从 ReAct 到 OpenAI:了解多样化的 LCEL 代理类型

1. LCEL 下的 Agent 类型

在 LangChain Expression Language (LCEL) 框架中,有多种不同类型的 agent 实现,每种都有各自的特点和适用场景。以下是主要的 agent 类型:

1. ReAct Agent

from langchain.agents import create_react_agent
  • 特点:基于"思考-行动-观察"循环的推理过程
  • 适用场景:需要清晰推理步骤的复杂任务
  • 优势:推理过程透明,便于调试

2. OpenAI Function Agent

from langchain.agents import create_openai_functions_agent
  • 特点:利用 OpenAI 模型的函数调用能力
  • 适用场景:使用 OpenAI 模型且需要精确工具调用的场景
  • 优势:工具调用格式准确,降低解析错误

3. Tool-Calling Agent

from langchain.agents import create_tool_calling_agent
  • 特点:支持原生工具调用能力的模型(如 Anthropic Claude 或 OpenAI)
  • 适用场景:使用支持工具调用的最新模型时
  • 优势:利用模型原生工具调用能力,提高准确性

4. XML Agent

from langchain.agents import create_xml_agent
  • 特点:使用 XML 格式组织推理和工具调用
  • 适用场景:需要结构化输出且模型善于处理 XML 的场景
  • 优势:输出格式规范,易于解析

5. OpenAI Assistant Agent

from langchain_openai import OpenAIAssistantRunnable
  • 特点:直接使用 OpenAI Assistant API
  • 适用场景:需要利用 OpenAI 托管助手能力的场景
  • 优势:简化部署,利用 OpenAI 优化的助手行为

6. Conversational Agent

from langchain.agents import AgentType, initialize_agent
agent = initialize_agent(tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION)
  • 特点:专为对话场景优化的 ReAct agent
  • 适用场景:交互式聊天应用
  • 优势:更自然的对话体验,保持上下文连贯性

7. Zero-shot Agent

agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
  • 特点:无需示例即可使用工具
  • 适用场景:简单工具使用场景
  • 优势:配置简单,无需额外训练数据

8. Plan-and-Execute Agent

from langchain.agents import create_plan_and_execute_agent
  • 特点:先规划全局步骤,再逐步执行
  • 适用场景:需要长期规划的复杂任务
  • 优势:处理多步骤任务时更有条理

9. Self-Ask-with-Search Agent

agent = initialize_agent(tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH)
  • 特点:通过提问分解复杂问题
  • 适用场景:需要多次搜索或查询的研究类任务
  • 优势:善于分解复杂问题

10. 自定义 Agent

from langchain.agents import create_structured_chat_agent
# 或使用自定义提示模板创建
agent = Agent.from_llm_and_tools(llm, tools, prompt)
  • 特点:根据特定需求定制的 agent
  • 适用场景:特殊领域或有特定输出格式要求
  • 优势:高度定制化,适应特定业务需求

在 LCEL 中,这些 agent 都可以通过统一的 Runnable 接口集成到更大的工作流中,使用 |+ 操作符与其他组件连接,形成复杂的应用程序。

2. ReAct Agent 和 OpenAI Function Agent 联系和区别?

共同点

  1. 目标相同:两种 agent 都旨在使语言模型能够使用工具解决复杂问题

  2. 工作流结构:都遵循"分析问题→选择工具→执行工具→整合结果"的基本流程

  3. LCEL 集成:都可以通过 LCEL 语法与其他组件组合成复杂工作流

  4. 迭代性:两者都支持多轮工具调用来解决复杂问题

主要区别

推理方式

  • ReAct Agent:显式的"思考-行动-观察"循环,模型需要清晰表达每一步的推理过程
  • OpenAI Function Agent:更依赖模型内部的推理能力,输出直接是函数调用而非详细推理步骤

格式要求

  • ReAct Agent

    思考: 我需要计算这个表达式行动: calculator(2+2)观察: 4思考: 现在我知道答案了
    
  • OpenAI Function Agent

    {
           "name": "calculator",  "arguments": {
         "expression": "2+2"}}
    

技术实现

  • ReAct Agent:基于文本提示和解析,通常需要正则表达式匹配工具调用
  • OpenAI Function Agent:利用 OpenAI 模型的原生函数调用能力,通过 JSON 格式传递

适用模型

  • ReAct Agent:适用于任何足够强大的 LLM,包括开源模型
  • OpenAI Function Agent:专为 OpenAI 模型(如 GPT-3.5/4)设计,利用其函数调用能力

错误率

  • ReAct Agent:可能出现格式错误,需要更强的错误处理
  • OpenAI Function Agent:函数调用格式错误较少,解析更可靠

代码示例对比

ReAct Agent 实现:

from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("""
回答问题,根据需要使用工具。

{tools}

使用以下格式:
思考: 分析问题需要什么工具
行动: 工具名(参数)
观察: 工具结果
思考: 下一步...

问题: {input}
""")

agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

OpenAI Function Agent 实现:

from langchain.agents import create_openai_functions_agent
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手,可以使用提供的工具来回答问题。"),
    ("human", "{input}")
])

agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

选择建议

  • 使用 ReAct Agent 当:
    • 使用非 OpenAI 模型
    • 需要透明的推理过程
    • 希望自定义详细的推理步骤
  • 使用 OpenAI Function Agent 当:
    • 使用 OpenAI 模型
    • 优先考虑工具调用的准确性
    • 希望更简洁的实现方式

两种 agent 本质上都在解决同一个问题:让 LLM 能够使用工具,但采用了不同的技术路线。在 LCEL 中,它们可以轻松替换,使开发者能够根据具体需求选择最合适的实现方式。

3. ReAct Agent 的完整案例

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain.agents import AgentExecutor, create_react_agent
from langchain_core.tools import tool
from langchain_community.utilities import SerpAPIWrapper
from datetime import datetime
from typing import List, Dict, Any
import os

# 配置环境变量 - 实际使用时请在环境中设置
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"  # 必填
os.environ[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Agent首席体验官

您的打赏是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值