ReAct
ReAct(Reasoning and Acting)是理解现代 Agent 执行循环的入口论文。
它的核心价值不是证明模型“会思考”,而是把语言模型的中间决策和外部行动组织成可观察的循环:
- 模型先根据任务和上下文形成下一步判断。
- 再选择一个动作,例如搜索、查知识库、调用环境动作或结束任务。
- 系统执行动作并返回观察结果。
- 模型基于新观察继续决策。
对工程系统来说,ReAct 最重要的遗产是:
- Agent 不能只看最终回答。
- 必须记录行动、工具参数、观察、错误和终止原因。
- 外部观察可以修正模型的中间判断。
- 工具返回也可能污染后续决策。
1. 背景问题
ReAct 试图解决两个早期范式的断裂。
第一类是只让模型做 Chain-of-Thought(CoT)式推理。
这种方式可以把复杂问题拆成中间步骤,但模型仍然被困在已有参数知识和输入上下文里。
当问题需要检索最新事实、读取环境状态或交互式试错时,单纯内部推理会出现两个问题:
- 中间推理看起来连贯,但事实基础可能是错的。
- 模型没有机会通过外部观察纠正路线。
第二类是只让模型或策略执行动作。
这种方式可以和环境交互,但如果缺少可解释的中间决策,调试者很难知道:
- 为什么选这个工具。
- 为什么传这些参数。
- 为什么忽略了某个观察。
- 为什么在错误之后继续执行。
ReAct 的论文贡献在于把 reasoning 和 acting 放在同一条轨迹里。
这使 Agent 既能推理,也能用外部世界的反馈校正推理。
2. 一句话结论
ReAct 是一种“推理-行动-观察”循环模式,适合需要多步工具调用、环境反馈和可观察轨迹的任务。
它不是生产级 Agent 框架。
它没有自动解决权限、安全、成本、工具可靠性、长时记忆和评测问题。
3. 方法结构
论文中的典型轨迹由三类片段组成。
| 片段 | 作用 | 工程化落点 | 风险 |
|---|---|---|---|
| Thought | 当前判断、计划、假设 | 生产中通常保存为内部决策摘要或 trace 摘要 | 不能当事实来源,也不一定适合对用户公开 |
| Action | 选择工具或环境动作 | tool name、arguments、权限上下文 | 参数错误会导致错误结果或副作用 |
| Observation | 工具或环境返回 | 结构化结果、错误码、证据片段 | 外部文本可能包含提示注入或污染 |
工程实现时,建议把 ReAct 抽象成状态机,而不是把论文中的文本格式照搬进 prompt。
一个更接近生产的状态对象可以是:
{
"task_id": "case-2026-05-09-001",
"goal": "回答一个需要检索的问题",
"step": 3,
"budget": {
"max_steps": 8,
"max_tool_calls": 5,
"timeout_ms": 30000
},
"state": {
"known_facts": [],
"open_questions": [],
"last_observation_ref": "obs_002"
},
"trace": [
{
"type": "tool_call",
"tool": "search",
"arguments": {"query": "ReAct paper ALFWorld WebShop"},
"result_ref": "obs_002",
"status": "success"
}
],
"termination": null
}
4. 实验设置与证据边界
ReAct 论文主要在两类任务上验证方法。
第一类是知识密集型问答。
代表任务包括 HotpotQA 和 Fever。
这些任务要求模型查找事实、整合证据并给出答案。
论文比较了 ReAct、Chain-of-Thought、Act-only 等设置。
核心观察是:
- 单纯 CoT 可能产生自洽但错误的推理。
- 只有行动缺少高层判断,容易在多步任务中迷失。
- 推理和检索交替可以让模型用观察结果修正下一步。
第二类是交互式决策任务。
代表环境包括 ALFWorld 和 WebShop。
这些任务要求模型在环境中执行动作,例如搜索商品、选择对象、完成目标。
论文中的证据说明 ReAct 在这些受控环境里能提升任务表现和轨迹可解释性。
但这些实验不能直接推出以下结论:
- ReAct 对任意业务工具都可靠。
- ReAct 的中间推理一定真实。
- 只要加入工具调用就能减少幻觉。
- 长时自主循环可以无监督运行。
5. 核心贡献
ReAct 的贡献可以分成四层。
第一层是认知结构贡献。
它把“想”和“做”交替起来,让模型不再只能在内部上下文中推演。
第二层是调试结构贡献。
它让每一步行动前后都有可审计的上下文,便于定位失败点。
第三层是工具使用贡献。
它展示了外部工具返回可以成为下一步推理的输入,而不是只作为最终答案证据。
第四层是 Agent Loop 原型贡献。
现代 Agent 系统里的 plan、act、observe、update、stop,很多都可以从 ReAct 的结构中看到影子。
6. 局限表
| 局限 | 具体表现 | 工程后果 | 缓解方式 |
|---|---|---|---|
| 行动空间受控 | 论文工具和环境远比企业系统简单 | 无法直接覆盖权限、交易、审批、幂等等问题 | 为每个工具定义 schema、权限、幂等性和回滚策略 |
| 中间推理不保证真实 | 轨迹可能合理但事实错误 | 审计者容易被流畅解释误导 | 把证据、工具返回和最终结论分开记录 |
| 工具返回不可信 | 网页、文档、搜索结果可能含恶意指令 | 后续步骤被 prompt injection 影响 | 对外部内容做隔离、摘要、过滤和引用标记 |
| 多步成本高 | 每步都可能触发模型和工具调用 | 延迟、费用和失败点增加 | 设置最大步数、最大成本和降级路径 |
| 终止条件弱 | 模型可能继续搜索或重复调用 | 循环失控、重复工具调用 | 用明确 stop reason 和预算控制终止 |
| 评测不完整 | 最终答案正确不代表过程可靠 | 工具乱用也可能偶然答对 | 同时评估答案、工具选择、参数和观察使用 |
7. 今天工程系统如何借鉴
ReAct 最适合借鉴到 Agent 的执行控制层。
可借鉴点包括:
- 显式维护任务状态。
- 每一步先决定是否需要外部工具。
- 工具调用后将观察写入 trace。
- 基于观察更新下一步,而不是一次性生成完整答案。
- 支持失败后回退、澄清或交给人工。
一个生产级 ReAct Loop 通常需要补齐这些模块:
| 模块 | 论文中是否充分覆盖 | 生产系统要求 |
|---|---|---|
| Tool Registry | 部分覆盖 | 工具描述、schema、权限、速率限制、负责人 |
| Policy Engine | 基本未覆盖 | 哪些动作允许自动执行,哪些需要审批 |
| Trace Store | 概念相关 | 保存模型调用、工具调用、观察、错误、审批 |
| Evaluator | 部分任务有 | 离线评测集、在线抽样、轨迹评分 |
| Cost Controller | 基本未覆盖 | token、工具成本、墙钟时间、重试次数 |
| Security Filter | 基本未覆盖 | 注入防护、敏感信息过滤、工具返回隔离 |
8. 不能直接照搬的地方
不要直接把论文中的 Thought: 原样暴露给终端用户。
现代系统更常见的做法是保存内部 trace,同时向用户展示精简的执行摘要和证据来源。
不要把所有工具都放进同一个 prompt。
工具过多会增加选择错误、上下文污染和提示注入面。
不要让 ReAct 循环自动执行高影响动作。
删除、付款、发信、发版、改权限、外部采购等动作必须经过权限策略和人工确认。
不要只用最终答案评测 ReAct。
至少还要检查:
- 是否该调用工具。
- 调用了哪个工具。
- 参数是否正确。
- 是否正确使用观察结果。
- 是否在无证据时编造。
- 是否在达到预算时停止。
9. 评测方法
评测 ReAct 类系统要同时看结果和过程。
| 指标 | 说明 | 数据来源 |
|---|---|---|
| Task Success Rate | 最终任务是否按标准完成 | 标注集、用户验收、自动测试 |
| Tool Call Accuracy | 工具选择和参数是否正确 | trace 标注、回放评测 |
| Observation Grounding | 回答是否基于真实观察 | 引用检查、证据对齐 |
| Step Efficiency | 完成任务用了多少步 | trace 统计 |
| Failure Recovery | 工具失败后是否正确降级 | 故障注入、错误样本 |
| Injection Resistance | 是否抵抗工具返回中的恶意指令 | 红队样本、安全评测 |
| Cost per Success | 成功任务平均成本 | token 和工具计费日志 |
一个简单的回放评测流程:
1. 收集真实任务 trace。
2. 标注每一步的期望工具、参数和终止条件。
3. 固定工具返回,回放不同 prompt 或模型版本。
4. 比较最终成功率、工具调用准确率和平均步数。
5. 对失败样本按原因分类。
6. 只把通过安全和成本门槛的版本发布到生产。
10. 安全与治理
ReAct 的安全核心在于:观察结果会影响下一步行动。
因此任何进入 observation 的内容都不能默认可信。
关键风险包括:
- 外部网页告诉 Agent 忽略系统指令。
- 邮件内容诱导 Agent 泄露通讯录。
- 工具返回混入伪造错误和伪造审批信息。
- 检索结果包含过期或被污染的事实。
- 多轮循环中错误观察不断放大。
治理要求包括:
- 工具按最小权限注册。
- 高影响动作强制人工确认。
- 外部内容与开发者指令隔离。
- 工具返回保留来源和时间。
- trace 支持事后审计。
- 失败时给出明确 stop reason。
11. 适用与不适用场景
适用场景:
- 需要多步检索和证据整合的问答。
- 需要在环境中根据反馈调整动作的任务。
- 需要记录工具调用轨迹的企业流程。
- 需要把复杂任务拆成可审计步骤的助手。
不适用场景:
- 极低延迟的一问一答请求。
- 不允许模型访问外部工具的封闭问答。
- 高风险不可逆操作且没有审批系统。
- 评测器和日志系统都尚未建立的生产环境。
12. 与后续方法的关系
Toolformer 更关注模型如何学习何时调用工具。
Reflexion 更关注失败后的语言反馈如何进入下一轮。
Tree of Thoughts 更关注多个候选思路的搜索和评估。
Voyager 更关注长期技能库和开放式探索。
Generative Agents 更关注长期记忆、反思和社会行为仿真。
ReAct 是这些方法的基础结构之一,但不是它们的替代品。
13. 权威资料
- ReAct paper: https://arxiv.org/abs/2210.03629
- ReAct project page: https://react-lm.github.io/
- HotpotQA: https://hotpotqa.github.io/
- ALFWorld: https://alfworld.github.io/
- WebShop: https://webshop-pnlp.github.io/
- 核对日期:2026-05-09