2,700만 원, 2주, 16개의 Claude 에이전트: Anthropic이 최초로 AI를 통해 구축한 C 컴파일러

BBetter Stack
Computing/SoftwareBusiness NewsVideo & Computer GamesInternet Technology

Transcript

00:00:00앤스로픽이 방금 엄청난 일을 해냈습니다. 16개의 클로드 에이전트를 풀어놓고
00:00:05C 컴파일러를 만들게 한 건데요. 2주 동안 쉬지 않고 가동한 결과, 실제로 작동하는 컴파일러를 완성했습니다.
00:00:11리눅스 커널을 컴파일하고 '둠' 게임까지 실행할 수 있는 수준이죠. 이전 버전인 오퍼스 4에서는
00:00:16절대 불가능했던 정말 인상적인 성과입니다. 하지만 일각에서는 앤스로픽이 이 결과를 얻기 위해 사용한
00:00:22의심스러운 기법들 때문에, 이번 성과가 '낚시'이자 절반의 진실일 뿐이라고 비판합니다.
00:00:28과연 앤스로픽은 속임수를 쓴 걸까요? 구독 누르시고 지금 바로 확인해 보시죠.
00:00:31이번 영상은 세 부분으로 나누어 살펴보겠습니다. 먼저 실험 세팅 과정을 알아보고,
00:00:37개발자라면 누구나 배울 점이 많은 핵심 발견 사항들을 짚어본 뒤,
00:00:42마지막으로 이 결과가 정말 타당한지 분석하겠습니다. 앤스로픽의 제작 방식에 대해 제 개인적인 의견이 좀 있거든요.
00:00:47자, 이 실험은 제가 보기에 아주 똑똑한 인물인 니콜라스 칼리니가 주도했습니다.
00:00:52그가 시스템을 어떻게 구축했는지 살펴볼까요? 우선 실제 프로젝트는 'Upstream'이라는 디렉토리에 저장되었고,
00:00:58이 디렉토리는 16개의 서로 다른 도커 컨테이너에 마운트되었습니다.
00:01:03화면에는 4개만 보이지만 16개라고 가정해 봅시다.
00:01:08각 도커 컨테이너에는 오퍼스 4.6 기반의 클로드 코드가 실행 중이었으며,
00:01:15Upstream 저장소를 작업 공간으로 복제해 수정한 뒤 다시 Upstream으로 푸시하는 방식이었습니다.
00:01:21이 방식이 영리했던 이유는 각 에이전트가 다른 에이전트의 작업에 영향을 주지 않고 독립적으로 일할 수 있었기 때문입니다.
00:01:27만약 병합 충돌(merge conflict)이 발생하면 클로드가 스스로 판단해 해결하고 다시 푸시했습니다.
00:01:32각 에이전트는 부여된 작업 목록에서 하나씩 골라 수행했는데요.
00:01:38이 작업들이 사람이 만든 건지, 에이전트가 테스트 결과를 바탕으로 생성한 건지는 확실치 않지만,
00:01:44이름이 지정된 작업들이 존재했고 각 에이전트는 새로운 작업을 맡을 때마다
00:01:50새 세션을 시작했습니다. 에이전트를 장시간 계속 가동하기 위해 Ralph 루프를 사용했는데요.
00:01:56에이전트가 작업을 마치고 푸시하면, 즉시 새 세션으로 다른 작업을 선택하는 과정을 무한 반복하는 구조입니다.
00:02:02이전 영상에서 설명했듯, 장기 가동 에이전트의 핵심은 명확하게 정의된 작업입니다.
00:02:08그런데 16개의 에이전트가 동시에 돌아가는데 어떻게 서로 같은 작업을 고르지 않게 했을까요?
00:02:13바로 '작업 잠금(Task lock-in)' 방식입니다.
00:02:19저자가 언급하지 않은 어딘가에 작업 목록이 있고, 에이전트가 작업을 선택하면
00:02:24해당 작업 이름과 일치하는 텍스트 파일을 만들어 커밋을 생성함으로써 독점권을 확보하고,
00:02:30이를 Upstream 디렉토리에 푸시합니다.
00:02:36만약 다른 에이전트가 같은 작업을 골라 동일한 파일을 만들고 푸시하려 하면,
00:02:42깃(Git)에서 파일이 이미 존재한다는 이유로 거부하므로 에이전트는 다른 작업을 찾아야 합니다.
00:02:48이것이 칼리니가 오퍼스 4.6 기반 에이전트의 장기 가동 능력을 테스트한 기본 원리이며,
00:02:53결과는 정말 놀라웠습니다. 하지만 이 실험을 통해 그는 개발자들에게 유용한 몇 가지 사실을 발견했습니다.
00:03:00첫 번째는 다양한 테스트를 수행하는 '테스트 하네스'나 스크립트를 구축하는 것입니다.
00:03:07닉(이제 친해졌으니 닉이라 부르죠)이 실험을 진행할 때,
00:03:12클로드가 새 기능을 만들면서 기존 기능을 망가뜨리는 일이 빈번했기 때문입니다.
00:03:17그래서 그는 SQLite, libjpg, Redis 같은 유명 오픈 소스의 고품질 테스트들로 테스트 하네스를 구성했습니다.
00:03:23또한 컨텍스트 오염을 방지하기 위해 테스트 하네스가 에이전트에게 필요한 로그, 즉 에러 로그만 출력하게 했고,
00:03:29나머지 로그는 별도 파일에 저장해 필요할 때만 클로드가 확인하도록 했습니다.
00:03:35하지만 수천 개의 테스트를 매번 돌리면 에이전트가 다른 일을 할 시간에 몇 시간씩 테스트만 하게 됩니다.
00:03:41여기서 닉의 영리함이 돋보이는데, 그는 테스트 하네스에 'fast 플래그'를 추가했습니다.
00:03:47에이전트가 설정된 값에 따라 전체 테스트의 1% 또는 10%만 무작위로 실행하게 만든 거죠.
00:03:52각 에이전트가 10%씩만 맡아도 합치면 160%니까 충분하고도 남습니다.
00:03:58이때 각 에이전트가 실행하는 테스트는 무작위로 선택되지만, 시드 번호를 동일하게 부여해 결정론적으로 작동하게 했습니다.
00:04:05결과적으로 각 에이전트는 서로 다른 무작위 테스트를 수행하며 혼자 할 때보다 훨씬 빠르게 전체 테스트를 마칠 수 있었습니다.
00:04:13다음 포인트 역시 기발하지만, 기존 기술을 활용했다는 점에서 다소 논란의 여지가 있습니다.
00:04:19지금까지는 여러 오픈 소스 프로젝트의 단위 테스트를 쪼개서 실행하는 방식이 잘 통했습니다.
00:04:25하지만 리눅스 커널 컴파일 단계에 이르자 상황이 복잡해졌습니다. 소스 파일이 개별 단위 테스트가 아니기 때문이죠.
00:04:31에이전트들이 전체를 컴파일하려다 보니 똑같은 에러에 직면하고, 서로의 수정을 덮어씌우는 문제가 발생했습니다.
00:04:36닉은 이번에도 각 에이전트가 컴파일의 일정 비율만 담당하게 하고,
00:04:41나머지는 기존의 GNU 컴파일러인 GCC가 처리하도록 했습니다.
00:04:46닉은 리눅스 커널을 완벽하게 컴파일할 수 있는 GCC를 '오라클(신탁)'이라 불렀습니다.
00:04:53에이전트가 특정 섹션은 자신의 컴파일러로, 나머지는 GCC로 컴파일했을 때 문제가 생겼다면
00:04:58그건 확실히 에이전트 컴파일러의 잘못이지 GCC 때문이 아니라는 게 증명됩니다.
00:05:04덕분에 에이전트는 다른 에이전트의 버그를 고치는 대신 자신의 문제에만 집중할 수 있었습니다.
00:05:09클로드가 바닥부터 직접 만들기로 한 작업에 기존 컴파일러를 썼다는 게 논란이 될 수 있는데,
00:05:15이 부분은 영상 후반부에서 더 자세히 다루겠습니다.
00:05:22다음 포인트는 에이전트에게 '기억력'을 부여하는 것입니다.
00:05:27새 작업은 이전 작업 내용을 모르는 완전히 새로운 클로드 세션에서 시작되므로,
00:05:34닉은 Readme 파일을 업데이트하고 작업 진행 상황과 지침이 담긴 별도 파일을 관리하는 것이 유용하다는 걸 발견했습니다.
00:05:40덕분에 새 세션은 원활하게 작업을 이어받고 이미 해결된 버그를 다시 만드는 실수를 방지할 수 있었습니다.
00:05:46마지막으로 좀 더 당연한 조언은 에이전트에게 각기 다른 역할을 부여하는 것입니다.
00:05:51여러 에이전트가 병렬로 일할 때의 장점은 동일한 코드에 대해 여러 작업을 동시에 진행할 수 있다는 점입니다.
00:05:57닉은 새 코드를 작성하지 않을 때 에이전트들에게 중복 코드 확인,
00:06:03성능 최적화 방안 찾기 같은 고유한 역할을 주었습니다.
00:06:09심지어 Rust 개발자의 관점에서 디자인을 비판하라는 역할도 주었는데, 부디 다른 에이전트들에게 자기가 Rust 개발자라고 떠벌리고 다니진 않았길 바랍니다.
00:06:13자, 프로젝트는 성공적이었지만 진짜 질문은 이겁니다. 앤스로픽이 속임수를 쓴 걸까요?
00:06:18어느 정도는 그렇다고 볼 수 있습니다. 원래 목표는 바닥부터 C 컴파일러를 만드는 것이었고
00:06:23에이전트는 인터넷 연결 없이 모든 코드를 직접 작성했습니다. 그런데 정말 그랬을까요?
00:06:29에이전트는 오픈 소스 프로젝트의 테스트 수트와 이미 컴파일된 GCC에 접근할 수 있었습니다.
00:06:35즉, GCC 컴파일러에 이런저런 값을 넣어보고 결과를 확인하면서
00:06:40Rust로 작성 중인 자기 컴파일러의 설계 방향을 정하는 데 참고했을 가능성이 큽니다.
00:06:45하지만 공평하게 말해서 저라도 C 컴파일러를 밑바닥부터 만든다면 똑같이 행동했을 겁니다.
00:06:51기존 컴파일러를 보고 어떻게 구현됐는지 파악해 제 작업의 방향을 잡았겠죠.
00:06:57만약 완전히 새로운 언어의 컴파일러를 만드는 작업이었다면 훨씬 어려웠을 것이고,
00:07:03클로드가 진짜 무에서 유를 창조할 수 있는지 확인하는 더 좋은 시험대가 되었을 겁니다.
00:07:10닉이 다음에 시도해 볼 만한 아이디어네요. 이제 실험의 자율성에 대해 이야기해 봅시다.
00:07:16솔직히 클로드가 모든 코드를 작성한 건 맞지만, 인간의 강력한 개입이 있었습니다.
00:07:24어떤 테스트 수트를 돌릴지, 루프를 시작하고 Ralph를 쓸지 결정한 건 인간이었습니다.
00:07:31테스트 하네스를 만들고 에이전트에게 구체적인 역할을 준 것도 인간이었죠.
00:07:36그러니 단순히 클로드에게 컴파일러를 만들라고 시켜두고 무한정 방치한 것과는 거리가 멉니다.
00:07:41인간의 도움이 전혀 없었다면 과연 이 정도 수준의 컴파일러가 탄생했을까요? 100% 자율적인 결과라고 보긴 힘듭니다.
00:07:47게다가 인간이 설계한 시스템을 모두 갖췄음에도 클로드 C 컴파일러에는 치명적인 한계가 있었습니다.
00:07:53예를 들어, 직접 만든 어셈블러와 링커에 버그가 너무 많아 결국 GCC의 것을 가져다 써야 했습니다.
00:07:57리눅스 부팅을 위해 GCC의 16비트 x86 컴파일러도 필요했죠. 무엇보다 코드 자체가 효율적이지 않았습니다.
00:08:04클로드 컴파일러의 최고 최적화 버전이 GCC의 최저 최적화 버전보다 성능이 떨어졌으니까요.
00:08:11결론적으로 개발자들은 당분간, 아니 적어도 지금 당장은 실직 걱정을 하지 않아도 될 것 같습니다.
00:08:16specific roles. So while this is far from someone telling Claude to build a compiler and leaving it
00:08:22to run forever and ever, I wouldn't say the code was written by an agent that was a hundred percent
00:08:28autonomous because how good would the compiler have been if a human wasn't involved in the first place?
00:08:33And even with all the systems in place designed by a human, the Claude C compiler did have some
00:08:39key limitations. For example, it used the assembler and linker from GCC because the one it created was
00:08:46too buggy. It also needed GCC's 16-bit x86 compiler in order to boot up Linux. And to top that all off,
00:08:54the code wasn't very efficient. The most optimized version of the Claude's compiler was less
00:09:00performant than the least optimized version of the GCC compiler. So it looks like developers
00:09:05aren't going anywhere anytime soon, or at least for now.

Key Takeaway

앤스로픽은 다중 AI 에이전트 협업 시스템을 통해 복잡한 C 컴파일러 구축에 성공하며 가능성을 보여주었으나, 여전히 인간의 정교한 시스템 설계와 기존 기술의 보조가 필수적임을 시사합니다.

Highlights

앤스로픽의 니콜라스 칼리니가 16개의 클로드 에이전트를 활용해 2주 만에 C 컴파일러를 구축함

에이전트 간의 독립적인 작업을 위해 도커 컨테이너와 '작업 잠금(Task lock-in)' 방식을 도입

전체 테스트의 일부만 무작위로 실행하는 'fast 플래그' 기법으로 테스트 효율성을 극대화함

기존 GCC 컴파일러를 '오라클'로 활용하여 에이전트가 자신의 버그를 격리하고 수정하도록 설계

에이전트에게 '기억력'을 부여하기 위해 Readme와 상태 파일을 업데이트하는 방식 활용

성공적인 결과에도 불구하고 인간의 개입과 기존 도구 의존성 때문에 완전 자율 성과인지에 대한 논란 존재

클로드 컴파일러의 성능이 GCC의 최저 최적화 버전보다 낮아 인간 개발자의 대체는 아직 시기상조임

Timeline

실험 개요 및 에이전트 협업 시스템 구축

