第 07 章

模型配置

为 Deep Agents 配置模型提供商和参数

选对模型、配好参数——Agent 才能跑得稳

为什么关注模型

你的 Agent 效果好坏,很大程度上取决于底层模型的选型和配置

随意选模型的困境

  • 不知道哪些模型支持工具调用,Agent 根本跑不起来
  • 参数没调好,模型要么太"懒"要么太"发散"
  • 换了模型后行为完全不同,没有统一的配置方式
  • 想运行时切换模型?只能重写代码

Deep Agents 的解法

  • 只需 provider:model 一行字符串即可指定模型
  • 通过 ProviderProfile 统一管理参数,提供商级 + 模型级分层配置
  • 用中间件实现运行时动态切换,无需重建 Agent
  • 官方评测套件帮你筛选表现良好的模型
核心前提:Deep Agents 支持任何实现了工具调用(tool calling)的 LangChain 聊天模型。不是所有模型都能用——必须支持工具调用。

模型格式

用 provider:model 格式指定模型

白话:你想用哪个模型,只需写一行 提供商名:模型名。比如 openai:gpt-5.4 就是 OpenAI 的 GPT-5.4,anthropic:claude-sonnet-4-6 就是 Anthropic 的 Claude。

使用 provider:model 格式传给 createDeepAgent,冒号前面是提供商前缀,冒号后面是模型标识符。提供商前缀用于选择对应的 LangChain 集成。

// 格式:provider:model
"google-genai:gemini-3.1-pro-preview"
"openai:gpt-5.4"
"anthropic:claude-sonnet-4-6"
"baseten:zai-org/GLM-5.1"    // 带命名空间的 ID
"ollama:llama3"

提供商前缀

决定使用哪个 LangChain 集成包。例如 openai 会加载 @langchain/openai。

有效前缀参见 init_chat_model 的 model_provider 参数。

模型标识符

冒号之后的所有内容直接传递给提供商。

有些用简单名称(如 gpt-5.4),有些用命名空间路径(如 zai-org/GLM-5.1)。

常见错误:模型标识符必须与提供商期望的格式完全匹配。写错了不会报"找不到模型",而是报更底层的 API 错误。请查阅提供商的模型目录确认标识符。

推荐模型

通过 Deep Agents 评测套件验证的模型

以下模型在官方评测套件中表现良好,该套件测试基本的 Agent 操作(文件操作、信息检索、工具使用等)。通过评测是必要条件,但不保证在更复杂任务中同样出色。

提供商推荐模型
Google gemini-3.1-pro-preview、gemini-3-flash-preview
OpenAI gpt-5.4、gpt-4o、gpt-4o-mini、o4-mini、gpt-5.2-codex、gpt-5.5
Anthropic claude-opus-4-6、claude-opus-4-5、claude-sonnet-4-6、claude-sonnet-4、claude-sonnet-4-5、claude-haiku-4-5、claude-opus-4-1
开源权重 GLM-5、Kimi-K2.5、MiniMax-M2.5、qwen3.5-397B-A17B、devstral-2-123B
开源权重模型可通过 OpenRouter、Fireworks 或 Ollama 等提供商使用。例如:openrouter:deepseek/deepseek-v4-pro、ollama:minimax-m2.7:cloud。
选择建议:如果你不确定用哪个模型,先从 google-genai:gemini-3.1-pro-preview 或 openai:gpt-5.4 开始——它们在文件操作和信息检索两项上均拿到 100%。

评测成绩

主流模型在 Deep Agents 评测套件中的表现一览

评测涵盖六大类 Agent 操作,加粗数字表示该维度最佳表现。数据来自官方 CI 运行记录。

