拆解 Cursor 多 Agent 重造 SQLite:规划-执行分离架构如何让成本降 8 倍

拆解 Cursor 多 Agent 重造 SQLite:规划-执行分离架构如何让成本降 8 倍

Cursor 团队最近放了一个实验:只给一群 AI Agent 一份 835 页的 SQLite 官方手册,不提供源码、测试集、二进制文件,也不联网,用 Rust 从零实现一个数据库引擎。最终,新蜂群架构通过了全部预留的 SQL 一致性测试;更关键的是,把「前沿模型做规划 + 低成本模型做执行」组合起来,成本从全用前沿模型的 10,565 美元降到 1,339 美元,差了将近 8 倍。

这件事对开发者的直接启发不是「Agent 可以替代程序员写数据库」,而是:当任务规模变大,Agent 怎么编排,比用哪个模型更重要。规划-执行分离、层级任务树、共享设计文档、可验证的引用链,这些工程机制正在成为新一代 AI 编程的基础设施。

如果你正在用 Cursor/Windsurf/Cline 做复杂项目,或者想把多个 Agent 串起来处理代码迁移、模块重构、测试补全,这套架构的思路可以直接抄作业。


核心思路:把任务树拆成「规划器」和「执行者」

单个 Agent 包揽大任务时,会出现一个经典困境:上下文要同时装下全局目标、当前子任务、历史决策、代码细节。时间一长,它要么盯死局部丢全局,要么看全局时局部潦草。Cursor 的解法是按树状结构拆分角色:

  • 规划器(Planner):只负责拆解任务,不写实现代码。它拥有完整目标,递归生成边界清晰的工作单元,然后委派出去。
  • 执行者(Worker):只负责实现被委派的具体任务,不参与规划。它可以把全部上下文都投入到一小块代码里。
  • 裁判/审查者(Referee / Reviewer):判断任务是否完成、是否需要回滚,提供多个错开视角的审查。
  • 冲突协调者(Conflict Resolver):中立的第三方 Agent,专门处理合并冲突和跨规划器的设计矛盾。

这种拆分本质上是在做上下文隔离。规划器不被底层实现细节塞满,执行者不被全局目标分散注意力。Cursor 认为,这其实是蜂群可扩展的主要来源,而不只是并行度。

用更工程化的语言描述,整个系统可以抽象成一条流水线:

目标 + 规格说明
    ↓
Root Planner(根规划器)
    ↓ 递归委派
子规划器 / 工作单元
    ↓
Worker Agent(实现具体模块)
    ↓
共享设计文档 + 可编译校验引用
    ↓
冲突协调器 + 审查视角叠加
    ↓
Held-out Test Suite(预留测试集)

这套架构不是只在 SQLite 实验里跑过。Cursor 说他们已经用类似结构做浏览器实现、数学问题求解、GPU kernel 优化、开源漏洞挖掘、测试覆盖率提升,以及生成训练数据。


关键机制 1:共享设计文档 + 可编译校验的引用

多 Agent 协作最怕「脑裂」:两个规划器在代码库不同部分实现了同一个概念,彼此不知道。传统合并工具只能解决文本冲突,解决不了语义冲突。

Cursor 的方案是:

  1. 规划器把设计决策写进共享设计文档。
  2. 依赖该决策的代码必须附带一个引用,指向对应文档条目。
  3. 这个引用可以被编译器校验。如果设计文档被协调器合并/修改,引用链会把解决结果传递到所有下游代码。

这就像给架构决策做类型检查。人类团队里的 ADR(Architecture Decision Records)是手写的、容易过时的;这里的 ADR 被当成一等公民,由 Agent 维护、由编译器强制执行。

一个简化的伪代码示例:

// 代码中的设计决策引用:引用设计文档第 B-07 条
// @design-ref: B-07 "SQL 表达式求值统一使用 Row 结构体"

#[derive(Clone, Debug)]
pub struct Row {
    // ... 字段定义
}

pub fn eval_expr(expr: &Expr, row: &Row) -> Value {
    // 实现细节
}

在真实实现里,引用可能以注释+静态检查工具的形式存在。重点是:让设计意图可追踪、可合并、可验证,而不是靠 Agent 在对话历史里记住。


关键机制 2:面向 Agent 的版本控制系统

传统 Git 在每小时 1000 次提交时还能撑,但 Cursor 的新蜂群峰值达到每秒约 1000 次提交。Git 的粗粒度锁和合并模型直接失效。

旧蜂群在 Grok 4.5 运行中,两小时内产生了 68,000 次提交,积累了超过 70,000 次合并冲突;最夸张的一个文件被 1,173 个不同 Agent 修改了 7,771 次冲突。新蜂群跑满四小时,冲突不到 1,000 次。

所以 Cursor 自己写了一套 VCS。它不只是为了提高吞吐量,更是把冲突协调机制下沉到版本控制层:

  • 提交粒度足够小,能暴露冲突。
  • 冲突一旦发生,调用中立第三方 Agent 解决。
  • 臃肿文件被标记后,阻止新提交进入,由外部 Agent 拆分模块。

