ReAct范式
1. 定义与边界
ReAct 是 Reasoning and Acting 的缩写,来自论文《ReAct: Synergizing Reasoning and Acting in Language Models》。它的核心思想是让模型在任务过程中交替生成推理线索和行动,通过外部观察结果修正后续步骤。
典型结构:
Thought -> Action -> Observation -> Thought -> Action -> Observation -> Final
在生产系统中,不一定要暴露完整 Thought;更重要的是让系统保留“决策摘要、行动、观察、状态更新”的可审计轨迹。
2. 为什么重要
ReAct 解决了纯 Chain-of-Thought 和纯工具调用的两个缺陷:
- 纯推理容易在缺少外部信息时编造。
- 纯行动缺少解释和计划,容易盲目调用工具。
ReAct 通过观察结果让模型接地,适合搜索、问答、代码、排错、导航等需要多步交互的任务。
3. 核心机制
ReAct 的关键不是“写出思维链”,而是把行动与观察嵌入循环。
ReAct 状态结构
ReAct 在工程上应保存可审计的“推理摘要-行动-观察”三元组,而不是依赖不可控的长篇 Thought。
{
"step": 2,
"reasoning_summary": "需要确认订单状态后才能判断退款路径",
"action": {
"tool": "get_order",
"arguments": {"order_id": "A123"}
},
"observation": {
"status": "ok",
"summary": "订单已签收,物流显示本人签收",
"evidence_id": "obs_002"
},
"next_constraint": "必须读取退款政策后再决定是否建单"
}
4. 架构模式
显式 ReAct
Prompt 中要求模型输出 thought/action/observation 格式。适合研究和调试,但在生产中要谨慎暴露内部推理。
隐式 ReAct
使用工具调用 API 或 Agent SDK,让模型选择工具,系统记录决策摘要和工具结果。更适合生产。
ReAct + Workflow
Workflow 固定外层流程,内部某个节点使用 ReAct 处理探索性任务。
ReAct + Reflection
在若干步后加入评估器或自评步骤,检查是否偏离目标。
5. 工程实现
工具调用版 ReAct:
def react_loop(question, tools):
state = {"question": question, "observations": []}
for step in range(6):
decision = model.choose_action(
context=state,
tools=[tool.schema for tool in tools]
)
if decision.type == "final":
return validate_final(decision.output)
tool = tools[decision.tool_name]
args = validate_args(tool.schema, decision.arguments)
observation = tool.invoke(args)
state["observations"].append({
"tool": tool.name,
"args": redact(args),
"result_summary": summarize(observation)
})
raise AgentFailed("max_steps_exceeded")
Prompt 结构示例:
任务:基于可用工具回答问题。
规则:
1. 不要猜测工具可查到的信息。
2. 每次只调用一个最相关工具。
3. 工具返回不足时说明缺口或请求升级。
4. 最多 6 步。
工程示例:政策问答不是一步 RAG
用户问题:“客户说没收到货,要退款,我该怎么处理?”
一个 ReAct 轨迹应像这样:
| 步骤 | 决策摘要 | 行动 | 观察 | 下一步 |
|---|---|---|---|---|
| 1 | 需要确认订单真实状态 | get_order(A123) | 订单已签收 | 查政策 |
| 2 | 签收后退款需看物流争议政策 | read_refund_policy(status=delivered) | 需先建物流争议 | 创建争议草稿 |
| 3 | 不能直接退款,应建争议工单 | create_dispute_ticket | 工单创建成功 | 输出处理建议 |
如果系统第一步就回答“可以退款”或“不能退款”,它不是 ReAct,只是基于不完整上下文的猜测。
6. 生产实践
| 问题 | 实践 |
|---|---|
| 观察结果过长 | 工具返回结构化摘要和引用 |
| 调用工具过多 | 限制步数、工具分组、先路由后执行 |
| 错误观察 | 对工具结果做校验和可信度标记 |
| 推理不可审计 | 记录 decision_summary、tool、args、observation |
| 结果不稳定 | 用任务集回归测试轨迹 |
7. 常见反模式
| 反模式 | 表现 | 后果 | 修正 |
|---|---|---|---|
| 长 Thought 当解释 | 保存或展示大段内部推理 | 泄漏风险、解释不稳定 | 保存决策摘要和证据 |
| Observation 原样拼接 | 网页、日志、邮件整段进入上下文 | 上下文污染和注入风险 | 工具返回结构化摘要和来源 |
| 工具失败后硬答 | timeout 或 policy conflict 后仍 final | 编造和错误行动 | 将错误转为状态,重试或升级 |
| 每步看全历史 | 上下文越来越大 | 成本高、注意力稀释 | 滚动摘要 + 必要证据引用 |
| 任何任务都 ReAct | 一步检索也多轮循环 | 延迟和成本浪费 | 先判断是否需要多步观察 |
| Action 无参数校验 | 模型输出直接调用工具 | 参数错、越权、重复写 | schema、权限、幂等校验 |
8. 评测方法
ReAct 需要评测轨迹:
| 指标 | 说明 |
|---|---|
| Required Tool Coverage | 是否调用必须工具 |
| Forbidden Tool Avoidance | 是否避免禁用工具 |
| Observation Usefulness | 最终答案是否基于观察结果 |
| Step Efficiency | 是否多次无效搜索或重复调用 |
| Error Recovery | 工具失败后是否换策略或升级 |
评测样本应包含干扰信息、工具错误、缺失数据和 prompt injection 文档。
轨迹级断言示例:
{
"id": "react_refund_007",
"required_order": ["get_order", "read_refund_policy"],
"allowed_extra_tools": ["create_dispute_ticket", "ask_user_clarification"],
"forbidden_tools": ["issue_payment"],
"assertions": [
"final_answer cites at least one observation",
"no final answer before policy observation",
"tool error must not be treated as success"
]
}
9. 安全与治理
ReAct 的风险在于模型会把观察内容纳入后续思考。如果观察来自网页、邮件、文档或 MCP 工具结果,必须防止其中的恶意指令影响系统目标。
控制手段:
- 外部观察结果标记为不可信数据。
- 工具结果只返回必要字段。
- 系统指令和外部内容结构隔离。
- 高风险行动不因模型推理而自动授权。
- 对行动前参数做策略校验。
10. 权威资料
- ReAct paper: https://arxiv.org/abs/2210.03629 (核对日期:2026-05-09)
- OpenAI Agents SDK, Tools: https://openai.github.io/openai-agents-python/tools/ (核对日期:2026-05-09)
- OpenAI Function Calling guide: https://platform.openai.com/docs/guides/function-calling (核对日期:2026-05-09)
- Anthropic, Building effective agents: https://www.anthropic.com/engineering/building-effective-agents (核对日期:2026-05-09)
- OWASP Top 10 for LLM Applications: https://owasp.org/www-project-top-10-for-large-language-model-applications/ (核对日期:2026-05-09)