Anthropic 에이전트 팀, 10만 줄 C 컴파일러 구축

16개의 병렬 Claude 에이전트로 구성된 팀이 10만 줄의 C 컴파일러를 성공적으로 구축한 것은 대규모 언어 모델을 사용한 자율적이고 장기 실행되는 소프트웨어 개발로의 큰 도약을 보여줍니다.

이 연구는 결과물인 컴파일러 자체에만 초점을 맞추는 것이 아니라, 여러 LLM 인스턴스를 올바른 궤도에 유지하고, 복잡한 코드베이스를 관리하며, 인간의 적극적인 개입 없이 진행 상황을 유지하는 데 필요한 고급 스캐폴딩에도 초점을 맞춥니다.

자율 개발을 위한 에이전트 팀 아키텍처

LLM 에이전트의 자율적 진행은 대화형 세션에서 지속적이고 자기 주도적인 루프로의 근본적인 전환을 요구합니다.

장기 실행 에이전트 활성화

기존 LLM 에이전트 스캐폴딩은 일반적으로 인간 운영자가 지속적인 입력을 제공해야 하므로, 복잡하고 장기적인 문제에 직면하면 모델이 중단됩니다. 이를 극복하기 위해 연구자들은 Claude를 단순하고 연속적인 루프로 강제하는 하네스를 구현했습니다. 에이전트가 하나의 작업을 완료하면 즉시 다음 작업을 진행하여 목표가 달성될 때까지 지속적이고 자율적인 진행을 유지합니다.

병렬화 및 동기화

여러 Claude 인스턴스를 병렬로 실행하면 단일 에이전트 시스템의 두 가지 중요한 약점, 즉 단일 세션이 여러 문제를 동시에 디버깅할 수 없는 점과 전문화 가능성을 해결합니다.

구현은 각 에이전트가 자체 Docker 컨테이너에서 작동하는 기본 Git 저장소 구조를 사용합니다. 에이전트가 동시에 동일한 문제를 해결하려고 시도하는 것을 방지하기 위해 하네스는 간단한 동기화 알고리즘을 사용합니다.

  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 개발자의 관점에서 프로젝트 설계 비평.
  • 프로젝트 문서 유지 관리.

컴파일러 기능 및 한계

2주 동안 프로젝트는 20억 개의 입력 토큰을 소비하고 1억 4천만 개의 출력 토큰을 생성하여 총 비용은 약 20,000달러 미만이었습니다. 결과적으로 만들어진 10만 줄의 컴파일러는 Claude 4 모델 시리즈의 현재 한계에 도달한 기능적 산출물입니다.

입증된 기능

컴파일러는 x86, ARM 및 RISC-V에서 부팅 가능한 Linux 6.9를 성공적으로 빌드할 수 있습니다. 또한 QEMU, FFmpeg, SQLite, PostgreSQL 및 Redis를 포함한 다양한 오픈 소스 프로젝트를 컴파일합니다. GCC torture 테스트 스위트를 포함한 대부분의 컴파일러 테스트 스위트에서 99% 통과율을 유지하며 Doom을 컴파일하고 실행할 수 있습니다.

현재 기술적 한계

컴파일러는 아직 전문 컴파일러의 대체재가 아니며 여러 한계가 남아 있습니다.

  • 누락된 핵심 구성 요소: 컴파일러에는 자체 어셈블러와 링커가 없으며, 이는 자동화되고 있는 마지막 구성 요소로 여전히 다소 버그가 있습니다.
  • 코드 효율성: 모든 최적화를 활성화하더라도 생성된 코드는 모든 최적화를 비활성화한 GCC가 생성한 코드보다 효율성이 떨어집니다.
  • 16비트 x86 지원: 컴파일러는 Linux를 리얼 모드에서 부팅하는 데 필요한 16비트 x86 코드 생성기를 구현할 수 없습니다. 이 특정 단계에서는 현재 GCC를 호출합니다.
  • 코드 품질: Rust 코드 품질은 합리적이지만 전문 Rust 프로그래머가 만든 표준에는 미치지 못합니다.

향후 소프트웨어 개발에 대한 시사점

에이전트 팀은 탭 완성과 같은 간단한 작업에 LLM을 사용하는 것에서 전체적이고 복잡한 소프트웨어 프로젝트의 자율적 구현을 가능하게 하는 패러다임 전환을 나타냅니다.

이 기능은 매우 흥미롭지만, 연구자들은 완전 자율 개발이 상당한 위험을 초래한다고 경고합니다. 오류를 실시간으로 잡을 수 있는 인간 감독 개발과 달리 자율 시스템은 중요한 결함이 포함된 상태에서도 테스트 통과를 보고할 수 있습니다. LLM의 빠른 발전은 방대한 양의 새 코드를 작성할 수 있는 문을 열어주지만, 이 새로운 세계는 안전하게 탐색하기 위한 새로운 전략을 요구하며, 검증되지 않은 소프트웨어를 배포하는 고유한 위험보다 긍정적인 적용이 우세하도록 보장해야 합니다.

SUMMARY: Anthropic은 16개의 병렬 Claude 인스턴스가 여러 아키텍처에서 Linux 6.9를 컴파일할 수 있는 10만 줄의 C 컴파일러를 구축하도록 하여 자율 LLM 에이전트 팀의 능력을 성공적으로 입증했습니다.

TITLE: Anthropic 에이전트 팀, 10만 줄 C 컴파일러 구축

Sources