Skip to main content

了解 ReAct 吗?简单介绍一下你的理解

· 5 min read

ReAct 不是"推理"和"行动"的简单拼接,是把两者编织成一条交替推进的链路:每一步推理都有观测反馈,每一步行动都有推理支撑。

  • 定义:模型交替生成"思考"和"行动",每次行动后把环境返回的观测结果注入下一步推理,形成闭环。
  • 与 CoT 的核心差异:CoT 在推理链中"脑补"事实,ReAct 通过外部工具或环境把推理接地——幻觉会触发不符预期的观测,反过来暴露推理错误。
  • 关键循环:Thought → Action → Observation → Thought,这个循环给 Agent 带来自我纠错能力——工具调错了?看返回就知道,下一步改。
  • Action Space 设计:工具描述、参数 schema、返回格式,这三样写不好,ReAct 的效果直接打对折。
  • 常见翻车:Agent 陷入重复 Action-Observation 死循环,没有收敛判断——需要加 max_steps 或让模型自己输出 Finish。
  • 适用场景:需要多步信息检索、代码执行、API 调用的任务。简单的单轮问答用 ReAct 是过度设计

ReAct 到底是什么

ReAct 是 Google Research 和普林斯顿在 2022 年提出的一种 prompting 模式,全称 Reasoning + Acting。思路很简单:让 LLM 在解决问题时交替输出两个东西——思考(Thought)和行动(Action),每次行动后得到一个观测结果(Observation),再把观测注入下一步思考。

说白了,就是把"想"和"做"变成一个循环。

Thought: 我需要知道北京今天的天气,得先查一下。
Action: search("北京 今天 天气")
Observation: 北京今天晴,气温 22-30°C,空气质量良。

Thought: 天气已经拿到了。用户还问了该穿什么,根据气温...
Action: Finish("北京今天晴天,22-30°C,建议穿短袖加薄外套。")

每个 Thought 前面有 Observation 提供事实约束,每个 Action 前面有 Thought 说明为什么要这么干——推理和行动不是两个独立步骤,是咬合在一起的齿轮。

为什么 Pure CoT 不够

Chain-of-Thought 的致命缺陷是推理链没有外部反馈。模型对世界知识的盲区、事实性错误会原封不动地沿着推理链传播——CoT 让模型"显得"在思考,但不能阻止它一本正经地胡说八道。

比如让模型回答"XX 公司去年 Q3 的营收"。CoT 的做法是让模型一步步推理,但它脑子里没有这个数据,就可能编一个看起来合理的数字,然后在这个错误数字上继续推导。ReAct 的做法是先 Action 搜索,拿到真实数字后再继续推理。

ReAct 最大的价值不是让模型变聪明,而是让模型有渠道验证自己的推理。 在需要精确信息、数学计算、代码执行的场景里,这个区别是决定性的。原始论文在 HotpotQA 和 ALFWorld 上的实验也印证了这一点:ReAct 同时优于纯推理和纯行动策略。

Action Space 是决胜点

很多人觉得 ReAct 效果取决于模型能力。实际工程里,工具定义质量的影响比模型本身还大。

三个最容易出问题的地方:

  1. 工具描述模糊:一个工具叫 get_data,描述写"获取数据",模型根本不知道什么时候该用它。描述要写清楚输入什么、输出什么、在什么场景用。
  2. 返回格式混乱:工具返回一大坨非结构化文本,模型拿到 Observation 后解析困难,推理链就断了。宁可多写一个后处理层,也要让 Observation 干净、结构化。
  3. 参数 Schema 不明确:类型、必填/可选、默认值,这些都直接影响模型能不能正确调用。

我的经验:花在 Action Space 设计上的时间,至少和调 prompt 一样多。

ReAct 的局限性

两个最常见的翻车场景:

死循环。模型在 Thought 和 Action 之间反复横跳,永远不会输出 Finish。典型症状是 Action 失败 → Observation 报错 → 模型 retry 同一个 Action → 再次失败。解法很简单:加 max_steps 硬限制,或者在 system prompt 里让模型最多 retry 一次就换策略。

过度设计。不是所有任务都需要 ReAct。翻译、摘要、分类这类任务直接用 zero-shot 或 CoT 就够了,上 ReAct 反而增加延迟和 token 消耗。一句话:任务需要外部信息或工具才能完成的时候,再考虑 ReAct。

总结

ReAct 就是一个朴素的工程思路:让模型把推理过程外化出来,在需要的时候调用工具获取真实信息。它解决 LLM 最核心的两个问题——幻觉和知识盲区——不是通过更好的训练数据,而是通过给模型一个"查资料"的渠道。

实际落地时真正花时间的就两件事:设计好的工具接口,处理好模型在 Action-Observation 循环中的异常分支。

References