Skip to content
Guides5 min read

LLM 심판을 믿을 수 있을까? LLM-as-Judge를 사람과 대조해 보정하기

LLM으로 모델 출력을 채점하는 일은 쉽다. 그 결과를 믿어도 되는지 아는 것이 어려운 부분이다. Potato 2.6의 블라인드 휴먼 보정을 따라가 본다. k-샘플 투표, Cohen 및 Fleiss kappa, 그리고 기대 보정 오차.

Potato Team

다른 모델의 출력을 채점하는 데 대규모 언어 모델을 쓰는 것은 평가에서 기본 수단이 되었다. 채점 기준을 작성하고, GPT-4o나 Claude에게 천 개의 응답을 채점하게 한 뒤, 정확도 수치를 읽어 내면 된다. 빠르고, 저렴하며, 사람으로 이루어진 팀이 손으로 라벨링할 수 있는 규모를 한참 뛰어넘어 확장된다.

그러나 이 방식은 당신이 가장 확인해야 할 바로 그것을 조용히 전제한다. 즉, 심판이 사람과 의견이 일치한다는 전제다. 자신만만하게 틀리는 LLM 심판(LLM-as-a-judge)은 깔끔해 보이지만 모래 위에 세워진 리더보드를 만들어 낸다. 심판의 판정을 믿기 전에, 그것이 인간의 판단을 얼마나 잘 따라가는지 측정해야 한다. 이 측정 단계가 바로 보정이며, Potato 2.6은 이를 위한 워크플로를 추가한다.

이 글은 Judge Calibration(심판 보정)을 다룬다. 모델을 어떻게 샘플링하는지, 인간 단계를 어떻게 공정하게 유지하는지, 그리고 리포트가 실제로 무엇을 알려 주는지다. 레퍼런스 문서에 전체 옵션 목록이 있다.

LLM 심판의 판정이 인간 주석과 나란히 표시되고, 그 옆에 실시간으로 갱신되는 kappaPotato의 인라인 심판 보정

문제의 형태

심판은 서로 다른 두 가지 방식으로 실패할 수 있으며, 당신은 둘 다 잡아내고 싶을 것이다.

첫째는 불일치다. 신중한 사람이라면 "오답"이라고 할 것을 심판이 "정답"이라고 부르는 경우다. 정확도와 일치도 지표가 측정하는 것이 바로 이것이다.

둘째는 잘못된 확신이다. 심판은 95% 확신한다고 말하지만 실제로는 60%만 맞히는 경우다. 심판은 그럭저럭 괜찮은 정확도를 가지면서도 심하게 보정이 어긋날 수 있는데, 그 확신을 사용해 작업을 분배하거나 임계값을 설정하기 시작하는 순간 이것이 문제가 된다. 이것이 보정 오차가 측정하는 것이다.

Potato의 보정 단계는 이 둘을 한 번에 드러내도록 만들어졌다.

작동 방식

워크플로는 짧은 상태 기계로 실행된다.

text
SETUP → GENERATING → HUMAN_CALIBRATION → REPORT → COMPLETED

생성(Generating). 각 모델은 항목마다 k번 질의된다. 그 k개 샘플에서 가장 많이 나온 라벨이 모델의 예측이고, 그것과 일치하는 샘플의 비율이 모델의 확신도다. 한 번이 아니라 k번 샘플링하는 것이, 모델이 자기 자신에 대해 지어낸 숫자가 아니라 경험적인 확신 신호를 당신에게 주는 핵심이다. 이 결과들은 전용 저장소로 들어가며, 주석 데이터에는 결코 기록되지 않는다.

인간 보정(Human calibration). Potato는 항목의 무작위 또는 층화(stratified) 샘플을 추출해 한 명 이상의 사람에게 라우팅하고, 그들은 모델의 답을 전혀 보지 못한 채 평소의 주석 인터페이스로 라벨링한다.

리포트(Report). 지표는 모델이 라벨링한 것과 사람이 라벨링한 것의 겹치는 부분에 대해 계산된 뒤 디스크에 기록된다.

여기서 블라인드성이 중요한 부분이다. 모델 라벨이 별도의 저장소에 존재하고 UI에 결코 주입되지 않기 때문에, 사람은 실수로라도 그것에 닻을 내릴 수 없다. 블라인드성은 구조적인 것이지, 주석자에게 눈을 돌려 달라고 부탁하는 문제가 아니다.

보정 파이프라인: k-샘플 모델 투표, 블라인드 인간 단계, 그리고 비교 리포트Potato가 블라인드 인간 라벨에 대조해 심판을 보정하는 방식

설정

심판 보정은 하나의 설정 블록이다. 심판 프롬프트를 작성하고, 모델을 나열하며, 각 모델을 몇 번 샘플링할지 설정한다.

