← 세미나 목록
세미나 노트 · 에이전트 워크플로

카파시 루프

사람이 매 단계를 지시하지 않고, 에이전트가 스스로 고치고 스스로 채점하며 될 때까지 반복하게 만드는 구조. 그리고 그 루프가 혼자서는 절대 못 고치는 한 가지 문제와, 그걸 해결하는 루프 안의 루프.

읽는 데 12분· 출처: AI Labs 영상 + Karpathy autoresearch 원본· 2026-10-03

1무슨 일이 있었나

Andrej Karpathy 가 autoresearch 라는 저장소를 공개했다. AI 에이전트에게 모델 학습 코드를 주고, 혼자 수정하고 혼자 돌려보고 혼자 채점하게 둔 것이다. 사람은 중간에 끼어들지 않는다.

2일
사람 개입 없이
돌아간 시간
700
에이전트가 수행한
실험 횟수
20
실제로 효과가 있던
개선 사항
11%
학습 시간 단축
2.02h → 1.80h

숫자 자체보다 중요한 건 어디에서 나온 11%인가이다. nanochat 은 Karpathy 가 이미 상당히 다듬어 둔 코드였다. 세계적인 ML 연구자가 최적화해 둔 코드에서 에이전트가 20개를 더 찾아냈다. 그중 하나는 QK-Norm 에 스칼라 곱이 빠져 있던 것 — 본인이 몇 달간 못 보고 지나친 버그였다.

같은 방식, 다른 사례

Shopify CEO Tobi Lütke 는 같은 패턴을 자기 사내 모델에 하룻밤 돌렸다. 아침에 깨어나 보니 0.8B 모델이 직접 손으로 튜닝한 1.6B 모델보다 19% 높은 점수를 냈다. 절반 크기 모델이 두 배 크기를 이긴 것이다. 에이전트가 "크면 좋다"는 상식 대신 그의 하드웨어에 맞는 구조를 찾았기 때문이다.

핵심은 이것이다. 연구자가 하루에 돌릴 수 있는 실험은 많아야 8~10회다. 그 시간의 대부분은 GPU 를 기다리는 데 쓰인다. 생각하는 시간이 아니라 기다리는 시간이 병목이다. 루프는 그 기다림을 사람에게서 떼어낸다.

사람이 직접 vs 루프에 맡김
사람이 직접 코드 수정 학습 대기 (느림) 결과 확인 판단 … 하루에 8~10회 사람의 주의력·피로·맥락 전환이 전부 여기에 들어간다 루프에 맡김 program.md 사람이 쓰는 지시서 에이전트가 혼자 반복 수정 실행 채점 판정 좋아지면 유지 · 나빠지면 되돌림 아침에 보고서 700회분 결과 사람의 일은 "실험 돌리기"에서 "무엇을 탐색할지 쓰기"로 옮겨간다
위는 평소 방식 — 수정하고 기다리고 확인하고 판단하는 주기를 사람이 전부 통제한다. 아래가 루프 — 사람은 program.md 한 장만 쓰고, 그 주기는 에이전트가 돈다. 700개 실험을 사람이 통제하려면 몇 주가 걸린다.

2루프의 해부도 — 파일 세 개가 전부다

autoresearch 의 구조가 놀라운 건 단순해서다. 복잡한 프레임워크가 아니라 파일 세 개의 역할 분담이 전부다.

세 파일의 권한 구분
에이전트 매 라운드 반복 수정 가능 train.py 모델·옵티마이저·학습 루프 에이전트가 손대는 유일한 파일 수정 불가 prepare.py · 채점 점수를 매기는 쪽 🔒 잠겨 있다 — 이게 핵심 program.md 사람이 평이한 말로 쓰는 지시서 ← 사람의 일은 여기까지   "무엇을 탐색하고 무엇은 건드리지 마라" 점수 비교 이전 최고 대비 좋아짐 → 유지 같거나 나쁨 → 되돌림 다음 라운드 — 사람 개입 없음
한 라운드 = 수정 한 번 + 학습 몇 분 + 채점. 에이전트는 train.py 만 고칠 수 있고, 채점하는 쪽은 건드릴 수 없다. 점수가 좋아지면 유지하고, 같거나 나빠지면 스스로 되돌린다.

