지표 포화

다들 만점이라 차이가 안 보이는 상태.

무엇이 문제인가

방식 A와 B를 비교하려고 지표를 쟀는데 둘 다 1.000이면, 어느 쪽이 나은지 알 수 없다. 지표가 변별력을 잃었다고 한다.

⚠️ 하면 안 되는 대응 — 조건 바꾸기

우리가 실제로 저지른 실수다.

hit@5가 1.000으로 포화됐다 → 문서 필터를 껐다 → 차이가 보이기 시작했다 → 그걸로 판정했다

이러면 안 된다. 필터를 끈 조건은 프로덕션에 존재하지 않는 경로였다. 존재하지도 않는 상황에서 측정하고 “이 방식은 효과 없다”고 결론냈다. 나중에 조건을 실전대로 되돌리니 결론이 뒤집혔다 (+0.002 → +0.073).

올바른 대응

방법설명
더 민감한 지표hit@5 → MRR. “찾았나”에서 “몇 등인가”로
더 어려운 문항쉬운 문항만 있으면 뭘 써도 만점
단위 바꾸기문서 단위 포화 → 청크 단위로 내려가면 안 포화

조건은 실전 그대로 둔다. 포화는 “그 조건에서 잘 되고 있다”는 신호지 조건을 버리라는 뜻이 아니다.

교훈

측정 편의를 위해 실전 조건을 바꾸면, 그 실험은 실전에 대해 아무 말도 못 한다.

“승격 기준을 측정 전에 확정한다”는 규칙을 지키는 것조건이 실전과 같은지 검증하는 것은 별개다. 전자만 지키면 엄격하게 잘못된 답이 나온다.

친척 현상 — 모델 출력이 포화하는 경우

위는 지표가 포화한 이야기지만, 같은 일이 모델 점수 쪽에서도 일어난다. 2차 실험에서 한국어 튜닝 리랭커(bge-reranker-v2-m3-ko)가 그랬다.

후보 20개 중 고유 점수가 10개뿐이고, 상위 3개가 전부 정확히 1.0이었다.

원인도 대응도 다르다. 지표 포화는 재는 자가 무뎌서 문항이나 지표를 바꾸면 되지만, 점수 포화는 모델 자체가 변별을 못 하는 것이라 모델을 바꿔야 한다(그래서 R1을 유지했다).

공통점은 하나 — 동점이 쌓이면 순위를 매길 수 없다. 그 리랭커에서는 동점 때문에 안정 정렬이 입력 순서를 그대로 흘려보내 C_doc ≠ D_doc 같은 미세한 어긋남까지 만들었다. → 검색 실험 결과 §3·§10

관련

MRR · Recall과 hit rate · 크로스인코더 리랭커 · 검색 실험 설계 §3-1