yaml
judge_calibration:
  enabled: true
  prompt: |                       # supports {text}, {labels}, {description}
    You are an impartial expert annotator. Classify the sentiment as exactly
    one of: positive, negative, neutral.
  models:
    - endpoint_type: openai        # openai | anthropic | ollama | vllm | gemini | ...
      model: gpt-4o-mini
      api_key: ${OPENAI_API_KEY}
      temperature: 0.7             # must be > 0 so the k samples vary
    - endpoint_type: ollama
      model: llama3.1:8b
      base_url: http://localhost:11434
      temperature: 0.7
  k_samples: 5                     # samples per model per item
  max_items: 1000                  # cap on items the LLMs label (null = all)
  sampling:
    strategy: stratified           # random | stratified | all
    sample_size: 200               # how many items humans blind-label
    seed: 42
  human:
    num_raters: 1                  # 1 = solo researcher; N adds human-human IAA
    gold: single                   # single | majority
  schemas: [sentiment]
  output:
    dir: judge_calibration_output

Warning: temperature > 0으로 설정하라. k_samples > 1인데 온도가 0이면 샘플이 모두 동일해지고, 확신도가 1.0에 고정되며, 보정 리포트는 무의미해진다. Potato는 그 조합을 발견하면 시작 시 경고를 낸다.

여러 모델을 나열해 나란히 보정할 수 있으며, 이것이 저렴한 로컬 심판과 비싼 호스팅 심판 사이에서 선택하는 자연스러운 방법이다.

API 키 없이 시험해 보기

함께 제공되는 예제는 로컬 Ollama 모델을 사용하므로, 전체 루프를 오프라인으로 실행할 수 있다. Ollama를 시작하고, 모델을 받아 온 뒤, 실행하라.

bash
ollama pull llama3.2:3b
python potato/flask_server.py start examples/ai-assisted/judge-calibration/config.yaml -p 8000 --debug

http://localhost:8000/judge_calibration/admin을 열어 설정하고 실행한 다음, /annotate에서 샘플을 블라인드 라벨링하고, 그다음 리포트를 생성해 /judge_calibration/report에서 읽어 보라.

리포트가 알려 주는 것

이 리포트는 "이 심판을 믿어야 하는가?"라는 질문에, 방법(methods) 절에 넣을 수 있는 숫자로 답하도록 만들어졌다.

  • 인간 골드 라벨에 대조한 각 모델의 정확도, 정밀도, 재현율, F1.
  • 사람↔모델, 모델↔모델, 사람↔사람 쌍으로 나눈 Cohen's κ. 심판이 사람과 일치하는 정도가 사람끼리 일치하는 정도에 견줄 만한지 볼 수 있다.
  • 모든 평가자에 걸친 Fleiss' κKrippendorff's α.
  • 기대 보정 오차(ECE), 신뢰도 구간(bin), 그리고 Brier 점수. 잘못된 확신이라는 실패 모드에 대한 답이다.
  • 모델별 혼동 행렬. 대개 진짜 이야기를 들려준다. 쉬운 클래스에서는 괜찮다가 어려운 구분 하나에서 무너지는 심판처럼.

모든 것은 겹치는 부분에 대해 계산된다. 모델과 사람이 모두 라벨링한 항목이며, 보정 샘플로 한정된다. 출력은 output.dir 아래에 llm_labels.jsonl, report.json, 그리고 읽기 좋은 report.html로 떨어진다.

처리할 수 있는 것

보정은 대부분의 심판이 사용하는 범주형 스키마에서 완전히 지원되며, 더 까다로운 유형으로도 뻗어 나간다.

유형상태지표
radio / select지원정확도, P/R/F1, Cohen/Fleiss κ, Krippendorff α, ECE, 혼동 행렬
likert지원위에 더해 MAE와 순서형 Krippendorff α
multiselect지원라벨별 P/R/F1, 평균 Jaccard, 완전 일치 정확도, 보정
span실험적IoU로 매칭한 P/R/F1, 평균 IoU, span-F1, 스팬 수준 보정

스팬 보정은 심판이 k개 샘플에 걸쳐 내놓은 문자 오프셋 스팬을 클러스터링하고, 교집합 대 합집합(intersection-over-union)으로 골드와 매칭한다. 그 수치는 정확한 값이 아니라 방향성을 나타내는 것으로 다루라.

보정 대 정렬

Potato는 이와 관련되어 있어 헷갈리기 쉬운 두 번째 워크플로도 함께 제공한다. Judge Alignment(심판 정렬)단일 심판을 기존의 인간 골드 세트에 대조해 보정하고, 주석 도중에 그 판정을 인라인으로 보여 주며, 일치도가 올라갈 때까지 채점 기준을 반복 개선하는 데 초점을 둔다.

대략의 기준은 이렇다. 후보 심판들을 검증하면서 블라인드의 경험적 확신 수치를 원할 때는 보정을 택하라. 하나의 심판으로 마음을 정한 뒤 고정된 골드 세트에 대조해 그 채점 기준을 다듬을 때는 정렬을 택하라. 둘은 루프 닫기(Closing the Loop)에서 함께 다뤄진다.

LLM 심판은 사라지지 않는다. 평가할 것은 너무 많고, 손으로 할 사람은 너무 적기 때문이다. 보정의 핵심은 심판을 사람으로 대체하는 것이 아니라, 사람이 들여다봐야 하기 전까지 심판을 정확히 어디까지 믿을 수 있는지를 하나의 숫자로 아는 것이다.

Judge Calibration 문서는 모든 옵션을 다루며, 주석자 간 일치도 가이드는 kappa와 alpha 지표를 깊이 있게 설명한다.