Plan-then-Execute:让 Agent 先规划再行动

场景:ReAct 每一步都做"推理→行动"循环,Token 消耗大、执行慢。Plan-then-Execute 把推理集中到规划阶段,一次性制定完整计划再执行。 路径:理解了"规划与执行分离",你就知道为什么有些场景 Token 可以省一半。

上篇我们把 ReAct 拆成了"推理→行动"的每步循环——每一步 LLM 都先想再干。这篇我们来看一个反直觉的进化:如果让 Agent 先一次性规划好所有步骤再执行,Token 能省多少?

Plan-then-Execute 不是 ReAct 的替代品——它是把 Agent 的"思考"从执行中分离出来的架构决策。你可以把它想象成写代码 vs 编译执行:ReAct 是 REPL(边写边跑),Plan-then-Execute 是先写完整程序再编译。两者都有用,但用错了场景等于浪费 Token。

理解这个分离,你就掌握了 Agent 架构设计中最重要的一个权衡:什么时候该让 Agent 思考,什么时候该让它干活。

【起源】Single-shot LLM 的局限

从无状态到 ReAct

上两篇文章已经覆盖了 Single-shot 和 ReAct 的细节,这里只提炼核心冲突:

模式 每步调用 LLM? 推理次数 Token 效率
Single-shot 1 次 1 次 最高,但做不了多步
ReAct 每步都调 N 次 灵活,但 80% Token 花在内部独白
Plan-then-Execute 仅规划阶段调 1 次 省 ~44%

ReAct 解决了"让 LLM 自己决定下一步做什么",但代价是每步都推理——3 步 = 3 次昂贵的 LLM 调用。Plan-then-Execute 打破了这个假设。

三种 Agent 调用模式对比

一眼看懂的代码对比

把两段伪代码并列,核心差异一目了然:

ReAct vs Plan-then-Execute 代码对比

ReAct 的推理在循环内部(每步都要 llm.think),PtE 的推理在循环外部(仅规划阶段)。"省 Token"的本质就是把推理从循环体内拉到循环体外。

【演进】从 ReAct 到 Plan-then-Execute

ReAct 的隐性成本

ReAct 解决了"让 LLM 自己决定下一步做什么"的问题,但没有解决"每步都做推理的 Token 开销"。 让我们用数据说话。一次典型的 ReAct 多步调用中,Token 消耗结构如下:

阶段 LLM 调用 推理 Token 工具调用 Token 合计
Thought 1 + Action 第 1 次推理 ~150 Token ~30 Token ~180
Observation → Thought 2 + Action 第 2 次推理 ~200 Token (含上下文) ~30 Token ~230
Observation → Thought 3 + Final 第 3 次推理 ~250 Token (含上下文) ~50 Token ~300

3 步任务 = 3 次推理调用,约 710 Token 的推理消耗。 其中约 80% 的 Token 消耗在"Thought"上——即 LLM 对自己说"我看到了什么、我现在要做什么"的内部独白。

这个模式的核心洞察来自 ReAct 论文(Yao et al., 2023):LLM 需要这些中间思考来维持推理的连贯性,但这些思考对最终用户来说是无价值的开销。

规划与执行的分离

Plan-then-Execute 解决了"多步任务中推理次数与步骤数成正比"的问题——把 N 次推理压缩到 1 次。 核心思想来自 ReWOO(Reasoning WithOut Observation,Xu et al., 2023):

把 Agent 的工作分成两个阶段:

Phase 1 — 规划(Planning) LLM 一次性生成完整的执行计划,声明每一步的工具调用和参数,但不执行任何工具:

Plan:
  1. tool: query_database | param: "SELECT * FROM users WHERE status='active'"
  2. tool: analyze | param: "$1" (上一步的输出)
  3. tool: write_report | param: "$2"
  4. tool: send_email | param: "report_recipient@company.com"

Phase 2 — 执行(Execution) 按计划顺序执行工具调用,每步只做工具调用,不再触发 LLM 推理。前一步的输出自动作为后一步的输入。

这种方法的核心改变是:推理调用从 N 次减为 1 次

维度 ReAct Plan-then-Execute
推理次数 N 次(每步一次) 1 次(仅规划阶段)
Token 消耗(3 步) ~710 ~400(含规划输出)
Token 节省 ~44%
灵活性 高(可中途改变策略) 低(规划后不修改)
执行速度 慢(每步都调 LLM) 快(纯工具调用)

ReAct vs Plan-then-Execute 工作流对比

为什么能省 Token

用一个类比来理解:ReAct 做三步任务是"每搬一块砖都想一次怎么搬",Plan-then-Execute 是"先想好整个砌墙顺序再一次性搬完"。

规划阶段的输出虽然也消耗 Token,但它是一次性的思维产物。执行阶段没有推理开销——所有步骤都是预定的工具调用,类似编排好的函数链。

Token — 模型处理的最小单位,类似编程语言的字符。越多 Token 意味着越多推理开销和越高延迟。

Plan-then-Execute 三阶段流程

【路径】🔍 "理解了规划与执行分离,你就知道为什么 Token 可以省一半"

一句话驯服 Agent 性能讨论

下次身边的人问"为什么 Agent 这么慢",你可以说:

