본문 바로가기

ai 자동화

AutoResearch로 에이전트 스킬을 자동 개선하는 방법

개요

2026년 3월, Andrej Karpathy가 공개한 AutoResearch는 AI 에이전트가 LLM 학습 실험을 자율적으로 수행하는 도구다. 에이전트가 코드를 수정하고, 5분간 학습을 돌리고, 성능이 올랐으면 유지하고 아니면 되돌린다. 이 단순한 루프를 밤새 반복해서 GPT-2 학습 시간을 11% 단축했다.
그런데 이 패턴이 LLM 학습에만 쓰일 이유가 없다. 코드를 수정하는 대신 프롬프트를 수정하고, 학습 지표 대신 평가 통과율을 측정하면, 에이전트의 스킬과 서브에이전트를 자동으로 개선하는 데 그대로 적용할 수 있다.

 


AutoResearch란 무엇인가

Karpathy의 AutoResearch는 세 개의 파일로 구성된 최소한의 실험 환경이다.

  • prepare.py: 데이터 준비와 평가 로직. 에이전트가 수정하지 않는 고정된 기반
  • train.py: 에이전트가 유일하게 수정하는 파일. 모델 구조, 하이퍼파라미터, 학습 루프가 담겨 있음
  • program.md: 에이전트에게 주는 지시 사항. 사람이 마크다운으로 작성

작동 방식은 다음과 같다.

  1. 에이전트가 program.md의 지시를 읽는다
  2. train.py에 한 가지 변경을 가한다
  3. git commit으로 변경을 기록한다
  4. 정해진 시간(5분) 동안 학습을 실행한다
  5. 검증 지표(val_bpb)를 측정한다
  6. 성능이 좋아졌으면 유지, 아니면 revert한다
  7. 1번으로 돌아간다

핵심은 단일 파일 수정, 고정된 평가 시간, 명확한 단일 지표, 이진 판단(유지/폐기)이라는 네 가지 제약이다. 이 제약들이 에이전트의 자율 실험을 안정적이고 측정 가능하게 만든다.
Karpathy는 이 방식으로 nanochat 프로젝트에서 약 700번의 실험을 돌려 20개의 유효한 개선점을 찾았고, GPT-2 학습 시간을 2.02시간에서 1.80시간으로 줄였다.


왜 에이전트 스킬 개선에 필요한가

Claude Code의 스킬이나 OpenAI Codex의 AGENTS.md 같은 에이전트 지시 파일을 작성해본 경험이 있다면, 다음 상황이 익숙할 것이다.

  • 스킬을 작성했는데 특정 케이스에서 기대와 다르게 동작한다
  • 프롬프트를 고쳤더니 다른 케이스가 깨진다
  • 어떤 수정이 전체 성능에 어떤 영향을 미치는지 파악하기 어렵다
  • 수작업 테스트를 반복하다 보면 시간이 금방 소모된다

사람이 직접 프롬프트를 다듬는 방식은 두 가지 한계가 있다. 첫째, 사람의 시간과 주의력에 의존한다. 둘째, 변경의 영향을 체계적으로 측정하기 어렵다.
AutoResearch 패턴은 이 문제를 정면으로 해결한다. 에이전트가 스스로 스킬을 수정하고, 평가 스위트를 돌리고, 결과에 따라 유지하거나 되돌린다. 사람은 평가 기준만 잘 설계하면 된다.
 

핵심 방법론: AutoResearch 패턴을 에이전트 스킬에 적용하기

원래 AutoResearch에서는 train.py라는 학습 코드를 수정했다. 에이전트 스킬에 적용할 때는 이 구조를 다음과 같이 대응시킨다.
AutoResearch 원본과 에이전트 스킬 적용의 대응 관계

  • train.py (수정 대상) → SKILL.md 또는 시스템 프롬프트 (수정 대상)
  • prepare.py (고정된 평가 기반) → 평가 스크립트와 테스트 케이스 (고정된 평가 기반)
  • program.md (에이전트 지시) → 메타 프롬프트: 스킬 개선 방향 지시 (에이전트 지시)
  • val_bpb (성능 지표) → 평가 통과율 (성능 지표)
  • 5분 학습 (고정 평가 시간) → N개 테스트 케이스 실행 (고정 평가 범위)

