Learn AI · 模型硬功底(由内而外)
第 21 课 / 经典论文 P20  ·  阶段五:检索与 Agent(Yao et al., 2022)

ReAct:
想一步、做一步、看一步
——AI agent 的循环骨架

你学的两块拼图,各有缺口:CoT 让模型「一步步想」,但想是封闭的——拿不到新信息、还可能越想越飘(无依据);RAG 能取信息,但只在开头检索一次,取完就定死。 可真实任务往往是:你得先想一下、才知道该查什么;查到结果后,再想下一步该干嘛——要边想边做、按需取信息。 这一课 ReAct 把「想」和「做」交错成一个循环,组装出了 agent 的基本形态。它正是语音客服、编程助手这类 agent「感知→思考→行动→再感知」的理论原型:一个会推理、会调工具、会根据结果调整的循环,到底长什么样、为什么这样才work?
一句话:ReAct = 把「推理(Reasoning)」和「行动(Acting)」交错成一个循环。
Thought(想一步)→ Action(做一步,调工具/搜索)→ Observation(看结果)→ Thought → … 直到给出答案。
妙处在相互增强推理决定该做什么动作(规划、拆解、处理异常);动作把真实信息喂回来给推理接地(防幻觉、可纠错)。 这就是现代几乎所有 agent(从编程助手到语音客服)的循环骨架,也是 RAG 从「一次性检索」升级成「模型自己决定何时查、查完再想」的形态。

一、立靶:会想的不会做,会做的不会想

把你学过的两条能力摆一起,缺口就露出来了:

立靶:推理和行动,能不能合一?

只会推理(CoT):在脑子里一步步想,但取不到外部信息、想错了也没东西纠正它——容易一本正经地飘只会行动(纯调工具):能搜、能调 API,但没脑子规划——不知道先做什么、为什么做、出错了怎么办RAG 介于之间,但它只在开头检索一次,多跳任务(答案要查好几轮、且后一轮查什么取决于前一轮结果)就不够用。 能不能让模型:想一下 → 据此去做一个动作 → 看到结果 → 再想 → 再做……?

二、抽框架:Thought → Action → Observation 循环

环节是什么来自你学过的
Thought(思考)模型写一段推理:我现在知道啥、还缺啥、下一步该做什么就是 CoT,只是嵌进了循环
Action(行动)模型发起一个动作:搜索、查库、调 API、计算……工具调用(下一课 Toolformer 讲它怎么学来的)
Observation(观察)动作的结果回到上下文,成为下一步推理的输入RAG 的「增强」,但每轮都来一次
关键:循环,直到「想清楚了」才收尾

模型不停地 想 → 做 → 看:每看到一个新 Observation,就把它纳入推理、决定下一个 Action,直到 Thought 判断「信息够了」,才输出最终答案。 和 RAG 的根本区别——RAG 是「先检索一次,再答」;ReAct 是「检索/行动多次,每次由推理决定下一步」。检索这件事,从固定的前置步,变成了模型在循环里主动控制的动作

三、核心洞察:推理与行动「相互增强」(Synergize)

论文标题里的 Synergizing 是题眼——不是「推理 + 行动」简单相加,而是两者互相补对方的命门

方向说明
① 推理 → 引导行动Thought 决定该调哪个工具、为什么、参数是啥,能拆解任务、规划顺序、处理异常(搜不到就换个词再搜)。没有推理的行动是瞎做。
② 行动 → 给推理接地Observation 把真实外部信息灌回推理,让后续思考建立在事实上而非凭空——这正好补上 CoT「闭门空想会飘」的命门。没有行动的推理是空想。
1 + 1 > 2

CoT 单独用:会推理但无依据,容易幻觉;纯行动单独用:能动手但不会规划,乱撞。 ReAct 把它们咬合成一个循环:推理让行动有章法,行动让推理有依据。 在知识问答、网页操作、决策任务上,ReAct 全面超过「只推理」和「只行动」——这就是「协同」的实证。

四、动手玩:一个多跳问题,纯 CoT vs ReAct

一个要「查两轮」才能答的问题(后一轮查什么,取决于前一轮的结果)。点两边,看纯 CoT 怎么凭记忆冒险、ReAct 怎么边想边查、步步接地。

问题:《盗梦空间》的导演,还导过哪部 2014 年的太空题材电影?
选方式: 

看出门道了吗:ReAct 把「我还缺什么 → 去查 → 拿到 → 再想下一步缺什么」走成了一条接地的链。每一步答案都锚在 Observation 上,而不是赌模型记得对。多跳、可纠错、能停在「够了」——这就是 agent 在干的事。

五、对照表(一):CoT-only vs Act-only vs ReAct

维度只推理(CoT)只行动(纯工具)ReAct
能取外部信息吗不能
会规划/处理异常吗会想但落不了地不会会(Thought 主导)
幻觉高(无接地)低(Observation 接地)
多跳任务

六、对照表(二):ReAct 在你已学版图里的位置

关系说明
= 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 上限

八、检索练习(关掉上文,凭记忆答)

1. ReAct 的核心结构是?
2. ReAct 里推理和行动怎么「相互增强」?
3. ReAct 和 RAG 在「检索」上的根本区别?

九、常见问题 FAQ

把这一课接到你真实工作上的几个关键问。点开看答。

怎么防 agent 死循环 / 不肯停 / 反复调同一个工具?

这些几乎都是 Thought 环节没管住,对应几招:① 设最大步数上限(兜底,到了强制收尾);② 让 Thought 显式自检——每轮要它回答「我是否已有足够信息?这个动作和上一步是否重复?该不该停?」;③ 把历史动作/观察喂进上下文,让它「看得见自己做过啥」,否则会失忆地重复;④ 给明确的停止条件(什么算「答完了」)。

根因心智:agent 的循环控制力住在 Thought 里。与其加更多工具,不如把「该不该继续」的判断写进每一步推理。死循环往往是「它不知道自己已经试过了」或「没人告诉它什么时候算完」。

现在有了 function calling,ReAct 还相关吗?是不是过时了?

没过时——function calling 是 ReAct 的「产品化封装」,骨架还是它。早期 ReAct 靠 prompt 让模型按 Thought/Action/Observation 格式输出、再由外层代码解析执行。现在模型被训得能直接结构化地吐出工具调用(function calling),把「Action」标准化了——但「想一步→调工具→拿结果→再想」的循环一模一样

所以理解 ReAct 仍是理解 agent 的钥匙:function calling 只是让 Action 那步更干净,Thought(要不要调、调哪个、看完结果怎么办)和整个循环逻辑还得你来设计。多数 agent 框架(LangChain agent、各家 SDK 的 agent loop)骨子里都是 ReAct。

ReAct 每轮都把推理和观察堆进上下文,会不会越跑越长、越贵越慢?

会,这是 agent 的真实成本陷阱。每轮 Thought + Observation 都累加进上下文,多跑几轮,token、延迟、钱都线性涨(还可能「迷失在中间」)。尤其 Observation 可能很长(一整页搜索结果、一大段 API 返回),几轮就把窗口撑爆。

缓解:① 压缩 Observation(只留相关摘要再入上下文,别原样塞);② 限制步数 / 早停;③ 阶段性总结(把前几轮压成一段记忆,丢掉原始细节);④ 对延迟敏感的实时语音场景(比如语音客服 agent),更要控轮数、用更快的工具、把重活挪到不卡用户的环节——这是 CoT「想得多=慢而贵」取舍在 agent 上的放大版。

记忆锚:ReAct 就是「办事版的知行合一」

王阳明提「知行合一」,正是为治两种病,和本课命门几乎同一句话:

王阳明的病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 篇全通关。

我是你的老师,随时提问。 比如:「多步 agent 出错了,我怎么定位是 Thought 错还是工具/Observation 错?」「ReAct 和 Plan-and-Execute(先规划全程再执行)哪种更适合我的场景?」 「Reflexion(让 agent 反思失败再重试)和 ReAct 是什么关系?」——别带着模糊往下走。

参考:
Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models, 2022.