Plan-and-Execute:比 ReAct 更“有全局观”的 Agent 设计范式
一、介绍
1. 什么是 Plan-and-Execute
Plan-and-Execute 是另一类非常重要的 Agent 设计范式,核心思想可以概括为一句话:
先把任务想清楚、拆清楚,再按步骤执行。
也就是把“规划(Plan)”和“行动(Execute)”明确分开。
如果说:
- ReAct 更像是“边走边看”
- 那 Plan-and-Execute 更像是“先做作战计划,再逐步落地”
它解决的不是“每一步怎么做”,而是:
整个任务应该怎么组织,才能更稳定地完成。
2. 它解决了什么问题
在复杂任务中,如果一上来就用类似 ReAct 的方式“边想边做”,很容易出现一些问题:
- 只关注当前一步,忽略整体目标(局部最优)
- 做着做着跑偏
- 重复尝试同样的路径
- 任务结构混乱,结果不成体系
Plan-and-Execute 的核心价值就在于:
用“先规划”来约束整个执行过程,让任务更有全局一致性。
3、为什么它很有价值
Plan-and-Execute 在复杂任务中表现更好的原因主要有:
1. 全局一致性更强
不容易做着做着偏题,输出结构更稳定。
2. 任务拆分清晰
每一步都有明确目标,方便跟踪和调试。
3. 更适合长链路任务
尤其是需要多阶段产出的任务(报告、项目、流程)。
4. 更容易插入人工控制
可以在关键步骤加入审批、确认。
5. 更适合并行化
某些步骤可以分配给不同 Agent 或系统同时执行。
尤其是在企业场景中,这一点非常重要:
很多任务本质上是:
- 写文档
- 跑流程
- 调多个系统
- 需要审计和复盘
这些都天然更适合“先规划”。
4、它的缺点
Plan-and-Execute 也有明显代价:
1. 计划可能不准确
一开始的信息不完整,计划容易偏。
2. 前期规划增加时延
相比直接执行,多了一步思考成本。
3. 小任务显得过重
简单问题不需要完整规划流程。
4. 环境变化时容易失效
计划如果不更新,会变成错误约束。
5. 执行层可能过于僵化
如果设计不好,会出现“按错计划认真执行”的问题。
可以总结为一句话:
它最大的风险不是“没想”,而是“想得太早、改得太晚”。
5、实践建议
如果你要在工程里落地 Plan-and-Execute,可以优先注意这几点:
1. 计划不要过细
太细会导致执行僵化,失去灵活性。
2. 明确每一步的输出
否则执行阶段很难判断“是否完成”。
3. 允许动态重规划
不要把计划当成不可变的真理。
4. 高风险步骤加人工确认
比如发邮件、改数据、调用外部系统。
5. 子任务内部用 ReAct
不要让 Execute 变成“死流水线”。
二、核心原理
1. 两阶段结构
Plan-and-Execute 通常分为两个核心阶段:
Plan(规划阶段)
在这个阶段,Agent 会:
- 理解任务目标
- 分析约束条件和输入
- 拆分出可执行的步骤
- 明确步骤之间的依赖关系
Execute(执行阶段)
在这个阶段,Agent 会:
- 按计划逐步执行
- 调用工具 / 查询数据 / 生成内容
- 记录中间结果
- 必要时调整计划
2. 一个标准流程
典型流程可以抽象成:
Goal → Plan → Step 1 → Step 2 → Step 3 → ... → Final Result
而不是:
Goal → 做一步 → 看结果 → 再决定下一步(ReAct)
不过需要注意一个关键点:
Plan-and-Execute 并不是“一次规划,永不修改”。
更准确的理解是:
👉以计划为主线的动态执行过程
执行过程中,如果环境发生变化,或者某一步失败,是可以回到规划层进行调整的。
3. Plan 阶段到底在做什么
很多人会把 Plan 简单理解为“列一个 TODO 清单”,其实远不止如此。
一个好的计划通常会结构化这些信息:
- 最终目标是什么
- 成功标准是什么
- 有哪些前置依赖
- 哪些步骤必须串行,哪些可以并行
- 哪些步骤风险高,需要人工确认
- 每一步的输入和输出是什么
重点不在于“步骤多”,而在于:
计划必须可执行、可检查、可调整
4. Execute 阶段在做什么
执行阶段也不是机械地“照单执行”。
一个成熟的执行过程通常包括:
- 读取当前步骤
- 选择合适工具执行
- 检查结果是否达标
- 记录状态(memory / log)
- 决定是否进入下一步
- 必要时回到 Plan 修正
这意味着:
执行层本身也可能包含推理和决策,而不是纯流水线。
三、两个典型例子
1. 写一份市场调研报告
用户需求:
帮我做一份关于 AI Coding Agent 市场格局的调研报告,包含竞品、定价、优势、风险和建议。
Plan 阶段
Agent 可能会先生成一个结构化计划:
- 明确研究范围(仅 AI Coding Agent)
- 收集主要竞品名单
- 收集各产品的功能、价格、定位
- 做横向对比分析
- 总结市场趋势和风险
- 生成最终报告
Execute 阶段
然后按步骤执行:
- 检索竞品名单
- 搜集产品资料(官网 / 文档 / 评测)
- 整理成结构化数据
- 做对比分析
- 输出报告
如果直接用纯 ReAct,也能做,但很容易:
- 漏竞品
- 结构混乱
- 输出像“笔记拼接”,而不是完整报告
Plan-and-Execute 的优势在于:
👉先定义“成品应该长什么样”,再去填充内容。
2. 修复一个复杂 Bug(工程场景)
用户需求:
修复订单同步延迟的问题,并补上测试。
Plan 阶段
可能生成这样的步骤:
- 复现问题并确认触发条件
- 定位延迟发生环节
- 判断是队列积压、接口超时还是锁竞争
- 设计修复方案
- 修改代码
- 补充测试
- 验证并总结
Execute 阶段
逐步执行:
- 查日志
- 看监控指标
- 阅读代码
- 修改实现
- 运行测试
这里有一个非常关键的点:
每一个子步骤内部,其实仍然可能使用 ReAct。
四、demo
import os from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI BASE_URL = os.getenv( "LLM_GATEWAY_BASE_URL", "https://llm-gateway.xxx.xxx.xxx/v1", ) API_KEY = os.getenv("LLM_GATEWAY_API_KEY", "******") MODEL = os.getenv("LLM_MODEL", "gpt-5.1") llm = ChatOpenAI( model=MODEL, base_url=BASE_URL, api_key="dummy", default_headers={"X-Api-Key": API_KEY}, temperature=0, use_responses_api=False, ) plan_prompt = PromptTemplate.from_template( """你是一个 Planner。 请把下面的任务拆成 3-5 个清晰步骤,只输出计划,不要直接完成任务。 任务:{task} """ ) execute_prompt = PromptTemplate.from_template( """你是一个 Executor。 请严格根据下面的计划完成任务,输出最终结果即可。 任务:{task} 计划: {plan} """ ) def main() -> None: user_input = "写一份 AI Coding Agent 市场调研报告" plan_resp = llm.invoke(plan_prompt.format(task=user_input)) plan_text = (plan_resp.content or "").strip() print("=== PLAN ===") print(plan_text) execute_resp = llm.invoke( execute_prompt.format( task=user_input, plan=plan_text, ) ) print("\n=== FINAL RESULT ===") print((execute_resp.content or "").strip()) if __name__ == "__main__": main()输出: