把你学过的两条能力摆一起,缺口就露出来了:
只会推理(CoT):在脑子里一步步想,但取不到外部信息、想错了也没东西纠正它——容易一本正经地飘。 只会行动(纯调工具):能搜、能调 API,但没脑子规划——不知道先做什么、为什么做、出错了怎么办。 RAG 介于之间,但它只在开头检索一次,多跳任务(答案要查好几轮、且后一轮查什么取决于前一轮结果)就不够用。 能不能让模型:想一下 → 据此去做一个动作 → 看到结果 → 再想 → 再做……?
| 环节 | 是什么 | 来自你学过的 |
|---|---|---|
| Thought(思考) | 模型写一段推理:我现在知道啥、还缺啥、下一步该做什么 | 就是 CoT,只是嵌进了循环 |
| Action(行动) | 模型发起一个动作:搜索、查库、调 API、计算…… | 工具调用(下一课 Toolformer 讲它怎么学来的) |
| Observation(观察) | 动作的结果回到上下文,成为下一步推理的输入 | 像 RAG 的「增强」,但每轮都来一次 |
模型不停地 想 → 做 → 看:每看到一个新 Observation,就把它纳入推理、决定下一个 Action,直到 Thought 判断「信息够了」,才输出最终答案。 和 RAG 的根本区别——RAG 是「先检索一次,再答」;ReAct 是「检索/行动多次,每次由推理决定下一步」。检索这件事,从固定的前置步,变成了模型在循环里主动控制的动作。
论文标题里的 Synergizing 是题眼——不是「推理 + 行动」简单相加,而是两者互相补对方的命门。
| 方向 | 说明 |
|---|---|
| ① 推理 → 引导行动 | Thought 决定该调哪个工具、为什么、参数是啥,能拆解任务、规划顺序、处理异常(搜不到就换个词再搜)。没有推理的行动是瞎做。 |
| ② 行动 → 给推理接地 | Observation 把真实外部信息灌回推理,让后续思考建立在事实上而非凭空——这正好补上 CoT「闭门空想会飘」的命门。没有行动的推理是空想。 |
CoT 单独用:会推理但无依据,容易幻觉;纯行动单独用:能动手但不会规划,乱撞。 ReAct 把它们咬合成一个循环:推理让行动有章法,行动让推理有依据。 在知识问答、网页操作、决策任务上,ReAct 全面超过「只推理」和「只行动」——这就是「协同」的实证。
一个要「查两轮」才能答的问题(后一轮查什么,取决于前一轮的结果)。点两边,看纯 CoT 怎么凭记忆冒险、ReAct 怎么边想边查、步步接地。
看出门道了吗:ReAct 把「我还缺什么 → 去查 → 拿到 → 再想下一步缺什么」走成了一条接地的链。每一步答案都锚在 Observation 上,而不是赌模型记得对。多跳、可纠错、能停在「够了」——这就是 agent 在干的事。
| 维度 | 只推理(CoT) | 只行动(纯工具) | ReAct |
|---|---|---|---|
| 能取外部信息吗 | 不能 | 能 | 能 |
| 会规划/处理异常吗 | 会想但落不了地 | 不会 | 会(Thought 主导) |
| 幻觉 | 高(无接地) | — | 低(Observation 接地) |
| 多跳任务 | 差 | 差 | 强 |
| 关系 | 说明 |
|---|---|
| = CoT + 工具,循环化 | Thought 就是 CoT,加上 Action/Observation 并反复迭代 |
| = RAG 的升级 | RAG 检索一次;ReAct 由模型在循环里决定何时查、查什么、要不要再查(这就是「agentic RAG」) |
| = agent 循环骨架 | 今天所有 function-calling / 工具 agent 的「想-做-看」主循环,模板源于此 |
⚠️ ReAct 的真实坑(你调 agent 一定撞过):死循环(反复做同一个无效动作)、不肯停(信息够了还在查)、选错工具/参数、Observation 太长淹没上下文。这些问题大多出在 Thought 的质量——agent 强不强,很大程度是「两个动作之间它想得好不好」。
🔮 收官在即:ReAct 讲的是用工具的推理循环,下一课 P21 Toolformer 讲模型怎么自己学会「该在哪调工具、怎么调」——function calling 的由来。两课合起来,就是你 agent 的完整底座。
| 你工作里的东西 | 其实就是这篇论文的什么 |
|---|---|
| 语音客服 agent 的「听 → 想 → 调工具/查资料 → 据结果应答 → 再听」 | 就是 ReAct 循环:Thought(想)+ Action(调工具)+ Observation(结果)反复迭代——每个对话式 agent 搭的都是这套 |
| 你想让 agent「先查知识库再回答」,且能多查几轮 | 就是 agentic RAG:把 RAG 的一次性检索,变成模型在循环里自己决定何时检索、要不要追查 |
| 你的 agent function calling / 工具编排 | ReAct 是其推理骨架:每次工具调用前那段「为什么调、调哪个」的 Thought,决定编排质不质量 |
| 你的 agent 死循环、不停、乱调工具这些 bug | 都是 ReAct 的经典失败模式——多在 Thought 环节修(让它显式判断「是否已够/是否在重复/该不该停」),而非加更多工具 |
| 「agent 质量到底取决于啥」 | 很大程度是「两个动作之间的推理质量」——所以 CoT 的功夫(先想后做、显式推理)直接决定 agent 上限 |
把这一课接到你真实工作上的几个关键问。点开看答。
这些几乎都是 Thought 环节没管住,对应几招:① 设最大步数上限(兜底,到了强制收尾);② 让 Thought 显式自检——每轮要它回答「我是否已有足够信息?这个动作和上一步是否重复?该不该停?」;③ 把历史动作/观察喂进上下文,让它「看得见自己做过啥」,否则会失忆地重复;④ 给明确的停止条件(什么算「答完了」)。
根因心智:agent 的循环控制力住在 Thought 里。与其加更多工具,不如把「该不该继续」的判断写进每一步推理。死循环往往是「它不知道自己已经试过了」或「没人告诉它什么时候算完」。
没过时——function calling 是 ReAct 的「产品化封装」,骨架还是它。早期 ReAct 靠 prompt 让模型按 Thought/Action/Observation 格式输出、再由外层代码解析执行。现在模型被训得能直接结构化地吐出工具调用(function calling),把「Action」标准化了——但「想一步→调工具→拿结果→再想」的循环一模一样。
所以理解 ReAct 仍是理解 agent 的钥匙:function calling 只是让 Action 那步更干净,Thought(要不要调、调哪个、看完结果怎么办)和整个循环逻辑还得你来设计。多数 agent 框架(LangChain agent、各家 SDK 的 agent loop)骨子里都是 ReAct。
会,这是 agent 的真实成本陷阱。每轮 Thought + Observation 都累加进上下文,多跑几轮,token、延迟、钱都线性涨(还可能「迷失在中间」)。尤其 Observation 可能很长(一整页搜索结果、一大段 API 返回),几轮就把窗口撑爆。
缓解:① 压缩 Observation(只留相关摘要再入上下文,别原样塞);② 限制步数 / 早停;③ 阶段性总结(把前几轮压成一段记忆,丢掉原始细节);④ 对延迟敏感的实时语音场景(比如语音客服 agent),更要控轮数、用更快的工具、把重活挪到不卡用户的环节——这是 CoT「想得多=慢而贵」取舍在 agent 上的放大版。
王阳明提「知行合一」,正是为治两种病,和本课命门几乎同一句话:
| 王阳明的病 | ReAct 的命门 |
|---|---|
| 冥行妄作(懵懂任意去做、不思省察) | 没有推理的行动是瞎做 |
| 悬空思索(空想揣摸、不肯躬行) | 没有行动的推理是空想 |
更妙:王阳明「知是行之始,行是知之成」对应 ReAct 循环——Thought(知)启动 Action(行),Observation 把结果灌回、完成并校正下一轮的知(「知→行→知之成→再知」);「事上磨练」≈「行动给推理接地」。
一处别画等号:王阳明主张知行本是一体(取消二元),ReAct 是把两个分开的步骤交替咬合(弥合二元);且王阳明的「知」是良知(讲成人),ReAct 的「知」是工具理性(讲办事)。精神一致、内核不同。但作记忆锚足够:ReAct = 用「想-做-看」循环,治「只知不行(幻觉)」和「只行不知(乱撞)」两种病。
读原典:Yao et al. — ReAct: Synergizing Reasoning and Acting in Language Models(2022)。
配套回看:CoT(Thought 的来源) + RAG(Observation/检索的来源)——ReAct 是这两块的循环化合体。
只剩最后一篇了!下一课 P21 Toolformer:模型怎么自己学会在合适的地方调用工具(function calling 的由来)——读完,21 篇全通关。
参考:
Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models, 2022.