앤스로픽의 니콜라스 칼리니는 16개의 클로드 에이전트를 병렬로 가동하여 리눅스 커널과 '둠' 게임을 실행할 수 있는 C 컴파일러를 2주 만에 제작했습니다. 각 에이전트는 독립된 도커 컨테이너 환경에서 작업하며, 'Upstream' 저장소를 공유하되 병합 충돌 발생 시 스스로 해결하도록 설계되었습니다. 에이전트들이 서로 같은 작업을 중복 수행하지 않도록 특정 텍스트 파일을 먼저 생성해 커밋하는 '작업 잠금' 방식을 사용하여 효율성을 높였습니다. 이 시스템은 Ralph 루프를 통해 작업을 마친 에이전트가 즉시 다음 과제를 선택하게 함으로써 쉬지 않고 작동하는 구조를 갖췄습니다. 초기 버전인 오퍼스 4에서는 불가능했던 성과를 이번 오퍼스 4.6 기반 에이전트들이 달성하며 장기 가동 능력을 입증했습니다.

효율적인 테스트 하네스 구축과 무작위 테스트 기법

에이전트가 새 기능을 추가하며 기존 코드를 망가뜨리는 현상을 방지하기 위해 SQLite, Redis 등 신뢰도 높은 오픈 소스의 테스트 수트를 포함한 '테스트 하네스'를 구축했습니다. 수천 개의 테스트를 매번 돌리는 비효율을 해결하기 위해, 닉은 전체 테스트의 1~10%만 무작위로 실행하는 'fast 플래그' 옵션을 도입했습니다. 각 에이전트가 서로 다른 무작위 세트를 테스트하도록 시드 번호를 부여하여, 16개의 에이전트가 합산 시 전체 테스트를 완벽하게 커버하도록 만들었습니다. 컨텍스트 창이 오염되지 않도록 에이전트에게는 필요한 에러 로그만 보여주고 상세 로그는 별도 파일에 저장하는 치밀함을 보였습니다. 이를 통해 에이전트는 리소스 낭비 없이 핵심적인 버그 수정과 기능 개발에만 집중할 수 있는 환경을 갖추게 되었습니다.