이 대응을 기반으로 에이전트 스킬의 자동 개선 루프를 구성할 수 있다.

루프의 네 단계

1단계: Generate (생성)
현재 스킬을 사용해 테스트 입력에 대한 출력을 생성한다.
2단계: Evaluate (평가)
생성된 출력을 이진 테스트(Binary Assertion)로 검증한다. 주관적 점수(1~5점) 대신 “통과/실패”만 판단한다.
3단계: Score (점수화)
전체 테스트 케이스 중 모든 조건을 통과한 비율을 계산한다.
4단계: Iterate (반복)
실패 패턴을 분석하고, 스킬 파일을 수정하고, 다시 1단계로 돌아간다. 점수가 올랐으면 유지, 내려갔으면 되돌린다.


이진 평가(Binary Assertion)가 중요한 이유

평가 방식 선택은 이 패턴 전체의 성패를 좌우한다. AutoResearch가 val_bpb라는 단일한 수치 지표를 쓰는 것처럼, 에이전트 스킬 평가에서도 모호함을 제거해야 한다.
1~5점 척도의 루브릭 평가는 일관성이 떨어진다. 같은 출력에 대해 평가자(사람이든 LLM이든)가 3점을 줄 수도, 4점을 줄 수도 있다. 이런 노이즈는 자동화된 개선 루프에서 잘못된 판단으로 이어진다.
이진 테스트는 이 문제를 해결한다. 각 테스트는 하나의 질문에 “예/아니오”로 답한다.

  • 출력이 유효한 JSON 형식인가?
  • 요약이 80단어 이하인가?
  • 원본에 없는 사실이 추가되지 않았는가?
  • 응답 시작에 공감 표현이 포함되어 있는가?

일반적으로 20~30개의 테스트 케이스에 각 3~6개의 이진 테스트를 구성하면, 한 번의 평가 사이클에서 60~180개의 개별 검증이 수행된다. 이 수준이면 스킬의 품질을 정량적으로 추적할 수 있다.


실전 예시: 고객 지원 요약 스킬 개선

구체적인 예시로 고객 지원 티켓을 요약하는 에이전트 스킬을 개선하는 과정을 살펴보자.

프로젝트 구조

skill-optimizer/
├── prompts/
│   ├── current.md          # 현재 활성 스킬 프롬프트
│   └── candidates/         # 개선 후보 프롬프트들
├── evals/
│   ├── test_cases.json     # 테스트 입력 데이터
│   └── assertions.py       # 이진 평가 함수들
├── results/
│   └── scores.json         # 평가 이력
└── AGENT_INSTRUCTIONS.md   # 메타 에이전트 지시

테스트 케이스 예시

{
  "test_cases": [
    {
      "input": "고객이 결제 실패 후 3일째 응답을 받지 못해 화가 난 상태의 지원 티켓",
      "assertions": [
        "output_is_valid_json",
        "summary_under_80_words",
        "contains_customer_sentiment",
        "no_hallucinated_facts",
        "includes_action_items"
      ]
    }
  ]
}

이진 평가 함수 예시

def output_is_valid_json(output: str) -> bool:
    try:
        json.loads(output)
        return True
    except json.JSONDecodeError:
        return False

def summary_under_80_words(output: str) -> bool:
    data = json.loads(output)
    return len(data.get("summary", "").split()) <= 80

def no_hallucinated_facts(output: str, source: str) -> bool:
    # LLM-as-Judge: 출력의 모든 사실이 원본에 존재하는지 검증
    result = llm_judge(
        prompt=f"출력에 포함된 모든 사실이 원본 텍스트에 존재하는가?\n원본: {source}\n출력: {output}",
        expected="yes"
    )
    return result == "yes"

