Anthropic은 신뢰할 수 있고, 해석 가능하며, 제어 가능한 AI 시스템을 만들기 위해 연구하는 AI 안전 연구 기업입니다.
이 글에서 Siddharth Mishra-Sharma는 테스트 오라클, 영속 메모리, 오케스트레이션 패턴 등 며칠에 걸친 에이전트 코딩 워크플로를 과학 컴퓨팅 작업에 적용하는 방법을 설명합니다. 자신의 전문 분야가 아닌 영역에서도 활용할 수 있다는 점이 핵심입니다.
현재 AI 에이전트를 활용하는 과학자 대부분은 대화형 루프 안에서 각 단계를 직접 세밀하게 관리하며 작업합니다. 하지만 지난 1년여 동안 모델의 장기 작업 수행 능력이 크게 향상되면서 새로운 작업 방식이 등장했습니다. 모든 세부 사항에 일일이 개입하는 대신, 상위 목표만 제시하고 에이전트 팀이 자율적으로 작업하도록 맡기는 것입니다. 이 방식을 활용하면 며칠, 몇 주, 심지어 몇 달이 걸릴 프로젝트를 단 몇 시간 만에 완료할 수 있습니다. 특정 유형의 과학 작업은 이런 모델에 잘 맞습니다. 예를 들어 수치 솔버를 재구현하거나, 오래된 Fortran 방언으로 작성된 레거시 과학 소프트웨어를 최신 언어로 변환하거나, 대규모 코드베이스를 참조 구현과 비교하며 디버깅하는 작업 등이 있습니다. 작업 범위가 명확하고, 성공 기준이 분명하며, 사람의 감독이 지속적이지 않아도 되는 작업들입니다.
Anthropic의 C 컴파일러 프로젝트는 이런 방식의 한 사례를 보여줬습니다. Claude가 약 2,000개의 세션에 걸쳐 작업하며 리눅스 커널을 컴파일할 수 있는 C 컴파일러를 구축한 프로젝트입니다. 이 글에서는 일반적인 학술 연구실 환경을 염두에 두고, Claude Code를 사용해 과학 컴퓨팅 작업에 유사한 패턴을 구성하는 방법을 설명합니다. 구체적인 예시로, Claude Opus 4.6을 활용해 미분 가능한(differentiable) 우주론적 볼츠만 솔버를 구현하는 과정을 다룹니다. 이 수치 코드는 빅뱅의 잔광인 우주 마이크로파 배경 복사(Cosmic Microwave Background, CMB)의 통계적 성질을 예측합니다. 초기 우주에서 광자, 바리온, 중성미자, 암흑물질의 연립 방정식을 시간에 따라 풀어내는 방식으로 동작합니다.
CLASS나 CAMB 같은 볼츠만 솔버는 우주론의 핵심 과학 인프라로, Planck나 Simons Observatory 같은 관측 프로젝트의 데이터를 활용해 우주론 모델의 매개변수를 제약하는 데 사용됩니다. 미분 가능한 버전, 즉 전체 솔버를 통해 그래디언트를 전파할 수 있는 버전을 만들면 그래디언트 기반 추론 방법을 활용할 수 있어, 매개변수 추정 속도가 획기적으로 빨라집니다. JAX로 작성하면 자동 미분과 가속기(예: GPU) 호환성을 사실상 무상으로 얻을 수 있어 자연스러운 선택입니다.
특기할 점은, 이 작업이 제 핵심 연구 분야가 아니라는 것입니다. 관련 도구와 과학에 대한 개괄적인 이해는 있지만, 합리적인 시간 내에 직접 완성할 수 있는 전문성은 갖추지 못했습니다. 해당 전문성을 보유한 연구 그룹들이 CLASS의 기능 일부를 포함하는 미분 가능한 솔버를 JAX로 구축한 바 있습니다. 이런 작업은 통상 수개월에서 수년의 연구자 시간을 필요로 합니다. 이번 실험의 목적은 비전문가의 최소한의 개입만으로 에이전트가 그 이상의 성과를 낼 수 있는지 확인하는 것이었습니다.
이런 유형의 작업은 C 컴파일러 프로젝트와 구조적으로 다릅니다. C 컴파일러는 다수의 병렬 에이전트에게 작업을 분배할 수 있지만, 볼츠만 솔버는 깊이 결합된 파이프라인입니다. 초기 우주의 재결합(recombination) 과정을 모델링할 때 작은 수치 오차나 부적절한 근사가 하류의 모든 결과를 미묘하게 왜곡시킬 수 있습니다. 따라서 에이전트에게 다른 종류의 역량이 요구됩니다. 디버깅 시 전체 인과 관계를 추적하고 도메인 지식을 활용해야 하며, 이는 하나의 에이전트가 순차적으로 작업하면서 필요에 따라 하위 에이전트를 생성하고, 참조 구현과 비교하며 불일치 지점을 이분 탐색하는 방식이 더 적합합니다.
이 글에서는 SLURM 작업 스케줄러가 실행되는 HPC 클러스터를 컴퓨팅 환경으로 사용하지만, 핵심 아이디어인 진행 파일, 테스트 오라클, 명확한 규칙이 담긴 에이전트 프롬프트는 Claude Code를 어디에서 실행하든 동일하게 적용됩니다.
자율적인 에이전트 연구팀 관리로 전환하려면, 프로젝트의 산출물과 관련 맥락을 명확히 기술하는 지침서를 작성하는 데 대부분의 시간을 투자해야 합니다(Claude와 상의하면서). 이 지침서는 루트 디렉토리에 위치한 CLAUDE.md 파일에 담습니다. Claude는 이 파일을 특별하게 취급하여 컨텍스트에 유지하면서 전체 계획의 참조 기준으로 활용합니다. 중요한 점은, Claude가 작업하면서 이 지침서를 직접 수정하여 문제 해결 과정에서 얻은 교훈을 이후 작업에 반영할 수 있다는 것입니다.
이것은 우주론적 볼츠만 솔버 프로젝트의 초기 CLAUDE.md로, 솔버 작성을 처음 시도한 후 정리된 전체 계획과 설계 결정을 보여줍니다. 이 계획에 도달하기까지, 저는 프로젝트의 상위 목표를 제시했습니다. 참조 CLASS 구현과 완전한 기능 동등성을 달성하면서 완전히 미분 가능하게 만드는 것, 그리고 핵심 과학 산출물에서 CLASS 대비 0.1% 정확도를 달성하는 것이었습니다. 이후 계획이 만족스러워질 때까지 Claude와 반복적으로 다듬었습니다. 0.1%는 두 대표적인 볼츠만 코드인 CLASS와 CAMB 간의 일반적인 일치 수준이므로, 적절한 과학적 목표로 판단했습니다.
진행 파일은 관례상 CHANGELOG.md라고 부르며, 에이전트의 이동 가능한 장기 기억, 즉 일종의 실험 노트 역할을 합니다. CLAUDE.md에서 Claude에게 이 파일에 진행 상황을 기록하도록 지시했습니다.
좋은 진행 파일에는 현재 상태, 완료된 작업, 실패한 접근법과 실패 이유, 주요 체크포인트에서의 정확도 표, 알려진 제한 사항 등이 기록됩니다. 실패한 접근법 기록이 특히 중요합니다. 이것이 없으면 이후 세션에서 같은 막다른 길을 반복 시도하게 됩니다. 예를 들어 "섭동 ODE에 Tsit5를 사용해봤으나, 시스템이 너무 강성(stiff)함. Kvaerno5로 전환" 같은 항목이 있을 수 있습니다. 이것은 실행 예제의 변경 로그로, 위의 요소들이 담겨 있습니다.
에이전트를 통한 보다 개방적인 과학 발견도 분명 가시권에 들어오고 있지만, 현재 장시간 자율 과학 작업의 핵심은 에이전트가 진행 상황을 스스로 판단할 수 있는 수단을 갖추는 것입니다. 과학 코드의 경우, 참조 구현, 명확히 정량화 가능한 목표 함수, 또는 기존 테스트 스위트가 이 역할을 할 수 있습니다. 에이전트에게 테스트 스위트를 확장하고 작업 중 수시로 테스트를 실행하도록 지시하면 회귀(regression)를 방지하는 데도 도움이 됩니다. 이번 예제에서는 Claude에게 CLASS C 소스 코드를 참조 구현으로 삼아 단위 테스트를 구성하고 지속적으로 실행하도록 지시했습니다.
Git은 에이전트의 진행 상황을 비동기적으로 모니터링하고 조율하는 좋은 수단입니다. 에이전트는 의미 있는 작업 단위가 완료될 때마다 커밋하고 푸시해야 합니다. 이렇게 하면 문제가 발생했을 때 복구 가능한 이력이 남고, 진행 상황을 로컬에서 확인할 수 있으며, 예를 들어 컴퓨팅 할당량이 세션 중간에 소진되더라도 작업이 유실되지 않습니다.
실무적으로는 CLAUDE.md에 다음과 같은 지침을 넣을 수 있습니다. "의미 있는 작업 단위마다 커밋하고 푸시할 것. 매 커밋 전에 `pytest tests/ -x -q`를 실행할 것. 기존에 통과하던 테스트를 깨뜨리는 코드는 절대 커밋하지 말 것."
에이전트를 조정해야 할 때는 언제든 클러스터에 SSH로 접속해 직접 프롬프트를 수정하거나 지침을 업데이트할 수 있습니다. 하지만 로컬의 Claude Code 인스턴스에 SSH 접속과 명령 실행을 맡기는 편이 더 편리한 경우가 많습니다. 아래에서 설명하는 내용에도 동일하게 적용됩니다.
앞서 언급했듯이, 먼저 로컬에서 계획을 반복적으로 다듬어 합리적인 수준으로 만들고 CLAUDE.md에 반영하는 것이 좋습니다. 그런 다음 컴퓨팅 노드에서 tmux 같은 터미널 멀티플렉서 안에 Claude Code 세션을 시작하고, 에이전트에게 코드베이스 위치를 알려준 뒤 알아서 작업하도록 놔두면 됩니다. tmux 안에서 세션이 실행되므로 분리(detach)한 후 노트북을 닫고, 가끔씩 진행 상황만 확인하면 됩니다. 볼츠만 솔버 프로젝트의 경우, 커피를 사러 줄을 서면서 핸드폰으로 GitHub을 확인하는 식이었습니다.
HPC 클러스터에서는 SLURM 스케줄러를 통해 노드를 요청하게 되는데, tmux 세션에서 Claude Code를 실행하는 작업 스크립트 예시는 다음과 같습니다:
#!/bin/bash
#SBATCH --job-name=claude-agent
#SBATCH --partition=GPU-shared
#SBATCH --gres=gpu:h100-32:1
#SBATCH --time=48:00:00
#SBATCH --output=agent_%j.log
cd $PROJECT/my-solver
source .venv/bin/activate
export TERM=xterm-256color
tmux new-session -d -s claude "claude; exec bash"
tmux wait-for claude
작업이 시작되면 tmux 세션에 접속해 Claude Code에 방향을 제시하고(예: "CHANGELOG.md를 읽고 다음 작업을 이어서 진행해"), 올바른 방향으로 진행 중인 것을 확인한 뒤 분리하면 됩니다. 진행 상황 확인, 방향 조정, 새 작업 시작이 필요할 때는 다음과 같이 다시 접속합니다:
srun --jobid=JOBID --overlap --pty tmux attach -t claude
Ralph 루프: 모델의 역량이 향상될수록 프롬프트 엔지니어링, RAG, 컨텍스트 스터핑 같은 맞춤형 오케스트레이션의 필요성은 줄어듭니다. 하지만 현시점에서는 일정 수준의 스캐폴딩이 성능 향상에 도움이 될 수 있습니다. 예를 들어, 현재 모델은 에이전트 태만(agentic laziness) 현상을 보이기도 합니다. 복잡한 다단계 작업을 요청하면 전체 작업을 완료하기 전에 핑계를 대며 중단하는 경우가 있습니다("늦었으니까, 내일 이어서 하시죠?").
이를 우회하기 위한 유용한 오케스트레이션 패턴이 Ralph 루프입니다. 본질적으로 for 루프로, 에이전트가 완료를 선언하면 다시 컨텍스트로 되돌려보내 정말로 끝났는지 확인하는 구조입니다. 장시간 작업에서 특히 유용한데, 에이전트가 작업이 기준에 미달함을 스스로 인정하고 충족될 때까지 계속 작업하게 됩니다. 유사한 패턴으로는 GSD(및 도메인별 변형)와 Claude Code 내장 /loop 명령어가 있습니다.
Ralph는 /plugin을 통해 설치할 수 있습니다. Claude Code에서의 일반적인 호출 프롬프트는 다음과 같습니다:
/ralph-loop:ralph-loop “Please keep working on the task until the success criterion of 0.1% accuracy across the entire parameter range is achieved.” --max-iterations 20 --completion-promise “DONE”여기서 Claude는 "DONE"이라는 완료 선언과 함께 작업이 끝났음을 보장할 때까지 최대 20회 반복합니다.
Claude는 며칠에 걸쳐 이 프로젝트를 처음부터 작업하여, 다양한 출력 항목에서 참조 CLASS 구현 대비 1% 미만의 오차를 달성했습니다. 저는 Claude에게 프로젝트 진행 과정에서 주요 출력인 각종 CMB 각도 파워 스펙트럼의 정확도를 복원하고, 개발 중 이정표를 함께 표시해달라고 요청했습니다. 아래 그래프는 Claude가 생성한 결과로, 1% 미만 정확도에 도달하기까지의 경로를 보여줍니다.

