Agent中的Planning到底是什么
现代Agent确实会生成计划,但这份计划更多承担的是任务拆解和进度管理的作用,而不是真正意义上的执行控制逻辑。如果将现代Agent理解为“先规划后执行”的流水线系统,往往会导致对其内部工作机制产生错误认识。
真正的现代Agent通常采用的是一种混合式规划架构:系统首先生成一个高层计划(High-Level Plan)用于描述整体方向和主要阶段,而在实际执行过程中,则持续基于当前状态动态决定下一步动作。这种模式可以概括为:
1 | High-Level Plan |
也就是说,计划存在,但计划并不是绝对权威;状态始终优先于计划。
为什么固定计划并不可靠
假设用户提出一个任务:
1 | 帮我修复登录模块中的Bug |
一个典型的Planner可能会生成如下计划:
1 | 1. 阅读登录模块代码 |
从人类角度来看,这是一份合理的计划。但问题在于,当Agent真正开始执行时,它获得的信息会不断变化。
例如在第二步分析代码时,它可能发现:
1 | 登录逻辑本身没有问题 |
这时原来的计划立即失效。
如果系统坚持按照既定步骤继续执行:
1 | 继续修改登录模块 |
那么最终很可能修错地方。
因此,现代Agent几乎不会把计划当作不可变的执行脚本。相反,它们会把计划视为一种当前认知下的最佳猜测。当新的信息出现时,计划本身也必须随之调整。
于是:
1 | 1. 阅读登录模块代码 |
新的计划会动态生成。
这也是为什么会在Cursor中经常看到这样的现象:Agent一开始展示了一份计划,但执行到中途时又主动修改了自己的执行路线。
现代Agent:两层规划机制
从工程实现角度来看,现代Agent通常同时存在两层规划机制。
(1)高层规划(High-Level Planning)
当用户给出目标后,系统首先要求模型将目标拆解为若干阶段:
1 | plan = llm(""" |
例如:
1 | 目标: |
这一步的主要作用并不是控制执行,而是帮助Agent理解任务结构,同时向用户展示系统准备如何开展工作。
从产品设计角度看,高层计划还有一个重要作用:降低用户的不确定感。相比一个什么都不说就开始工作的黑盒系统,用户通常更愿意信任一个能够明确展示行动路线的Agent。
但真正决定Agent行为的并不是这份计划。
(2)动态规划(Dynamic Planning)
在执行过程中,系统会不断维护当前状态:
1 | state = { |
每完成一步动作之后,状态都会发生变化。
此时Planner并不是重新生成完整计划,而是回答一个更简单的问题:
1 | 在当前状态下,下一步最有价值的动作是什么? |
例如:
1 | next_action = llm( |
模型可能返回:
1 | { |
{
“action”: “edit_file”,
“target”: “session.py”
}
1 |
|
下一步应该做什么?
1 |
|
next_action = llm(…)
1 |
|
context = build_context(…)
1 |
|
State
+
Memory
+
Context Engineering
```
Planner只是利用这些信息做出下一步决策。
换句话说,Planning本身并不神秘。现代Agent之所以能够持续完成复杂任务,并不是因为拥有某种特殊的规划算法,而是因为系统能够持续维护状态、组织上下文,并基于当前认知不断重新决定下一步行动。
这也是为什么近年来Agent系统的研究重点逐渐从Planner本身转向Memory、State和Context Engineering。
对于现代Agent而言,真正困难的从来不是“制定计划”,而是“知道自己现在处于什么状态,以及接下来最应该做什么”。