Planner-Worker Separation for Long-Running Agents
Cursor Team· emerging
问题
在复杂的多周项目中并行运行多个AI智能体时,会产生重大的协调挑战:
- 扁平化结构会引发冲突、工作重复,还会导致智能体之间互相干扰
- 通过带锁定机制的共享文件开展动态协调会成为瓶颈——大多数智能体的时间都耗费在等待上,而非实际工作
- 地位平等的智能体会变得规避风险,逃避困难任务,仅做出微小的、安全的变更,而非着手进行端到端的实现工作
- 没有任何智能体负责解决棘手问题或把控整体项目方向
方案
将Agent角色划分为分层的规划者-执行者结构:
- 规划者(Planner):持续探索代码库并创建任务。他们可以为特定领域生成子规划者(Sub-Planner),让规划工作本身具备并行性与递归性。
- 执行者(Worker):承接任务并专注于完成任务。他们无需与其他执行者协调,也不用考虑全局情况。会全力推进分配到的任务直至完成,然后提交变更。
- 评判者(Judge):在每个周期结束时,判定是继续执行还是已达成目标。
这种结构形成一个迭代周期,每个迭代都会重新启动,以此避免偏差与视野局限。
graph TD
subgraph 规划层
P1[规划者Agent]
P1 --> SP1[子规划者:领域A]
P1 --> SP2[子规划者:领域B]
P1 --> SP3[子规划者:领域C]
end
subgraph 执行层
SP1 -->|创建任务| W1[执行者1]
SP1 -->|创建任务| W2[执行者2]
SP2 -->|创建任务| W3[执行者3]
SP2 -->|创建任务| W4[执行者4]
SP3 -->|创建任务| W5[执行者5]
end
subgraph 评估层
W1 -->|提交变更| J[评判者Agent]
W2 -->|提交变更| J
W3 -->|提交变更| J
W4 -->|提交变更| J
W5 -->|提交变更| J
J -->|是否继续?| P1
end
如何使用
规划者-执行者分离的适用场景:
- 大型代码库:需要人类团队耗时数月完成的项目(代码量超100万行、文件数超1000个)
- 高难度目标:从零构建复杂系统(如网页浏览器、Windows模拟器、Excel克隆版)
- 大规模迁移:原地框架迁移(如从Solid迁移到React、Java LSP实现迁移)
- 性能优化:为提升速度采用不同语言进行完全重写(如从C++重写为Rust)
实现注意事项:
- 角色专属模型选择:不同模型擅长不同角色。即便存在专注于编码的执行者模型,也应选用专注于规划的模型来承担规划者角色。
- 全新启动:每个周期都应从全新状态开始,以避免长期运行的context引发的偏差和视野局限。
- 并行规划:规划者可以生成子规划者,使规划过程本身具备并行性和递归性。
- 执行者隔离:执行者应聚焦于单个任务,无需处理与其他执行者的协调工作。
Prompt设计至关重要:要让Agent实现良好协作、避免异常行为并长期保持专注,需要针对prompt开展大量实验。
权衡
优点:
- 可扩展性:数百个Agent可在单一代码库上同时工作数周
- 明确的职责归属:规划者(Planners)掌控全局;执行者(Workers)负责任务完成
- 并行规划:可通过生成子规划者来扩展规划能力
- 降低协调开销:执行者无需相互协调
- 避免思维局限:带有全新启动环节的迭代周期可防止任务偏离方向
缺点:
- 系统复杂度高:需要用于角色划分和任务分配的编排基础设施
- 提示词工程难度大:协调行为需要大量的提示词实验
- 成本高昂:让数百个Agent同时运行数周的成本不菲
- 并非完全高效:存在大量Token浪费,但实际效果远好于预期
- 仍在发展完善中:规划者应在任务完成时触发唤醒;Agent有时会运行超时
参考文献
关键词:
:包含Cursor平台关于规模化长时运行自主编码代理的实践博客,以及其GitHub上超百万行由代理生成的浏览器源代码仓库。
直译:
- 规模化长时运行自主编码 - Cursor博客文章,介绍如何同时运行数百个并发代理并持续数周
- GitHub上的浏览器源代码 - 超过100万行由代理生成的代码
来源摘要
正在获取来源并生成中文摘要…