【三个月 AI Agent 实战学习】Day 24 详细展开:第一个 Agent —— 使用 LangChain 构建数学专家
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 奠定基础。有任何问题欢迎随时提问

相关新闻

Unity 中文句子转拼音方法(能识别多音字、声调)

Unity 中文句子转拼音方法(能识别多音字、声调)

实现思路:使用 DotNetG2P.Chinese 打开 https://www.nuget.org/packages/DotNetG2P.Chinese 下载nupkg包并解压,在lib文件夹得到:DotNetG2P.Chinese.dll 放入Unity 即可。 备用链接:https://pan.baidu.com/s/1fQIMkrx9z-vTuXQ6…

2026/10/2 17:24:41 阅读更多 →
Vue/Nuxt 设计系统提取指南:基于 stitch-skills extract-design-md 从源码逆向出 DESIGN.md

Vue/Nuxt 设计系统提取指南:基于 stitch-skills extract-design-md 从源码逆向出 DESIGN.md

AI 技能AI 插件 【免费下载链接】stitch-skills A library of Agent Skills designed to work with the Stitch MCP server. Each skill follows the Agent Skills open standard, for compatibility with coding agents such as Antigravity, Gemini CLI, Claude Code, Cursor…

2026/10/2 17:24:41 阅读更多 →
一线观察多年,我看到江浙沪3-18岁青少儿心理服务的适配边界

一线观察多年,我看到江浙沪3-18岁青少儿心理服务的适配边界

我扎在江浙沪3-18岁青少儿心理这个赛道摸了快5年,跑过不下三四十所学校,接触过近千个家庭,最近很多人问我,怎么找适配的心理服务,其实我最先想说的是,大部分人到现在都还没搞懂这个赛道的真实适配边界。先聊…

2026/10/2 17:23:41 阅读更多 →

最新新闻

文献综述怎么写?paperxie三步填空法:从骨架到打磨的完整拆解

文献综述怎么写?paperxie三步填空法:从骨架到打磨的完整拆解

说实话,我见过太多人把文献综述写成“文献摘要大合集”:一篇综述交上来,一千字里能出现二十个“某某学者指出”,每段都是“A认为……B认为……C认为……”,读完全文记不住作者自己到底想说啥。本科 5000 字综述往往不是…

2026/10/2 17:58:59 阅读更多 →
RabbitMQ Connection 与 Channel 底层原理深度解析

RabbitMQ Connection 与 Channel 底层原理深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:58:59 阅读更多 →
TypeScript 工具类型实战:Record、Partial、Omit 组合应用与避坑指南

TypeScript 工具类型实战:Record、Partial、Omit 组合应用与避坑指南

去年接手一个中后台项目时,我发现自己每天都在做同一件无聊的事:定义一个User接口,再定义一个UserForm,然后是UserUpdateParams,字段几乎一样,只是多了几个问号、少几个字段。代码又臭又长,改一…

2026/10/2 17:58:59 阅读更多 →
Hetty 安全研究 HTTP 工具包:开源 MITM 代理、流量拦截与重放全指南

Hetty 安全研究 HTTP 工具包:开源 MITM 代理、流量拦截与重放全指南

网络安全应用安全 【免费下载链接】hetty An HTTP toolkit for security research. 项目地址: https://gitcode.com/GitHub_Trending/he/hetty 点击查看 免费下载 导读 Hetty 是一款面向安全研究(security research)的 HTTP 工具包&#xf…

2026/10/2 17:58:59 阅读更多 →
灵犀 AI Agent 多模型接入实战:用 TaoToken 统一 Key 打通智能体工厂

灵犀 AI Agent 多模型接入实战:用 TaoToken 统一 Key 打通智能体工厂

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:58:59 阅读更多 →
CCS嵌入式开发效率提升:代码补全与快捷键优化实战指南

CCS嵌入式开发效率提升:代码补全与快捷键优化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:57:58 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →