使用并行 Claude Agent 团队构建 C 编译器
TL;DR
Anthropic 研究员 Nicholas Carlini 展示了“智能体团队”的能力,他指派了 16 个并行的 Claude Opus 4.6 实例,让它们从零开始自主构建一个基于 Rust 的 C 编译器。最终生成的 100,000 行编译器可以构建 x86、ARM 和 RISC-V 上的 Linux 6.9。这证明了自主智能体团队可以在无需人类持续干预的情况下处理大规模、长期的技术项目。
智能体团队架构
为了摆脱对人类操作员提供持续反馈的需求,Carlini 开发了一个将 Claude 置于持续循环中的框架。当一个任务完成后,智能体立即开始下一个任务,其行为由提示词引导,要求它将问题分解为小块并跟踪自己的进度。
并行执行与同步
并行运行多个智能体可以实现对多个问题的同时调试,并并使用专门的角色。技术实现使用了裸 git 仓库和 Docker 容器:
- 基础设施: 每个智能体都在其各自的 Docker 容器中运行,并挂载了仓库。智能体克隆本地副本,执行任务,并将更改推送到上游仓库。
- 同步: 为了避免重复工作,智能体通过在
current_tasks/目录中写入文本文件来使用简单的锁定机制。如果两个智能体尝试申领同一个任务,git 同步会强制第二个智能体选择不同的任务。 - 工作流: 智能体从上游拉取,合并来自其他智能体的更改,推送其更新,并移除锁定。Claude 被指派任务去解决由此产生的任何合并冲突。
为自主进展而设计的工程化实现
成功的自主开发需要一个环境,使模型能够自我定位并验证自己的工作,而无需人类指导。
高质量验证
由于 Claude 会解决它被赋予的问题,因此任务验证器必须近乎完美,以防止模型解决错误的问题。Carlini 实现了一个持续集成 (CI) 流水线并进行严格执行,以防止新功能破坏现有功能。
针对 LLM 限制进行优化
该框架的设计考虑了特定语言模型的局限性:
- 上下文窗口污染: 为了防止浪费 token,该框架仅打印极简输出,并将详细信息记录到文件中。日志格式经过设计,以便通过
grep轻松搜索错误。 - 时间盲区: 由于 LLM 无法跟踪时间,该框架提供了一个
--fast选项,用于运行确定性的 1% 或 10% 随机测试样本,以便在不花费数小时运行完整测试套件的情况下快速识别回归问题。
扩展到复杂任务
虽然对于独立测试,并行化很容易,但像编译 Linux 内核这样的单体任务往往会导致智能体互相覆盖彼此的工作。为了解决这个问题,Carlini 使用 GCC 作为“在线已知良好的编译器 oracle”。
通过随机使用 GCC 编译内核的大部分内容,而仅使用 Claude 的编译器编译一小部分,智能体可以并行地隔离并修复特定文件中的 bug。这一过程通过 delta debugging 技术进一步优化,以识别那些在单独使用时可以工作但在组合在一起时会失败的文件。
最终编译器的能力与局限性
使用 Claude Opus 4.6,该项目在两周内消耗了 20 亿个输入 token 和 1.4 亿个输出 token,成本约为 20,000 美元。
技术成就
- 范围: 仅使用 Rust 标准库实现的干净室实现 (clean-room implementation)。
- 兼容性: 可以在 x86、ARM 和 RISC-V 上构建可引导的 Linux 6.9。它还可以编译 QEMU、FFmpeg、SQLite、Postgres 和 Redis。
- 基准测试: 在大多数编译器测试套件(包括 GCC torture test suite)上实现了 99% 的通过率,并在成功编译并运行了 Doom。
当前局限性
- 引导过程 (Bootstrapping): 它缺乏启动 Linux 所需的 16 位 x86 编译器;目前在这一特定阶段调用 GCC。
- 工具链: 它没有自己功能完备的汇编器和链接器,演示视频中依赖 GCC。
- 效率: 生成的代码效率低于 GCC 在禁用所有优化的情况下产生的代码。
- 代码质量: Rust 源代码质量尚可,但无法与专家级人类 Rust 程序员的质量相匹配。
对自主开发的影响
这项实验标志着 LLM 从作为自动补全工具或结对编程助手,向作为自主项目执行者的转变。虽然生产力潜力巨大,但 Carlini 指出,对于自主生成且从未经过人类亲自验证的软件部署存在显著的安全担忧,并引用其在渗透测试方面的背景作为谨慎的理由。
Sources
相关
- 项目
- 项目
- 项目
- 项目
- Dispatch