스스로 속지 않으면서 평가를 설계하고 그 평가를 기준으로 힐클라이밍하는 원칙을 정리하고, claude-api 스킬의 build-eval, hillclimb 명령이 이 원칙을 실제로 어떻게 적용하는지 소개합니다.
평가(evaluation)는 앱이나 스킬이 특정 작업에서 어느 정도 성능을 내는지 알려 주는 신호입니다. 하지만 평가를 설계하는 일도, 스스로 속지 않으면서 평가 점수를 끌어올리는 일도 만만치 않습니다. 그래서 claude-api 스킬에 이 두 가지를 위한 가이드를 추가했습니다.
이 스킬을 쓰면 /claude-api build-eval를 실행해 코드베이스 안에 평가를 만들 수 있습니다. 이어서 /claude-api hillclimb를 실행하면 그 평가를 기준으로 애플리케이션을 한 번에 하나씩 개선해 나가며, 따로 떼어 둔(held-out) 예시 세트로 과적합을 잡아냅니다.
이 글에서는 먼저 좋은 평가 설계와 힐클라이밍의 원칙을 짚어 봅니다. 그다음 claude-api 스킬을 적용한 Claude Code가 이 원칙을 어떻게 구현하는지 살펴보고, 마지막으로 이 명령을 사용한 사례 몇 가지를 소개합니다.
잘 설계된 평가에는 몇 가지 공통 요소가 있습니다(그림 1).

모델의 능력은 들쭉날쭉합니다. 오늘의 모델이 실패하는 사례만 골라 담으면 한 모델의 능력 곡면에서 골짜기만 표본으로 뽑는 셈입니다(그림 2). 그러면 평가가 애플리케이션에 본질적으로 어렵거나 가치 있는 일이 아니라, 그 모델의 실패 지문을 측정하게 될 수 있습니다.

어려운 사례는 사람이 어렵다고 판단했기 때문에 골라야 합니다. 작업을 넣기 전에 왜 어려운지 설명할 수 있는지 자문해 보면 유용합니다. 프로덕션 트래픽, 버그 리포트, 티켓에서 나온 애플리케이션 고유의 실패 사례도 포함하세요. 다만 사용자 트래픽을 무조건 믿어서는 안 됩니다. 사용자는 대개 될 거라고 기대하는 것만 시도하므로, 사용자 트래픽에서만 뽑은 작업 분포는 쉬운 쪽으로 치우칠 수 있습니다.
claude-api 스킬의 build-eval 명령은 이 원칙들을 단계별 안내 워크플로로 만든 것입니다. Claude Code에서 /claude-api build-eval를 실행하면 Claude가 사용자에게 질문하며 요구 사항을 파악하고, 코드베이스 안에 평가를 만들며, 정해진 지점마다 멈추고 승인을 받습니다.
Claude는 다음 순서로 입력을 샘플링해 평가를 구성합니다.
이 스킬은 프로덕션 트래픽을 최우선으로 삼지만, 사용자가 제공한 실제 예시 몇 개를 기준 삼아 합성 데이터를 생성할 수도 있습니다. 스킬은 Claude가 모든 입력을 보여 주는 간단한 페이지를 만들고, 사용자가 확인할 때까지 기다리도록 지시합니다. 그림 3은 이메일 라우터 애플리케이션을 예로 들어, 스킬이 사용자에게 검토를 요청할 수 있는 입력 세트를 보여 줍니다.

입력을 확정하고 나면 Claude는 애플리케이션의 출력 형태에 맞는 채점기 가운데 가장 저렴한 것을 제안합니다.
Claude는 소수의 사례를 채점하고, 사용자가 다르게 채점했을 사례가 있는지 묻습니다(그림 4). 일반적으로 평가기를 믿기 전에 채점된 대화 기록을 표본으로 읽어 보는 것이 중요합니다. 채점 오류는 평가가 잘못 구성되는 가장 흔한 원인 중 하나입니다.
채점기 검증이 끝나면 스킬은 평가 세트의 규모(사례 수 × 반복 횟수 × 모델, 그리고 대략적인 소요 시간)를 알려 주고, 기준선을 실행한 뒤 신뢰구간과 함께 점수를 출력합니다. 결과물은 사례, 채점기, 실행기, 사례별 JSON 한 줄과 전체 대화 기록, 그리고 사례별 점수와 대화 기록 링크를 나열한 간단한 페이지입니다. 이 페이지 이상의 것(예: 차트)이 필요하면 요청만 하세요. Claude가 옆에 추가 페이지로 만들어 줍니다. 이런 추가 페이지는 기본적으로 로컬에서 열리는 정적 파일이며 네트워크에서 아무것도 불러오지 않습니다.

