LLM-as-judge 자동 채점 쓸 때 미리 알았으면 좋았을 함정 3개
이수빈
@growth_lee
평가 데이터셋 채점을 LLM한테 시켰다가 점수가 못 미덥게 나와서, 까먹기 전에 함정만 모아둠. 본인용 메모.
1) 단일 점수는 후하다 "1~10점 매겨" 식으로 시키면 거의 다 7~9점에 몰린다. 모델이 웬만하면 좋게 보려는 경향이 있어서, 못 만든 답이랑 잘 만든 답 점수 차이가 거의 안 벌어짐. → 절대 점수 말고 pairwise로 바꿈. "A랑 B 중 어느 쪽이 나음?" 둘 중 고르게 하면 변별이 확 산다.
2) position bias 근데 pairwise로 바꾸니까 이번엔 앞에 놓인 쪽을 더 자주 고름. A/B 위치만 바꿔도 승자가 뒤집히는 케이스가 꽤 됐다. → 같은 쌍을 순서 바꿔서 두 번 돌리고, 두 번 다 이긴 것만 승리로 인정. 한 번씩 갈리면 무승부 처리.
3) 정답 모르는 도메인이면 "길고 그럴듯한 답"을 편애 이게 제일 위험. 채점자 LLM이 정답을 모르는 영역에선 내용 맞고 틀리고가 아니라, 길고 자신감 있고 형식 갖춘 답에 점수를 더 준다. 틀렸는데 그럴듯하면 이김. → 점수/선호 묻지 말고 rubric을 yes/no 체크리스트로 쪼갰다. "핵심 수치 언급함? Y/N", "조건 X 다룸? Y/N" 식으로. 길이가 점수에 못 새어들어옴.
암튼 셋 다 겪고 나서 평가 코드를 promptfoo로 옮김. assert에 llm-rubric/pairwise가 이미 있어서 직접 짠 거 갈아엎고 그냥 갖다 씀.
한 가지. LLM-judge는 사람 평가를 대체하는 게 아니라, 사람이 직접 볼 샘플 수를 줄여주는 도구로 보는 게 맞다. 의심스러운 케이스만 사람이 보면 됨. 전부 맡기면 위 3번에서 조용히 망함.