Anthropic 代理团队构建了一个 10 万行的 C 编译器
由 16 个并行 Claude 代理组成的团队成功构建了一个 10 万行的 C 编译器,这标志着在使用大型语言模型进行自主、长期软件开发方面迈出了重要一步。
这项研究不仅关注最终的编译器产物,还关注所需的先进脚手架,以保持多个 LLM 实例在轨道上、管理复杂的代码库,并在没有人工干预的情况下保持进展。
自主开发的代理团队架构
LLM 代理的自主进展需要从交互式会话向持续的、自我导向的循环进行根本性转变。
支持长期运行的代理
现有的 LLM 代理脚手架通常需要人工操作员提供持续输入,导致模型在面对复杂、长期问题时停滞。为了克服这一点,研究人员实现了一个强制 Claude 进入简单、持续循环的框架。当一个代理完成一项任务时,它会立即进行下一项任务,保持持续的自主进展,直到目标达成。
并行化和同步
并行运行多个 Claude 实例解决了单代理系统的两个关键弱点:单个会话无法同时调试多个问题,以及缺乏专业化的可能性。
该实现使用了一个裸 Git 仓库结构,每个代理在自己的 Docker 容器中运行。为了防止代理同时尝试解决相同的问题,框架采用了一个简单的同步算法:
- 代理通过写入锁文件(例如
current_tasks/parse_if_statement.txt)来声明任务。 - 如果第二个代理尝试声明相同的任务,Git 的同步机制会强制第二个代理选择不同的任务。
- 代理工作,从上游仓库拉取更改,合并其他代理的更改,推送自己的更改,然后移除锁。
该系统允许代理在编译器的不同部分并发工作,即使发生合并冲突,Claude 也能解决这些冲突。
编排 LLM 代理的关键经验
该项目中最重要的努力是设计环境——包括测试、反馈和结构——以允许 Claude 在没有人类指导的情况下定位自身并取得进展。
高质量的测试和 CI
由于 Claude 自主运行,任务验证器必须近乎完美;否则,模型将解决错误的问题。研究人员发现,改进测试框架需要找到高质量的编译器测试套件,并为开源包构建验证器和构建脚本。此外,实现了持续集成管道,以严格执行新提交不会破坏现有功能。
针对 LLM 限制的设计
测试框架是专门围绕语言模型的固有限制设计的,包括上下文窗口污染和时间盲区。
- 上下文窗口污染: 为了防止上下文窗口被无用数据填满,框架将所有重要信息记录到文件中。错误以结构化方式记录(例如,
ERROR后跟同一行上的原因),以促进自动化处理。 - 时间盲区: 由于 Claude 无法感知时间,框架不频繁地打印增量进度。它还包括一个默认的
--fast选项,运行一个小型、确定性的随机测试样本,确保进展而不压倒上下文。
解决并行化瓶颈
当代理开始编译 Linux 内核时,它们经常遇到相同的错误,导致重复工作。解决方案是集成 GCC 作为在线的已知良好编译器预言机。一个新的测试框架使用 GCC 随机编译了大部分内核,只留下剩余文件给 Claude 的编译器。这允许代理并行处理不同的文件,修复独特的错误,直到 Claude 的编译器能够编译整个内核。
通过多种角色实现专业化
并行性使得专业化不仅仅是修复错误。团队为不同的代理分配了不同的角色,包括:
- 合并 LLM 编写的代码中发现的重复代码。
- 提高编译器本身的性能。
- 确保输出的编译代码高效。
- 从 Rust 开发者的角度批评项目的设计。
- 维护项目文档。
编译器的能力和限制
在两周内,该项目消耗了 20 亿个输入令牌,并生成了 1.4 亿个输出令牌,总计不到 2 万美元。由此产生的 10 万行编译器是一个功能性产物,已达到 Claude 4 模型系列的当前极限。
已验证的能力
该编译器可以成功地在 x86、ARM 和 RISC-V 上构建可启动的 Linux 6.9。它还可以编译各种开源项目,包括 QEMU、FFmpeg、SQLite、Postgres 和 Redis。它在大多数编译器测试套件(包括 GCC torture 测试套件)中保持 99% 的通过率,并且可以编译和运行 Doom。
当前技术限制
该编译器还不是专业编译器的直接替代品,并且存在几个限制:
- 缺少核心组件: 编译器缺少自己的汇编器和链接器,这些是正在自动化的最终组件,并且仍然有些 bug。
- 代码效率: 即使启用了所有优化,生成的代码也比 GCC 在禁用所有优化的情况下生成的代码效率低。
- 16 位 x86 支持: 编译器无法实现从实模式启动 Linux 所需的 16 位 x86 代码生成器。对于这个特定阶段,它目前调用 GCC。
- 代码质量: 虽然 Rust 代码质量合理,但未达到专家 Rust 程序员的标准。
对未来软件开发的影响
代理团队代表了从使用 LLM 进行简单任务(如标签补全)到实现整个复杂软件项目的自主实现的范式转变。
虽然这种能力非常令人兴奋,但研究人员警告说,完全自主的开发引入了重大风险。与人工监督的开发不同,错误可以实时捕获,自主系统可以在报告测试通过的同时仍然包含关键缺陷。LLM 的快速进展为编写大量新代码打开了大门,但这个新世界需要新的策略来安全导航,确保积极的应用超过部署未经验证的软件的固有风险。