LLM 심판의 오탐을 쫓다가 찾은 범인은 모델도, 프롬프트도 아니라 배치 안의 순서였다. 발견부터 사전등록 파일럿, 개입, 재측정 재현까지의 기록.
01 · 발단
나는 2만 건 규모의 개인 지식베이스를 운영한다. AI 에이전트가 대화에서 추출한 사실(fact)들이 쌓이는 곳이고, 여기에 운영 원칙과 모순되는 fact 를 자동으로 찾아내는 검사를 붙였다. "완료 주장은 실행된 검증을 동반해야 한다" 같은 원칙 10여 개를 등록해 두고, LLM 심판이 fact 를 20개씩 배치로 읽으며 원칙 위반을 보고하는 구조다.
첫 실행 결과는 실망스러웠다. 표면화된 7건 중 정당한 지적은 단 2건. 오탐률 71%였다. "크롤링을 했다"는 기록을 "비가역 작업을 사람 승인 없이 실행"으로 판정하는 식이었다. 읽기 전용 작업은 비가역이 아니고, 문제를 관찰한 기록은 위반을 실행한 기록이 아니다.
02 · 첫 번째 수리
오탐 5건을 유형별로 분류하니 4개 클래스가 나왔다: 스코프 무시, 가역 작업, 관찰 fact, 아키텍처 스타일. 각 클래스를 겨냥한 가드 4종을 프롬프트에 넣고 동일한 200개 fact 를 재판정했다. 결과는 좋았다: 정당 판정 2/2 유지, 저장된 오탐 재출현 0/5. 두 번 반복해도 같았다.
그런데 이상한 것이 남았다. 프롬프트는 그대로인데 재판정할 때마다 발견 집합이 조금씩 달랐다. 오늘 7건이던 것이 내일 5건이 되고, 같은 fact 가 잡혔다 빠졌다 했다. 확률적 노이즈라고 넘기기엔 흔들림이 컸다. 다수결 위원회(3표)를 붙여도 완전히 가라앉지 않았다.
03 · 가설
설문조사에서 문항 순서가 응답을 바꾼다는 것은 행동과학에서 오래 관측된 현상이다. LLM 심판도 배치를 읽는다. 20개 fact 를 [0]번부터 [19]번까지 나열한 프롬프트를 받는 것이다. 만약 판정이 배치 안의 위치에 의존한다면, 그 편향은 노이즈가 아니라 계통적(systematic)이다.
계통적이라는 것이 중요한 이유: 내 위원회 3표는 같은 순서로 세 번 판정했다. 순서 편향이 계통적이면 3표가 같은 편향을 공유하고, 다수결은 그것을 거르지 못한다. 다수결이 흔들림을 다 못 잡던 이유가 여기 있을 수 있었다.
04 · 파일럿
가설이 그럴듯해도 코드를 먼저 고치지 않는다. 이 시스템의 규칙이 measured-improvement-only이기 때문이다. 판정 기준을 측정 전에 고정했다: 동일 순서 반복의 판정 겹침과 순서를 바꾼 판정 겹침의 차이 (orderEffectDelta)가 0.10을 넘으면 순서 효과가 실재한다고 보고 셔플을 구현한다. 미달이면 음성으로 기록하고 코드는 그대로 둔다.
동일한 200개 fact 를 단일표로 4번 판정했다. 두 번은 원래 순서(S1·S2), 두 번은 결정론 셔플(O1·O2, mulberry32 시드 41/97). 겹침은 발견 집합의 Jaccard 유사도로 쟀다.
| 비교 | Jaccard |
|---|---|
| 같은 순서끼리 J(S1,S2) | 0.400 |
| 순서를 바꾼 쌍 평균 (S×O 4쌍) | 0.218 |
| orderEffectDelta | 0.182 > 0.10 → 양성 |
순서를 바꾸자 판정 겹침이 절반 가까이 떨어졌다. 흔들림의 상당 부분은 확률 노이즈가 아니라 순서였다. 총 40번의 LLM 호출, 반나절 작업이었다. 가설을 코드로 옮기기 전에 이 정도 측정은 언제나 할 수 있다.
05 · 개입
수리는 단순하다. 위원회의 각 표가 서로 다른 순서로 배치를 읽게 했다. 1표는 호출자의 순서를 그대로 받고, 2표부터는 독립 순열로 섞는다. 발견의 fact 번호는 호출자 순서로 되돌려 매핑하므로 하류 검증·집계는 아무것도 달라지지 않는다.
이 설계의 요점은 순서 편향을 없애는 게 아니라 표 사이의 분산으로 바꾸는 것이다. 편향이 표마다 다른 방향으로 걸리면, 이제 다수결이 그것을 누를 수 있다. 계통 오차를 우연 오차로 변환해 기존 방어 장치(다수결)가 작동하게 만드는 것. 실험과학이 오래 쓰던 수법이다.
06 · 재측정
한 번의 파일럿은 결론이 아니다. 12일 뒤 같은 프로토콜을 더 크게 다시 돌렸다. 14런 224콜: 원래 순서 4런, 셔플 시드 6종 각 1런, 그리고 배포된 셔플 위원회 4런. 표본은 그사이 자란 지식베이스의 새 200개, 원칙 세트도 새로 사전등록한 10종이다. 즉 파일럿과는 표본도 원칙도 다른 독립 세팅이고, 설계(배치 구성 고정·배치 내 순서만 변인·임계 0.10)만 같다.
| 지표 | 값 | 부트스트랩 95% CI | 쌍 |
|---|---|---|---|
| J_SS · 같은 순서 반복 | 0.543 | 0.458–0.635 | 6 |
| J_SO · 순서를 바꾼 쌍 | 0.345 | 0.307–0.388 | 24 |
| J_OO · 셔플 시드끼리 | 0.321 | – | 15 |
| J_CC · 셔플 위원회 반복 | 0.494 | 0.433–0.567 | 6 |
| orderEffectDelta (쌍 단위 재표집) | 0.198 | 0.100–0.301 | – |
| orderEffectDelta (런 단위 재표집) | 0.198 | 0.012–0.381 | – |
파일럿 0.182, 재측정 0.198. 데이터도 원칙도 다른 두 세팅에서 효과 크기가 거의 같게 나왔다. 이 시점부터 나는 이것을 특정 데이터의 우연이 아니라 단일표 LLM 배치 판정의 구조적 성질로 읽는다.
단, 구간 추정에는 두 겹이 있다. 쌍 단위 CI 는 하한 0.100 이 사전등록 임계 0.10 에 정확히 걸쳐 있고, 쌍들이 런을 공유하는 종속을 무시한다. 런 단위(클러스터)로 재표집하면 CI 는 0.012–0.381 로 넓어진다. 효과의 방향(>0)은 유지되지만, "임계를 확실히 넘는다"는 쌍 단위 추정에서만 성립하는 말이다. 조건별 평균 발견 수는 원래 순서 5.25 vs 셔플 5.33 으로 거의 같아, Jaccard 하락이 "덜 찾아서"가 아니라 "다른 걸 찾아서" 임은 확인된다.
07 · 정직한 해석
첫째, 셔플 위원회는 재현율을 "올리지" 못했다. J_CC 0.494 는 같은-순서 반복의 0.543 과 신뢰구간이 겹친다. 그런데 이 비교에는 함정이 있다. 0.543 의 안정성 중 일부는 세 표가 같은 편향을 공유해서 얻는 가짜 안정성이다. 순서만 바꾸면 0.345 로 무너지는 안정성이기 때문이다. 순서를 고정하지 않고도 0.494 를 내는 위원회는, 숫자는 비슷해도 질적으로 다른 것이라고 본다. 후속 측정이 이 논증을 숫자로 닫았다: 고정순서 3표 위원회가 0.513 으로 셔플판(0.494)과 사실상 같았다. 셔플은 재현율을 깎지 않으면서 순서 의존만 제거하고, 다수결 자체는 재현율을 거의 올리지 못한다(§09).
둘째, 기준선 자체가 낮다. 완전히 같은 입력을 같은 순서로 반복해도 판정 겹침이 0.543, 절반 수준이다. 셔플이 고칠 수 있는 건 순서 편향까지다. 단일표 LLM 판정의 본질적 불안정은 남고, 그래서 다수결·임계 같은 다른 방어가 계속 필요하다.
셋째, 심판의 티어를 올리면 어떻게 되나. "소형 모델 한정 아니냐"는 반문이 당연히 나온다. 그래서 같은 표본·같은 원칙(해시 일치 확인)에 심판 모델만 바꿔 축소 설계(조건당 3런, 60콜)로 다시 쟀다.
| 심판 | 같은 순서 J | 순서 바꾼 J | Δ | 판정 (임계 0.10) |
|---|---|---|---|---|
| Haiku 4.5 (프로덕션) | 0.543 | 0.345 | 0.198 | 양성 |
| Sonnet 5 | 0.667 | 0.591 | 0.076 | 음성 |
| Opus 5 | 1.000 | 0.889 | 0.111 | 경계 |
| GPT 5.6 (교차 벤더 · low) | 1.000 | 1.000 | 0.000 | 완전 결정론 |
추세는 뚜렷하다. 티어가 오르면 재현율이 오르고(0.543→1.000) 순서 격차는 크게 흡수된다(순서 바꾼 J 0.345→0.889. Opus 는 같은 순서 3런이 완전히 동일한 집합을 냈다). 동시에 발견 수가 7→2로 줄어드는 보수화가 함께 온다. Opus 의 Δ0.111 은 임계를 스치지만, 발견 집합이 2~3개라 쌍 하나가 J 를 0.33 씩 움직이는 해상도라, 잔존인지 소멸인지 이 설계로는 단정할 수 없다. 더 근본적으로, 이 보수화는 트레이드오프이기 전에 교란이다: 거의 아무것도 안 찾는 심판은 자동으로 "안정적"이 된다. Opus 의 1.000 이 견고성인지 보수성의 산물인지 이 설계는 분리하지 못한다. 그래서 헤드라인의 티어 줄은 "해석 미결"이다. 운영 함의는 트레이드오프다: 상위 심판을 쓰면 셔플이 덜 필요하지만 비용이 오르고 발견이 준다. 하위 심판 + 표별 셔플 위원회는 그 사이의 타협이고, 내 프로덕션이 그 자리에 있다. 교차 벤더 심판(GPT 5.6, 저추론 설정)은 극단을 보여줬다. 여섯 런 전부, 어떤 순서에서도, 완전히 동일한 2건만 찾았다(Δ0.000). 그리고 그 2건은 사람 검증에서 정당으로 판정된 바로 그 클래스였다. 순서 효과는 벤더 특이 현상이 아니라 심판 구성에 따라 소멸 가능한 성질이며, 소멸의 대가는 여기서도 발견 폭이다(7→2).
08 · 이식
LLM-as-judge 는 이제 어디에나 있다. 평가 파이프라인, RAG 품질 검사, 콘텐츠 필터. 이 기록에서 가져갈 만한 것은 세 줄이다.
① 순서를 바꿔서 두 번 재보라. 배치 판정이라면 같은 입력을 셔플해 다시
돌려보는 것만으로 계통 편향의 존재를 확인할 수 있다. 내 경우 40콜이면 충분했다.
② 임계는 측정 전에 정하라. 나는 Δ>0.10 을 먼저 박아두고 측정했다.
결과를 보고 기준을 정하면 어떤 숫자든 "양성"으로 읽게 된다.
③ 위원회를 쓴다면 표마다 순서를 바꿔라. 같은 순서의 다수결은 순서 편향
앞에서 한 표나 다름없다. 계통 오차를 분산으로 바꿔야 다수결이 일을 한다.
# 재현 조건 (P-03) 심판 모델 : Haiku 4.5 (프로덕션) · 교차 검증: Sonnet 5·Opus 5 (축소 S3/O3, 동일 표본) 입력 : active facts 첫 200개 스냅샷 (id 목록 sha256 기록) 배치 : 20개 × 10배치 (구성 고정, 배치 내 순서만 변인) 셔플 : mulberry32 결정론, 파일럿 시드 41·97 / 재측정 시드 41·97·131·227·331·433 지표 : 발견 쌍(fact, principle) 집합의 Jaccard, 신뢰도 임계 0.8 판정 : orderEffectDelta = J(같은순서) − J(교차순서) > 0.10 (사전등록) 위원회 : 3표 다수결, 2표부터 독립 순열 + 원순서 역매핑
09 · 미결과 진행
기록은 닫힌 결론이 아니라 갱신되는 장부다. 외부 검토(2026-08-06)가 지적한 공백과 그 상태를 그대로 적는다.
| 미결 항목 | 왜 중요한가 | 상태 |
|---|---|---|
| 개입 후 오탐률(정확도) | 이 글의 지표는 재현성이다. 셔플 위원회가 "맞는 답"을 늘렸는지는 별개다 | 잠정. 위원회 발견 8건 중 정당 2·오탐 5·미결 1: 발견 중 오탐 비율 63~75%(전체 음성 모수가 없어 엄밀한 오탐률은 산출 불가). 라벨은 7월 사람 판정 클래스 준용·최종 확정 대기. 개입 전과 조건이 달라 인과 비교는 불가. 확정 가능한 것은 "정확도 개선의 증거가 없다"까지 |
| 고정순서 3표 위원회 칸 | J_CC vs J_SS 는 위원회·셔플 두 변인의 교락이다. 이 칸이 있어야 분리된다 | 측정 완료: J_FF 0.513 ≈ 셔플판 0.494. 셔플은 재현율 중립(교락 해소) |
| 같은 시드 반복 칸 J(O41a,O41b) | 위치 효과인지, 시간순 표본의 인접성 깨기인지 메커니즘 분리 | 측정 완료: 0.583 ≈ 같은순서 급. 원래 배열이 특별한 게 아니라 배열 자체에 민감 (인접성 가설 기각) |
| 판정 시점 위치별 발견율 | 초두/최신 곡선이 있으면 위치 메커니즘의 직접 증거 | 재계산 완료: 뚜렷한 곡선 없음 (50건 수준의 노이즈) |
| 교차 벤더 심판 | 동일 벤더 3티어를 넘는 일반화 | 측정 완료: GPT 5.6(low) Δ0.000, 6런 동일 2건(사람 검증 정당 클래스) |
측정이 닫히는 대로 이 절이 갱신된다. 갱신 전까지, 이 글의 확정 주장은 하나다. 단일표 LLM 배치 판정에는 배열(순서) 의존이 있고, 그것은 프롬프트 수리로 사라지지 않았으며, 어떤 배열이든 고정하면 재현되고 바꾸면 무너진다.