模型文件操作信息检索工具使用记忆对话摘要
gemini-3.1-pro 100% 100% 25% 54% 48% 80%
gpt-5.4 100% 100% 18% 51% 38% 100%
claude-opus-4-6 92% 100% 26% 69% 22% 100%
claude-opus-4-7 100% 100% 18% -- 52% 100%
GLM-5 92% 100% 87% 44% 29% 60%
minimax-m2.7 92% 90% 82% 38% 29% 60%
gpt-5.5 92% 100% 20% 64% 52% 80%
Kimi-K2.6 100% 100% 20% -- -- 60%
deepseek-v4-pro 100% 100% 25% -- -- 80%
minimax-m2.7 (OpenRouter) 92% 100% 20% -- -- 60%
nemotron-3-super-120b 0% 0% 0% 0% 0% 0%
glm-5.1 92% 100% 25% -- 33% 80%
关键发现:文件操作和信息检索各模型整体表现较好(90%+),但工具使用是普遍短板(大多数低于 30%)。如果你的 Agent 重度依赖工具调用,优先考虑 GLM-5(87%)或 minimax-m2.7(82%)。

配置参数

两种方式精细控制模型行为

白话:如果你只想换模型名称,传字符串就够了。但如果你要调参数(如 temperature、reasoning_effort),有两种更灵活的方式。

除了传入 provider:model 字符串,你还可以传入一个已配置的模型实例来获得完全控制。底层通过 init_chat_model 解析。

方式一:initChatModel

import { initChatModel } from "langchain/chat_models/universal";
import { createDeepAgent } from "deepagents";

// 用通用工厂方法初始化模型,字符串指定提供商和模型
// reasoningEffort 控制推理深度,"medium" 为中等,可选 "low"/"high"
const model = await initChatModel(
  "google-genai:gemini-3.1-pro-preview",
  { reasoningEffort: "medium" }
);
// 将已配置的模型实例传入,Agent 直接使用它
const agent = createDeepAgent({ model });

方式二:提供商包

import { ChatGoogle } from "@langchain/google";
import { createDeepAgent } from "deepagents";

// 直接用提供商包实例化,可访问该提供商的所有专有参数
const model = new ChatGoogle({
  model: "gemini-3.1-pro-preview",  // 模型标识符,只需写模型名
  reasoningEffort: "medium",        // 推理深度参数
});
const agent = createDeepAgent({ model });

initChatModel

通用方法,用字符串指定模型,通过选项配置参数。适合快速切换模型时使用。

提供商包

直接实例化提供商类,可访问该提供商的所有专有参数。适合需要深度定制的场景。

注意:可用参数因提供商而异。reasoningEffort 可能只对部分模型有效。请查阅各提供商的集成文档确认支持的参数列表。

配置档案

用 ProviderProfile 统一管理模型参数

白话:ProviderProfile 就像"模型配置模板"。你可以写一个模板说"所有 OpenAI 模型温度设 0",再写一个说"GPT-5.4 额外开启推理功能"——它们会自动合并。

ProviderProfile 封装了在使用 provider:model 字符串创建 Agent 时应用的初始化参数。它支持两级注册,且两者可以共存、自动合并。

import { ProviderProfile, registerProviderProfile } from "deepagents";

// 提供商级别:所有 openai 模型都设置 temperature=0
registerProviderProfile(
  "openai",
  new ProviderProfile({ temperature: 0 }),
);

// 模型级别:gpt-5.4 额外设置 reasoningEffort
// 会继承上面提供商级别的 temperature=0
registerProviderProfile(
  "openai:gpt-5.4",
  new ProviderProfile({ reasoningEffort: "medium" }),
);

提供商级别

用裸提供商键名(如 "openai")注册,应用于该提供商的所有模型。

适合设置通用默认值,如 temperature。

模型级别

用 provider:model 键名(如 "openai:gpt-5.4")注册,仅应用于特定模型。

会与提供商级别配置合并,模型级优先。