3가장 중요한 규칙: 채점표를 못 만지게 한다

이 설계에서 하나만 가져가야 한다면 이것이다. 에이전트는 자기를 채점하는 파일을 수정할 수 없다.

이유는 단순하다. 고칠 수 있게 두면, 모델을 개선하는 대신 점수를 따기 쉽게 만드는 쪽이 훨씬 빠른 길이기 때문이다. 에이전트는 악의가 없다. 주어진 목표를 가장 효율적으로 달성하는 것이고, 채점표를 고치는 게 실제로 더 효율적이다.

채점표가 열려 있으면 무슨 일이 생기나
🔓 채점표를 고칠 수 있을 때 목표: 점수 올리기 더 쉬운 길을 찾는다 = 채점 기준 낮추기 점수 100점 모델은 그대로 실패를 성공으로 기록 에이전트는 거짓말하지 않았다 주어진 목표를 달성한 것이다 🔒 채점표를 잠갔을 때 목표: 점수 올리기 쉬운 길이 막혀 있다 = 실제로 개선해야 함 진짜 개선 20건 모델이 실제로 빨라짐 점수를 신뢰할 수 있다
루프를 세울 때 가장 먼저 확인할 것이 이 잠금이다. 채점이 열려 있는 루프는 돌려도 의미가 없다 — 점수는 올라가지만 아무것도 나아지지 않는다.
원본 구조

train.py — 에이전트가 수정 · prepare.py — 수정 금지(do not modify 명시) · program.md — 사람이 쓰는 지시서 · analysis.ipynb — 결과 보기. 저장소 전체가 오후 한 나절에 읽을 수 있는 분량이다.

4언제 쓰면 안 되는가 — 네 가지 조건

여기가 실무에서 가장 중요한 대목이다. 루프는 공짜가 아니다. 맞지 않는 작업에 루프를 세우면 토큰만 태우고 결과도 못 얻는다. 네 가지가 모두 충족될 때만 만들 가치가 있다.

영상 제작자의 운영 원칙

"저희는 여러 종류의 루프를 쓰지만 명확히 측정되는 점수가 있는 작업에만 씁니다. 그리고 한 번의 루프로 앱 전체를 만들고 끝내는 일은 절대 없습니다. 루프는 한 번에 기능 하나를 만들거나, 검사기가 확인할 수 있는 단순한 버전을 만드는 데만 씁니다."

5앱 개발로 옮기기 — 스킬 다섯 개

ML 학습용 루프를 일반 앱 개발로 옮기면 구조가 이렇게 된다. 각 조각을 스킬로 쪼갠 이유가 중요하니 하나씩 본다.

앱 개발용 루프의 전체 구조
① 프로젝트 컨텍스트 기능 · 화면 구성 · 규칙 피해야 할 것들 앱이 자라면 이것도 같이 자란다 = 항상 최신 상태의 기억 저장소 ② 빌드 스킬 루프 전체를 지휘 ③ 검사 항목 작성 기능 구현 전에 먼저 에이전트가 자기 코드를 자기가 판단하지 않게 하려고 — 기준을 먼저 못박는다 👤 사람이 확인 검사가 흔한 문제를 다 덮는지 본다 ← 루프 전체에서 사람이 끼어드는   지점은 사실상 여기 하나다 ④ 검사 승인 → 🔒 잠긴 폴더로 이동 Claude Code 설정 규칙이 그 폴더 수정을 차단 + 커밋까지 해서 보호 계층을 하나 더 쌓는다 = 원본의 "채점표 잠금"과   똑같은 장치 ⑤ 기능 빌더 에이전트 — 여기서 루프가 돈다 매번 새 컨텍스트로 시작 · 기능 하나씩 · 라운드 결과를 파일로 남긴다 검사를 통과할 때까지 반복 → 통과하면 다음 기능 program.md 에 기록 고정 규칙·작업 방식 — 원본과 같은 형식 모든 단계가 여기서 맥락을 꺼내 쓴다
순서가 중요하다. 검사를 먼저 쓰고 → 사람이 확인하고 → 잠그고 → 그다음에 만든다. 만들고 나서 검사를 쓰면 에이전트가 자기 코드에 맞춰 검사를 쓰게 된다.

