LangChainAgent怎么编写

wen python案例 2

LangChain Agent 编写全攻略(2024实战版)

目录导读

  1. Agent 是什么?为什么需要它?
  2. 环境准备与核心概念速览
  3. 三种主流 Agent 类型与选择策略
  4. 实战:编写一个会搜索+计算的金融助手
  5. 进阶技巧:记忆系统、错误处理与工具封装
  6. 常见问题与调优 FAQ

Agent 是什么?为什么需要它?

在传统 LLM 应用中,你问“今天天气如何”,模型只能根据训练数据回答,无法实时查询。Agent(智能体) 赋予 LLM 调用外部工具的能力:搜索网页、执行代码、查询数据库,甚至控制硬件。

LangChainAgent怎么编写

通俗比喻: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-communityRateLimiter
  • 开启日志审计:记录每次Agent的思考链和工具调用
  • 使用回调函数实时推送进度条

总结与推荐学习资源

编写Agent的本质是通过Prompt定义决策逻辑,通过Tools扩展能力边界,关键三原则:

  1. 工具描述要像写给小孩看(具体、带示例)
  2. Prompt不仅要告诉做什么,还要告诉怎么做(给出决策树)
  3. 务必加迭代限制(防止无限火车事故)

推荐进一步实践

  • 尝试让Agent同时调用 requests 库和 pandas(分析数据)
  • 构建一个能控制智能家居设备的Agent(需加上 datetime 工具判断时间)

SEO关键词提示:本文适合的搜索意图是“LangChain Agent 教程代码”、“如何编写Agent”、“AI智能体实战”,已在标题、小标题、代码块中自然植入,符合Google BERT算法对上下文关联的要求。

抱歉,评论功能暂时关闭!