개선 사이클 결과 (가상 시나리오)

  • 사이클 1~5 (명백한 수정): JSON 형식 오류 해결, 단어 수 초과 문제 수정 → 통과율 45% → 62%
  • 사이클 6~12 (구조적 개선): 감정 분석 로직 보강, 액션 아이템 추출 지시 구체화 → 통과율 62% → 78%
  • 사이클 13~20 (미세 조정): 엣지 케이스 처리, 표현 다듬기 → 통과율 78% → 84%

이 과정을 밤새 자동으로 돌리면, 아침에 출근했을 때 개선된 스킬 파일과 상세한 평가 이력을 확인할 수 있다.


단계별 적용 가이드

직접 적용하고 싶다면, 다음 5단계를 따라가면 된다.

1단계: 개선할 스킬 선정과 베이스라인 측정

모든 스킬이 자동 개선에 적합한 것은 아니다. 다음 조건을 만족하는 스킬을 선택한다.

  • 출력의 품질을 자동으로 측정할 수 있는가?
  • 충분한 테스트 케이스를 확보할 수 있는가?
  • 반복 실행의 비용이 감당 가능한가?

선정 후, 현재 상태의 스킬로 전체 테스트 스위트를 돌려 베이스라인 통과율을 기록한다.

2단계: 이진 평가 스위트 설계

실패 모드(failure mode)에서 출발한다. 스킬이 실제로 어떻게 깨지는지 관찰하고, 각 실패 유형에 대응하는 이진 테스트를 작성한다.
일반적인 실패 모드 유형은 다음과 같다.

  • 형식 위반: JSON 파싱 실패, 마크다운 구조 깨짐
  • 환각(Hallucination): 원본에 없는 정보 생성
  • 지시 미준수: 단어 수 초과, 필수 섹션 누락
  • 과잉 응답: 불필요하게 긴 출력, 관련 없는 내용 포함

20~30개의 테스트 케이스와 케이스당 3~6개의 이진 테스트가 기본적인 출발점이다.

3단계: 메타 프롬프트 작성

에이전트가 스킬을 어떻게 개선할지 지시하는 메타 프롬프트를 작성한다. AutoResearch의 program.md에 해당하는 부분이다.

## 스킬 개선 지시

1. 현재 스킬 파일(current.md)을 읽는다
2. 평가 결과(results/scores.json)에서 실패 패턴을 분석한다
3. 실패를 해결하는 방향으로 스킬 파일에 한 가지 변경을 가한다
4. 변경된 스킬로 전체 테스트 스위트를 실행한다
5. 통과율이 올랐으면 유지, 내려갔으면 되돌린다
6. 한 사이클에 한 가지 변경만 한다 (복합 변경 금지)

핵심 원칙: 한 사이클에 한 가지 변경. AutoResearch에서도 이 원칙이 핵심이다. 여러 변경을 한꺼번에 적용하면 어떤 변경이 효과가 있었는지 알 수 없다.

4단계: 자동 반복 실행

루프를 실행한다. Claude Code의 경우, Task 도구로 서브에이전트를 호출하거나 스킬 내에서 자동으로 반복하도록 구성할 수 있다. CI/CD 파이프라인(예: GitHub Actions)에서 스케줄로 실행하는 것도 가능하다.
예상 비용은 모델과 테스트 케이스 수에 따라 다르지만, 30~50 사이클을 기준으로 약 $1.50~$4.50 수준이다.

5단계: 거버넌스와 품질 문턱값 설정