왜 파일이 아니라 "스킬"로 만드는가

프로젝트 정보를 그냥 context.md 같은 파일에 두는 것과 스킬로 만드는 것의 차이가 영상에서 가장 실용적인 대목이었다.

파일 vs 스킬 — 컨텍스트 창 점유 방식
그냥 파일로 두면 전체 내용이 매 작업마다 올라온다 작업과 무관한 부분까지 전부 · 앱이 커지면 컨텍스트를 점점 많이 먹는다 · 정작 지금 필요한 내용이 묻힌다 · 토큰 비용이 라운드마다 붙는다 스킬로 만들면 짧은 설명 한 줄만 항상 상주 필요할 때만 본문을 꺼내 온다 · 에이전트는 "그 정보가 있다"는 걸 항상 안다 · 하지만 전부 읽지는 않는다 → 컨텍스트 절약
스킬의 짧은 설명만 컨텍스트 창에 머문다. 에이전트는 그 정보가 존재한다는 걸 항상 알지만, 매 작업마다 전체를 불러오지 않고 필요할 때만 상세를 가져온다.

6실제로 돌려보니 — 점수에 안 잡힌 문제

영상 제작자가 이 구조를 레스토랑 웹사이트에 적용했다. "손님이 음식 픽업을 주문할 수 있게 해달라"는 요청이었다.

  1. 기능 목록에 없던 기능이라 먼저 등록

    Claude 가 features.md 에 온라인 주문 규칙을 추가했다.

  2. 검사 항목 10개를 제시

    사람이 보니 게스트 이메일 확인이 빠져 있었다. 추가 요청 → 11개가 되었고, 새 검사는 이메일이 실제 주소 형식인지 확인했다.

  3. 승인 → 커밋 → 잠금

    이 시점부터 에이전트는 검사를 수정할 수 없다.

  4. 약 6분 만에 기능 완성, 첫 라운드에 11개 전부 통과

    반복이 필요 없었다. 여기까지는 성공이다.

  5. 그런데 루프가 점수에 안 나타난 문제를 잡아냈다

    검사는 주문 규칙만 테스트했다. 규칙은 만들어졌지만 손님이 쓸 주문 양식이 없었다. 루프는 기능을 완료로 표시하기 전에 양식을 만들고 규칙과 연결했다.

여기서 배울 것

검사가 11개 전부 통과했는데도 기능은 미완성이었다. 검사는 "통과했다"를 보장하지만 "쓸 수 있다"를 보장하지 않는다. 검사 항목을 사람이 확인하는 단계(③→👤)가 왜 남아 있어야 하는지가 여기서 드러난다.

7치명적 결함: 에이전트는 어제를 기억하지 못한다

여기가 영상의 핵심이고, 루프를 실제로 운영해 보지 않으면 모르는 문제다.

루프 안에서 어떤 방식이 안 먹히면 에이전트는 그 루프 안에서는 개선한다. 하지만 다음번에 같은 루프가 돌 때는 그걸 기억하지 못한다.

모든 기능이 항상 새 에이전트 + 똑같은 지시 파일로 시작하기 때문이다. 그래서 한 라운드에서 저지른 실수가 다음 라운드에서 똑같이 반복된다. 영상에서는 이것을 에이전트의 "습관"이라고 불렀다.

