LangChain Agent 编写全攻略(2024实战版)
目录导读
- Agent 是什么?为什么需要它?
- 环境准备与核心概念速览
- 三种主流 Agent 类型与选择策略
- 实战:编写一个会搜索+计算的金融助手
- 进阶技巧:记忆系统、错误处理与工具封装
- 常见问题与调优 FAQ
Agent 是什么?为什么需要它?
在传统 LLM 应用中,你问“今天天气如何”,模型只能根据训练数据回答,无法实时查询。Agent(智能体) 赋予 LLM 调用外部工具的能力:搜索网页、执行代码、查询数据库,甚至控制硬件。

通俗比喻:LLM 是大脑(思考逻辑),Agent 是手和脚(执行动作),工具是工具箱(API、计算器等)。
核心流程:
用户提问 → Agent 拆解任务 → 选择工具 → 执行工具 → 将结果反馈给 LLM → 生成最终回答。
Q:Agent 与普通 Chain 的区别是什么?
A:Chain 是固定流程(先做A再做B),Agent 是动态决策(根据当前情况决定下一步用什么工具、怎么用),用户问“苹果股价 vs 特斯拉,哪个回报率更高?”Agent 会先查股价,再查历史数据,最后用计算器算百分比。
环境准备与核心概念速览
安装依赖
pip install langchain langchain-openai langchain-community python-dotenv
核心组件一览
| 组件 | 作用 | 示例 |
|---|---|---|
| LLM | 决策引擎 | GPT-4、Claude3 |
| Tool | 具体能力单元 | 搜索API、计算器、数据库查询 |
| AgentExecutor | 执行循环 | 决策→执行→反馈→再决策 |
| PromptTemplate | 控制Agent行为 | 约束语言风格、输出格式 |
环境变量配置
import os from dotenv import load_dotenv load_dotenv() # 需配置 OPENAI_API_KEY 或对应的模型API key
三种主流 Agent 类型与选择策略
1 Zero-shot React Agent(推荐新手)
- 特点:每步思考“当前状态 → 下一步行动 → 行动输入 → 观察结果”
- 适用:任务明确,工具数量≤5个
- 优势:最稳定,LangChain官方默认采用
2 OpenAI Functions Agent
- 特点:利用GPT-4的函数调用能力,结构化输出行动参数
- 适用:需要精细控制工具输入格式(如指定JSON参数)
- 注意:仅支持OpenAI系列模型
3 Plan-and-Execute Agent
- 特点:先制定完整计划→再逐步执行
- 适用:多步骤复杂任务(如:分析十年财报并生成报告)
- 缺点:耗时较长,可能因计划错误导致全盘失败
Q:我应该选哪种?
A:如果第一次写 Agent,优先选Zero-shot React;若工具需要精确参数(如数据库查询),选Functions;若任务超过5步(如“查10家公司近5年营收趋势”),选Plan-and-Execute。
实战:编写一个会搜索+计算的金融助手
需求描述
用户输入“我买了100股苹果股票,买入价185美元,现价查询一下,告诉我盈亏百分比”
步骤1:定义工具(搜索引擎 + 计算器)
from langchain.tools import Tool
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.agents import load_tools
# 搜索工具
search = DuckDuckGoSearchRun()
search_tool = Tool(
name="WebSearch",
func=search.run,
description="当你需要查找实时股票价格、新闻或任何网络信息时使用,输入应为搜索关键词。"
)
# 计算器工具(LangChain内置)
calc_tools = load_tools(["llm-math"], llm=llm)
步骤2:创建Agent
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
# LLM(建议使用gpt-4,gpt-3.5-turbo在复杂任务中易出错)
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
# 自定义Prompt(关键!控制Agent行为)
agent_prompt = PromptTemplate.from_template("""
你是一个专业的金融助手,请按照以下步骤回答用户问题:
1. 如果需要实时数据,使用 WebSearch
2. 如果需要计算,使用 Calculator
3. 最终回答必须给出明确结论,并附上数据来源
工具:{tools}
工具名:{tool_names}
用户输入:{input}
思考过程:{agent_scratchpad}
""")
# 创建Agent
agent = create_react_agent(llm, [search_tool, calc_tools[0]], agent_prompt)
agent_executor = AgentExecutor(agent=agent, tools=[search_tool, calc_tools[0]], verbose=True, max_iterations=5)
# verbose=True可以看到思考过程,调试神器
# max_iterations防止死循环
步骤3:运行
result = agent_executor.invoke({"input": "我买了100股苹果股票,买入价185美元,现价查询一下,告诉我盈亏百分比"})
print(result["output"])
执行过程可视化(verbose输出示例):
> 思考:用户需要查询苹果当前股价
> 执行:WebSearch("苹果(AAPL)实时股价")
> 观察:当前价210.50美元(谷歌财经)
> 思考:需要计算盈亏百分比
> 执行:Calculator("(210.50 - 185) / 185 * 100")
> 观察:13.78%
> 最终回答:当前盈利13.78%...
进阶技巧:记忆系统、错误处理与工具封装
1 添加记忆(对话历史)
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
agent_executor = AgentExecutor(
agent=agent, tools=tools, memory=memory,
verbose=True
)
- 效果:Agent能记住前文“你刚才说买100股”,后续无需重述。
2 自定义工具(封装API)
from langchain.tools import BaseTool
class StockPriceTool(BaseTool):
name = "StockPrice"
description = "输入股票代码(如AAPL),返回当前美元价格"
def _run(self, ticker: str) -> str:
# 实际可调用yfinance、Alpha Vantage等API
return f"当前{ticker}股价为210.50美元"
async def _arun(self, ticker: str):
raise NotImplementedError("暂不支持异步")
stock_tool = StockPriceTool()
3 错误重试机制
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools,
handle_parsing_errors=True, # 自动重试解析失败的输出
max_iterations=5,
early_stopping_method="generate" # 超时后生成一个合理答案
)
Q:Agent执行卡在死循环怎么办?
A:设置max_iterations=10(最大循环次数),同时检查工具描述是否清晰,死亡螺旋常因工具描述模糊,Agent重复调用同一个工具。
常见问题与调优 FAQ
Q1:Agent速度太慢怎么优化?
- 使用
gpt-3.5-turbo-instruct(速度比gpt-4快3倍) - 减少工具数量,将多个相关工具合并(如“搜索+汇总”合并为“信息查询器”)
- 限制
max_iterations=3,同时告诉Agent“尽量在2步内完成”
Q2:工具调用结果不准确?
- 在工具描述中加入使用示例,
description="输入:多少美元兑人民币?格式如:'100 USD to CNY'" - 使用
OpenAI Functions Agent强制参数为JSON格式
Q3:如何让Agent遵循特定输出格式?
- 在Prompt中明确给出模板:
最终回复应包含:①当前结果 ②计算过程 ③风险提示
Q4:生产环境部署要点?
- 添加速率限制:用
langchain-community的RateLimiter - 开启日志审计:记录每次Agent的思考链和工具调用
- 使用回调函数实时推送进度条
总结与推荐学习资源
编写Agent的本质是通过Prompt定义决策逻辑,通过Tools扩展能力边界,关键三原则:
- 工具描述要像写给小孩看(具体、带示例)
- Prompt不仅要告诉做什么,还要告诉怎么做(给出决策树)
- 务必加迭代限制(防止无限火车事故)
推荐进一步实践:
- 尝试让Agent同时调用
requests库和pandas(分析数据) - 构建一个能控制智能家居设备的Agent(需加上
datetime工具判断时间)
SEO关键词提示:本文适合的搜索意图是“LangChain Agent 教程代码”、“如何编写Agent”、“AI智能体实战”,已在标题、小标题、代码块中自然植入,符合Google BERT算法对上下文关联的要求。