자동 개선이 항상 올바른 방향으로 가지는 않는다. 안전장치가 필요하다.

  • 최소 통과율 문턱값: 특정 카테고리의 통과율이 일정 수준 이하로 떨어지면 변경을 자동 거부
  • 인간 검토 트리거: 통과율이 목표치(예: 85%)에 도달하면 사람이 최종 검토
  • 버전 이력 관리: 모든 스킬 변경을 git으로 추적하고, 각 버전의 평가 점수를 함께 기록
  • 회귀 방지: 전체 통과율이 올라도 특정 카테고리가 크게 떨어지면 거부

OpenAI의 Self-Evolving Agents와의 비교

OpenAI도 유사한 패턴을 “Self-Evolving Agents”라는 이름으로 제안했다. 핵심 구조는 거의 동일하다.
공통점

  • 현재 에이전트로 출력을 생성하고 평가하는 루프 구조
  • 실패 분석 기반의 프롬프트 수정
  • 자동화된 반복과 버전 관리

차이점

  • OpenAI 방식은 4가지 상호보완적 평가자를 사용한다: 도메인 특화 정확도, 길이 규율, 의미적 유사도, LLM 기반 종합 품질 평가
  • “관대한 통과” 기준을 사용한다: 평가자의 75%가 통과하거나 평균 점수가 0.85를 넘으면 개선 시도를 트리거
  • 롤백 기능이 내장된 VersionedPrompt 시스템으로 프롬프트 이력을 관리한다

두 접근법의 핵심은 같다. 측정하고, 실패에서 배우고, 반복한다.


Claude Code Skills 2.0의 내장 평가 기능

Claude Code의 최신 스킬 시스템(Skills 2.0)에는 이 패턴을 지원하는 기능이 이미 내장되어 있다.
Skill Creator: 스킬 작성, 테스트 케이스 생성, 평가 실행, 실패 분석, 자동 개선을 최대 5회 반복하는 메타 스킬이다.
EVAL 모드: 스킬을 테스트 프롬프트 세트에 대해 실행하고, 통과/실패를 판정한다.
IMPROVE 모드: 평가 결과의 실패 패턴을 분석하고, 스킬을 자동으로 재작성하여 개선한다.
이 기능들을 조합하면, AutoResearch 패턴을 별도의 인프라 없이 Claude Code 환경 안에서 바로 실행할 수 있다.
 

주의사항과 한계

이 접근법이 만능은 아니다. 적용 전에 알아야 할 것들이 있다.
평가 설계가 전부다: 평가 스위트의 품질이 개선의 방향을 결정한다. 잘못된 평가 기준은 잘못된 방향으로의 최적화를 유도한다. Goodhart의 법칙이 여기서도 적용된다.
창의적 작업에는 한계가 있다: 코드 생성, 데이터 추출처럼 정답이 명확한 작업에 효과적이다. 글쓰기, 디자인 같은 주관적 작업은 이진 테스트로 포착하기 어려운 품질 차원이 존재한다.
과적합 위험: 테스트 스위트에 과적합되어 테스트에서는 높은 점수를 받지만 실제 사용에서는 딱딱하게 동작할 수 있다. 테스트 케이스의 다양성이 중요하다.
비용 고려: 매 사이클마다 LLM API 호출이 발생한다. 테스트 케이스 수와 반복 횟수에 비례하여 비용이 증가한다.


마무리

AutoResearch 패턴의 핵심 통찰은 단순하다. 수정하고, 측정하고, 유지하거나 되돌린다. 이 원칙은 LLM 학습 코드에서 에이전트 스킬로 자연스럽게 확장된다.
코드를 최적화하는 대신 프롬프트를 최적화하고, 학습 지표 대신 평가 통과율을 추적하면, 밤새 자동으로 에이전트 성능을 개선하는 시스템을 만들 수 있다.
시작하기 위해 거창한 인프라가 필요하지 않다. 개선할 스킬 하나, 테스트 케이스 20개, 이진 평가 함수 몇 개면 충분하다. 나머지는 에이전트가 알아서 한다.


참고 자료

이 글은 Claude Code를 활용하여 작성되었습니다.