왜 LLM 평가가 흔들리는가
LLM을 채점자로 쓰면 사람 평가보다 빠르고 싸지만, 판정이 체계적으로 한쪽으로 쏠린다. 대표적인 편향은 네 가지다. 첫째, 위치 편향: A/B 쌍을 비교할 때 먼저 제시된 응답을 선호한다. 둘째, 장황함 편향: 길고 형식이 갖춰진 답을 실제 품질과 무관하게 높게 준다. 셋째, 자기 선호: 채점 모델이 자기 계열 출력을 후하게 본다. 넷째, 관대함 쏠림: 5점 척도에서 4~5점만 남발해 변별력이 사라진다. 이 편향들은 노이즈가 아니라 방향성을 가진 오차라서, 표본을 늘려도 사라지지 않는다.
위치 편향: 순서를 뒤집어 상쇄한다
페어와이즈 비교에서 가장 확실한 보정은 순서를 두 번 물어보는 것이다. (A,B)와 (B,A)를 모두 채점해 일치할 때만 승패를 인정하고, 뒤집혔을 때는 무승부로 처리한다. 이렇게 하면 순서에 의존하는 판정이 결과에 반영되지 않는다.
def judge_pairwise(judge, question, a, b):
v1 = judge(question, first=a, second=b) # "first" | "second"
v2 = judge(question, first=b, second=a)
# v2는 역순이므로 라벨을 뒤집어 정규화
r1 = "A" if v1 == "first" else "B"
r2 = "A" if v2 == "second" else "B"
if r1 == r2:
return r1 # 두 순서 모두 동일 → 신뢰
return "tie" # 순서에 따라 뒤집힘 → 판정 보류
비용은 2배지만, 순서만 바꿔도 승자가 달라지는 비율(플립률)을 로그로 남기면 판정 자체의 불안정성을 정량화할 수 있다. 플립률이 20%를 넘으면 프롬프트나 척도를 다시 설계해야 한다.
척도 편향: 루브릭과 근거를 강제한다
단일 응답에 점수를 매길 때는 "얼마나 좋은가"라는 열린 질문 대신 관찰 가능한 기준을 나눠 묻는다. 근거를 먼저 쓰게 하고 점수를 나중에 뽑으면 관대함 쏠림이 줄고, 채점 결과를 사후 감사할 수 있다.
rubric:
- id: factual
question: "질문에 사실 오류가 있는가"
scale: [0, 1, 2] # 0=중대오류, 1=사소, 2=정확
- id: grounding
question: "제공된 컨텍스트에만 근거했는가"
scale: [0, 1, 2]
output_contract:
order: [reasoning, per_criterion_score, total] # 근거 먼저, 점수는 나중
forbid: ["응답 길이 언급", "문체 칭찬"]
척도는 5점보다 3점이 재현성이 높다. 사람도 5점 척도의 중간값 구분을 어려워하며, LLM은 그 경계에서 무작위에 가까워진다.
편향과 보정 기법 대응표
| 편향 | 증상 | 보정 |
|---|---|---|
| 위치 | 순서 바꾸면 승자 변경 | 양방향 채점 + 불일치 무승부 |
| 장황함 | 긴 답에 고점 | 길이 언급 금지, 기준별 채점 |
| 자기 선호 | 동일 계열 편애 | 채점 모델 교차, 익명화 |
| 관대함 | 고점만 분포 | 3점 척도, 근거 선행 |
사람 라벨로 채점자를 검증한다
보정 프롬프트가 실제로 맞는지는 사람이 라벨링한 골드셋으로 확인해야 한다. 200~300개 정도의 수기 판정과 LLM 판정의 일치도를 Cohen's kappa로 측정한다. 단순 정확도는 관대함 쏠림 때문에 부풀려지므로, 우연 일치를 보정하는 kappa가 신뢰도의 핵심 지표다.
-- 채점 로그와 골드셋을 조인해 관측 일치도와 기대 일치도 계산
WITH j AS (
SELECT g.human_label, m.judge_label
FROM gold g JOIN judge_runs m USING (item_id)
)
SELECT
AVG(CASE WHEN human_label = judge_label THEN 1 ELSE 0 END) AS observed,
-- 라벨별 주변확률의 곱 합 = 기대 일치도(우연 일치)
SUM(p_h * p_m) AS expected
FROM j
CROSS JOIN LATERAL (SELECT 1) x -- 실제로는 라벨별 비율을 서브쿼리로 산출
;
-- kappa = (observed - expected) / (1 - expected)
kappa가 0.6 미만이면 채점자를 배포하지 않는다. 0.6~0.8이면 판정 보류(tie) 구간을 넓혀 저신뢰 케이스를 사람에게 넘긴다.
운영에서 주의할 점
채점 모델을 버전 업하면 과거 점수와 비교 가능성이 깨진다. 리더보드나 회귀 테스트에 쓰는 채점자는 모델 ID와 프롬프트 해시를 함께 기록해 고정하고, 갱신 시 골드셋 kappa를 다시 측정한다. 또 채점 대상이 채점 프롬프트를 조작할 수 있는 환경(사용자 생성 콘텐츠)에서는 프롬프트 인젝션 방어가 필요하다. 마지막으로 LLM 판정은 사람 평가의 대체가 아니라 선별 필터로 쓰는 편이 안전하다. 명확한 케이스는 자동 통과시키고, 무승부와 저신뢰 구간만 사람에게 보내면 비용과 신뢰도를 동시에 잡을 수 있다.