create_tool_calling_agent、create_react_agent区别
如果你使用的是 GPT-3.5/4、Claude 3 等先进模型:请优先使用。它是现代的标准,错误率更低,体验更好。如果你使用的是早期的开源模型(如 Llama-2, Vicuna)或者模型不支持 API 级别的工具调用:你需要使用(或者),通过提示词技巧来强制模型调用工具。
·
在 LangChain 框架中,create_tool_calling_agent 和 create_react_agent 是两种用于构建智能体的核心函数。它们的主要区别在于模型与工具交互的机制、提示词的格式以及对模型能力的要求。
简而言之:
create_react_agent:基于经典的 ReAct (Reasoning + Acting) 模式,依赖文本解析,兼容性强但可能不够稳定。create_tool_calling_agent:基于模型的原生工具调用能力,依赖结构化输出,更稳定、高效,是现在的推荐做法。
下面是详细的对比分析:
1. create_react_agent (经典 ReAct 模式)
这是 LangChain 早期最流行的构建方式。它的核心思想是让 LLM 通过生成特定的文本来决定下一步行动。
- 工作原理:
- 提示词工程:Prompt 中明确指示模型按照特定的格式(如
Thought:,Action:,Action Input:)进行思考。 - 文本生成:模型生成一段纯文本,例如:
- 提示词工程:Prompt 中明确指示模型按照特定的格式(如
Thought: 我需要查询当前的天气
Action: Search
Action Input: 北京天气
3. 文本解析:LangChain 使用 OutputParser 解析这段文本,提取出要调用的工具名称和参数。
4. 执行与循环:执行工具,将结果作为新的 Observation 拼接到 Prompt 中,再次发给模型。
- 优点:
- 兼容性极好:理论上任何能够生成文本的 LLM(包括早期的开源模型)都可以使用,只要它能遵循指令格式。
- 缺点:
- 脆弱性:如果模型生成了不符合格式的文本(例如多打了一个空格、说了句废话),解析器就会报错,导致流程中断。
- Token 消耗:每次循环都需要把完整的思考过程和特定的格式说明发回给模型。
- 速度较慢:因为依赖于文本生成和正则解析,处理多步骤推理时效率较低。
2. create_tool_calling_agent (原生工具调用模式)
这是随着 OpenAI 推出 Function Calling API 后兴起的方式,也是 LangChain 目前推荐的主流方式。
-
工作原理:
- 绑定工具:通过
.bind_tools()方法将工具的定义(Schema)以 JSON Schema 的格式附加在模型请求中。 - 原生识别:LLM 在推理时,不再生成
Action: ...这种文本,而是直接在 API 响应中通过特定的字段(如 OpenAI 的tool_calls)返回一个结构化的对象,指明要调用哪个工具以及参数。 - 结构化处理:LangChain 直接读取这个结构化的字段,无需进行复杂的文本解析即可执行工具。
- 绑定工具:通过
-
优点:
- 稳定性高:模型 API 保证返回的结构是合法的 JSON,极大减少了因格式错误导致的失败。
- 效率高:模型专门针对工具推理进行了微调,通常能更准确地选择工具和提取参数,推理速度也更快。
- 支持多工具并行:许多支持工具调用的模型可以在一次响应中同时请求调用多个工具。
-
缺点:
- 模型限制:必须使用支持原生工具调用/函数调用的模型(如 GPT-3.5/4, Claude 3, 以及部分微调过的开源模型如 Llama 3 - Tool use 版本)。对于普通的 Chat 模型不适用。
3. 核心对比表
| 特性 | create_react_agent | create_tool_calling_agent |
|---|---|---|
| 底层机制 | 文本生成 + 正则解析 | API 原生参数/结构化输出 |
| Prompt 格式 | 需要包含 Thought/Action/Observation 循环模板 |
相对简洁,主要依赖 agent_scratchpad 传递历史 |
| 模型要求 | 任何文本生成模型 (Text Completion/Chat) | 必须支持 Function Calling / Tool Calling 的模型 |
| 稳定性 | 较低 (容易因格式问题出错) | 高 (由 API 保证结构正确) |
| 并行调用 | 通常只能串行执行 | 容易实现并行调用工具 |
| Token 效率 | 较低 (包含大量格式化废话) | 较高 (通常只传关键参数和结果) |
| 适用场景 | 使用不支持工具调用的老模型或开源小模型 | 生产环境、使用 GPT-4/Claude 等商业模型 |
4. 代码示例对比 (逻辑层面)
ReAct Agent 的 Prompt 示例 (逻辑):
Question: What is the weather in Beijing?
Thought: I should search for the weather.
Action: Search
Action Input: Beijing
...
*Agent 内部需要写正则表达式来截取 Search 和 Beijing。*
Tool Calling Agent 的 API 请求 (逻辑):
{
"model": "gpt-4",
"messages": [...],
"tools": [{"type": "function", "function": {"name": "Search", ...}}]
}
// 模型直接返回:
{
"tool_calls": [{
"id": "call_123",
"function": {"name": "Search", "arguments": "{\"query\": \"Beijing\"}"}
}]
}
Agent 内部直接读取 tool_calls 字段,无需解析。
5. 总结建议
- 如果你使用的是 GPT-3.5/4、Claude 3 等先进模型:请优先使用
create_tool_calling_agent。它是现代的标准,错误率更低,体验更好。 - 如果你使用的是早期的开源模型(如 Llama-2, Vicuna)或者模型不支持 API 级别的工具调用:你需要使用
create_react_agent(或者create_json_agent),通过提示词技巧来强制模型调用工具。
更多推荐


所有评论(0)