LLM-as-a-Judge: Claude가 답안의 68%에 10점 만점에 7점 또는 8점을 부여하다
요약
LLM을 평가자(Judge)로 활용할 때, 1-10점과 같은 기준이 모호한 점수 체계는 모델이 특정 점수대(예: 7~8점)에 답안을 군집화시키는 경향이 있습니다. 이는 명확한 기준점 부재와 모델의 관대함 때문입니다. 이 글은 이러한 문제를 해결하기 위해 서술적 설명이나 이진 체크리스트를 활용하는 방법을 제시합니다.
핵심 포인트
- 기준 없는 1-10점 척도는 LLM을 특정 점수(7~8점)에 군집화시킵니다.
- 단순히 '엄격하게 평가하라'는 지시는 근본적인 해결책이 아닙니다.
- 서술적 설명이나 이진 체크리스트를 사용하면 채점의 일치도와 정확도를 높일 수 있습니다.
한 사용자가 저에게 두 개의 보고서 스크린샷을 나란히 찍어 이메일로 보내왔습니다. 한 세션에서는 정말 잘했고, 다른 세션에서는 너무 형편없이 망쳐서 중간에 포기했다고 합니다. 둘 다 '7/10'이라고 했습니다.
그때 저는 제 LLM-as-a-judge가 아무것도 평가하고 있지 않다는 것을 알게 되었습니다. 그저 덧셈 과정을 거쳐 숫자 7을 출력하고 있었던 겁니다.
저는 시스템이 지금까지 생성했던 모든 점수를 꺼내봤습니다: 총 1,140개의 채점된 답안입니다. 이 중 41%가 7점이었고, 27%가 8점이었습니다. 5점 미만은 3%의 비율로 나타났습니다. 제가 공들여 작성한 채점 프롬프트는 숫자 7에 대한 강한 의견을 가진 매우 비싼 랜덤 넘버 제너레이터(random number generator)가 되어버린 겁니다.
제가 측정한 내용, 시도해 본 네 가지 수정 방법, 그리고 실제로 효과를 본 한 가지 방법을 소개합니다.
요약 (TL;DR)
- 기준이 없는 1-10점 척도로 LLM-as-a-judge를 사용하면 7점과 8점에 수렴한다. 제 경우, 1,140개 답안 중 68%가 이 점수대에 머물렀습니다.
- 모델에게 '엄격하게 평가하라'고 지시하는 것은 해결책이 아니다. 전체 분포를 한 점 낮추기만 할 뿐입니다. 순위 품질(Spearman)은 거의 변하지 않았습니다 (0.41 → 0.44).
- 모든 레벨에 대한 서술적 설명이 포함된 1-5점 척도는 수기로 채점한 점수와의 일치도를 0.68까지 끌어올렸습니다.
- 코드 내에서 합산되는 이진(Binary) 체크리스트 항목은 0.79를 기록하며, 두 명의 인간 평가자 간의 0.83 일치도에 근접했습니다. 재실행 노이즈는 0.9점에서 0.31점으로 떨어졌습니다.
- 비용: 채점 비용이 세션당 약 75% 증가했으며, 체크리스트는 여전히 짧거나 특이한 답안을 잘못 점수 매기는 문제가 있습니다.
실제로 무엇을 채점하고 있었나?
이 시스템은 제가 운영하는 인터뷰 연습 플랫폼인 Preterview입니다 (솔직히 말하자면, 제가 직접 만들었습니다). 이 플랫폼은 음성 인터뷰를 진행하고, 각 답변을 전사(transcribe)한 다음, 몇 가지 차원에 걸쳐 LLM이 점수를 매기고 보고서를 작성합니다. 만약 점수가 모호하면 보고서도 모호하고, 전체 제품 자체가
후보자의 답변을 다음 항목에 대해 1점에서 10점까지 점수 매기기:
- 명확성(clarity)
- 구체성(specificity)
...
깔끔함. 읽기 쉬움. 쓸모없음.
LLM-as-a-judge가 왜 10점 만점에 7점으로 점수를 군집화하는가?
정의되지 않은 숫자는 모델이 '좋다(fine)'고 판단하는 사전 지식에 기본적으로 의존하며, 그 사전 지식이 대략 7점이다. 기준점이 없기 때문에 '6'과 '8'은 특별한 의미를 갖지 못하므로, 모델은 가짜처럼 들리지 않으면서도 지지하는 것처럼 들리는 안전한 중간-높은 답변을 선택한다.
몇 가지 요소가 복합적으로 작용한다:
- 기준점 부재. '구체성'에 있어 6점과 7점의 차이는 무엇인가? 나는 말한 적이 없다. 모델도 마찬가지다.
- 관대함(Leniency). 명령어 기반으로 미세 조정된(Instruction-tuned) 모델은 도움이 되고 기분 좋은 방식으로 작동하도록 훈련된다. 어려움을 겪는 사람에게 3점을 주는 것은 무례하게 느껴질 수 있다. 7점은 누구도 불쾌하게 만들지 않는다.
- 너무 많은 단계. 10개의 구간(buckets)은 우리 중 어느 누구도 일관되게 사용할 수 있는 해상도를 넘어선다. 추가적인 구간들은 단순히 최빈값 주변의 노이즈가 될 뿐이다.
수정 작업을 하기 전 내 프로덕션 배포 분포는 다음과 같았다:
LLM judge가 정확한지 테스트하는 방법은 무엇인가?
작은 수동 채점 보정 세트(hand-graded calibration set)를 구축하고 이를 기준으로 순위 일치도(rank agreement)를 측정하라. 수천 개의 예시가 필요하지 않다. 이미 올바른 순서(right ordering)를 알고 있는 세트만 있으면 된다.
나는 실제 답변 60개(허가를 받고 익명화된)를 가져와 1~5점 척도로 직접 채점했으며, 이 세트가 고르게 분포되도록 각 단계별로 의도적으로 12개를 골랐다. 많은 채용 프로세스를 거친 친구가 이를 블라인드하게 채점했다. 우리의 일치도(Spearman $
ho$)는 0.83이었다. 이것이 한계치이다. 어떤 judge prompt도 두 인간의 합의를 능가할 것이라고 기대해서는 안 된다.
그런 다음 나는 모든 프롬프트 변형을 이 60개 답변에 대해 각각 다섯 번씩 실행하고 세 가지 숫자를 추적했다:
- 내 점수 대비 Spearman $
ho$ (답변 순위를 올바르게 매기는가?) - 최빈값에서의 점수 비율(Share of scores at the mode) (점수가 쏠리고 있는가?)
- 재실행 표준 편차(Rerun standard deviation) (같은 답변이 같은 점수를 받는가?)
보정(calibration) 세트에서 기본 프롬프트를 사용했을 때: ρ = 0.41이었으며, 제가 이 세트를 균등하게 분산되도록 선택했음에도 불구하고 답변의 71%가 7점 또는 8점을 받았습니다. 표준 편차를 다시 계산하니: 0.9점입니다. 한 답변은 다섯 번의 실행 동안 5점, 7점, 8점, 7점, 6점을 기록했습니다. 같은 텍스트에, 같은 프롬프트였습니다.
수정 1: “엄격하게 평가하세요.” 효과가 있었을까요?
아니요. 모든 점수가 약 1점씩 하락했고 순위는 거의 변하지 않았습니다. ρ는 0.41에서 0.44로 올라갔는데, 이는 노이즈 범위 내의 수치입니다.
저는 “당신은 까다로운 선임 면접관이다. 대부분의 답변은 6점 미만이다.”라는 문구를 추가했습니다. 최빈값(mode)이 7점에서 6점으로 이동했습니다. 그게 전부였습니다. 점수 분포가 하나의 블록처럼 왼쪽으로 밀려났을 뿐입니다. 좋지 않은 답변과 좋은 답변이 여전히 함께 뭉쳐 있었지만, 단지 더 낮은 높이에 있을 뿐이었습니다.
이것은 제가 가장 흔하게 추천받는 수정 방법이며, 기본적으로 미용적인 필터에 불과합니다. 더욱 엄격해 보이는 점수를 얻게 되어, 마치 정밀함(rigor)을 갖춘 것처럼 느껴지지만 실제로는 그렇지 않습니다.
수정 2: 기준점(anchored levels)이 있는 1-5점 척도
이것이 첫 번째 실질적인 개선이었습니다: ρ가 0.68로 급등했습니다. 저는 척도를 다섯 단계로 줄이고 각 단계에 대해 구체적이고 관찰 가능한 설명을 작성했습니다.
구체성(specificity):
1 = 구체적인 예시 없음. 일반론으로 이야기함 (“저는 팀 플레이어입니다”).
2 = 상황은 언급하지만 행동이나 결과가 없음.
...
핵심은 각 단계가 모델이 스크립트에서 확인할 수 있는 무언가를 설명한다는 것입니다.
승자: $\rho = 0.79$, 재실행 표준 편차(rerun std dev)는 0.31이며, 어느 단일 레벨에서도 누적 오류가 발생하지 않았습니다. 저는 모델에게 숫자를 요구하는 대신 일련의 예/아니오 질문을 했고 점수는 직접 계산했습니다.
from pydantic import BaseModel
class Check(BaseModel):
...
예상했던 것보다 더 중요했던 두 가지 세부 사항이 있습니다:
- 증거 요구 (Require evidence). 모델이 기록(transcript)을 인용해야만 체크가 유효합니다. 이 규칙이 없었을 때, 모델은 실제 근거가 없는 답변에 대해서도 "결과를 진술함"을 기꺼이 참으로 표시했습니다. 인용을 강제하자 관대한 통과 판정이 대부분 사라졌습니다.
- 예/아니오가 1-10점보다 쉽다. "측정 가능한 결과를 진술했는가?"에는 정답이 있습니다. "10점 만점에 얼마나 구체적이었나?"에는 그렇지 않습니다. 모델들은 전자의 질문 유형에 훨씬 더 일관성을 보였고, 이것이 바로 재실행 노이즈(rerun noise)가 3분의 2만큼 감소한 이유입니다.
체크리스트 접근 방식이 무엇을 망가뜨렸는가?
짧고, 특이하며, 진정으로 강력한 답변. 캘리브레이션 세트(calibration set)에서 60개의 답변 중 5개가 제 점수와 2단계 이상 차이가 났으며, 이 5개 중 4개는 실력 있는 후보자들이 작성한 간결한 답변이었습니다.
한 답변은 두 문장으로 이루어져 있었습니다: 정확한 문제점, 정확한 해결책, 그리고 수치였습니다. 저는 여기에 5점을 주었습니다. 하지만 체크리스트는 "성찰(reflection)" 부분이 없고 행동들이 "X를 했다"고 명시되기보다 암시되었기 때문에 3점을 주었습니다. 체크리스트는 구조에 보상을 주고, 구조는 길이와 상관관계가 있습니다. 저는 아직 이 문제를 완전히 해결하지 못했습니다. 현재 제가 적용한 패치는 "간결함에도 불구하고 완전함(complete despite being brief)"을 위한 별도의 검사이며, 이는 해당 사례의 약 절반 정도에서 도움이 됩니다.
다른 솔직한 비용들:
- 비용. 증거 인용은 더 많은 출력 토큰을 의미합니다. 점수 책정 비용이 세션당 약 $0.012에서 $0.021로 증가했습니다.
- 사용자들이 알아차렸다. 평균 점수가 하락했고, 첫 주에 저는 "너무 가혹하게 느껴진다"는 이메일을 몇 통 받았습니다. 아무도 7점이 너무 관대하다고 말하는 이메일을 보낸 적이 없었습니다. 이러한 비대칭성이 바로 문제 전체를 한 문장으로 요약합니다.
- 체크리스트는 유지보수가 필요하다. 새로운 차원이 생길 때마다, 프롬프트에 단어를 추가하는 것뿐만 아니라 캘리브레이션 세트에 대해 새로운 체크를 작성하고 검증해야 합니다.
그렇다면 LLM-as-a-judge가 모든 것에 7점을 주는 것을 어떻게 막을까요?
점수를 요구하는 것을 멈추세요. 고정되지 않은(unanchored) 1-10 스케일에서 작동하는 LLM-as-a-judge는 '7'이 모델의 기본값인 '수용 가능함(acceptable)'이기 때문에 7점을 중심으로 군집화될 것입니다. 그리고 엄격하게 지시하더라도 이 군집은 아래로 미끄러질 뿐입니다. 스케일을 구체적인 예/아니오 확인 항목으로 대체하고, 각 항목마다 인용된 증거 조각을 요구하며, 점수는 직접 코드로 계산하고, 그 결과를 올바른 순위가 무엇인지 아는 소규모 수동 채점 세트와 비교하여 검증하세요. 제 경우, 이는 인간의 점수와의 순위 일치도를 0.41에서 0.79까지 끌어올렸으며, 인간 대 인간의 최고치(ceiling)인 0.83과 비교했을 때의 비용으로 더 많은 토큰 지출과 뛰어난 짧은 답변에 대한 알려진 사각지대를 감수해야 했습니다.
Preterview(https://preterview.com/en)라는 인터뷰 준비 플랫폼을 개발한 개발자 작성.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기