기존 컴파일러(GCC)의 전략적 활용과 논란

리눅스 커널 컴파일처럼 복잡한 단계에서는 에이전트들이 서로의 수정을 방해하는 문제가 발생했는데, 닉은 이를 해결하기 위해 기존 GCC 컴파일러를 '오라클'로 활용했습니다. 컴파일 작업의 일정 비율은 클로드의 컴파일러가, 나머지는 GCC가 처리하게 하여 오류 발생 시 책임 소재를 명확히 구분했습니다. 만약 특정 섹션에서 문제가 생기면 이는 확실히 에이전트가 만든 컴파일러의 잘못임을 알 수 있어 디버깅 효율이 비약적으로 향상되었습니다. 하지만 바닥부터 직접 만들기로 한 프로젝트에서 기존 컴파일러를 참고했다는 점은 결과의 순수성에 대한 논란을 불러일으킵니다. 그럼에도 불구하고 실제 개발 환경에서 기존의 정답지를 활용해 방향성을 잡는 것은 매우 영리한 전략으로 평가받습니다.

에이전트의 기억력 관리와 고유 역할 부여

개별 클로드 세션은 이전 작업 내용을 알지 못하므로, 닉은 세션 간의 연속성을 보장하기 위해 Readme와 작업 지침 파일을 지속적으로 업데이트하는 '기억력' 시스템을 적용했습니다. 이를 통해 새 에이전트 세션은 이전 세션이 어디까지 작업했는지 파악하고 이미 해결된 버그를 반복하는 실수를 줄일 수 있었습니다. 또한 모든 에이전트에게 동일한 작업을 주는 대신 중복 코드 확인, 성능 최적화, 혹은 Rust 개발자의 관점에서 비판하기와 같은 특화된 역할을 부여했습니다. 이러한 역할 분담은 단순 코딩을 넘어 시스템 설계 전반에 걸쳐 다각적인 검토가 이루어지게 만들었습니다. 결과적으로 다중 에이전트가 병렬로 작동하면서도 마치 한 팀처럼 유기적으로 움직이는 협업 모델을 보여주었습니다.

실험의 한계점 및 개발자 실직 위기론 분석

성공적인 결과에도 불구하고 닉의 실험은 100% 자율적인 결과라고 보기는 어렵다는 비판이 따릅니다. 어떤 테스트를 돌릴지, 시스템 구조를 어떻게 짤지 등 핵심적인 의사 결정은 모두 인간인 니콜라스 칼리니의 손을 거쳤기 때문입니다. 또한 클로드 컴파일러는 어셈블러와 링커의 버그를 해결하지 못해 결국 GCC의 도구를 빌려 썼으며, 생성된 코드의 효율성도 매우 낮았습니다. 클로드 컴파일러의 최고 성능이 GCC의 최저 성능보다 떨어지는 결과는 AI가 아직 최적화 영역에서는 갈 길이 멀다는 점을 시사합니다. 따라서 당분간은 인간 개발자가 AI를 도구로 활용하는 구조가 유지될 것이며, 개발자들이 즉각적인 실직 걱정을 할 단계는 아니라고 결론짓습니다.

Community Posts

View all posts