기억이 없는 루프 — 같은 실수가 매번 반복된다
지시 파일(program.md) — 변하지 않는다 같은 내용이 매 기능에 그대로 전달된다 기능 A 새 에이전트 실수 X 발생 → 고침 기능 B 새 에이전트 — A 를 모른다 실수 X 또 발생 기능 C 새 에이전트 — 역시 모른다 실수 X 또 발생 기능이 늘어날수록 같은 비용을 계속 낸다 루프는 한 회차 안에서는 배우지만, 회차를 넘어서는 배우지 못한다
루프가 잘 돌아도 학습이 축적되지 않는다. 기능 20개를 만들면 같은 실수를 20번 고치는 비용을 낸다.

8해법 — 루프 안의 루프(오토 루프)

해결 방식이 우아하다. 첫 번째 루프의 실행 기록을 읽고 지시 파일을 고쳐 쓰는 두 번째 루프를 만든다. 영상에서는 이것을 오토 루프(auto loop) 스킬이라 불렀다.

원래 방식에서는 사람이 program.md 를 쓴다. 이 설정에서는 오토 루프가 그 파일을 고쳐 쓴다.

루프 안의 루프 — 지시서가 스스로 개선된다
바깥 루프 (오토 루프) — 루프 자체를 개선한다 안쪽 루프 — 기능 하나를 만든다 검사 작성 빌드 검사 실행 실패하면 라운드 취소 → 다시 통과하면 기능 완료 라운드 기록 어디서 틀렸고 어떻게 고쳤나 습관 찾기 반복되는 실수 패턴을 근거 라운드와 함께 정리 program.md 다시 쓰기 다음 기능은 "실제로 효과가 있던 방식"부터 시작한다 ⛔ 단, 검사 항목은 고칠 수 없다 — 아래 설명 개선된 지시로 다음 기능 시작 매 기능이 끝날 때마다 지시를 검토·갱신 → 루프가 돌 때마다 이전보다 나아진다 🔒 오토 루프도 검사 항목은 편집할 수 없다 고칠 수 있다면 기준을 낮춰 버린다 → 습관은 그대로인데 검사 실패만 멈춘다. 문제가 숨겨지는 것이다.
빌드 스킬은 한 번만 실행된다 — 모든 기능이 같은 지시를 받고, 배운 것이 다음으로 넘어가지 않는다. 오토 루프는 기능이 끝날 때마다 지시를 갱신한다 — 그래서 다음 기능은 효과가 입증된 방식부터 시작한다.

실제로 잡아낸 습관 두 개

프로젝트 관리 앱(여러 사람이 집중 세션을 공유하는 기능)에 적용한 결과다.

1

검사는 통과, 앱에는 연결 안 됨

공유 데이터베이스가 검사 10개를 모두 통과했는데 앱이 그 DB에 아무것도 저장하지 않았다. → 추가된 습관: 검사를 통과시키는 같은 라운드에서 앱에 연결까지 할 것

2

새 규칙을 옛 코드가 모름

멘션(@이름) 기능이 검사를 통과했지만 앱의 이전 부분은 여전히 @ 를 옛 방식으로 읽었다. → 추가된 습관: 그 동작을 하는 모든 곳을 찾아 새 규칙을 따르게 할 것

효과 확인

두 습관이 지시서에 들어간 뒤부터 다음 기능들은 화면에 이미 연결된 상태로 나왔다. 같은 실수를 반복하지 않게 된 것이다.

검사가 실제로 작동하는 모습

루프가 늘 한 번에 성공하지는 않는다. 공유 프로젝트 기능에서 빌더가 두 라운드를 틀렸고, 검사가 그걸 잡았다.

라운드무슨 일이 있었나검사 결과
1회차멘션 기능을 망가뜨렸다멘션 검사 실패 → 라운드 취소
2회차각자의 몫을 단순 계산 — 3명이 33씩 가져가 합계가 99검사 실패
3회차이를 수정검사 10개 전부 통과

33+33+33=99 같은 오차는 사람이 코드 리뷰로 잡기 어렵다. 실행해서 채점했기 때문에 잡힌 것이다. 이게 "명확한 점수로 검증 가능해야 한다"는 조건이 왜 필수인지 보여준다.

