Anthropic 代理团队构建了一个 10 万行的 C 编译器

由 16 个并行 Claude 代理组成的团队成功构建了一个 10 万行的 C 编译器,这标志着在使用大型语言模型进行自主、长期软件开发方面迈出了重要一步。

这项研究不仅关注最终的编译器产物,还关注所需的先进脚手架,以保持多个 LLM 实例在轨道上、管理复杂的代码库,并在没有人工干预的情况下保持进展。

自主开发的代理团队架构

LLM 代理的自主进展需要从交互式会话向持续的、自我导向的循环进行根本性转变。

支持长期运行的代理

现有的 LLM 代理脚手架通常需要人工操作员提供持续输入,导致模型在面对复杂、长期问题时停滞。为了克服这一点,研究人员实现了一个强制 Claude 进入简单、持续循环的框架。当一个代理完成一项任务时,它会立即进行下一项任务,保持持续的自主进展,直到目标达成。

并行化和同步

并行运行多个 Claude 实例解决了单代理系统的两个关键弱点:单个会话无法同时调试多个问题,以及缺乏专业化的可能性。

该实现使用了一个裸 Git 仓库结构,每个代理在自己的 Docker 容器中运行。为了防止代理同时尝试解决相同的问题,框架采用了一个简单的同步算法:

  1. 代理通过写入锁文件(例如 current_tasks/parse_if_statement.txt)来声明任务。
  2. 如果第二个代理尝试声明相同的任务,Git 的同步机制会强制第二个代理选择不同的任务。
  3. 代理工作,从上游仓库拉取更改,合并其他代理的更改,推送自己的更改,然后移除锁。

该系统允许代理在编译器的不同部分并发工作,即使发生合并冲突,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 的快速进展为编写大量新代码打开了大门,但这个新世界需要新的策略来安全导航,确保积极的应用超过部署未经验证的软件的固有风险。

Sources