Anthropicのエージェントチームが10万行のCコンパイラを構築
16の並列Claudeエージェントからなるチームによる10万行のCコンパイラの構築成功は、大規模言語モデルを用いた自律的かつ長期的なソフトウェア開発への大きな飛躍を示しています。
この研究は、結果として得られたコンパイラの成果物だけでなく、複数のLLMインスタンスを軌道に乗せ、複雑なコードベースを管理し、人間の介入なしに進捗を維持するために必要な高度なスキャフォールディングにも焦点を当てています。
自律開発のためのエージェントチームアーキテクチャ
LLMエージェントの自律的な進歩には、対話型セッションから持続的で自己主導型のループへの根本的な転換が必要です。
長時間実行エージェントの実現
既存のLLMエージェントスキャフォールドは通常、人間のオペレーターが継続的な入力を提供する必要があり、複雑で長期的な問題に直面するとモデルが停止してしまいます。これを克服するために、研究者らはClaudeを単純な連続ループに強制するハーネスを実装しました。エージェントが1つのタスクを完了すると、すぐに次のタスクに進み、目的が達成されるまで持続的かつ自律的な進捗を維持します。
並列化と同期
複数のClaudeインスタンスを並列実行することで、単一エージェントシステムの2つの重大な弱点、すなわち1つのセッションが複数の問題を同時にデバッグできないことと、専門化の可能性に対処します。
実装では、各エージェントが独自のDockerコンテナ内で動作するベアGitリポジトリ構造を使用します。エージェントが同時に同じ問題を解決しようとするのを防ぐため、ハーネスは単純な同期アルゴリズムを採用しています:
- エージェントがロックファイル(例:
current_tasks/parse_if_statement.txt)を書き込むことでタスクを要求します。 - 別のエージェントが同じタスクを要求しようとすると、Gitの同期メカニズムにより、2番目のエージェントは別のタスクを選択せざるを得なくなります。
- エージェントは作業し、上流リポジトリから変更をプルし、他のエージェントの変更をマージし、自身の変更をプッシュしてから、ロックを解除します。
このシステムにより、エージェントはマージ競合が発生してもコンパイラの異なる部分で並行して作業でき、Claudeはその競合を解決できます。
LLMエージェントを調整する上での重要な教訓
このプロジェクトで最も重要な取り組みは、Claudeが人間のガイダンスなしで自己定位し進捗できるように、テスト、フィードバック、構造を含む環境を設計することでした。
高品質なテストとCI
Claudeは自律的に動作するため、タスク検証器はほぼ完璧でなければなりません。そうでなければ、モデルは間違った問題を解決してしまいます。研究者らは、テストハーネスを改善するには、高品質なコンパイラテストスイートを見つけ、オープンソースパッケージ用の検証器とビルドスクリプトを構築する必要があることを発見しました。さらに、新しいコミットが既存の機能を壊さないことを厳格に強制する継続的インテグレーションパイプラインが実装されました。
LLMの限界に合わせた設計
テストハーネスは、コンテキストウィンドウの汚染や時間盲など、言語モデルの固有の限界に特化して設計されました。
- コンテキストウィンドウの汚染: コンテキストウィンドウが無用なデータで満たされるのを防ぐため、ハーネスはすべての重要な情報をファイルに記録します。エラーは構造化された方法(例:
ERRORの後に行内に理由)で記録され、自動処理を容易にします。 - 時間盲: Claudeは時間を認識できないため、ハーネスは進捗を頻繁に出力しません。また、デフォルトの
--fastオプションを含み、小さな決定的なランダムサンプルのテストを実行することで、コンテキストを圧倒せずに進捗を確保します。
並列化のボトルネックの解決
エージェントがLinuxカーネルのコンパイルを開始すると、同じバグに頻繁に遭遇し、冗長な作業が発生しました。解決策は、GCCをオンラインの既知の正常なコンパイラオラクルとして統合することでした。新しいテストハーネスは、カーネルの大部分をGCCでランダムにコンパイルし、残りのファイルだけをClaudeのコンパイラに残しました。これにより、エージェントは異なるファイルで並行して作業し、Claudeのコンパイラがカーネル全体をコンパイルできるようになるまで、独自のバグを修正できました。
複数の役割による専門化
並列処理により、単なるバグ修正を超えた専門化が可能になります。チームは異なるエージェントに異なる役割を割り当てました。例えば:
- LLMが書いたコードに見られる重複コードの統合。
- コンパイラ自体のパフォーマンス向上。
- 出力されたコンパイル済みコードが効率的であることの確保。
- Rust開発者の視点からプロジェクトの設計を批評。
- プロジェクトドキュメントの維持。
コンパイラの機能と制限
2週間で、プロジェクトは20億の入力トークンと1億4000万の出力トークンを消費し、合計で2万ドル弱となりました。結果として得られた10万行のコンパイラは、Claude 4モデルシリーズの現在の限界に達した機能的な成果物です。
実証された機能
このコンパイラは、x86、ARM、RISC-V上で起動可能なLinux 6.9を正常にビルドできます。また、QEMU、FFmpeg、SQLite、Postgres、Redisなどのさまざまなオープンソースプロジェクトもコンパイルします。GCC tortureテストスイートを含むほとんどのコンパイラテストスイートで99%の合格率を維持し、Doomのコンパイルと実行も可能です。
現在の技術的限界
このコンパイラはまだプロフェッショナルなコンパイラの代替品ではなく、いくつかの制限が残っています:
- 欠落しているコアコンポーネント: コンパイラには独自のアセンブラとリンカがなく、これらは自動化されている最終コンポーネントであり、まだややバグが残っています。
- コード効率: すべての最適化を有効にしても、生成されるコードはGCCの最適化をすべて無効にした場合に生成されるコードよりも効率が劣ります。
- 16ビットx86サポート: コンパイラは、Linuxをリアルモードから起動するために必要な16ビットx86コードジェネレータを実装できません。この特定のフェーズでは、現在GCCを呼び出しています。
- コード品質: Rustコードの品質は合理的ですが、熟練したRustプログラマーが生み出す水準には達していません。
将来のソフトウェア開発への影響
エージェントチームは、タブ補完のような単純なタスクにLLMを使用することから、複雑なソフトウェアプロジェクト全体の自律的な実装を可能にすることへのパラダイムシフトを表しています。
この能力は非常にエキサイティングですが、研究者らは、完全に自律的な開発には重大なリスクが伴うと警告しています。エラーをリアルタイムで検出できる人間が監督する開発とは異なり、自律システムは重大な欠陥を含みながらテストに合格したと報告することがあります。LLMの急速な進歩は、膨大な量の新しいコードを書く可能性を開きますが、この新しい世界は、検証されていないソフトウェアの展開に伴う固有のリスクを上回る肯定的な応用を確実にするために、安全にナビゲートするための新しい戦略を必要とします。
将来のソフトウェア開発への影響
エージェントチームは、タブ補完のような単純なタスクにLLMを使用することから、複雑なソフトウェアプロジェクト全体の自律的な実装を可能にすることへのパラダイムシフトを表しています。
この能力は非常にエキサイティングですが、研究者らは完全に自律的な開発には重大なリスクが伴うと警告しています。エラーをリアルタイムで検出できる人間が監督する開発とは異なり、自律システムは重大な欠陥を含みながらテストに合格したと報告することがあります。LLMの急速な進歩は、膨大な量の新しいコードを書く可能性を開きますが、この新しい世界は、検証されていないソフトウェアの展開に伴う固有のリスクを上回る肯定的な応用を確実にするために、安全にナビゲートするための新しい戦略を必要とします。