第 2 章 AI AgentAgentic PatternsPlan-Then-Execute

第 2 章 规划-执行-观察:先想清楚,再动手

为什么 Agent 会"边做边偏"

我们接着上一章那个修 bug 的场景往下想。

Agent 接到"帮我修用户登录 bug"这个任务后,如果没有任何约束,它的典型反应是:立刻开始读代码、猜问题、改文件。问题在于——它一边探索一边决定下一步,很容易被中途看到的东西带偏

比如它读到一个可疑的函数,就停下来深挖,结果挖了半天发现跟登录 bug 没关系;或者它改到一半,看到另一个文件里有个"好像相关"的东西,就顺手改了,结果把本来好的功能改坏了。

这就像一个人做事没有计划,想到哪做到哪。短任务可能没事,任务一长、步骤一多,就跑偏了。

这一章讲三个递进的模式,专门对付这个问题:

  1. Plan-Then-Execute(先计划再执行):让 Agent 先写出完整计划,再开始动手。
  2. Planner-Worker 分离:把"做计划"和"干活"拆给不同的 Agent,各司其职。
  3. 阶段分离(Discrete Phase Separation):把"调研、规划、实现"分成隔离的阶段,每阶段单独开会话。

模式一:先计划再执行(Plan-Then-Execute)

问题

当"规划"和"执行"混在同一个循环里时,Agent 每做一步,都要看着上一步的结果来决定下一步。这带来两个麻烦:

  • 容易跑偏:中间结果会带着 Agent 走向意想不到的地方。
  • 不安全:更严重的是,如果中间结果来自不可信的外部数据(比如网页抓取的内容、某个工具的输出),它甚至可以"劫持"Agent 的决策——诱导 Agent 去调用不该调用的工具。这就是所谓的 prompt injection(提示词注入)的一种。

方案

把推理拆成两个明确的阶段:

  1. 规划阶段:Agent 在接触任何不可信数据之前,先写出一份固定的工具调用计划。
  2. 执行阶段:一个确定性的控制器,严格按计划执行。中间结果可以影响"参数"(比如搜什么关键词、传什么参数),但不能改变"做哪些步骤"

一句话:战略决策在动手前就定了,执行阶段只管照做。

计划 = LLM.制定计划(任务)        # 一份固定步骤清单
for 步骤 in 计划:
    结果 = 工具.运行(步骤)        # 结果只影响参数,不影响步骤
    暂存(结果)                    # 输出被隔离,不反过来改计划

证据

  • 论文(Parisien 等人,2024)报告:先规划再执行,任务完成率提升 40%-70%,幻觉减少约 60%。
  • Claude Code 的 "plan mode"(计划模式)就是这个思路的产品化:先让 Agent 出方案,人审阅、修改、批准后,Agent 才开始动手。对复杂任务,成功率能提高 2-3 倍。
  • LangChain 也有对应的 PlanAndExecute 组件,把 planner(规划器)和 executor(执行器)拆成两个 Agent。

怎么用

适合这类任务:动作集合是已知的,但参数是变化的。比如:

  • 邮件和日历助手(动作就是"读邮件、发邮件、建日程"这些固定动作)
  • SQL 助手(动作是查表、执行查询)
  • 代码评审助手

一个实用建议:"哪些任务需要先规划"的边界,会随着模型变强而移动。Anthropic 的 Boris Cherny 说过一段很实在的话——新模型更聪明了,以前需要规划的任务,现在一句话就能搞定。所以不要死守"所有任务都先规划",要看你用的模型能力而定。

取舍

  • 好处:控制流非常稳,不会被中间内容带偏。
  • 代价:灵活性有限——如果任务本身很开放、需要边做边发现,死板的计划反而碍事。
  • 要注意:虽然"做哪些步骤"被锁死了,但"步骤的输出内容"仍然可能被污染(比如让 Agent 生成的邮件正文里被塞进坏内容)。

模式二:Planner-Worker 分离

问题

