02. ReAct 的核心思想是什么?和 CoT 有什么关系?

整理 ReAct 的基本范式、与 CoT 的关系及工程注意点。

简单回答

ReAct(Reasoning + Acting)是一种让 LLM 交替进行"推理"和"行动"的 Agent 范式。每一步 LLM 先输出 Thought(推理过程),再输出 Action(调用什么工具),然后接收 Observation(工具返回结果),再进入下一轮。CoT(Chain of Thought)只有推理没有行动——模型一路想到底然后直接给答案;ReAct 在推理过程中穿插了和外部世界的交互,能获取新信息来修正推理方向。

详细解释

ReAct 的全称和来源

ReAct 全称 Reasoning and Acting,来自 Yao et al. 2022 年的论文。核心观点是:纯推理(CoT)和纯行动(只调工具不推理)都有缺陷,把两者交替进行效果最好。

CoT 的局限

CoT 让 LLM 逐步推理,在数学、逻辑等纯推理任务上效果显著。但 CoT 有一个根本限制——它只能基于模型自身的知识推理,不能获取新信息。如果推理过程中需要一个模型不知道的事实(比如"今天的汇率是多少"),CoT 只能靠猜或者编,没有办法去查。

另外 CoT 一旦推理方向走偏了,后面的链条会一错到底,因为没有外部信号来纠正。

ReAct 的工作流程

ReAct 在 CoT 的基础上加入了 Action 和 Observation 两个环节,形成一个循环:

Thought 1: 用户问的是最近一周的新闻,我需要搜索一下。
Action 1: search("本周 AI 领域重要新闻")
Observation 1: [搜索结果:1. xxx  2. yyy  3. zzz]

Thought 2: 搜索结果里提到了三条新闻,让我看看哪些最相关...
Action 2: fetch("https://example.com/news/xxx")
Observation 2: [文章内容]

Thought 3: 信息已经足够了,我可以给用户一个总结。
Action 3: finish("基于搜索结果,本周 AI 领域最重要的新闻包括...")

每一步的 Thought 就是 CoT 式的推理——模型在"想"当前的状态是什么、下一步应该做什么。Action 是模型决定调用的工具和参数。Observation 是工具返回的结果,作为新信息注入下一轮推理。

这个循环的关键价值在于:推理可以利用外部信息,行动有推理做指导。推理不是闭门造车(CoT 的局限),行动不是盲目执行(没有规划就调工具的局限)。

ReAct 和 CoT 的关系

可以把 ReAct 理解为 CoT 的"开放世界版本"。CoT 是封闭系统内的推理——模型只用自己的知识一步步推。ReAct 是开放系统中的推理——模型在推理过程中可以和外部世界交互,获取新信息、执行操作、观察结果,然后继续推理。

从实现的角度看,CoT 就是一次 LLM 调用——一个长长的推理链输出完就结束了。ReAct 是多次 LLM 调用——每一轮 Thought+Action 是一次 LLM 调用,拿到 Observation 后再做下一次调用。这也意味着 ReAct 的成本和延迟远高于 CoT。

ReAct 在现代 Agent 框架中的位置

ReAct 是目前大部分 Agent 框架的底层范式。不管是 LangChain 的 Agent、LlamaIndex 的 Agent,还是 OpenAI 的 Function Calling 流程,本质上都是 ReAct 循环的变体——模型思考(可能是隐式的)→ 调工具 → 拿结果 → 继续思考。

只不过在 Function Calling 的接口设计中,Thought 部分有时候被省略了或变成了隐式的(模型直接输出工具调用,不显式输出推理过程)。显式输出 Thought 的好处是可解释性更强、更方便调试,坏处是增加了 token 消耗。

ReAct 的常见问题

ReAct 循环最常见的问题是陷入死循环或无效循环——模型反复调同一个工具、或者来回在几个状态之间震荡。这通常是因为 Prompt 设计不好、工具返回的信息不够清晰、或者模型对"什么时候该停"没有明确的判断标准。工程上需要设最大循环次数限制和超时控制。

面试时可以这样答

ReAct 全称 Reasoning and Acting,核心思想是让 LLM 交替进行推理和行动。每一步先 Thought——想清楚当前状态和下一步该做什么,再 Action——调用工具,然后 Observation——拿到工具返回的结果,再进入下一轮。

它和 CoT 的关系是:CoT 只有推理没有行动,模型一路想到底。ReAct 在推理中穿插了和外部世界的交互,可以获取新信息来修正推理方向。可以理解为 CoT 的"开放世界版本"。

现在主流的 Agent 框架底层基本都是 ReAct 循环的变体。OpenAI 的 Function Calling、LangChain 的 Agent,本质上都是"思考→调工具→看结果→继续思考"这个循环。区别在于有些框架把 Thought 显式输出方便调试,有些把它做成了隐式的。

工程上 ReAct 最大的挑战是循环控制——要设最大轮数和超时,防止模型陷入死循环或反复调同一个工具。

常见追问

  1. ReAct 的 Thought 部分是否一定需要显式输出?省略 Thought 对效果有什么影响?
  2. 除了 ReAct,还有哪些 Agent 范式(如 Plan-and-Execute、LATS)?
  3. ReAct 在复杂任务上的成功率有多高?失败时怎么处理?