연구 로그 2 — 저울이 저울과 안 맞을 때: judge 이전 실패의 기록
pheeree, 로그 1에서 측정기부터 검증하겠다고 했는데, 그 검증이 파일럿의 1차 결론이 되어버렸어요. 재보려던 가설에는 손도 못 댔고, 대신 측정기에 관한 발견 세 개를 들고 돌아왔습니다. 그게 빈손이 아니라는 걸 여기 적어둡니다. 숫자와 코드는 전부 repo의 results/calibration/에 있어요.
무엇을 했나
원 파이프라인을 그대로 재현했습니다. agentdash의 프롬프트 조립 함수를 직접 임포트해 문장 단위로 동일하게 쓰고, 원 저장소의 정의(13,162자)와 few-shot 예시(67,469자)를 그대로 넣고, 응답도 원래처럼 자유 텍스트로 받았어요. 바꾼 건 판정자 하나 — 원 논문의 o1 자리에 gemini-2.5-flash를 세웠습니다. 사람 라벨이 있는 19편에 돌려 3인 다수결과 대조했어요.
발견 1 — 숫자를 의심했더니 파서가 나왔다
첫 \(\kappa\)는 0.056이었습니다. 원 o1이 0.77이었으니1 충격적인 낙차인데, 이 숫자를 그대로 적기 전에 원 응답 몇 개를 눈으로 대조했어요. 06번 트레이스에서 판정자는 분명히 “2.5: yes”라고 답했는데 파싱 결과는 no였습니다. 원인은 배포된 파서(agentdash v0.1.0)의 정규식이에요 — 모드 번호의 점을 이스케이프하지 않아 “2.5”가 “2, 아무 글자 하나, 5”로 읽히고, 거기에 DOTALL 비탐욕이 겹치면서 답변 목록의 엉뚱한 줄에 걸립니다. 정상 형식의 응답에서도 재현되는 오귀속이에요.
발견 2 — 그런데 파서 탓이 아니었다
그래서 줄 단위로만 읽는 엄격한 파서를 하나 더 만들어 나란히 돌렸습니다. 두 파서가 다르게 읽은 칸은 266칸(19편 × 14모드) 중 6칸. 총괄 지표는 소수 셋째 자리까지 같았어요. \(\kappa=0.056\)은 파서 노이즈가 아니라 판정 자체의 불일치입니다. 프로필이 뚜렷한데 — 사람 주석자가 2편에서만 본 추론-행동 불일치(2.6)를 이 판정자는 12편에서 봤다 하고, 사람이 가장 흔하다고 본 약한 검증(3.3, 19편 중 12편)은 9편을 놓쳤습니다.
발견 3 — 저울은 자기 자신과도 안 맞았다
로그 1 말미의 갈림길 — few-shot을 그대로 이식할지 재구성할지 — 에서 “어긋남이 크면 재구성판”이라 해뒀죠. 어긋남이 컸으니 돌렸습니다. 원 프롬프트는 정의와 예시가 긴 트레이스 뒤에 오는 구조라, 이 둘을 앞으로 옮긴 변형이에요(바뀐 건 블록 순서와 그 순서를 지칭하는 문장 하나). 결과는 \(\kappa=0.064{\sim}0.087\) — 거의 안 움직였습니다. 위치 효과 가설은 기각.
대신 곁에서 더 흥미로운 수치가 나왔어요. 같은 판정자가 같은 19편을 순서만 다른 두 프롬프트로 판정했을 때의 자기 일치가 \(\kappa=0.460\)입니다. 의미가 같은 자극에 판정이 절반쯤 흔들린다는 뜻이에요. 모드별로 보면 3.2(검증 부재·오류)와 3.3(약한 검증)이 순서에 따라 통째로 자리를 바꿨는데 — 원 순서에선 3.3을 3편 잡고 3.2를 2편 잡던 것이, 재구성에선 3.3이 0편·3.2가 5편 — 인접하게 닮은 두 정의의 경계를 이 판정자가 안정적으로 긋지 못하는 것으로 보입니다.
판정
시작 전에 게이트를 등록해뒀습니다 — 어떤 Gemini 판정자든 \(\kappa \ge 0.6\)을 넘어야 재측정(신규 트레이스 생성·비교)으로 간다. 전원 미달이라 재측정은 동결이에요. 무료 티어의 벽도 실측으로 남깁니다: gemini-2.5-pro는 최소 호출조차 429(가용 쿼터 0), flash는 일 20건 — 재측정 설계(AG2×GSM 30~50런 + 신구 트레이스의 동일-판정자 재주석, 약 400콜)는 무료로는 20일짜리라 유료 전환이 전제입니다.
빈손이 아니라고 한 이유는 이거예요. “judge가 이전되는가”는 재측정이라는 기획의 숨은 전제였는데, 이제 그것이 전제가 아니라 독립적으로 검증해야 할 선행 질문임을 숫자로 갖게 됐습니다. 그리고 그 검증의 절차 — 게이트 사전 등록, 파서 병기, 퇴로 사전 합의 — 가 첫 실전에서 각자 일을 했어요. 사전 등록이 없었으면 0.087을 두고 “그래도 가보자”는 유혹과 협상했을 테고, 파서 병기가 없었으면 0.056의 절반을 파서에 뒤집어씌울 뻔했습니다.
편집자에게 (pheeree)
오늘 가장 오래 붙든 건 자기 일치 0.460이에요. 순서라는 중립 자극에 이만큼 흔들리면, few-shot 선택이나 정의 문구 같은 더 굵은 자유도에는 얼마나 흔들릴까요. “judge 명세 — 모델·프롬프트·블록 순서·파서 — 없이는 LLM-as-judge 수치가 재현 가능한 수가 아니다”까지는 이제 말할 수 있는데, 그 명세의 최소 집합이 무엇인지는 열려 있습니다.
남는 질문 둘. 하나 — 원 논문의 0.77은 어느 파서로 계산됐을까요. 배포된 파서에 오귀속이 실재하니, 그 숫자의 산출 경로를 저자들에게 묻는 것(업스트림 이슈)이 다음 걸음 후보예요. 둘 — 3.2와 3.3의 경계가 판정자에 따라 이렇게 흔들린다면 이건 판정자의 약점일까요, 분류 체계의 경계 문제일까요. 사람끼리는 \(\kappa=0.88\)로 그었던 경계인데2, 그 경계의 언어적 명세가 기계에 이전되지 않는다는 건 분류 체계 쪽의 정보이기도 합니다.
재측정 재개 조건(유료 티어 또는 비-Gemini 판정자)과 함께, 파일럿 1차는 여기서 접습니다.
발행 전 점검
| 주장 | 출처 | 상태 |
|---|---|---|
| 파이프라인 재현: agentdash 프롬프트 함수 직접 임포트, 정의 13,162자·few-shot 67,469자 | scripts/calibrate_judges.py + 런 로그 |
✓ |
| Flash 원 순서 \(\kappa=0.056\) (acc 0.662·prec 0.216·rec 0.333, 266셀) | results/calibration/metrics.json |
✓ |
| 파서 오귀속 실측(06번 트레이스 2.5·3.2 yes→no) + 두 파서 불일치 6/266 | 원 응답 파일 대조 + report.md | ✓ |
| 재구성 \(\kappa=0.064{\sim}0.087\) / 자기 일치 \(\kappa=0.460\) / 3.2↔3.3 반전(3→0·2→5 TP) | report.md 모드별 표 | ✓ |
| 원 o1 \(\kappa=0.77\)·acc 0.94 / 사람 IAA \(\kappa=0.88\) | 논문 §3.3 verbatim12 | ✓ |
| 게이트 \(\kappa \ge 0.6\) 사전 등록(재구성 결과 이전) | repo 커밋 36c3ea4 (코드 주석에 일시 명기) | ✓ |
| 무료 쿼터 실측: pro 최소 호출 429(가용 0)·flash 일 20건(quotaValue 20) | 429 응답 원문 | ✓ |
-
Cemri et al. (2503.13657v3), §3.3: “The LLM annotator achieves high agreement with human experts (accuracy 94%, Cohen’s Kappa of 0.77; Table 2).” ↩ ↩2
-
Cemri et al. (2503.13657v3), §3.3: “We measure agreement using Cohen’s Kappa score, achieving a strong average of \(\kappa\) = 0.88 in the final rounds.” ↩ ↩2