LLM 판사 점수에 신뢰구간을 적용했지만, 오차 막대가 3주간의 ‘트렌드’를 삼켜버렸다.
Source: Dev.to
우리는 프로덕션 트레이스 샘플에서 LLM 판정자와 인간 라벨 간의 주간 합의도(Cohen’s kappa)를 추적합니다. 3주 동안 점 추정값은 0.55, 0.49, 0.44라는 이야기를 들려주었습니다. 팀은 “무엇이 판정자를 망가뜨렸는가”를 찾기 시작했죠.
그런 다음 각 주별 수치에 대해 부트스트랩 신뢰구간을 구했습니다. 우리 샘플 크기(주당 50개 트레이스)에서는 95% 구간이 대략 ±0.15 정도였습니다. 세 주의 추정값 모두 서로의 구간 안에 들어 있었고, 이틀 동안 조사했던 감소는 잡음과 구별되지 않았습니다.
점수가 낮은 구간과 의도를 기준으로 주간 샘플을 층화(stratified)했더니, 드물지만 중요한 슬라이스가 몇 주에서 사라지는 현상이 멈췄습니다. 이는 주간 변동의 주요 원인이었습니다.
구간을 보고하라, 점수를 보고하지 말라. 대시보드에는 구간이 표시됩니다. 구간보다 작은 움직임에는 아무도 반응하지 않죠. 이 덕분에 최소 두 번의 불필요한 조사를 방지할 수 있었습니다.
지속적인 변동이 있을 때만 에스컬레이션한다: 이전 구간 밖에 연속해서 나타나는 주, 단일 나쁜 판독값이 아니라.
나를 놀라게 한 점
이러한 관행이 얼마나 드문가 하는 점입니다. 제가 본 대부분의 평가 대시보드는 불확실성 전혀 없는 단일 kappa 혹은 정확도 수치만 보여주고, 팀은 0.05 정도의 변동에도 판정자를 재조정합니다. A/B 테스트에서는 절대 받아들일 수 없지만, 평가 지표에서는 어느새 일반이 되었습니다.
import numpy as np
def kappa_ci(judge, human, n_boot=2000, alpha=0.05):
from sklearn.metrics import cohen_kappa_score
idx = np.arange(len(judge)); stats = []
for _ in range(n_boot):
s = np.random.choice(idx, size=len(idx), replace=True)
stats.append(cohen_kappa_score(judge[s], human[s]))
lo, hi = np.percentile(stats, [100*alpha/2, 100*(1-alpha/2)])
return lo, hi
아직 고민 중인 열린 질문: “연속 주가 구간 밖에 있는 것”은 거친 에스컬레이션 규칙입니다. 평가 지표에 대해 더 정교한 방법(CUSUM, 관리도 등)을 사용한다면, 잡음이 많은 판정자 데이터에서 실제로 어떻게 동작하는지 듣고 싶습니다.