合并规则:模型级别的配置会覆盖提供商级别的同名参数,未覆盖的参数保留提供商级别的值。如果你传入的是预配置的模型实例(而非字符串),ProviderProfile 不会生效。
提示:若要控制模型构建完成后 Agent 的行为方式(而非模型本身的参数),请使用框架配置档案(harness profile)。Harness Profile 在 Provider Profile 之上提供更高层的 Agent 行为控制。
图:Provider/Model 两级注册与合并

运行时切换

用中间件在运行时动态选择模型,无需重建 Agent

如果你的应用允许用户通过 UI 下拉菜单选择模型,可以使用 LangChain 中间件(middleware)在运行时切换。

import { initChatModel, createMiddleware } from "langchain";
import { createDeepAgent } from "deepagents";
import * as z from "zod";

// 定义上下文的 schema,model 字段存放用户选择的模型名
const contextSchema = z.object({
  model: z.string(),
});

// 定义中间件:拦截每次模型调用,替换为用户选择的模型
const configurableModel = createMiddleware({
  name: "ConfigurableModel",
  // wrapModelCall 会在每次 LLM 调用前执行
  wrapModelCall: async (request, handler) => {
    // 从运行时上下文中读取用户选择的模型名
    const modelName = request.runtime.context.model;
    // 动态初始化新模型实例
    const model = await initChatModel(modelName);
    // 用新模型替换原请求中的模型,继续执行后续流程
    return handler({ ...request, model });
  },
});

const agent = await createDeepAgent({
  model: "google-genai:gemini-3.1-pro-preview",  // 默认模型(首次调用时使用)
  middleware: [configurableModel],                 // 注册中间件
  contextSchema,                                   // 绑定上下文 schema
});
工作原理:中间件拦截每次模型调用,从上下文中读取用户选择的模型名称,动态初始化新模型并替换。Agent 只需构建一次,之后通过传入不同的 context 即可切换模型。
图:中间件拦截动态切换模型

切换实战

用不同模型调用同一个 Agent

// 用 Google 模型调用——context.model 指定模型,中间件会拦截并切换
const result1 = await agent.invoke(
  { messages: [{ role: "user", content: "分析这段代码" }] },
  { context: { model: "google-genai:gemini-3.1-pro-preview" } },
);

// 切换到 OpenAI 模型——同一个 agent 实例,无需重建
const result2 = await agent.invoke(
  { messages: [{ role: "user", content: "分析这段代码" }] },
  { context: { model: "openai:gpt-5.4" } },
);

// 切换到 Anthropic 模型——只需改变 context 中的 model 值
const result3 = await agent.invoke(
  { messages: [{ role: "user", content: "分析这段代码" }] },
  { context: { model: "anthropic:claude-sonnet-4-6" } },
);

适用场景

  • 用户在 UI 中自选模型
  • 根据任务复杂度路由到不同模型
  • A/B 测试不同模型的效果

注意事项

  • 每次切换都会初始化新模型,有少量延迟
  • 确保所有候选模型都支持工具调用
  • 不同模型的输出格式可能有差异
进阶用法:如果需要更复杂的动态选择模式(如根据对话复杂度自动路由或成本优化),可参考 LangChain Agent 指南中的"动态模型(Dynamic model)"章节。

本章小结

模型配置的三层能力:选模型、调参数、运行时切换

选模型

  • 格式:provider:model
  • 必须支持工具调用
  • 参考官方评测套件选择
  • Google / OpenAI / Anthropic 整体领先

调参数

  • initChatModel 通用配置
  • 提供商包直接实例化
  • ProviderProfile 分层管理
  • 提供商级 + 模型级自动合并

运行时切换

  • 中间件拦截模型调用
  • 上下文传入模型名称
  • 无需重建 Agent
  • 适合用户自选和 A/B 测试
核心结论:Deep Agents 的模型配置遵循"简单场景用字符串、复杂场景用实例、动态场景用中间件"的分层策略。从一行字符串开始,按需升级控制粒度。

延伸阅读

继续本课程

官方文档

相关概念