ReAct 范式
把推理和行动交织起来,而不是分开做。现代 agent 循环背后的思想,它为什么优于单纯推理,以及它在哪里吃紧。
在 agent 成为一个产品品类之前,有一个朴素的观察:只会想的模型和只会做的模型都有短板,把两者交织起来则胜过任何单独一边。这个想法就是 ReAct——推理与行动——也是你今天要搭的 agent 循环在概念上的祖先。
把 ReAct 当作一个思想来理解,撇开任何框架,才能解释这个循环为什么长成现在这样。
两个半吊子方案
看一个需要外部信息的问题:「这三个库当中,哪个最近发过版本?」
只推理(思维链(chain-of-thought))能让模型一步步想下去,但它没有任何办法去核实。它只能依据参数里的东西推理,而那些东西可能过时,也可能根本没有。它能给出一个论证漂亮、答案是错的回答。
只行动——中间不加推理地连发工具调用——解决了信息问题,却制造了新问题。没有推理,模型就无法解读结果、判断它没用、或者调整方向。它只会盲目开火。
两边各自在对方成功的地方失败。推理有判断力,却无据可依;行动有依据,却没有判断力。
交织
ReAct 把两者合成一个循环:
Thought: 我需要查出每个库最近一次发布的日期。
Action: search("库 A 最新版本")
Observation: A 于 2026-08-14 发布了 v3.1
Thought: 一个搞定,接下来看 B。
Action: search("库 B 最新版本")
Observation: B 于 2026-05-02 发布了 v2.0
...
Thought: 三个当中,A 最近发过版本。
Answer: 库 A。Thought 是模型用自然语言推理下一步做什么。Action 是一次工具调用。Observation 是结果,被喂回去。然后是下一个 Thought,以 Observation 揭示的内容为条件。
威力在于反馈。每个 Thought 都写在上一次 Observation 之后,所以推理始终以真实结果为据,而不是开环空转。模型能发现某次搜索什么都没返回,然后换一个查询重试——这是两个半吊子方案都做不到的修正。
Thought 这一步为什么值这些 token
为了省 token 把 Thought 那几行砍掉、只输出动作,确实很诱人。但这通常是错的,有两个原因。
第一,让思维链奏效的机制在这里同样成立:每个推理 token 都是一次额外的前向传播,用文字把计划写出来,能可测量地改善随后的动作。Thought 不是装饰——它是塑造下一个选择的计算。
第二,Thought 是你观察 agent 决策的窗口。一次运行出问题时,正是这一串 Thought 告诉你它为什么选了那个糟糕的动作。把它们砍掉,你就是在盲调。
从 ReAct 到你今天要搭的循环
现代的 agent 循环就是 ReAct,只是推理被放进了模型内部,不再硬塞进一个死板的文本模板。
早期的 ReAct 用少样本示例把这个格式显式写进 prompt:直接把「Thought:/Action:/Observation:」的循环演示给模型看,让它照着续写。今天,模型被训练成原生就能产出推理和结构化工具调用,你很少再手写模板。但形状完全一样——想、做、看、重复到结束。当你读到那个十五行的循环时,你读到的就是 ReAct,只是脚手架已经被吸收进模型和工具调用 API 里了。
这就是为什么即便你不会手写 ReAct,也值得了解它:它给这个循环所体现的原则命了名。
它在哪里吃紧
ReAct 是地基,不是成品答案,它的局限正是上面还要叠更多结构的原因。
没有前瞻。 ReAct 一次只决定一步,不会往前算几步,所以会走进有远见就能避开的死胡同。任务需要在动手前先有规划时,多步规划是叠在 ReAct 之上,而不是取代它。
推理漂移。 跑得久了,Thought 会偏离最初的目标——也就是循环本身要面对的那个上下文膨胀问题。把目标重述一遍有帮助。
失败叠加。 ReAct 继承了循环的算术:每一步都是一次出错的机会,可靠性会随步数累积下降。每步多推理一点,救不了一个糟糕的指数。
啰嗦的代价。 每个 Thought 和 Observation 都是 token,每次迭代都要重发。ReAct 换来的清晰不是白来的。
这些都不是否定。它们是一张地图,标出你该在 ReAct 周围搭什么:用规划补前瞻,用记忆治漂移,用可靠性模式应对失败叠加。
要点回顾
- ReAct 把推理与行动交织起来,补上各自的盲区:只推理无据可依,只行动没有判断力。
- 循环是 Thought → Action → Observation → 重复,每个 Thought 都以最新的 Observation 为条件,因而能在任务中途纠偏。
- 推理这一步值它的 token——它改善下一个动作,也给你留下可调试的调用链。
- 现代的 agent 循环就是 ReAct,推理模板已经被吸收进训练好的模型里。
- 它没有前瞻,又继承失败叠加——这正是规划和可靠性层要叠在它上面的原因。
下一篇: Agent 架构