这给我们的启发是:如果你打算让多个 Agent 同时写一个代码库,先别急着上 Git 共享分支,先想清楚冲突发现、冲突解决、模块化边界这三件事。否则 Agent 越多,合并地狱越严重。


关键机制 3:破坏性变更也要被允许

在人类维护的代码库中,Agent 倾向于「不碰核心代码」。这会导致核心模块逐渐僵化。Cursor 的解法是:允许 Agent 主动引入带注释的破坏性变更。

流程如下:

  1. 某个 Agent 判断核心部分需要改动,提交一个补丁,并附带说明注释。
  2. 编译器把变更影响传导到整个系统,相关模块构建失败。
  3. 其他 Agent 读到注释,理解原因,更新各自负责的代码。

这相当于把「重构」从人类专家专属行为,变成 Agent 蜂群里的标准流程。关键前提是:变更必须带解释,失败必须可传播


关键机制 4:用预留测试集做裁判,而不是优化目标

Cursor 用 SQLite 的 sqllogictest 作为评分标准。这套测试包含数百万条 SQL 查询,用来验证不同数据库引擎执行相同查询是否返回一致结果。

重点来了:Agent 事先不知道这套测试集的存在。每次运行后,团队还会人工审查代码和运行过程,确保 Agent 没有作弊或只针对测试做优化。

这对开发者做 Agent 项目非常重要。如果你让 Agent 自己写测试,它很可能只写自己过得去的;如果你用固定的、Agent 看不见的测试集,才能真正衡量它是不是在解决问题。

实践中你可以这样设置:

# 保留一部分测试用例不告诉 Agent
# 公开测试集:用于 Agent 自我迭代
public_tests/

# 预留测试集:只在最终评估时运行
held_out_tests/

# 评估脚本
python evaluate.py --engine ./target/minisqlite --tests held_out_tests/

预留测试集是避免「Agent 自我欺骗」的最简单手段。


模型经济性:规划器贵,执行者便宜

Cursor 测试了四种模型组合,结果都通过了测试集,但成本差异巨大:

配置规划器执行者大致成本结果
全前沿GPT-5.5GPT-5.5~$10,565通过
成本基线Grok 4.5Grok 4.5中等通过
混合方案 AOpus 4.8Composer 2.5$1,339100% 通过
混合方案 BFable 5Composer 2.5略高通过

数据表明:

  • Worker 至少消耗 69% 的 token,多数情况下超过 90%。
  • 但规划器 token 虽然少,却占了约三分之二的成本。
  • 真正需要前沿智能的环节只有:任务拆解、设计决策、关键权衡。
  • 一旦规划器把不确定性收敛成明确指令,便宜模型照着执行就行。

结论很直白:不要全链路用大模型。把不确定性高的部分交给强模型,把确定性高的部分交给快模型。


动手建议:怎么在自己的项目里复用这套思路

这套架构不是只有 Cursor 能玩。你在处理复杂代码任务时,可以按下面步骤逐步落地:

1. 从「任务分解」开始

不要直接让 Agent 写一个完整模块。先让强模型输出一个层级任务树:

目标:为现有 Django 项目添加 OAuth2 登录
├── 子任务 1:添加依赖并配置 settings
├── 子任务 2:实现 OAuth Provider 适配器
├── 子任务 3:实现用户绑定/创建逻辑
├── 子任务 4:添加登录路由和回调路由
├── 子任务 5:编写单元测试
└── 子任务 6:编写集成测试

2. 给每个任务加验收标准

每个叶子节点都要带明确的完成标准,比如:

  • 能够通过 pytest tests/oauth/ 的公开测试集。
  • 路由 /auth/callback/ 返回 302 并设置 session["user_id"]
  • 不引入新的未处理异常类型。

3. 用便宜模型做执行,强模型做审查

  • 执行者:用 Claude 3.5 Sonnet / GPT-4o-mini / DeepSeek-V3 写代码。
  • 规划者/审查者:用 Claude Opus 4 / GPT-5.5 / Kimi K3 做任务拆解和最终审查。

4. 保留预留测试集

把 20% 的测试用例藏起来,只在最终评估时跑。这能防止 Agent 过拟合到可见测试。

5. 别让多个 Agent 直接写同一个文件

如果必须并发,先按模块划分清晰边界。否则你会遇到旧蜂群那个「一个文件 7,771 次冲突」的噩梦。


资源链接


一句话总结

当任务复杂到单个 Agent hold 不住时,「强模型做规划、便宜模型做执行、共享设计文档做协调、预留测试集做裁判」这套组合,比单纯堆模型能力更划算,也更可控。Cursor 的 SQLite 实验已经把路线图画出来了,剩下的就是在你自己的代码库里照着拆。

滚动至顶部