앞서 말한 기준선 실행 중에 Claude는 여러 가지를 점검합니다.
이제 작업 성능을 믿을 만하게 채점할 방법이 생겼으니 성능을 개선해 볼 수 있습니다. 힐클라이밍은 effort나 프롬프트처럼 비용과 성능 사이의 균형을 좌우하는 파라미터를 조정하는 데 효과적입니다. 어디에 적용할지 정할 때 참고할 일반적인 팁은 다음과 같습니다.
아무리 잘 설계한 평가라도 프로덕션에서 중요한 실제 작업 분포와 정확히 일치하는 경우는 드뭅니다. 그래서 평가에 "과적합"되는 문제가 흔히 생기고, 그 결과 프로덕션 트래픽보다 평가에서 성능이 더 좋게 나오는 시스템이 만들어집니다.
평가가 하네스(모델을 둘러싼 코드로, 프롬프트, 도구, Claude를 호출하는 루프를 포함)로 "새어 들어가는" 경로는 다양합니다. 예를 들어 어떤 평가 작업에는 OCR이 도움이 되지만 프로덕션 작업에서는 OCR이 거의 쓸모없다고 해 봅시다. 평가용 하네스가 애플리케이션에 OCR 도구를 추가하면 벤치마크 점수는 오르지만 프로덕션에는 아무 영향이 없습니다. 더 넓게 보면, 힐클라이밍이 선택한 평가 예시의 엣지 케이스를 해결하는 기능을 하네스에 추가할 수도 있습니다. 이런 하네스 변경은 평가 점수를 올리지만 프로덕션 개선으로는 이어지지 않습니다(그림 5).

다음 세 가지가 도움이 됩니다.
아래에서 설명하듯 claude-api 스킬이 이 원칙들을 대신 적용해 줍니다.
claude-api 스킬의 hillclimb 명령은 이 원칙들을 단계별 안내 워크플로로 만든 것입니다. Claude Code에서 /claude-api hillclimb를 실행하면 Claude가 주어진 평가를 기준으로 반복하며 성능을 개선합니다. Claude가 바꿀 수 있는 대상은 사용자가 정하며, 다음이 포함됩니다.
시작 전에 Claude는 무엇을 최적화할지(예: 성능, 또는 성능을 유지하면서 비용 절감) 묻고, 평가 세트를 무작위로 테스트 세트와 학습 세트로 나눕니다. 비용 절감이 목표라면 대표적인 비용 요인 몇 가지를 살펴봅니다. 프롬프트 캐싱, 선택한 모델과 프롬프트의 호환성 점검, 모델과 effort 설정 선택이 여기에 포함됩니다.
첫 라운드 전에 Claude는 평가의 노이즈(우연만으로 점수가 움직일 수 있는 폭)가 사용자가 실제로 반영하려는 최소 개선폭보다 작은지 확인합니다. 그렇지 않으면 그 사실을 알리고 반복 횟수나 사례를 늘리라고 제안합니다.
매 라운드마다 Claude는 직전 라운드의 학습 세트 대화 기록을 읽고 패치 형태로 변경 하나를 제안합니다. 각 라운드는 평가 노이즈를 넘어 효과가 드러날 만한 변경을 목표로 합니다. 문구 한 줄을 다듬는 대신 실패 행동의 근본 원인을 고칩니다(예: 원인이 되는 섹션을 다시 쓰거나 빠진 규칙을 추가). 그런 다음 패치를 적용한 상태로 평가를 실행합니다. 이때 Claude는 검사를 하나 수행합니다. train 세트는 좋아졌는데 test 세트는 그대로라면 과적합을 의심하고 패치를 되돌립니다. 성능이 나빠진 경우에도 되돌립니다. 학습 세트와 테스트 세트가 모두 좋아지면 패치를 유지합니다(그림 6).

점수가 두세 라운드 동안 정체되면 Claude는 남은 학습 세트 실패 사례를 하나씩 읽고 원인별로 분류합니다. 어떤 단일 수정으로도 평가 노이즈보다 큰 개선을 얻기 어렵다면 이 작업을 더 일찍 하기도 합니다. 그럴 때는 측정하기엔 너무 작은 변경에 라운드를 쓰지 않고 반복 횟수나 사례를 늘리라고 제안합니다. 이 단계에서는 모호한 평가 사례, 하네스 오류, 실행 간 편차를 찾아낼 수 있습니다.
이후 힐클라이밍 라운드에는 정당한 실패만 포함됩니다.
힐클라이밍이 끝나면 Claude는 사용자의 목표 기준으로 테스트 세트에서 가장 좋은 성과를 낸 버전으로 코드를 남겨 둡니다. 그리고 기준선 대비 테스트 결과를 신뢰구간과 함께 보고합니다(그림 7). 개선폭이 노이즈 범위 안이라면 그렇다고 알리고 병합하지 말라고 권고합니다.