Agent 的慢通常不是因为工具调用(毫秒级),而是因为每次工具调用前的推理(秒级)。ReAct 每一步都要推理,所以 3 步至少 3 秒。Plan-then-Execute 只在开头推理一次,所以 3 步 1 + 3×0.1 = 1.3 秒。

Token 优化的本质不是"少输出"——而是"少推理"。

最实用的 Agent 选型法则

下次跟团队争论 Agent 框架选型,先抛一个问题:

你的场景是"已知路径"还是"探索路径"?

  • 已知路径(数据处理流水线、定时报表、ETL)→ Plan-then-Execute:快、省 Token、不需要中途改主意
  • 探索路径(客服对话、Web 搜索、Debug 排查)→ ReAct:慢但灵活,每一步都可以根据上一步结果调整方向

这个二选一能解决 80% 的 Agent 架构争论。剩下 20% 才是框架层面的差别。

【现状】ReWOO:Plan-then-Execute 的经典实现

ReWOO 架构

ReWOO(Reasoning WithOut Observation)是 Plan-then-Execute 模式最有影响力的实现之一。它的核心架构包含三个组件:

组件 角色 类似传统架构中的
Planner 制定执行计划,不执行 项目经理(画甘特图)
Worker 执行具体工具调用,不思考 搬砖工(按图施工)
Solver 汇总执行结果,生成最终答案 质检员(检查交付物)

工作流程:

  1. Planner 接收用户问题,输出一组工具调用计划(完全放弃 Observation 的 ReAct 循环)
  2. Worker 按顺序执行计划中的每个工具调用,每步只做调用,不调用 LLM
  3. Solver 将 Worker 各步骤的结果汇总,进行一次最终推理,生成回答

这个分离的意义在于:Planner 只做推理不做操作,Worker 只做操作不推理。 推理和执行的关注点完全解耦。

适用边界

ReWOO 不是 ReAct 的全面替代品——它有自己的适用场景限制:

适合 Plan-then-Execute 的场景: - 执行步骤可预定义(如数据处理流水线、定时报表、ETL 管道) - 每步输入输出类型固定(查询→处理→生成→发送) - 不需要在执行过程中看中间结果改变策略

不适合 Plan-then-Execute 的场景: - 需要在执行中根据动态结果调整方向(如客服对话、debug 排查) - 上一步的执行结果会影响到下一步做什么(如 Web 搜索后根据结果决定下一步搜什么) - 用户可能中途中断或修改输入(如交互式对话)

用一句话概括:Plan-then-Execute 适合"已知路径"的任务,ReAct 适合"探索路径"的任务。

实际 Token 节省估算

用 ReWOO 论文的数据结合实测,一个 3 步工具调用任务的 Token 消耗:

模式 规划 Token 执行 Token 合计
ReAct ~710(3 次推理) 0 ~710
Plan-then-Execute ~250(1 次规划) ~150(Worker + Solver 调用消耗) ~400
节省 ~44%

注意:Solver 的最终推理在一次执行中也是必需的——它把各步骤结果整合成用户能读的答案。即使 ReAct 模式,最终也需要一次推理来生成回答。

【趋势】从静态规划到自适应规划

当前局限

Plan-then-Execute 目前最常用的实现是"静态规划"——Planner 一次生成完整计划,之后完全不修改。如果执行过程中发现第一步的结果不符合预期,Agent 只会继续按原计划走,不会停下来重新评估。

如果你已经在用 LangGraph 或 CrewAI,这些框架对 PtE 模式有原生支持。LangGraph 的 StateGraph 支持在任意节点设置检查点(checkpoint),当节点输出偏离预期时触发重新规划。CrewAI 的 Process.hierarchical 模式天然实现了 Manager→Worker 的规划-执行分离——Manager 负责制定任务计划,Worker 执行,Manager 审查结果。改框架就是改一个配置的事。

下一站:Plan-then-Replan

下一代优化方向是引入"检查点":

  1. Planner 先生成初步计划
  2. Worker 执行到检查点
  3. 检查是否符合预期?→ 是则继续,否则触发 Replanner
  4. Replanner 修改剩余计划

这样就融合了 ReAct 的灵活性(能改)和 Plan-then-Execute 的效率(大部分步骤不推理)。

再下一站:Tree-of-Thought

更进一步的方向是用 Tree-of-Thought(ToT)代替线性规划——同时生成多条规划路径,在执行过程中基于中间结果切换最优路径。这个方案虽然推理成本更高,但在需要大量探索的场景(如代码生成、研究分析)中效果更好。

Agent 规划能力的演进路径

每个选择都对应一个权衡: - 全部推理(ReAct):最灵活,最贵 - 规划→执行(Plan-then-Execute):最便宜,最死板 - 规划→检查→再规划(Plan-then-Replan):折中 - 多路径并行(Tree-of-Thought):最贵,但探索最彻底

【锚点】"记住一句话"

脑中的锚点

"Plan-then-Execute = 先画施工图再施工,ReAct = 边施工边改图纸。"

如果你在搭一个步骤确定的 Agent 流水线,先用 Plan-then-Execute 省下那 40% 的 Token。如果 Agent 需要在执行中看情况变通,回到 ReAct 的每步推理。

下篇我们聊 Reflection——Agent 如何像程序员 review 自己代码一样自我纠错。

🔗 个人博客:https://opencao.cn 📺 公众号:Ai拆代码的曹操 🌟 知识星球:Ai拆代码的曹操