第2周·第2讲|ReAct:如何交替获取信息与采取行动
本讲目标理解工具返回的新信息怎样改变下一步行动。一、为什么有了循环还需要理解 ReAct上一讲解决的是程序如何不断接收响应、执行工具并在适当的时候停止但循环本身没有回答下一轮应该调用哪个工具还缺什么信息已经获得的信息是否足够例如用户提出查询订单 A102若已发货再查物流到哪里了。程序一开始不知道订单是否存在。是否已经发货。物流单号是什么。这些信息需要通过工具获取。因此合理的后续动作不能只依据最初的问题还要依据实际返回的结果。先查询订单 ↓ 根据订单结果判断下一步 ├─ 待发货 → 说明状态结束 ├─ 已发货且有物流单号 → 查询物流 └─ 已发货但缺少物流单号 → 说明缺失结束ReAct 关注的就是这种“获取信息后再调整下一步”的过程。二、ReAct 的三个核心部分ReAct 来自Reasoning and Acting即推理与行动相结合。经典形式常用下面三个词描述名称含义本例中的表现Thought推理根据目标和已有证据判断还缺什么、下一步做什么订单已发货需要用返回的物流单号继续查询Action行动提出具体工具调用再由程序执行调用query_shipping(T900)Observation观察工具实际返回的信息运输中当前位置为杭州转运中心它们之间的关系是已有目标和信息 ↓ 判断下一步 ↓ 提出行动 ↓ 程序执行工具取得观察 ↓ 根据新观察再次判断 ↓ 继续行动或者回答这里有两个重要边界。第一工具结果必须来自执行过程。模型写出一句“我查到了物流”不能替代实际工具返回。第二终端打印了 Thought、Action、Observation并不能证明发生了真实推理或工具调用。你在第一周已经识别过固定轨迹回放。工程实现也不要求把模型的完整内部推理展示出来。我们主要检查可验证的信息请求了什么工具、返回了什么、下一步是否合理利用了反馈。三、用一个完整过程理解信息依赖本讲的数据中ORDERS { A102: {status: 已发货, tracking_id: T900}, B203: {status: 待发货, tracking_id: None}, }物流数据是SHIPMENTS { T900: { location: 杭州转运中心, delivery_status: 运输中, }, }查询 A102 时会经历三轮轮次此时已有的信息生成的响应执行后新增的信息第1轮用户要求查询订单及物流请求query_order(A102)已发货物流单号为 T900第2轮已知物流单号但还不知道位置请求query_shipping(T900)运输中位于杭州转运中心第3轮已取得需要的信息生成最终回答循环结束这里的关键不是“执行了两个工具”而是第二个工具的参数来自第一个工具的返回结果。第一轮查询之前程序还没有从工具取得T900。不能凭空填一个物流单号。这类关系叫作数据依赖后一步需要前一步的输出作为输入。因此在本例中不能把两次查询简单地同时执行。四、如果观察变了行动也应该变化把订单换成 B203订单工具返回{ ok: True, data: { order_id: B203, status: 待发货, tracking_id: None, }, }此时用户“若已发货再查物流”的条件没有满足合理的下一步是直接说明订单B203待发货暂不查询物流。于是路径缩短为第1轮查订单 第2轮根据待发货状态回答再看第三种情况{status: 已发货, tracking_id: None}它与“待发货”不同。订单已经发货但继续查询所需的参数缺失。合理处理是订单已发货但缺少物流单号无法继续查询物流。不能因为希望完成任务就编造一个物流单号。这三种情况说明停止也可以是合理决策不是只有继续调用工具才算有效行动。五、本地规则模拟与真实 ReAct 有什么区别本讲脚本里的fake_model()使用明确的if分支if data[status] 待发货: return final_answer(...) if data[status] 已发货: tracking_id data.get(tracking_id) if not tracking_id: return final_answer(...) return tool_request( call_002, query_shipping, {tracking_id: tracking_id}, )所以它本质上是一个根据反馈选择分支的规则程序用于模拟 ReAct 的信息流。可以这样比较实现方式下一步怎样产生适合本例的程度固定轨迹回放依次输出预先写好的记录只能展示形式无法验证反馈变化条件工作流程序按明确规则读取结果并选择分支订单与物流规则清楚时很合适模型参与的 ReAct模型根据目标、上下文和观察提出下一步程序负责执行与约束目标、工具选择或信息需求较开放时更有价值当前订单场景本来就可以用规则完成。我们用它是因为数据和路径足够清楚便于你观察机制。以后替换成真实模型时控制程序仍要负责参数校验、工具执行、回填、轮次限制。模型提出的动作也仍然需要检查。六、这份新代码怎么读先按这条顺序阅读main() ↓ fake_model() ↓ execute_tool() ↓ query_order() / query_shipping()对应文件位置位置阅读重点[第115行main (line 115)](/D:/learn/ai-agent-book/chapter1/web-search-agent/lesson_react.py:115)循环、工具执行、观察回填、停止原因[第78行fake_model (line 78)](/D:/learn/ai-agent-book/chapter1/web-search-agent/lesson_react.py:78)根据最新工具结果选择下一步[第43行execute_tool (line 43)](/D:/learn/ai-agent-book/chapter1/web-search-agent/lesson_react.py:43)工具映射、参数检查、超时处理[第22行两个查询函数 (line 22)](/D:/learn/ai-agent-book/chapter1/web-search-agent/lesson_react.py:22)数据如何实际产生有两个接口变化需要先说明。工具注册表现在支持两种能力TOOL_REGISTRY { query_order: (query_order, order_id), query_shipping: (query_shipping, tracking_id), }每个键对应“函数、参数名”这一对信息。function, parameter TOOL_REGISTRY[name]表示把这一对信息分别赋给两个变量。然后function(**args)把参数字典展开为命名参数调用例如query_shipping(tracking_idT900)两个查询函数现在都直接返回统一结果。上一讲的query_order()查不到时返回None再由执行器转换成失败字典。本讲为了让两个工具使用相同接口它们直接返回{ok: True, data: ...}或者{ok: False, error: ...}execute_tool()负责分发与参数检查业务查询函数负责表达自己的查询结果。两种内部划分都可以关键是调用双方遵守同一约定。另外ORDER_ID是本地配置输入用户消息也会根据它生成。模拟器没有从自然语言中识别订单编号。七、本讲集中实践改变观察检查行动我已经验证了这些分支可以运行。现在由你运行和修改观察它们为什么不同。确认 VS Code 当前打开的是lesson_react.py保持MAX_TURNS 3实验 A查询已发货订单顶部设置ORDER_ID A102运行后重点看行动 观察 最终输出 工具调用序列预期工具序列[query_order, query_shipping]实验 B查询待发货订单只修改ORDER_ID B203预期工具序列[query_order]实验 C订单已发货但缺少物流单号先恢复ORDER_ID A102然后在ORDERS中将 A102 改为A102: {status: 已发货, tracking_id: None},运行后检查程序是否仍然调用了物流工具以及最后怎样说明缺失的信息。完成后把物流单号恢复成T900。这次不用粘贴完整历史三组分别提交工具调用序列 最终输出 决定下一步的订单结果字段再用一句话回答为什么实验 B 和 C 都没有查物流但停止的依据不同实验A工具调用序列query_orderquery_shipping最终输出订单A102的物流T900运输中当前位置杭州转运中心。决定下一步的订单结果字段tracking_id实验B工具调用序列query_order最终输出订单B203待发货暂不查询物流决定下一步的订单结果字段status实验C工具调用序列query_order最终输出 订单已发货但缺少物流单号无法继续查询物流。决定下一步的订单结果字段status tracking_id因为状态不同B是待发货没有物流状态是正常的但是C已发货就要有物流状态AI修改:C 缺少“物流查询所需的物流单号”而不是笼统的“物流状态”。