Plan-Then-Execute 解决的是"单个 Agent 先想后做"。但如果任务是超大工程——几百万行代码、几百个文件、要做几个星期——单个 Agent 再会规划也撑不住。而且让很多 Agent 平级地一起干,会互相踩脚:

  • 两个 Agent 可能改同一个文件,产生冲突。
  • 谁都不愿意碰"难啃的硬骨头",净挑简单安全的活干。
  • 没有人对整体方向负责。

方案

把 Agent 分成上下两级,各管一摊:

  • Planner(规划者):负责持续探索代码库、拆解任务、制定计划。它自己还可以再派生子规划者,让规划这件事本身也能并行、递归。
  • Worker(执行者):从计划里领任务,然后专注地把它做完。不操心别的 Worker 在干嘛,也不操心全局——闷头干完,提交改动。
  • Judge(裁判):每个周期结束时,判断目标达成了没有,要不要进入下一轮。

每一轮都重新开始(带着上一轮的精炼结果,但上下文是新的),这样能对抗"越做越偏、钻牛角尖"的问题。

证据

  • Cursor 团队在生产环境验证过:上百个 Agent 并发运行数周,处理超过 100 万行代码的巨型代码库。
  • 学术界早就有了理论支撑:分层强化学习(Hierarchical RL)研究了几十年,核心思想就是"规划-执行分离"。
  • Anthropic 的 initializer-maintainer、AMP 的 factory-over-assistant 等实现,都印证了这个模式的价值。

怎么用

适合这些场景:

  • 巨型代码库:人类团队要干几个月的项目。
  • 从零构建复杂系统:比如做一个浏览器、一个 Excel 的替代品。
  • 大规模迁移:把整个项目的框架从 A 换到 B。
  • 性能重写:为了速度,用另一种语言重写关键模块。

实施要点:

  • 不同角色用不同模型:规划可能适合"思考型"模型,执行可能适合"编码型"模型,不必强求同一个。
  • Worker 要隔离:让它只管自己的任务,别让它操心协调。
  • 每轮重新开始:对抗长上下文的漂移。

取舍

  • 好处:能处理单 Agent 完全撑不住的大工程;并行度高。
  • 代价:架构复杂,需要额外的协调和裁判逻辑;对小型任务是大炮打蚊子。
  • 注意:层级越深,越需要一个好的裁判来把关,否则错误会逐层累积。

模式三:阶段分离(Discrete Phase Separation)

问题

你有没有见过 Agent"一心三用"?一边调研需求,一边想实现方案,一边已经开始改代码了。结果往往是:调研不深入、计划很模糊、代码也不怎么样。

原因在于:在一个会话里同时做探索、思考、执行,会互相污染。上下文里塞满了各种优先级冲突的信息,Agent 没法专心做好任何一件事。

方案

把开发流程拆成彼此隔离的阶段,每个阶段用独立的会话、全新的上下文窗口,只专注于一个目标:

  1. 调研阶段:深入探索需求、现有代码、约束条件。只做背景调查,完全不考虑实现。
  2. 规划阶段:制定结构化的实现路线图,定义清晰的步骤和依赖。不被写代码分心。
  3. 实现阶段:按计划逐步执行,专注代码质量和功能。

最关键的原则:阶段之间只传递"精炼后的结论",不传完整的对话历史。这样既防止了上下文污染,又保住了必要的信息流。

证据

这个模式来自 Ambral 团队的实践(Sam Stettner),Claude 官方博客也有分享。它本质上是对"上下文是宝贵资源"这一思想的直接应用——每个阶段用最合适的模型和最新的上下文,事半功倍。

怎么用

适合这些场景:

  • 大而复杂的任务,需要先搞清楚"到底要做什么"。
  • 需要严格按流程推进的工程(调研 → 方案 → 实现)。
  • 当发现"一个会话里做太多事"导致质量下降时。

实施要点:

  • 阶段之间用精炼摘要交接,而不是把整个对话搬过去。
  • 不同阶段可以用不同模型(比如调研和规划用更强的推理模型,实现用更快的编码模型)。

