LangChain ReAct Agent实战:从零构建一个能思考会行动的智能体

📅 2026/7/14 12:37:29
LangChain ReAct Agent实战:从零构建一个能思考会行动的智能体
1. 认识LangChain ReAct Agent当AI学会边想边做想象一下你正在教一个实习生完成市场调研任务。优秀的实习生不会直接给你答案而是会先思考我需要先查行业报告再联系几家供应商比价最后整理成表格。这正是ReAct Agent的工作方式——它让AI像人类一样先规划再行动而不是机械地生成文本。LangChain中的ReAct Agent由三个核心部件组成大脑LLM通常是GPT-4或Claude这类大模型负责思考决策工具集Tools就像实习生的调研工具包可能包含搜索引擎、计算器、数据库查询等执行引擎AgentExecutor负责协调思考与行动的循环流程我最近用这个技术帮朋友做了个智能购物助手。当用户问3件T恤加2条牛仔裤总价多少时Agent会调用商品查询工具获取单价使用计算器工具进行运算最后生成带优惠建议的完整回复2. 搭建开发环境五分钟快速起步在开始编码前我们需要准备以下工具pip install langchain langchain-openai python-dotenv建议在项目根目录创建.env文件存储API密钥OPENAI_API_KEY你的密钥 OPENAI_API_BASEhttps://api.deepseek.com/v1 # 国内可用替代端点这里有个实用技巧使用temperature0.1能让Agent的决策更稳定。我在早期测试时曾设为0.7结果Agent经常突发奇想调用错误工具比如用计算器工具查询天气。基础配置代码示例from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os load_dotenv() llm ChatOpenAI( modeldeepseek-chat, temperature0.1 # 降低随机性 )3. 定义智能体的双手工具开发实战工具(Tool)是Agent与真实世界交互的接口。去年我帮电商客户开发库存管理系统时就为Agent定制了这些工具价格查询工具关键代码from langchain_core.tools import tool tool def query_product_price(product_name: str) - float: 查询商品单价输入应为商品全称 price_map { T恤: 99.9, 牛仔裤: 199.0, 运动鞋: 299.0 } return price_map.get(product_name, 0.0)折扣计算工具tool def calculate_discount(total: float, discount: float) - float: 计算折后价格示例calculate_discount(100, 0.1)返回90 return total * (1 - discount)开发工具时我踩过两个坑描述不准确曾把工具描述为处理价格计算结果Agent把运费计算也塞进来缺少类型提示没有声明参数类型时Agent常会传入错误格式建议每个工具都像这样写文档字符串【明确功能】 查询商品当前库存量 参数 - product_id: str 商品SKU编号 返回 int 可用库存量缺货返回0 4. 组装智能大脑Agent初始化详解完整的Agent构建流程就像组装乐高准备工具包tools [query_product_price, calculate_discount]设计提示词模板from langchain_core.prompts import PromptTemplate prompt PromptTemplate.from_template( 你是一个专业的购物助手请用中文回答。 可用工具{tools} 按照以下格式响应 问题用户的问题 思考你的分析过程 行动要调用的工具名 行动输入工具参数 观察工具返回结果 ...循环直到解决问题 最终答案给用户的完整回复 当前问题{input} {agent_scratchpad} # 这里会自动填充历史记录 )创建Agent执行器from langchain.agents import create_react_agent, AgentExecutor agent create_react_agent(llm, tools, prompt) agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 调试时建议开启 max_iterations5 # 防止无限循环 )这里有个性能优化技巧使用ConversationBufferMemory可以让Agent记住对话历史。有次用户连续问T恤价格和搭配什么裤子没有记忆功能的Agent就像金鱼一样每次都重新开始。5. 实战演示拆解购物咨询案例让我们看一个完整的工作流程。当用户询问买2件T恤和1条牛仔裤会员能打8折吗Agent的执行日志会显示 进入思考链... 思考需要先获取T恤和牛仔裤的单价 行动query_product_price 行动输入T恤 观察99.9 思考还需要牛仔裤价格 行动query_product_price 行动输入牛仔裤 观察199.0 思考计算总价(2*99.9 199) 398.8 行动calculate_discount 行动输入398.8, 0.2 观察319.04 最终答案2件T恤和1条牛仔裤原价398.8元会员折后319.04元我在测试中发现几个常见问题及解决方案工具选择错误通过优化工具描述加入不要用于...的说明参数格式错误在工具中添加输入验证循环卡死设置max_iterations并添加超时监控6. 高级技巧让Agent更智能的秘诀经过多个项目的实战我总结出这些提升Agent表现的方法1. 少样本学习Few-shot Learning在提示词中加入示例能显著提高工具调用准确率。比如示例1 问题3个苹果多少钱 思考需要查询苹果单价 行动query_price 行动输入苹果 观察5.0/个 最终答案共15元2. 错误处理机制为工具添加try-catch块我常用这个模板tool def safe_query(参数): try: # 正常逻辑 except Exception as e: return f工具执行失败{str(e)}3. 混合工具策略简单任务用单一工具复杂任务启用多工具协作。就像我开发的客服Agent商品咨询 → 知识库工具订单查询 → 数据库工具投诉处理 → 工单系统工具4. 实时监控看板用LangSmith搭建监控系统跟踪工具调用成功率平均思考步数Token消耗分析7. 避坑指南我踩过的那些坑在开发旅游规划Agent时曾遇到这些典型问题问题1无限循环现象Agent反复查询相同信息 解决在AgentExecutor中添加early_stopping_methodgenerate # 当连续两次生成相同Action时停止问题2工具过载现象简单计算也调用外部API 优化为LLM添加工具使用规范优先使用内置计算能力仅在需要实时数据时调用工具问题3敏感操作教训曾有Agent意外执行了删除操作 防护措施tool def delete_item(id): 【危险操作】需要二次确认 if not confirm(确定删除): raise Exception(操作已取消)这些经验让我意识到好的Agent设计强大能力安全护栏。就像教孩子骑车既要放手让他尝试又要准备好保护措施。