相关新闻

昆山停业企业税务零申报管理一站式流程,闲置老板必读

昆山停业企业税务零申报管理一站式流程,闲置老板必读

昆山很多老板都有过这样一个动作:生意不做了,把营业执照往抽屉里一放,心里想着"反正也没收入,不用交税,放着就放着吧"。 两三年后想重新创业,一查才发现——公司早已被列入税务非正常户&#xff…

2026/10/14 3:31:36 阅读更多 →
苏州个体户转型有限公司,债权债务如何平稳承接?

苏州个体户转型有限公司,债权债务如何平稳承接?

在苏州的大街小巷和产业集群里,很多经营了多年的个体户都走到了转型升级的节点:从常熟服装城做批发生意的个体户,攒下稳定客源之后想升级成商贸有限公司;从张家港开五金加工坊的个体户,订单规模越做越大,下…

2026/10/14 3:31:36 阅读更多 →
Java异常处理全解析:从继承体系到底层原理与最佳实践

Java异常处理全解析:从继承体系到底层原理与最佳实践

1. 先看异常继承体系:一张图理清所有家族成员做Java开发这么多年,我见过太多人在异常处理上翻车。有的是catch了Exception却没处理,日志打出来一堆堆栈却不知道根因在哪;有的是在循环里抛出受检异常,结果编译都过不了&…

2026/10/14 3:31:36 阅读更多 →

最新新闻

【风电功率预测】【多变量输入单步预测】基于TCN-RVM的风电功率预测研究(Matlab代码实现)

【风电功率预测】【多变量输入单步预测】基于TCN-RVM的风电功率预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/14 4:13:48 阅读更多 →
HDR色调映射:对数变换原理、实现与调参优化

HDR色调映射:对数变换原理、实现与调参优化

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

2026/10/14 4:13:48 阅读更多 →
【无人机路径规划】基于粒子群优化和遗传算法的水陆两栖无人机任务规划和执行研究(Matlab代码实现)

【无人机路径规划】基于粒子群优化和遗传算法的水陆两栖无人机任务规划和执行研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/14 4:13:48 阅读更多 →
FPGA面试必考:跨时钟域处理(CDC)核心原理与实战解析

FPGA面试必考:跨时钟域处理(CDC)核心原理与实战解析

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

2026/10/14 4:13:48 阅读更多 →
静磁场数值模拟的常见陷阱与结果验证方法

静磁场数值模拟的常见陷阱与结果验证方法

做电磁场仿真的人一听到“静磁场数值模拟”这几个字,第一反应往往是:这不就是最简单的那一类吗?没有时间项,没有涡流,没有波,方程就那几条,软件一点就能出结果。但我自己的体会恰恰相反。当年我…

2026/10/14 4:13:48 阅读更多 →
Spring Boot整合XXL-JOB:分布式定时任务调度实战指南

Spring Boot整合XXL-JOB:分布式定时任务调度实战指南

1. 先说清楚:为什么Spring Boot项目要引入XXL-JOB前后端项目做多了,你会发现业务里真正难搞的往往不是接口怎么写,而是那些“到点必须跑、跑了不能挂、挂了要重试、多台机器只能跑一份”的定时任务。单机项目用Spring自带的Scheduled当然没问…

2026/10/14 4:12:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →