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

판정 모델의 편향과 보정

~22 min · judges, bias, calibration

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

판정 모델에는 편향이 있어. 직접 측정해

LLM 판정 모델은 알려진 체계적 오류가 있는 도구야. 실제보다 2도 높게 표시하는 온도계처럼 다뤄야 해. 보정값을 알고 적용한다면 충분히 쓸 수 있어.

중요한 네 가지 편향

  1. 위치 편향 — 쌍대 비교에서 판정 모델은 먼저 제시된 출력, 때로는 마지막에 제시된 출력을 선호해. 방어 방법: 두 순서로 모두 실행한 뒤 결과를 평균 내.
  2. 길이 편향 — 짧은 답이 더 나은데도 판정 모델이 긴 출력에 더 높은 점수를 주곤 해. 방어 방법: 평가 기준표에 "답변 길이는 판정에 영향을 주지 않아야 한다"라고 명시하고, 같은 답을 줄이거나 늘인 변형으로 표본 점검을 해.
  3. 자기 선호 — 판정 모델은 자신과 같은 모델 계열에서 생성된 듯한 출력을 선호해. 방어 방법: 다른 모델 계열을 판정 모델로 사용하거나 여러 판정 모델의 일치도를 확인해.
  4. 장황성 및 확신 편향 — 불확실성을 적절히 드러낸 출력보다 단정적이고 매끄러운 출력을 선호해. 방어 방법: 적절한 유보 표현을 긍정적으로 평가하는 조항을 평가 기준표에 명시해.

판정 모델을 보정하는 방법

  1. 100개 사례 표본을 준비해.
  2. 사람 평가자가 각 사례에 점수를 매기게 해.
  3. 같은 100개 사례를 판정 모델로 평가해.
  4. Cohen's kappa나 단순 일치도 비율을 계산해.
  5. 불일치 사례를 살펴보고 프롬프트를 수정한 뒤 다시 실행해.
  6. 사람 평가자 간 일치도와 비슷한 수준에 도달할 때까지 반복해서 개선해.
원칙: 구체적인 과제에서 사람의 평가를 기준으로 보정하지 않은 판정 모델은 추측에 불과해. 보정을 거쳐야 믿고 쓸 수 있는 도구가 돼.

여러 판정 모델을 앙상블로 활용하기

위험도가 높은 평가라면 서로 다른 모델 계열의 판정 모델 2~3개를 실행해 결과를 종합해. 판정 모델 간 불일치도 유용한 신호야. 그런 사례는 사람이 검토해야 해. 단일 판정 모델 파이프라인보다 비용은 더 들지만 신뢰성은 크게 높아져.

Code

보정: 사람 평가와의 일치도 측정·python
from sklearn.metrics import cohen_kappa_score

def calibrate(human_labels, judge_labels):
    """Both are lists of 0/1 (or PASS/FAIL)."""
    agree = sum(h == j for h, j in zip(human_labels, judge_labels)) / len(human_labels)
    kappa = cohen_kappa_score(human_labels, judge_labels)
    return {"agreement": agree, "kappa": kappa}

# Target: kappa > 0.7. Anything below 0.4 means your judge is barely
# better than random for this task.
# Inter-human agreement is the ceiling — judges rarely beat humans
# at agreeing with humans.
길이 편향 진단·python
# Quick experiment: take 30 outputs, ask the judge to rate them.
# Then ask it to rate truncated versions (50% length).
# If average score drops significantly, your judge has length bias.
import random

def length_bias_test(cases, judge):
    full_scores, short_scores = [], []
    for c in cases:
        out = c["output"]
        full_scores.append(judge(c, out))
        short = out[:len(out)//2] + "..."
        short_scores.append(judge(c, short))
    print(f"avg full: {sum(full_scores)/len(full_scores):.2f}")
    print(f"avg short: {sum(short_scores)/len(short_scores):.2f}")
    # Big gap → judge rewards length more than content.
두 판정 모델 앙상블 — 일치도 관문·python
def ensemble_judge(case, judge_gpt, judge_claude):
    a = judge_gpt(case)
    b = judge_claude(case)
    if a["verdict"] == b["verdict"]:
        return {"verdict": a["verdict"], "agreement": True}
    return {"verdict": "REVIEW", "agreement": False, "a": a, "b": b}

# Cases marked REVIEW go to a human queue. Cheap insurance for high-stakes evals.

External links

Exercise

가장 자주 쓰는 판정 모델을 골라. 동료에게 출력 50개를 평가해 달라고 하고 일치도를 계산해. 카파가 0.6보다 낮다면 0.7을 넘을 때까지 프롬프트를 반복해서 개선해. 무엇을 바꿨는지도 문서화해.

Progress

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

댓글 0

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

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