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 联系和区别?
共同点
-
目标相同:两种 agent 都旨在使语言模型能够使用工具解决复杂问题
-
工作流结构:都遵循"分析问题→选择工具→执行工具→整合结果"的基本流程
-
LCEL 集成:都可以通过 LCEL 语法与其他组件组合成复杂工作流
-
迭代性:两者都支持多轮工具调用来解决复杂问题
主要区别
推理方式
- 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[