在 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 通过生成特定的文本来决定下一步行动。

  • 工作原理
    1. 提示词工程:Prompt 中明确指示模型按照特定的格式(如 Thought:Action:Action Input:)进行思考。
    2. 文本生成:模型生成一段纯文本,例如:
        Thought: 我需要查询当前的天气
        Action: Search
        Action Input: 北京天气

                3. 文本解析:LangChain 使用 OutputParser 解析这段文本,提取出要调用的工具名称和参数。
                4. 执行与循环:执行工具,将结果作为新的 Observation 拼接到 Prompt 中,再次发给模型。

  • 优点
    • 兼容性极好:理论上任何能够生成文本的 LLM(包括早期的开源模型)都可以使用,只要它能遵循指令格式。
  • 缺点
    • 脆弱性:如果模型生成了不符合格式的文本(例如多打了一个空格、说了句废话),解析器就会报错,导致流程中断。
    • Token 消耗:每次循环都需要把完整的思考过程和特定的格式说明发回给模型。
    • 速度较慢:因为依赖于文本生成和正则解析,处理多步骤推理时效率较低。

2. create_tool_calling_agent (原生工具调用模式)

这是随着 OpenAI 推出 Function Calling API 后兴起的方式,也是 LangChain 目前推荐的主流方式。

  • 工作原理

    1. 绑定工具:通过 .bind_tools() 方法将工具的定义(Schema)以 JSON Schema 的格式附加在模型请求中。
    2. 原生识别:LLM 在推理时,不再生成 Action: ... 这种文本,而是直接在 API 响应中通过特定的字段(如 OpenAI 的 tool_calls)返回一个结构化的对象,指明要调用哪个工具以及参数。
    3. 结构化处理: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),通过提示词技巧来强制模型调用工具。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