取舍

  • 好处:每个阶段质量更高;上下文干净;可以针对不同阶段选模型。
  • 代价:交接需要额外设计(摘要怎么打、信息丢不丢);对简单任务反而繁琐。

三个模式怎么选

场景 推荐模式
单个 Agent 做多步骤任务,容易跑偏 Plan-Then-Execute
超大工程,几百个文件几百万行代码 Planner-Worker 分离
大而复杂、需要先调研再规划再实现 阶段分离
任务很小、模型很强 什么都不用,直接做

三个模式不是互斥的,常常组合使用:比如先阶段分离(调研/规划/实现),实现阶段内部再用 Plan-Then-Execute 锁死步骤,项目足够大时再套上 Planner-Worker 的层级。

实践清单

  • 多步骤任务:先让 Agent 出计划,再批准执行
  • 涉及不可信外部数据(网页、文件)时:必须锁死"做哪些步骤"
  • 超大项目:拆成 Planner + Worker + Judge 三层
  • 大而复杂的任务:按"调研 → 规划 → 实现"分阶段,只传精炼结论
  • 阶段间用摘要交接,不用完整对话历史
  • 记住:模型越强,需要显式规划的任务越少

本章小结

  • Plan-Then-Execute:先计划后执行,锁死控制流,防跑偏防注入。
  • Planner-Worker 分离:规划者拆任务,执行者闷头干活,裁判把关——专治超大工程。
  • 阶段分离:调研、规划、实现各自开会话,只传精炼结论,防止上下文污染。
  • 三个模式层层递进,也可以组合使用。

下一章,我们讲"让 Agent 学会检查自己的作业"——反思闭环(Reflection)模式族。

📑 Agent 模式实战:生产级 AI Agent 的工程模式

1 第 1 章 什么是 Agent 模式 2 第 2 章 规划-执行-观察:先想清楚,再动手 3 第 3 章 反思闭环:让 Agent 学会检查自己的作业 4 第 4 章 委派:让主 Agent 学会把活分出去 5 第 5 章 上下文预算治理:把 token 当成钱来管 6 第 6 章 上下文压缩与精选:装不下怎么办 7 第 7 章 上下文最小化:别让脏东西留在脑子里 8 第 8 章 记忆体系:让 Agent 记得住过去 9 第 9 章 学习沉淀:让 Agent 和团队一起变聪明 10 第 10 章 工具接口哲学:让 Agent 能用、好用、用得起 11 第 11 章 工具发现:让 Agent 在几百个工具里找到对的 12 第 12 章 执行环境:Agent 在哪动手、怎么动手 13 第 13 章 代码执行与沙箱:先写码,再跑码 14 第 14 章 结构化输出与契约:让 Agent 的输出能接住 15 第 15 章 验证循环:Agent 怎么检查自己的作业 16 第 16 章 评测基建:怎么系统地检验 Agent 17 第 17 章 可观测性:看见 Agent 在想什么、在干嘛 18 第 18 章 韧性工程:扛得住部分失效 19 第 19 章 威胁模型:先看风险长什么样,再谈防御 20 第 20 章 控制流隔离:把"谁做决定"和"谁执行"分开 21 第 21 章 权限与审批:谁有权干什么、谁点头 22 第 22 章 凭据与出口:Agent 手里的钥匙和门 23 第 23 章 多智能体信任:多个 Agent 之间怎么互信、怎么审计 24 第 24 章 反馈信号设计:给 Agent 的是信号,不是更大的提示词 25 第 25 章 评测驱动的改进:让 Agent 在真实使用和对抗测试里变强 26 第 26 章 强化学习:把反馈变成训练信号 27 第 27 章 复合式进化:让 Agent 系统越用越值钱 28 第 28 章 多智能体协调:让一群 Agent 一起干活不掉链子 29 第 29 章 模型路由:谁用哪个模型,怎么用得起 30 第 30 章 推理搜索结构:让 Agent 多想想,而不是一条道走到黑 31 第 31 章 控制谱系:从自动补全到完全自主的滑动条 32 第 32 章 团队与产品:把 Agent 变成团队资产,而不是个人玩具
← 返回本书大纲