🔥 고급2026-09-067~9분
LLM-as-Judge 평가 파이프라인: 편향 제거와 신뢰 구간 확보 실전 가이드
Claude를 평가자(Judge)로 사용하는 자동 평가 파이프라인에서 위치 편향·자기 선호 편향을 정량적으로 제거하고, 결과에 통계적 신뢰 구간을 부여하는 방법을 다룬다.
evaluationllm-judgemlops
LLM Judge의 구조적 편향 문제
LLM-as-Judge는 인간 평가 대비 비용을 95% 이상 절감하지만, 두 가지 편향이 결과를 오염시킨다. 위치 편향(Position Bias): 동일 응답이라도 첫 번째로 제시된 쪽이 평균 8~15%p 높은 점수를 받는다. 자기 선호 편향(Self-preference Bias): Claude를 Judge로 쓸 때 Claude 생성 응답을 GPT-4 응답보다 약 12%p 더 선호하는 경향이 보고되어 있다.
편향 제거 전략: 스왑 앤 평균(Swap-and-Average)
두 응답의 순서를 바꿔 각각 평가한 뒤 점수를 평균 내면 위치 편향을 통계적으로 상쇄할 수 있다. 자기 선호 편향은 Judge 프롬프트에 "응답 생성 모델을 알 수 없다고 가정하라"는 명시적 지시와 함께 평가 기준을 루브릭(rubric) 형태로 구조화하면 6~8%p 완화된다.
import anthropic
import json
from statistics import mean, stdev
client = anthropic.Anthropic()
RUBRIC = """다음 기준으로 0~10점 평가. JSON만 반환.
- accuracy(정확성): 0~4점
- clarity(명확성): 0~3점
- completeness(완결성): 0~3점
응답 형식: {"accuracy": N, "clarity": N, "completeness": N, "total": N}"""
def judge_pair(question: str, resp_a: str, resp_b: str) -> dict:
def evaluate(first: str, second: str) -> dict:
prompt = f"{RUBRIC}\n\n질문: {question}\n응답1: {first}\n응답2: {second}\n어느 모델이 생성했는지 알 수 없다. 응답1 평가:"
msg = client.messages.create(
model="claude-opus-4-5",
max_tokens=128,
messages=[{"role": "user", "content": prompt}],
)
return json.loads(msg.content[0].text)
# 순서 A→B, B→A 두 번 평가
score_ab = evaluate(resp_a, resp_b)
score_ba = evaluate(resp_b, resp_a)
# 스왑 평균으로 위치 편향 상쇄
avg_a = mean([score_ab["total"], 10 - score_ba["total"]])
return {"response_a_debiased_score": round(avg_a, 2),
"response_b_debiased_score": round(10 - avg_a, 2)}
신뢰 구간 확보와 운영 체크리스트
통계적 신뢰 구간: 단일 판정으로는 노이즈가 크다. 동일 쌍을 5회 평가해 표준편차를 구하면, 실측 기준 σ ≈ 0.8~1.2점(10점 척도)이 일반적이다. 95% 신뢰구간 ±1.6점 이내 차이는 통계적으로 유의하지 않으므로 "무승부"로 처리해야 한다.
트레이드오프
- 평가 횟수 ↑ → 신뢰도 ↑, API 비용 ↑ (5회 기준 단일 대비 10× 비용)
- 루브릭 세분화 ↑ → 일관성 ↑, Judge 컨텍스트 토큰 ↑
- 권장: 배치 API 활용 시 비용 50% 절감 가능, 평가 결과 24시간 캐시
실패 모드
- Judge 출력이 JSON 파싱 실패 시 재시도 없이 0점 처리하는 버그 주의
- 평가 대상 응답이 4000자 초과 시 Judge가 후반부를 무시하는 경향 → 청크 분할 평가 필요
운영 체크리스트
- [ ] 위치 편향 측정: 동일 응답 순서 바꿔 100쌍 테스트, 편향 <5%p 확인
- [ ] 인간 평가 샘플(5%)과 Judge 결과 상관계수 목표 ≥0.80
- [ ] 평가 결과를 데이터베이스에 저장, 모델 업그레이드 시 회귀 감지
- [ ] Judge 프롬프트 버전 관리 필수 (프롬프트 변경 = 점수 분포 변경)