LangChain实战(十三):Agent Types详解与选择策略
本文是《LangChain实战课》系列的第十三篇,将深入探讨LangChain中不同类型的Agent及其适用场景。通过学习如何根据任务特性选择最合适的Agent类型,你将能够构建更加高效和可靠的AI应用系统。
前言
在前面的文章中,我们学习了如何创建和使用自定义Tools来扩展Agent的能力。然而,选择合适的Agent类型同样至关重要——不同的Agent类型有着不同的决策逻辑、适用场景和性能特点。就像为不同的任务选择合适的工具一样,为你的应用选择合适的Agent类型是成功的关键。
Agent类型核心概念回顾
在深入具体类型之前,让我们先回顾一下Agent的基本工作流程。无论哪种类型的Agent,其核心工作模式都是:
-
理解任务:分析用户的输入和当前状态
-
制定计划:决定需要采取什么行动序列
-
执行行动:调用适当的工具并获取结果
-
评估结果:分析工具返回的结果
-
迭代或完成:决定是否需要继续执行或返回最终答案
不同的Agent类型在这些步骤的具体实现上有所差异,主要体现在:思考方式、工具选择策略、上下文处理能力和与用户的交互模式。
主要Agent类型详解
1. ZERO_SHOT_REACT_DESCRIPTION
核心特点
ZERO_SHOT_REACT_DESCRIPTION
是最基础也是最常用的Agent类型。它基于ReAct(Reason + Act)框架,在每个步骤中都会生成"Thought"、“Action”、"Observation"的循环。
工作原理:
-
Thought: 分析当前状况和下一步该做什么
-
Action: 选择要使用的工具和参数
-
Observation: 接收工具执行的结果
-
重复这个过程直到任务完成
代码示例
from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI
from langchain.agents import AgentType# 初始化LLM和工具
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)# 创建Zero-Shot Agent
agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True # 显示详细的思考过程
)# 执行任务
result = agent.run("目前特斯拉的股价是多少?如果是100美元,能买多少股?")
print(result)
输出示例
Thought: 我需要先查找特斯拉的当前股价,然后进行数学计算。
Action: Search
Action Input: "特斯拉当前股价"
Observation: 特斯拉(TSLA)当前股价为250.75美元
Thought: 现在我知道股价是250.75美元,可以计算100美元能买多少股。
Action: Calculator
Action Input: 100 / 250.75
Observation: 0.398
Thought: 我现在知道100美元可以买大约0.398股特斯拉股票。
Final Answer: 100美元可以购买大约0.398股特斯拉股票。
适用场景
-
简单到中等复杂度的任务
-
工具数量较少的情况(通常少于10个)
-
需要透明决策过程的调试和学习场景
-
一次性查询而非多轮对话
优点
-
简单易用,无需示例或训练
-
决策过程透明,易于调试
-
资源消耗相对较低
限制
-
对于复杂任务可能陷入循环
-
在多轮对话中可能丢失上下文
-
工具选择可能不够精准
2. CONVERSATIONAL_REACT_DESCRIPTION
核心特点
CONVERSATIONAL_REACT_DESCRIPTION
专为多轮对话场景设计,内置了对话记忆管理功能。它在Zero-Shot ReAct的基础上增加了对话上下文的理解和维护能力。
特殊能力:
-
维护对话历史记录
-
理解基于上下文的指代和省略
-
支持持续的多轮交互
代码示例
from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI
from langchain.agents import AgentType
from langchain.memory import ConversationBufferMemory# 初始化带有记忆的Agent
memory = ConversationBufferMemory(memory_key="chat_history")
llm = OpenAI(temperature=0)
tools = load_tools([