LangChain: Agent(代理)
Agent是LangChain中最强大的概念之一,它让语言模型能够自主决策和执行动作,而不仅仅是生成文本。
核心概念图解
什么是Agent?
Agent是一个由语言模型驱动的系统,它能够:
- 理解用户请求
- 决定需要采取什么行动
- 使用工具执行这些行动
- 根据结果决定下一步行动
- 最终提供完整的回答
Agent的核心组件
1. 工具(Tools)
from langchain.agents import load_tools# 加载内置工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
2. 代理类型(Agent Types)
from langchain.agents import AgentType# 常用代理类型
agent_types = [AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 零样本推理AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 结构化聊天AgentType.OPENAI_FUNCTIONS # OpenAI函数调用
]
3. 代理执行器(Agent Executor)
from langchain.agents import initialize_agentagent = initialize_agent(tools=tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)
完整代码示例
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI# 1. 初始化模型
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")# 2. 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)# 3. 初始化代理
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True # 显示详细执行过程
)# 4. 运行代理
result = agent.run("目前市场上iPhone 15 Pro Max的价格是多少?""如果买3台,总价是多少?加上8%的税呢?"
)
print(result)
这里的serpapi会提供实时联网查询功能,参考:https://blog.csdn.net/seanyang_/article/details/151323089
如果不使用该工具,则会推理计算。
输出
Thought: 我需要先查找iPhone 15 Pro Max的当前市场价格。由于我没有实时访问互联网的能力,我需要基于一般知识来估算价格。iPhone 15 Pro Max的起售价通常在999美元左右,但具体价格可能因地区和配置而异。我将假设一个基准价格进行计算。Action: Calculator
Action Input: 999 * 3 # 假设每台999美元,计算3台的总价Observation: Answer: 2997
Thought:Observation: 2997Thought: 现在我需要加上8%的税。首先计算税额,然后加到总价上。Action: Calculator
Action Input: 2997 * 0.08 # 计算8%的税额Observation: Answer: 239.76
Thought:Thought: 现在将税额加到总价上,得到最终总价。Action: Calculator
Action Input: 2997 + 239.76Observation: Answer: 3236.76
Thought:Thought: 我基于iPhone 15 Pro Max的起售价999美元进行了计算。但需要注意的是,实际价格可能因存储容量、地区和零售商的不同而有所差异。此外,我假设的是美元价格,而问题是用中文提出的,可能指的是中国市场的人民币价格。不过既然没有指定货币,我继续使用美元计算。Final Answer: 基于iPhone 15 Pro Max起售价999美元的假设:
- 3台iPhone 15 Pro Max的基础总价为2,997美元
- 加上8%的税后,最终总价为3,236.76美元请注意:实际市场价格可能因配置(存储容量)、地区和零售商的不同而有所差异。建议查询当地苹果官网或授权经销商获取准确价格。> Finished chain.
基于iPhone 15 Pro Max起售价999美元的假设:
- 3台iPhone 15 Pro Max的基础总价为2,997美元
- 加上8%的税后,最终总价为3,236.76美元请注意:实际市场价格可能因配置(存储容量)、地区和零售商的不同而有所差异。建议查询当地苹果官网或授权经销商获取准确价格。Process finished with exit code 0
可以看到agent有thought,action
带搜索的Agent的执行过程
> Entering new AgentExecutor chain...
我需要先查找iPhone 15 Pro Max的当前市场价格
Action: Search
Action Input: "iPhone 15 Pro Max 当前价格"
Observation: iPhone 15 Pro Max 当前起售价为1199美元现在需要计算3台的总价
Action: Calculator
Action Input: 1199 * 3
Observation: 3597现在计算加上8%税的价格
Action: Calculator
Action Input: 3597 * 1.08
Observation: 3884.76Thought: 我已经得到了所有需要的信息
Final Answer: 目前iPhone 15 Pro Max起售价为1199美元,购买3台原价3597美元,加上8%税后总价为3884.76美元。
自定义工具创建
from langchain.tools import BaseTool
from typing import Optionalclass CustomCalculatorTool(BaseTool):name = "CustomCalculator"description = "用于执行数学计算的高级计算器"def _run(self, query: str) -> str:"""执行计算"""try:# 安全评估数学表达式result = eval(query)return f"计算结果: {result}"except:return "计算错误,请检查表达式"async def _arun(self, query: str) -> str:"""异步执行"""return self._run(query)# 使用自定义工具
custom_tools = [CustomCalculatorTool()]
agent = initialize_agent(tools=custom_tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
不同类型的Agent
1. Zero-Shot React Agent
不需要示例,直接推理
# 不需要示例,直接推理
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
2. Structured Chat Agent
# 支持更复杂的多轮对话
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
)
3. OpenAI Functions Agent
# 使用OpenAI的函数调用能力
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.OPENAI_FUNCTIONS
)
实际应用场景
1. 研究助手
research_tools = load_tools(["serpapi", "wikipedia"])
research_agent = initialize_agent(tools=research_tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)result = research_agent.run("研究人工智能的历史,并总结主要里程碑事件"
)
2. 数据分析助手
data_tools = load_tools(["python_repl"])
data_agent = initialize_agent(tools=data_tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)result = data_agent.run("分析这个CSV文件并找出销售额最高的产品: sales_data.csv"
)
3. 客户服务助手
service_tools = load_tools(["serpapi", "llm-math"])
service_agent = initialize_agent(tools=service_tools,llm=llm,agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
)result = service_agent.run("客户询问产品价格和库存情况,请帮忙查询"
)
最佳实践和技巧
1. 工具描述优化
# 为工具提供清晰的描述
calculator.description = """
用于执行数学计算。输入应该是数学表达式,如 '2 + 2' 或 '500 * 0.1'。
对于复杂计算,使用括号明确运算顺序。
"""
2. 错误处理
from langchain.agents import AgentExecutoragent_executor = AgentExecutor.from_agent_and_tools(agent=agent,tools=tools,max_iterations=5, # 限制最大迭代次数early_stopping_method="generate" # 提前停止策略
)
3. 记忆集成
from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,memory=memory,verbose=True
)
常见问题解决
1. 无限循环
# 设置迭代限制
agent_executor = AgentExecutor(agent=agent,tools=tools,max_iterations=5,handle_parsing_errors=True
)
2. 解析错误
# 更好的错误处理
agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,handle_parsing_errors=True
)
3. 工具选择不当
# 提供更详细的工具描述
search_tool.description = """
使用此工具搜索最新信息。输入应该是具体的搜索查询。
适用于查找事实、价格、新闻等实时信息。
"""
性能优化
1. 缓存结果
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cacheset_llm_cache(InMemoryCache())
2. 并行工具执行
# 使用异步执行
async def run_agent_async():result = await agent.arun("你的问题")return result
3. 批量处理
# 同时处理多个查询
questions = ["问题1", "问题2", "问题3"]
results = []
for q in questions:results.append(agent.run(q))
总结
LangChain的Agent系统提供了强大的自主决策和执行能力:
-
核心优势:
- 自主工具使用
- 多步推理能力
- 实时信息获取
- 复杂任务处理
-
适用场景:
- 研究分析
- 数据查询
- 自动化任务
- 智能助手
-
最佳实践:
- 清晰工具描述
- 适当迭代限制
- 错误处理机制
- 记忆集成
通过合理使用Agent,你可以创建出能够理解、推理和行动的智能系统,而不仅仅是生成文本的模型。