본문 바로가기
C.W.K.
Stream
Lesson 06 of 06 · published

회귀 테스트와 평가·개선 주기

~18 min · systems, regression, ci

Level 0추측자
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

회귀 평가 모음은 시스템에 대한 조직의 기억이야

수정한 모든 버그는 회귀 테스트로 남길 가치가 있어. 보고된 모든 실패는 평가 데이터셋의 사례로 남길 가치가 있어. 시간이 지나면 회귀 평가 모음이 시스템에서 발생한 모든 실수를 기록하고, 같은 실수가 소리 없이 되돌아오지 않도록 막아 줘.

평가와 개선 주기

  1. 평가가 실패를 찾아내 — 출시 전 평가 모음이 회귀를 잡거나, 운영 환경 표본에서 새로운 실패 양상이 드러나.
  2. 실패가 사례가 돼 — 적절한 태그를 달아 회귀 데이터셋에 추가해.
  3. 시스템을 고쳐 — 프롬프트, 검색, 모델 업그레이드 등 진단 결과가 가리키는 부분을 바꿔.
  4. 평가로 수정 결과를 확인해 — 새 사례가 통과하고 기존의 다른 사례가 회귀하지 않았는지 확인해.
  5. 출시하고 관찰해 — 운영 환경 표본 추출로 같은 실패 양상이 재발하는지 살펴봐.

회귀 평가 모음은 절대 줄어들지 않아

수정 사항을 출시할 때마다 자라야 해. 6개월 동안 "쉽게 통과해 온 사례"였더라도 폐기하지 마. 모델 업그레이드가 바로 그런 사례에서 조용히 회귀를 일으킬 수 있어. 해당 동작이 더는 필요하지 않을 때(예: 기능 제거)만 폐기해.

원칙: 수정한 모든 버그는 회귀 테스트가 돼야 해. 출시할 때마다 자라는 데이터셋은 팀이 가진 가장 가치 있는 자산이야.

이상적인 목표치가 아니라 기준선과의 차이

올바른 CI 관문은 "이전 출시보다 통과율이 떨어졌어?"라고 물어야지, "통과율이 절대 기준값을 넘었어?"라고 물으면 안 돼. 절대 기준값은 분포 변화에 적응하지 못하지만, 기준선과의 차이를 쓰면 시스템이 향상될수록 기준도 자연스럽게 높아져.

Code

스크립트로 구현한 평가·개선 주기·bash
# 1. Eval flags failure on PR
$ just eval-pr
  qa.long_doc.045  FAIL  judge: 'response cited a doc that wasn't retrieved'

# 2. Add the case to the regression set with a tag
$ python scripts/add_to_regression.py \
    --id qa.long_doc.045 \
    --tag 'citation-hallucination' \
    --reason 'Added after regression spotted on 2026-04-15'

# 3. Fix the prompt / retrieval / model / etc.
$ vim prompts/citation.txt

# 4. Re-run eval. The new case must pass; nothing else may regress.
$ just eval-pr
  qa.long_doc.045  PASS
  pass_rate: 0.94 → 0.96  ✓

# 5. Ship.
$ just deploy
기준선과의 차이를 확인하는 품질 관문·python
def gate(current_results, baseline_results, max_drop=0.02):
    cur_rate = sum(r["pass"] for r in current_results) / len(current_results)
    base_rate = sum(r["pass"] for r in baseline_results) / len(baseline_results)
    diff = cur_rate - base_rate
    if diff < -max_drop:
        regressed = [r for r in current_results
                     if r["pass"] is False and any(b["id"] == r["id"] and b["pass"] for b in baseline_results)]
        return False, f"pass-rate dropped {diff:.1%}; specifically: {[r['id'] for r in regressed[:5]]}"
    return True, f"pass-rate diff {diff:+.1%} within tolerance"

External links

Exercise

팀이 가장 최근에 수정한 프롬프트 관련 버그를 골라. 그 문제의 회귀 테스트를 추가해. 사례, 참조 답안, 태그가 필요해. 지난 분기에 수정한 버그도 살펴봐. 회귀 테스트가 있는 버그는 몇 개야? 빠진 테스트를 채우는 게 다음 주 과제야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.