에이전트의 개발 과정이 항상 매끄럽지는 않았습니다. 예를 들어, 테스트 커버리지에 명확한 허점이 있었습니다. 한동안 단일 기준(fiducial) 매개변수 지점에서만 코드를 테스트하여, 버그 탐지 범위가 크게 축소된 상태였습니다. 또한 게이지 규약에 혼동을 일으키거나, 우주론 전문가라면 즉시 발견했을 버그를 찾느라 몇 시간을 허비하는 등 기초적인 실수도 있었습니다. 그럼에도 1% 미만 정확도라는 목표를 향해 꾸준히 진전을 이어갔습니다.
이 프로젝트의 부수적인 효과로, 볼츠만 솔버와 그 배경 물리에 대해 예상외로 많은 것을 배울 수 있었습니다. Git 커밋 이력을 따라가며 Claude의 점진적인 진행 과정을 지켜보고, 모르는 내용을 찾아보는 것 자체가 과학을 자연스럽게 흡수하는 효과적인 학습법이었습니다. 제 핵심 연구 분야가 아닌 프로젝트였는데도 말입니다. 커밋 로그는 마치 빠르고 지극히 꼼꼼한 포닥의 실험 노트를 읽는 것 같았습니다.
완성된 솔버가 프로덕션 수준에 이른 것은 아닙니다(예: 모든 영역에서 참조 CLASS 구현과 허용 가능한 정확도로 일치하지는 않습니다). 하지만 에이전트 주도 개발이 수개월, 심지어 수년의 연구자 작업을 며칠로 압축할 수 있다는 가능성을 보여주었습니다.
이런 시간 압축은 '유휴 시간'의 의미를 바꿔놓습니다. AI 연구에서 보편적인 경험이 있습니다. 밤새 실험(예: 학습 실행)을 돌려놓고, 아침에 결과를 확인하는 즐거움입니다. 실험을 돌리지 않으면 기회비용이 발생합니다. 요즘은 에이전트를 돌리지 않는 것도 마찬가지로 기회비용처럼 느껴집니다. 컴퓨팅 자원과 성공 기준이 명확한 프로젝트가 있다면, 에이전트를 돌리지 않는 매일 밤이 테이블 위에 놓아둔 잠재적 진전인 셈입니다.
피어 리뷰를 해주신 Eric Kauderer-Abrams, 그리고 유익한 피드백을 주신 Xander Balwit, Ethan Dyer, Rebecca Hiscott에게 감사드립니다.