在 LangChain 中,initialize_agent
函数用于创建代理(Agent),其中 agent
参数通过指定 AgentType
来定义代理的类型。AgentType
枚举了 LangChain 支持的代理类型,每种类型对应不同的代理行为和提示策略。尽管 initialize_agent
在 LangChain 0.3.x 中已被标记为不推荐(建议使用 LangGraph),但它仍然可用,且 AgentType
定义了其支持的代理类型。本文基于 LangChain 0.3.x,详细列出 AgentType
的所有可能值及其用途,并提供相关代码示例。
AgentType
概述
AgentType
是一个枚举类,位于 langchain.agents
模块中,用于指定代理的行为模式。不同的 AgentType
对应不同的提示模板和推理策略,适用于不同的工具调用和任务场景。以下是 LangChain 0.3.x 中 AgentType
的所有可能值及其描述。
可用的 AgentType
值
根据 LangChain 0.3.x 的源代码和文档(langchain.agents.AgentType
),以下是所有 AgentType
枚举值:
-
ZERO_SHOT_REACT_DESCRIPTION
- 描述:基于 ReAct(Reasoning + Acting)框架的零样本代理,仅依赖工具描述进行推理和行动,无需示例。
- 适用场景:通用工具调用任务,适合快速构建无需训练数据的代理。
- 提示策略:生成包含工具描述的提示,代理通过推理选择工具并执行。
- 工具支持:支持任意数量的工具。
-
REACT_DOCSTORE
- 描述:专为文档存储(Docstore)设计的 ReAct 代理,结合搜索和查找工具处理文档相关任务。
- 适用场景:需要从文档库中检索信息的任务,如问答系统。
- 提示策略:提示包含搜索和查找工具的描述,代理通过 ReAct 逻辑处理文档查询。
- 工具支持:通常与
Search
和Lookup
工具配合。
-
SELF_ASK_WITH_SEARCH
- 描述:自问自答代理,通过搜索工具回答复杂问题,逐步分解问题并查找答案。
- 适用场景:需要外部知识(如网络搜索)的问答任务。
- 提示策略:提示引导代理提出子问题,调用搜索工具获取答案。
- 工具支持:通常需要一个搜索工具(如 Google 搜索 API)。
-
CONVERSATIONAL_REACT_DESCRIPTION
- 描述:对话型 ReAct 代理,结合对话历史和工具调用,适合交互式对话场景。
- 适用场景:需要维护对话上下文并调用工具的聊天机器人。
- 提示策略:提示包含对话历史和工具描述,代理在对话中推理和行动。
- 工具支持:支持任意工具,强调对话流畅性。
-
CHAT_ZERO_SHOT_REACT_DESCRIPTION
- 描述:为聊天模型优化的零样本 ReAct 代理,使用消息格式提示,适合现代聊天模型(如
gpt-4o
)。 - 适用场景:与聊天模型结合的工具调用任务,注重消息格式。
- 提示策略:使用系统消息和用户消息,包含工具描述,代理通过 ReAct 逻辑行动。
- 工具支持:支持工具调用,兼容现代模型的工具调用 API。
- 描述:为聊天模型优化的零样本 ReAct 代理,使用消息格式提示,适合现代聊天模型(如
-
CHAT_CONVERSATIONAL_REACT_DESCRIPTION
- 描述:为聊天模型优化的对话型 ReAct 代理,结合对话历史和工具调用。
- 适用场景:需要对话上下文和工具调用的交互式聊天场景。
- 提示策略:提示包含对话历史、系统消息和工具描述,代理在对话中推理。
- 工具支持:支持任意工具,强调对话连续性。
-
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
- 描述:为结构化工具调用优化的零样本 ReAct 代理,支持多输入工具(Structured Tools)。
- 适用场景:需要调用复杂工具(多参数或 schema 定义)的任务。
- 提示策略:提示包含工具的结构化描述,代理通过 ReAct 逻辑选择和调用工具。
- 工具支持:专为
StructuredTool
或复杂工具 schema 设计。
-
OPENAI_FUNCTIONS(已废弃)
- 描述:专为 OpenAI 函数调用(Function Calling)设计的代理,使用 OpenAI 的原生函数调用 API。
- 适用场景:早期 OpenAI 模型(如
gpt-3.5-turbo
)的函数调用任务。 - 提示策略:直接利用 OpenAI 的函数调用接口,无需复杂提示。
- 工具支持:支持 OpenAI 函数格式的工具。
- 注意:在 LangChain 0.3.x 中已标记为不推荐,建议使用
CHAT_ZERO_SHOT_REACT_DESCRIPTION
或 LangGraph。
-
OPENAI_MULTI_FUNCTIONS(已废弃)
- 描述:类似
OPENAI_FUNCTIONS
,但支持同时调用多个函数。 - 适用场景:需要批量函数调用的场景。
- 提示策略:与
OPENAI_FUNCTIONS
类似,依赖 OpenAI 函数调用 API。 - 工具支持:支持多函数调用。
- 注意:同样不推荐,建议迁移到现代工具调用代理。
- 描述:类似
如何选择 AgentType
?
选择 AgentType
取决于你的任务需求和模型类型:
- 简单工具调用:使用
ZERO_SHOT_REACT_DESCRIPTION
(通用)或CHAT_ZERO_SHOT_REACT_DESCRIPTION
(聊天模型)。 - 对话场景:使用
CONVERSATIONAL_REACT_DESCRIPTION
或CHAT_CONVERSATIONAL_REACT_DESCRIPTION
。 - 复杂工具:使用
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
。 - 文档检索:使用
REACT_DOCSTORE
。 - 搜索驱动:使用
SELF_ASK_WITH_SEARCH
。 - OpenAI 函数调用:避免使用
OPENAI_FUNCTIONS
或OPENAI_MULTI_FUNCTIONS
,改用CHAT_ZERO_SHOT_REACT_DESCRIPTION
。
代码示例
以下是一个使用 initialize_agent
和 CHAT_ZERO_SHOT_REACT_DESCRIPTION
的示例,展示如何创建代理并调用工具。同时,我会指出迁移到 LangGraph 的建议。
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络以获取信息。"""
return f"搜索 {query} 的结果:[示例内容]"
tools = [search_web]
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")
# 初始化代理
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 调用代理
response = agent.invoke({"input": "成都的天气如何?"})
print(response["output"])
输出示例:
[代理使用 search_web 工具] 成都的天气是晴天,最高气温 28°C。
代码说明
- OpenAI API 密钥:
- 通过
os.environ["OPENAI_API_KEY"]
设置,确保 OpenAI 模型正常调用。 - 将
"Your OpenAI API Key"
替换为你的实际密钥。
- 通过
- 工具:
- 使用
@tool
装饰器定义search_web
,兼容现代工具调用。
- 使用
- LLM:
- 使用
langchain_openai.ChatOpenAI
,选择gpt-4o-mini
支持工具调用。
- 使用
- 代理:
- 设置
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION
,适合聊天模型的零样本工具调用。 verbose=True
显示代理推理过程。
- 设置
- 调用:
- 使用
invoke
方法(推荐),输入为字典{"input": "..."}
。 - 输出为字典,访问
response["output"]
获取结果。
- 使用
迁移到 LangGraph 的建议
initialize_agent
已被标记为不推荐,建议迁移到 LangGraph,因为它更灵活,支持状态持久化、复杂工作流和现代工具调用。以下是使用 LangGraph 的等效代码:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
# 定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络以获取信息。"""
return f"搜索 {query} 的结果:[示例内容]"
tools = [search_web]
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")
# 创建 LangGraph ReAct 代理
agent = create_react_agent(llm, tools)
# 调用代理
response = agent.invoke({"messages": [{"role": "human", "content": "成都的天气如何?"}]})
for message in response["messages"]:
if message["role"] == "assistant":
print(message["content"])
输出示例:
[代理使用 search_web 工具] 成都的天气是晴天,最高气温 28°C。
说明:
- 使用
create_react_agent
创建 ReAct 代理,替代initialize_agent
。 - 支持状态持久化(可添加
MemorySaver
)。 - 输入为消息列表,输出为状态字典。
注意事项
- API 密钥安全:
- 避免硬编码密钥,推荐使用
.env
文件和python-dotenv
:from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的 OPENAI_API_KEY
- 确保密钥支持指定模型(如
gpt-4o-mini
)。
- 避免硬编码密钥,推荐使用
- 工具兼容性:
- 确保工具返回字符串或 JSON 兼容输出,适应现代工具调用。
- 复杂工具使用
StructuredTool
。
- 模型选择:
gpt-4o-mini
性价比高,适合工具调用。- 其他选项:
gpt-4o
或gpt-3.5-turbo
。
- LangGraph 迁移:
initialize_agent
适用于简单场景,但 LangGraph 更适合复杂任务。- 参考 迁移指南。
常见问题
Q1:如何选择合适的 AgentType
?
A:根据任务选择:
- 通用工具调用:
CHAT_ZERO_SHOT_REACT_DESCRIPTION
。 - 对话场景:
CHAT_CONVERSATIONAL_REACT_DESCRIPTION
。 - 复杂工具:
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
。 - 文档/搜索:
REACT_DOCSTORE
或SELF_ASK_WITH_SEARCH
。
Q2:initialize_agent
还能用多久?
A:支持到 LangChain 1.0,但新项目应使用 LangGraph。
Q3:LangGraph 与 initialize_agent
相比有何优势?
A:LangGraph 支持状态持久化、复杂工作流和人机交互,initialize_agent
仅适合简单场景。
Q4:如何调试代理行为?
A:设置 verbose=True
查看推理过程,或使用 LangGraph 的调试工具。
总结
LangChain 0.3.x 中 AgentType
的可能值包括:
ZERO_SHOT_REACT_DESCRIPTION
REACT_DOCSTORE
SELF_ASK_WITH_SEARCH
CONVERSATIONAL_REACT_DESCRIPTION
CHAT_ZERO_SHOT_REACT_DESCRIPTION
CHAT_CONVERSATIONAL_REACT_DESCRIPTION
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
OPENAI_FUNCTIONS
和OPENAI_MULTI_FUNCTIONS
(已不推荐)。