비용 절감과 성능 개선을 목표로 사내 고객 지원 벤치마크에 /claude-api hillclimb를 실행했습니다. 이 벤치마크는 티켓 44건으로 구성되며, 30건은 탐색에 쓰고 14건은 따로 떼어 두었습니다. 출발점은 기본(high) effort 설정의 Opus 4.8이었고, 탐색용 티켓에서 판정 정확도는 74.4%, 티켓당 토큰 비용은 4.6센트였습니다.
힐클라이밍은 먼저 프롬프트를 점검해 필수 도구 호출 의식(ritual), 스크래치패드 단계, 서로 모순되는 규칙을 제거했습니다. 그런 다음 Opus 5.5를 낮은 effort로 시도했습니다. 그 결과 정확도 87.8%로 기준선 정확도를 넘었고, 비용은 티켓당 1.9센트로 처음의 절반 아래로 줄었습니다.
절감분의 일부는 Opus 5.5의 가격 정책에서 나왔습니다. 입력과 출력 토큰 가격이 Opus 4.8보다 20% 저렴하고, 캐시 읽기는 60% 저렴합니다. Opus 5.5가 기준을 넘었으므로 힐클라이밍은 한 단계 아래로 내려가 더 저렴한 모델도 기준을 넘을 수 있는지 확인했습니다. Sonnet 5를 낮은 effort로 돌리자 점수는 88.9%로 거의 같았고 비용은 티켓당 약 1센트로 절반 수준이었습니다(그림 8).

마지막으로 Claude가 라우팅 규칙과 환불 한도 상호 참조를 추가해 프롬프트를 개선하자 Sonnet 5는 거의 같은 비용으로 98.9%에 도달했습니다. 탐색 과정에서 한 번도 보지 못한 14건의 테스트 티켓에서는 최종 구성이 90.5%를 기록해 원래 구성의 78.6%를 웃돌았고, 비용은 약 5분의 1이었습니다.
또 다른 사례는 claude-api 스킬입니다. 이 스킬은 Anthropic API 사용법과 Claude를 다루는 일반적인 팁(이 글에서 다룬 하위 명령 포함)을 안내합니다. 스킬이 API를 사용하는 코드를 정확하게 구현하는지 확인하고자, 문서를 바탕으로 평가 세트를 만들어 스킬을 테스트했습니다.
이 평가에서 스킬의 출발 점수는 66%였습니다. 힐클라이머에게 문서와 SDK에 접근할 권한을 주어 Claude가 오류를 찾아 스스로 고치게 했습니다(그림 9). Claude는 스킬에 기능 8개에 대한 내용이 빠져 있다는 것을 찾아냈습니다.
해당 섹션을 스킬에 추가하자 성능이 74%로 올랐습니다. 이어 C#과 Java 타입 표의 오류를 찾아 고치면서 77%까지 올랐습니다.

두 라운드 동안 점수가 정체되자 Claude는 남은 실패 사례를 분석해 근본 원인별로 분류했습니다. 일반 라운드에서는 가장 흔한 실패 하나를 골라 한 번 수정합니다. 이 단계에서는 수정 없이 남은 실패를 원인별로 분류하기만 합니다. 이 성찰 단계는 여러 면에서 쓸모가 있었습니다.
이 하위 명령은 claude-api 스킬을 통해 Claude Code에서 바로 사용할 수 있습니다.
특정 문제에 맞는 평가 세트를 만들고 싶다면 /claude-api build-eval를 실행하세요. 트레이스 같은 예시에 접근할 수 있게 해 주면 방향을 잡는 데 도움이 됩니다. Claude는 이 글에서 소개한 가이드를 활용해 예시와 채점기를 설계하고, 사용자가 예시와 채점기를 반드시 승인하도록 합니다.
이미 평가가 있고 Claude가 이를 기준으로 성능을 끌어올리게 하고 싶다면 /claude-api hillclimb를 실행하세요. 목표(예: 더 나은 성능, 또는 성능을 유지하면서 비용 절감)를 기준으로 Claude가 개선을 진행합니다. Claude는 이 글에서 소개한 가이드를 활용해 개선하는 동안 과적합을 확인하고, 평가 자체의 버그도 점검합니다. 예를 들어 맞아 보이는 답을 틀렸다고 채점하는 채점기나 하네스 오류를 첫 라운드 전과 점수가 정체될 때마다 확인합니다.
스킬 개발에 힘써 주신 Misha Khalman께 특별히 감사드립니다. 검토, 기여, 제품 지원을 해 주신 Misha Khalman, Michael Segner, Matt Bell, Matt Thanabalan께도 감사드립니다.