拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

番外A2-用LangChain框架实现ReAct Agent

番外A2-用LangChain框架实现ReAct Agent 文章目录项目概述Agent与链的区别工具与工具包Agent的武器库今天要聊什么项目结构核心文件说明1. 工具定义 - tools.py tool装饰器怎么用工具说明2. Agent配置 - agent.py ⚙️ReAct Prompt模板Prompt占位符说明Agent创建函数配置说明ReAct模式到底怎么工作3. 入口程序 - main.py 运行示例环境要求安装依赖配置环境变量扩展示例查询其他水果价格复杂计算扩展建议 工具扩展Agent优化文档信息创建时间2026-01-22作者zuozewei功能使用LangChain框架实现ReAct Agent技术栈Python、LangChain、OpenAI API、DeepSeek源代码https://github.com/zuozewei/blog-example/tree/master/AI-LLM项目概述这是一个使用LangChain框架实现ReAct Agent的完整示例项目展示如何创建能够调用工具的智能Agent。Agent可以处理需要多步骤推理和工具调用的复杂问题。Agent与链的区别Agent和链最大的区别在于执行方式。链是线性的一步接一步走完就结束而Agent是动态的它会根据执行结果自己决定下一步该干什么。这就需要AgentExecutor来负责循环调度让大模型不断思考、行动、观察直到得出最终答案。这种机制让Agent能处理更复杂的任务自主决策、动态调整执行路径。工具与工具包Agent的武器库在Agent的架构中工具Tool和工具包Toolkit是核心概念工具Tool负责与模型交互其输入由模型产生输出会回传给模型。工具是Agent执行具体任务的载体。工具包Toolkit一组相关的工具集合提供特定领域的完整解决方案。开发一个Agent很多时候就是在开发工具和集成工具。学习编写工具是构建基于LangChain的Agent的关键点。LangChain社区提供了大量的工具可以用它们来改造代码实现新的Agent。今天要聊什么最近在项目中用LangChain搭了个Agent踩了不少坑也总结了一些经验。这篇文章会带你从零开始实现一个ReAct Agent重点分享工具的定义和使用 - 使用tool装饰器将普通函数转换为Agent可调用的工具提示词的构建 - 设计ReAct模式的Prompt模板指导Agent的推理过程Agent的组装 - 集成工具和LLM创建完整的Agent执行器Agent的执行过程 - 通过示例展示Agent如何询问水果单价、计算总价等具体步骤AgentExecutor的作用 - 介绍如何使用执行器来运行Agent并输出结果项目结构使用LangChain框架实现ReAct Agent/ ├── tools.py # 工具定义 ├── agent.py # Agent配置 ├── main.py # 入口程序 └── .env # 环境变量配置核心文件说明1. 工具定义 - tools.py 使用LangChain的tool装饰器将普通函数转换为Agent可调用的工具。fromlangchain_core.toolsimporttooltooldefcalculate(expression:str)-float:执行计算并返回结果 - 使用 Python 语法,必要时请使用浮点数语法returneval(expression)tooldefask_fruit_unit_price(fruit:str)-str:询问水果的价格fruitfruit.strip()iffruit.casefold()in[apple,苹果]:return苹果单价是 10元/公斤iffruit.casefold()in[banana,香蕉]:return香蕉单价是 6元/公斤returnf{fruit}单价是 20元/公斤tool装饰器怎么用tool装饰器会自动把函数转换成Agent能识别的工具函数名→ 工具名称建议用英文方便模型理解Docstring→ 工具描述这里很关键模型靠这个判断什么时候用哪个工具参数类型注解→ 工具参数schema一定要写对否则模型传参会报错⚠️踩坑提醒Docstring写得太模糊会导致模型乱用工具比如计算函数就不如执行数学表达式计算准确。工具说明calculate: 执行数学表达式计算使用Python的eval机制安全警告生产环境千万别直接用eval这里只是演示用。实际项目建议用ast.literal_eval或者专门的数学表达式解析库否则会被注入恶意代码。ask_fruit_unit_price: 查询水果单价支持中英文水果名称apple/苹果、banana/香蕉其他水果默认价格为20元/公斤2. Agent配置 - agent.py ⚙️使用LangChain框架创建ReAct模式的Agent执行器集成自定义工具并配置LLM参数。importosimportdotenvfromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain_core.promptsimportPromptTemplatefromlangchain_openaiimportChatOpenAIfromtoolsimportcalculate,ask_fruit_unit_priceReAct Prompt模板promptPromptTemplate.from_template(Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Question: {input} Thought:{agent_scratchpad})Prompt占位符说明{tools}: 可用工具列表及其描述{tool_names}: 工具名称列表{input}: 用户输入的问题{agent_scratchpad}: 存储推理历史Thought/Action/Observation序列Agent创建函数defcreate_agent()-AgentExecutor:创建ReAct Agent执行器dotenv.load_dotenv()llmChatOpenAI(openai_api_keyos.getenv(OPENAI_API_KEY),openai_api_baseos.getenv(OPENAI_API_BASE),modelos.getenv(AI_MODEL,deepseek-chat),temperature0.1,# 推理场景使用低temperature保证确定性)tools[calculate,ask_fruit_unit_price]agentcreate_react_agent(llmllm,toolstools,promptprompt)returnAgentExecutor(agentagent,toolstools,verboseTrue# 打印详细执行过程)配置说明LLM参数配置temperature0.1: 推理任务一定要用低温度我试过用0.7模型有时候会瞎猜工具导致循环次数暴涨。建议0-0.2之间model: 默认用deepseek-chat性价比不错。如果你追求效果可以换GPT-4但成本会高10倍以上max_tokens: 建议设个上限防止模型陷入死循环疯狂输出我遇到过一次跑了5000 tokens的情况…成本优化每次Agent调用都会消耗不少tokens建议先在本地用小模型测试确认逻辑没问题再上生产。AgentExecutor参数agent: ReAct Agent实例tools: 工具列表verboseTrue: 打印详细执行过程便于调试生产环境建议关闭ReAct模式到底怎么工作ReActReasoning Acting说白了就是让模型边想边做。举个例子问它3公斤苹果和2公斤香蕉多少钱它会这么思考Thought: 我得先查苹果和香蕉的单价Action: 调用ask_fruit_unit_price工具Action Input: 苹果Observation: 苹果单价是10元/公斤Thought: 现在查香蕉价格Action: 调用ask_fruit_unit_price工具Action Input: 香蕉Observation: 香蕉单价是6元/公斤Thought: 知道价格了现在计算总价Action: 调用calculate工具Action Input: 3 * 10 2 * 6Observation: 42Thought: 算出来了可以回答了Final Answer: 总共42元这个过程会一直循环直到模型觉得我知道答案了才停止。3. 入口程序 - main.py fromagentimportcreate_agentif__name____main__:# 创建Agentagentcreate_agent()# 执行Agentresultagent.invoke({input:3公斤苹果和2公斤香蕉的总价格是多少?})# 打印结果print(result)运行示例执行程序后输出如下Entering new AgentExecutor chain... 我需要计算总价格。首先我应该找到苹果和香蕉的单价。 Thought: 我需要找到苹果的单价 Action: ask_fruit_unit_price Action Input: 苹果 Observation: 苹果单价是10元/公斤 Thought: 现在我需要找到香蕉的单价 Action: ask_fruit_unit_price Action Input: 香蕉 Observation: 香蕉单价是6元/公斤 Thought: 我已经知道了两种水果的价格。苹果是10元/公斤香蕉是6元/公斤。现在我需要计算总成本3公斤苹果和2公斤香蕉。 Action: calculate Action Input:3*102*6Observation:42Thought: 我现在知道最终答案了 Final Answer:3公斤苹果和2公斤香蕉的总价格是42元。Finished chain.{input:3公斤苹果和2公斤香蕉的总价格是多少?,output:3公斤苹果和2公斤香蕉的总价格是42元。}环境要求Python 3.8LangChainOpenAI API Key或兼容的API如DeepSeek安装依赖pipinstalllangchain langchain-openai langchain-core python-dotenv配置环境变量创建.env文件OPENAI_API_KEYyour_api_key_hereOPENAI_API_BASEhttps://api.deepseek.com/v1# 或其他兼容的API端点AI_MODELdeepseek-chat扩展示例查询其他水果价格resultagent.invoke({input:5公斤橙子多少钱?})复杂计算resultagent.invoke({input:如果我买2公斤苹果和3公斤香蕉,并且有10%的折扣,我需要付多少钱?})扩展建议 工具扩展添加输入验证防止eval执行危险代码实现更多实用工具搜索、API调用、文件操作等添加工具使用日志和错误处理Agent优化调整Prompt模板优化Agent推理能力添加更多工具扩展Agent能力范围实现自定义Agent类型满足特定需求添加回调函数监控Agent执行过程评论区聊聊你在项目中用过Agent吗遇到过什么坑课后挑战试着给Agent加一个汇率查询工具让它能计算美元换人民币
返回列表