ReAct、Plan-and-Execute、Reflection 三种范式有什么核心区别?实际项目怎么选型?
三个名字回答的是同一个问题的不同侧面:ReAct 解决"每步怎么想",Plan-and-Execute 解决"先想清楚再干",Reflection 解决"干完发现不对怎么办"。 它们不是互斥的三选一,而是可以叠在一个循环里的三种机制。面试里先讲控制流差异,再讲叠加方式,最后给选型判据。
1. 结论:差别在"思考发生在什么时候"
| 范式 | 思考时机 | 核心循环 | 一句话概括 |
|---|---|---|---|
| ReAct | 每一步之前 | 想 → 做 → 看 → 想 | 边走边看,局部最优 |
| Plan-and-Execute | 动手之前一次性规划 | 规划 → 逐步执行 → 必要时重规划 | 先出图纸再施工 |
| Reflection | 产出之后 | 产出 → 批判 → 修订 | 自己给自己改作业 |
选型看三点:任务步骤能否事先枚举、单步反馈是否昂贵、错误是否容易自我识别。
2. 机制:三张流程图
ReAct
目标 ──▶ [Thought] ──▶ [Action] ──▶ 环境 ──▶ [Observation]
▲ │
└────────────────────────────────────┘
每步都重新决策;上下文随步数线性增长
Plan-and-Execute
目标 ──▶ [Planner] ──▶ 步骤 1 ─▶ 步骤 2 ─▶ 步骤 3 ──▶ 汇总
│ │
└─ 失败/偏差 ─▶ [Replan] ─┘
规划一次,执行多次;执行器可以是简单函数,也可以是子 Agent
Reflection
产出 ──▶ [Critic 找问题] ──▶ 有问题? ──是──▶ [Revise 修订] ──┐
▲ │ │
└────────────────────────┴──────── 否 ──▶ 交付 ◀─┘
三者的开销结构完全不同:ReAct 贵在步数(每步一次推理),Plan-and-Execute 贵在规划(一次长输出)但执行便宜,Reflection 贵在重复生成(至少两倍 token)。
3. 详细对比
| 维度 | ReAct | Plan-and-Execute | Reflection |
|---|---|---|---|
| 上下文增长 | 快,每步都堆观察 | 慢,计划一次成型 | 中,需保留草稿与批评 |
| 长任务表现 | 容易走偏、忘记早期目标 | 好,计划可反复对照 | 中,只改局部 |
| 并行能力 | 弱,天然串行 | 强,无依赖步骤可并行 | 弱 |
| 可中断恢复 | 难,状态散在上下文里 | 易,计划即状态 | 中 |
| 典型失败 | 死循环、重复调用同一工具 | 计划本身错了、执行偏离计划 | 反复改、越改越差 |
| 成本量级 | 中 | 低(步数固定) | 高 |
4. 工程上正确的做法是叠加
生产系统很少只用一种。常见组合是"外层计划、内层 ReAct、关键节点反思":
def run(goal: str, budget: int = 40) -> str:
plan = planner(goal) # ① 先规划:输出 JSON 步骤数组
state, notes = {}, []
for step in plan["steps"]:
if step.get("depends_on") and not satisfied(step, state):
plan = replan(goal, plan, state, reason="前置步骤失败") # ④ 重规划
continue
result = react_loop(step, tools=TOOLS, max_steps=8) # ② 步骤内 ReAct
if step.get("verify"):
result = reflect(result, rubric=step["verify"], max_rounds=2) # ③ 反思
state[step["id"]] = result
return merge(goal, plan, state)
# 关键:三层各自有独立预算,任何一层超限都向上抛,而不是静默重试
这段结构里,Planner 只负责"分几步",ReAct 负责"这一步怎么落地",Reflection 只在有明确验收标准(如能跑通编译、能过单测)时启用。
5. 选型判据
| 场景特征 | 推荐 | 理由 |
|---|---|---|
| 3~8 步、每步依赖上一步结果 | ReAct | 计划会因信息不足而失真 |
| 步骤多(10+)、可并行、要求可恢复 | Plan-and-Execute | 计划即状态,便于断点续跑 |
| 有硬性验收标准(测试、schema、规则) | 叠加 Reflection | 有客观信号,反思才有效 |
| 需要人工审核的产出(报告、代码) | ReAct + 一次 Reflection | 交付前自查一轮性价比最高 |
| 延迟敏感(<3 秒) | 都不用,走 Workflow | 多轮推理无法满足 SLA |
经验阈值:设一个总步数预算 N,ReAct 每步消耗 1,规划消耗 3,反思每轮消耗 2,超预算就降级到 Workflow 兜底,而不是让循环无限跑。
6. 常见追问
问:Plan-and-Execute 的计划错了怎么办? 必须有重规划(Replan)入口,触发条件写清楚:某步连续失败两次、工具返回"前置条件不满足"、执行结果与计划的预期产出不符。没有重规划的纯计划执行,本质就是一次性的 Workflow。
问:Reflection 什么时候不该用? 没有客观判定信号时(如"这段文案好不好"),模型自评容易自我肯定,反思收益很低甚至有害;另外延迟敏感场景也不适合,它至少让成本翻倍。
问:ReAct 的"想"必须显式输出吗? 不一定。推理模型(Reasoning Model)把思考放在内部,外部只暴露动作,这时 ReAct 退化为"函数调用循环"。显式 Thought 的好处是可观测、可干预,缺点是占 token。
问:三者能用一个框架统一吗? 能,把"规划、行动、反思"都建模成图上的节点即可(LangGraph 这类图编排就是这么做的)。统一的好处是状态可序列化、可断点恢复;代价是抽象层变厚,简单任务反而更绕。
小结
ReAct 是"每步都想",Plan-and-Execute 是"先想再做",Reflection 是"做完再想"。真实系统按"计划 → 逐步 ReAct → 关键处反思"叠加,并用独立预算约束每一层。选型的根本判据不是范式新旧,而是任务步骤能否预知、有没有客观验收信号、延迟预算是多少。