Eval setup을 자동으로 스캐폴드할 수 있나요?

발행: (2025년 12월 25일 오전 03:21 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

왜 eval이 고통스러운가 (그리고 왜 계속 건너뛰어지는가) 🔥

Eval은 안전을 위해 존재하지만, 설정은 종종 처벌처럼 느껴진다:

  • 프롬프트를 무작위 파일에 복사한다
  • 결과를 지저분한 시트에 추적한다
  • JSON 출력이 깨져서 시간을 낭비한다
  • 메트릭이 설명 없이 변한다
  • 모델이 개선됐는지… 아니면 운이 좋았는지 알 수 없다

그래서 사람들은 너무 늦을 때까지 eval을 피한다.

간단한 “스캐폴드된 평가” 흐름 (실제로 작동하는 것)

자동화할 수 있는 지루한 작업들:

  • 평가 팩 만들기 (폴더 + 파일)
  • 테스트 세트 템플릿 생성 (케이스 + 기대 출력)
  • 모델 호출 래핑 (매번 동일한 형식)
  • 출력 검증 (특히 JSON)
  • 결과 점수 매기기 (우선 간단한 메트릭)
  • 베이스라인과 비교 (향상되었는지, 단지 바뀌었는지?)
  • 보고서 출력 (누구나 읽을 수 있게)

다이어그램

Prompt / Agent Change
        |
        v
Run Eval Pack (same script every time)
  - load test cases
  - call model
  - validate JSON
  - compute metrics
  - compare to baseline
        |
        v
Report (what improved, what broke, what drifted)

Eval Pack 구조 (몇 분 안에 스캐폴드)

간단하게 유지하세요:

  • eval_cases.jsonl – 한 줄에 하나의 테스트
  • schemas/ – 당신의 JSON 스키마
  • runner.py – 모든 케이스를 실행합니다
  • metrics.py – 기본 점수 매기기
  • baseline.json – 마지막으로 알려진 정상 결과
  • report.md – 자동 작성된 요약

이 구조는 평가를 반복 가능하게 하고 팀원과 쉽게 공유할 수 있게 합니다.

복사‑붙여넣기 템플릿: 평가 사례 (JSONL)

각 줄은 하나의 테스트 케이스입니다:

{"id":"case_001","input":"Summarize this support ticket...","expected_json_schema":"ticket_summary_v1","notes":"Must include priority + next_action"}
{"id":"case_002","input":"Extract tasks from this PR description...","expected_json_schema":"task_list_v1","notes":"Must include title + owner + due_date if present"}

복사‑붙여넣기 체크리스트: 자동화할 항목

✅ 1) 스캐폴딩 체크리스트

  • 폴더 구조 생성 (Eval Pack)
  • eval_cases.jsonl 템플릿 생성
  • 베이스라인 파일 스텁 생성
  • 모든 작업을 실행하는 단일 명령어 생성

✅ 2) JSON 신뢰성 체크리스트 (시간 절약)

  • 출력이 유효한 JSON인지 검증
  • 스키마와 일치하는지 검증
  • 유효하지 않을 경우: 안전하게 복구 시도 (그 후 재검증)
  • 여전히 유효하지 않으면: 실패로 표시하고 원시 출력 저장

✅ 3) 메트릭 체크리스트 (작게 시작)

  • 통과/실패 비율 (스키마 통과)
  • 작은 필드에 대한 정확한 일치 (해당되는 경우)
  • “필수 필드 포함” (구조화된 출력에 대해)
  • 베이스라인 대비 회귀 차이

✅ 4) 보고서 체크리스트 (읽기 쉽게)

  • 전체 케이스 수
  • 통과 비율
  • 주요 실패 (ID 포함)
  • 베이스라인 대비 변경 사항 (좋은 점 + 나쁜 점)
  • 디버깅을 위한 원시 출력 링크/경로

실패 모드 → 어떻게 발견하고 → 어떻게 해결할까

  1. 내 eval이 느려서 아무도 실행하지 않음

    • Spot: 주 1회만 실행되고, 변경마다 실행되지 않음
    • Fix: 빠르게 실행되는 스모크 eval(10–20 케이스)를 유지하고, 더 긴 야간 eval을 추가
  2. 모델이 손상된 JSON을 반환해 파이프라인을 망침

    • Spot: 파싱 오류가 많이 발생하고, 유용한 지표가 없음
    • Fix: 스키마‑first 파이프라인: 검증 → 복구 → 재검증 → 원시 출력 저장 후 실패
  3. 지표는 좋아 보이지만 제품은 악화됨

    • Spot: 통과율은 상승했지만 사용자 불만이 증가함
    • Fix: 실제 사례 몇 개를 추가하고 회귀 차이를 추적, 단일 수치만 보지 않음
  4. 개선됐는지 단순히 변했는지 알 수 없음

    • Spot: 실행마다 결과가 달라짐
    • Fix: 기준선을 유지하고, 차이를 비교하며, 매 실행마다 아티팩트를 저장

Where HuTouch fits

우리는 HuTouch를 구축하여 반복 가능한 레이어(스캐폴딩, JSON 검사, 기본 메트릭 및 보고서)를 자동화하고, 엔지니어가 배관 작업이 아니라 판단에 집중할 수 있도록 합니다.

평가 설정의 지루한 부분을 빠르게 자동화하고 싶다면 HuTouch를 사용해 보세요.

FAQ

How many eval cases do I need?
Start with 20–50 good ones. Add more only when you have repeatable failures.

What’s the fastest metric to start with?
Schema pass rate + required fields pass rate + baseline diff.

How do I eval agents, not just prompts?
Treat the agent like a function: same input → get output → validate → score → compare.

Should I use LLM‑as‑a‑judge?
Only after you have basic checks. Judges can help, but they can also hide problems.

How do I stop eval from becoming a giant project?
Keep the first version small: fixed test set, fixed runner, basic report. Grow later.

What should I store after each run?
Inputs, raw outputs, validated outputs, metrics, and a short report. That’s your replay button.

Back to Blog

관련 글

더 보기 »

TOON for LLMs: 벤치마크 성능 분석

JSON을 사용한 모든 API 호출은 생각보다 더 많은 비용이 듭니다. 저는 Gemini 2.5 Flash를 사용해 실제 환경에서 추출을 수행했으며, 그 결과는 놀라웠습니다: JSON…