尧图精选

【三个月 AI Agent 实战学习】Day 24 详细展开:第一个 Agent —— 使用 LangChain 构建数学专家

🕒 发布时间:2026/10/2 17:24:37 📁 来源:尧图网络
Day 24 详细展开第一个 Agent —— 使用 LangChain 构建数学专家欢迎来到第二十四天昨天我们手动管理了工具调用的循环虽然可行但代码较为繁琐。今天我们将使用 LangChain 提供的create_react_agent和AgentExecutor来构建一个真正的 Agent它会自动处理 Thought-Action-Observation 循环我们只需定义好工具和模型即可。通过这个项目你将体会到框架带来的巨大便利并理解 Agent 执行器的内部机制。一、今日学习目标理解 LangChain 中 Agent 的组成模型、工具、提示词模板、执行器。掌握使用create_react_agent创建 ReAct 风格的 Agent。学会使用AgentExecutor运行 Agent并获取最终结果和中间步骤。通过给 Agent 配备计算器和搜索工具观察它如何自主决定调用哪个工具、如何处理多步任务。对比手动 ReAct 循环与框架实现的差异理解抽象的价值。二、详细实现步骤步骤 1环境准备确保已安装langchain、langchain-openai、langchain-community如果使用搜索工具需要。今天我们将使用一个简单的模拟搜索工具不依赖外部 API。如果尚未安装执行pipinstalllangchain langchain-openai新建first_agent.py导入所需模块importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain.agentsimportcreate_react_agent,AgentExecutorfromlangchain_core.promptsimportPromptTemplate load_dotenv()# 初始化模型llmChatOpenAI(modeldeepseek-chat,api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com,temperature0.1)步骤 2定义工具我们定义两个工具calculator计算器和search模拟搜索。沿用昨天的风格确保 docstring 清晰。tooldefcalculator(expression:str)-str:计算数学表达式支持加减乘除和括号。输入为字符串格式的数学表达式返回计算结果。try:allowedset(0123456789-*/(). )ifnotset(expression).issubset(allowed):return错误表达式包含非法字符resulteval(expression)returnstr(result)exceptExceptionase:returnf错误{e}tooldefsearch(query:str)-str:搜索信息输入关键词或问题返回相关答案。knowledge{北京天气:北京今天晴26°C湿度 40%。,中国首都:中国的首都是北京。,人工智能:人工智能是计算机科学的一个分支研究如何让机器模拟人类智能。,深度学习:深度学习是机器学习的一个子集基于人工神经网络。}forkey,valueinknowledge.items():ifkeyinquery:returnvaluereturn未找到相关信息。步骤 3创建 ReAct 提示词模板LangChain 的create_react_agent需要一个包含特定变量的提示词模板。这些变量包括tools、tool_names、agent_scratchpad和input。我们可以使用 LangChain 自带的hub拉取标准 ReAct 提示词也可以手动定义。为了更直观我们手动构造一个中文的提示词模板。react_template你是一个智能助手可以通过调用工具来回答用户问题。你可以使用以下工具 {tools} 工具名称列表{tool_names} 使用以下格式进行推理和行动 问题用户提出的问题 思考你应该思考接下来要做什么 行动要使用的工具名称必须是 [{tool_names}] 中的一个 行动输入传递给工具的输入 观察工具返回的结果 ...这个思考/行动/行动输入/观察可以重复 N 次 思考我现在知道最终答案了 最终答案对用户问题的最终回答 开始 问题{input} 思考{agent_scratchpad}promptPromptTemplate.from_template(react_template)关键变量说明{tools}工具的描述文本由 LangChain 自动填充。{tool_names}工具名称列表帮助模型知道有哪些工具可用。{agent_scratchpad}中间步骤存储区域模型在循环中会不断更新此处的思考与行动记录。{input}用户输入的问题。步骤 4创建 Agent使用create_react_agent将模型、工具和提示词模板组合起来agentcreate_react_agent(llm,tools,prompt)该函数返回一个 Runnable它能够根据输入生成下一步的行动或最终答案。步骤 5创建 AgentExecutor 并运行AgentExecutor负责执行 Agent 的循环调用 Agent 获取行动执行工具将观察结果反馈给 Agent直到得到最终答案。agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,# 打印中间步骤便于观察handle_parsing_errorsTrue,# 自动处理格式错误max_iterations5# 防止死循环)verboseTrue会在控制台输出 Agent 的每一步思考、行动和观察非常有助于调试。测试运行resultagent_executor.invoke({input:请帮我计算 (12 7) * 3然后搜索一下北京天气})print(最终答案,result[output])步骤 6观察运行过程运行脚本你会看到类似以下的输出简化 Entering new AgentExecutor chain... 思考我需要同时进行计算和搜索。先计算数学表达式再搜索天气。 行动calculator 行动输入(12 7) * 3 观察57 思考计算结果是57。接下来搜索北京天气。 行动search 行动输入北京天气 观察北京今天晴26°C湿度 40%。 思考我已经得到了所有信息。 最终答案计算结果是57北京今天晴26°C湿度 40%。 Finished chain. 最终答案计算结果是57北京今天晴26°C湿度 40%。Agent 自动完成了多步工具调用并正确整合了结果。步骤 7处理解析错误和边界情况AgentExecutor提供了handle_parsing_errorsTrue当 Agent 输出格式不符合预期时它会尝试自动修复将错误信息反馈给 Agent。这比我们昨天手动处理要方便得多。我们还可以测试一个需要多轮修正的问题例如故意让计算器返回错误观察 Agent 如何应对# 修改 calculator 工具在表达式包含字母时返回错误# 已有的逻辑会返回错误信息resultagent_executor.invoke({input:请计算 abc 5})print(result[output])Agent 会先调用计算器得到错误信息然后可能会重新尝试或给出无法计算的答案。步骤 8对比手动 ReAct回顾 Day 19/22 我们手动编写的 ReAct 循环对比今天的代码方面手动 ReActLangChain Agent循环管理自己写 while 循环解析 Action执行工具追加 ObservationAgentExecutor自动完成格式错误处理需要自己检测并提醒模型handle_parsing_errorsTrue自动处理工具描述注入手动拼接工具描述自动从工具对象生成中间步骤存储手动维护消息列表自动管理agent_scratchpad代码量较长很少框架大大简化了开发让我们能够专注于工具设计和业务逻辑。三、常见问题与调试Q1create_react_agent提示找不到变量。→ 确保提示词模板中包含所有必需变量tools、tool_names、agent_scratchpad、input。变量名必须完全一致。Q2Agent 输出的“行动输入”格式不对比如包含多余引号或换行。→ 启用handle_parsing_errorsTrue可以缓解。也可以降低温度或在提示词中强调格式。如果问题严重可以考虑自定义输出解析器但今天先依赖默认处理。Q3Agent 陷入循环不断调用工具却不给出最终答案。→ 设置max_iterations限制最大步数并在提示词中加入“当你拥有足够信息时请立即输出最终答案”。另外检查工具描述是否让模型误以为需要更多信息。Q4如何查看 Agent 的中间步骤Thought/Action→ 设置verboseTrue即可在控制台打印。如果需要编程获取中间步骤可以使用return_intermediate_stepsTrue参数返回结果中会包含intermediate_steps列表。Q5能否使用 LangChain Hub 上的标准 ReAct 提示词→ 可以。使用from langchain import hub; prompt hub.pull(hwchase17/react)获取英文提示词。对于中文场景自定义模板可能更合适。我们这里手动定义是为了深入理解。Q6AgentExecutor的handle_parsing_errors是如何工作的→ 当解析器无法从模型输出中提取有效行动时它会捕获错误并将错误信息作为观察反馈给 Agent让 Agent 重新输出。这相当于自动重试机制。四、今日总结与作业今天你完成了✅ 使用 LangChain 的create_react_agent和AgentExecutor构建了第一个 Agent。✅ 理解了 Agent 的组成模型、工具、提示词、执行器。✅ 观察了 Agent 自主进行多步工具调用的过程体验了框架的便利。✅ 学会了如何处理解析错误和限制循环次数。今日作业必做修改提示词模板加入更多约束例如“如果问题不需要工具直接给出最终答案”测试 Agent 在闲聊场景下的表现。为 Agent 添加第三个工具get_time返回当前时间无参数测试用户提问“现在几点了”和“请计算 5*6 并且告诉我现在的时间”观察 Agent 是否能同时调用多个工具。设置return_intermediate_stepsTrue运行同一个问题打印出所有中间步骤包括工具名称、输入、输出理解 Agent 的完整执行轨迹。思考如果要让 Agent 使用外部搜索 API如 DuckDuckGo你需要如何修改工具定义请写出伪代码或说明。明日预告我们将深入 Agent 的思考过程学习如何通过日志和回调函数调试 Agent掌握解析器的工作原理为构建更复杂的 Agent 奠定基础。有任何问题欢迎随时提问
上一篇/下一篇内容由系统自动关联 返回资讯列表 →