9내 환경에 세울 때의 순서

영상 제작자는 "각 부분이 무슨 역할인지 알려줄 테니 Claude 에게 직접 만들어 달라고 요청하라"고 했다. 그 요청을 할 때 빠뜨리면 안 되는 것들을 순서로 정리한다.

  1. 이 작업이 루프에 맞는지 먼저 판정

    4장의 네 조건을 통과하지 못하면 여기서 멈춘다. 프롬프트 하나로 끝낼 일에 루프를 세우면 설정에 더 많은 시간을 쓴다.

  2. 프로젝트 컨텍스트 스킬부터 만든다

    기능·화면·규칙·금지사항을 담는 기억 저장소. 앱이 자라면 같이 갱신한다. 파일이 아니라 스킬로 만드는 이유는 5장 참조.

  3. 검사 작성 스킬 — 구현보다 먼저

    에이전트가 자기 코드를 자기가 판단하지 않게 기준을 먼저 못박는다. 평이한 말로 "이 검사가 무엇을 확인하는지" 나열시켜 사람이 읽을 수 있게 한다.

  4. 🔒 검사 잠금 장치를 반드시 넣는다

    승인된 검사를 잠긴 폴더로 옮기고, 에이전트 설정 규칙으로 그 폴더 수정을 차단한다. 커밋까지 해두면 보호 계층이 하나 더 생긴다. 이 단계를 빼면 루프 전체가 무의미해진다.

  5. 기능 빌더를 별도 컨텍스트로 분리

    빌드 스킬이 직접 만들지 않고 넘긴다. 기능마다 새 컨텍스트로 시작해야 앞 기능의 잡음이 섞이지 않는다. 라운드 결과는 파일로 남긴다 — 다음 단계의 재료다.

  6. 오토 루프를 얹어 지시서가 스스로 개선되게

    라운드 기록에서 반복되는 실수(습관)를 찾아 program.md 를 다시 쓰게 한다. 단, 오토 루프에게도 검사 편집 권한은 주지 않는다.

  7. 샌드박스를 고려한다

    에이전트를 여러 개 동시에 돌리면 노트북에서 서로 충돌하고 느려진다. 각 에이전트에 격리된 실행 환경을 주면 밤새 병렬로 돌릴 수 있다. (영상에서는 10개를 동시에 돌렸다 — 하나는 기능 빌드, 하나는 버그 추적 등)

세울 때 가장 흔한 실패

① 검사를 구현 뒤에 쓴다 → 에이전트가 자기 코드에 맞춰 검사를 쓴다 · ② 검사를 잠그지 않는다 → 점수만 오르고 아무것도 나아지지 않는다 · ③ 루프 한 번으로 앱 전체를 만들려 한다 → 검사가 전체를 덮지 못해 통과해도 미완성 · ④ 라운드 기록을 안 남긴다 → 오토 루프를 얹을 재료가 없다


한 장으로 요약

핵

루프 = 수정·실행·채점·판정의 반복

사람은 지시서만 쓰고, 그 주기는 에이전트가 돈다. 좋아지면 유지, 나빠지면 되돌림.

🔒

채점표는 반드시 잠근다

에이전트가 채점 기준을 고칠 수 있으면 목표 달성보다 기준 낮추기가 더 빠른 길이 된다.

4

네 조건을 통과해야 가치가 있다

반복성 · 토큰 예산 · 명확한 점수 · 직접 실행 가능. 하나라도 빠지면 세우지 않는다.

順

검사를 먼저, 구현을 나중에

순서가 바뀌면 에이전트가 자기 코드에 맞는 검사를 쓴다. 기준은 먼저 못박아야 한다.

⚠

통과 ≠ 완성

검사 11개를 다 통과했는데 손님이 쓸 양식이 없었다. 검사가 덮는 범위를 사람이 봐야 한다.

↻

루프 위에 루프를 얹는다

기록에서 반복 실수를 찾아 지시서를 다시 쓰게 하면, 돌 때마다 이전보다 나아진다.