스스로를 속이지 않으면서 평가를 설계하고 그 평가를 기준으로 힐클라이밍을 진행하는 원칙을 정리했습니다. 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센트였습니다.
힐클라이밍은 먼저 프롬프트를 점검해 필수 도구 호출 절차, 스크래치패드 단계, 서로 모순되는 규칙을 제거했습니다. 그다음 low effort의 Opus 5.5를 시도했습니다. 그 결과 정확도 87.8%로 기준선 정확도를 넘어섰고, 비용은 티켓당 1.9센트로 처음의 절반 아래로 줄었습니다.
절감분의 일부는 Opus 5.5의 가격 정책에서 나옵니다. 입력과 출력 토큰 비용이 Opus 4.8보다 20% 저렴하고, 캐시 읽기 비용은 60% 저렴합니다. Opus 5.5가 기준을 넘었기 때문에, 힐클라이밍은 한 단계 아래 모델로 내려가 더 저렴한 모델도 기준을 넘을 수 있는지 확인했습니다. low effort의 Sonnet 5는 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 update을 실행하세요. claude-api 스킬은 Claude Code에 포함되어 배포되므로, 업데이트하면 이 명령어들의 최신 버전을 쓸 수 있습니다.
claude update그런 다음 Claude Code에서 다음을 실행합니다.
/claude-api build-eval /claude-api hillclimb
이 하위 명령어들은 claude-api 스킬을 통해 Claude Code에서 바로 사용할 수 있습니다.
특정 문제를 위한 평가 세트를 만들고 싶다면 /claude-api build-eval을 실행하세요. 트레이스 같은 예시에 접근할 수 있게 해 주면 방향을 잡아 줄 수 있습니다. Claude는 이 글에서 소개한 가이드를 활용해 예시와 채점기를 설계하고, 사용자가 예시와 채점기를 반드시 승인하도록 합니다.
이미 평가가 있고 Claude가 이를 개선해 주길 원한다면 /claude-api hillclimb를 실행하세요. 목표(예: 더 나은 성능, 또는 성능을 유지하면서 비용 절감)를 기준으로 진행합니다. Claude는 이 글에서 소개한 가이드를 활용해, 힐클라이밍하는 동안 과적합 여부를 확인하고 평가 자체의 버그도 점검합니다. 정답처럼 보이는 답을 틀렸다고 채점하는 채점기나 하네스 오류가 그런 예이며, 점검은 첫 라운드 전과 점수가 정체될 때마다 이루어집니다.
스킬 개발에 힘써 준 Misha Khalman에게 특별히 감사드립니다. 검토, 기여, 제품 지원을 해 준 Misha Khalman, Michael Segner, Matt Bell, Matt Thanabalan, Punit Shah에게도 감사드립니다.