네 개의 모델은 내 수치를 완벽하게 인용했지만, 하나는 여전히 잘못 읽었다
요약
AI 모델이 수치를 정확하게 인용하더라도 데이터로부터 잘못된 결론을 도출할 수 있음을 실험을 통해 증명합니다. 281개의 에이전트 세션 데이터를 활용해 4개 모델의 수치 인용 정확도를 검증했으나, 수치 자체는 정확해도 해석 단계에서 오류가 발생하는 사례를 발견했습니다.
핵심 포인트
- 모델의 수치 인용 정확도와 데이터 해석 능력은 별개임
- 4개 모델 모두 수치 인용(Citation)에서는 환각 없이 완벽한 결과 기록
- 정확한 수치를 읽고도 잘못된 통계적 결론을 내리는 실패 모드 확인
- 데이터 검증 시 단순 인용 감사(Citation Audit) 이상의 단계가 필요함
hexisteme notes에 처음 게시되었습니다.
최근 나는 내가 직접 수행한 281개의 AI 에이전트 (AI-agent) 세션에서 계산된 행동 지표 (behavioral metrics) 테이블을 고정(freeze)한 뒤, 거기서 도출된 결론을 신뢰하기 전에 두 가지 별도의 검증을 거쳤습니다. 두 검증 모두 통과했습니다. 하지만 두 검증 모두 내가 실제로 알고 싶었던 것을 확인해주지는 못했습니다 — 그리고 두 실패는 정확히 같은 형태를 띠고 있었습니다.
기저에 깔린 테이블은 관찰 데이터이며, 모델에 대한 사실이라기보다는 나의 라우팅 정책 (routing policy)을 촬영한 사진에 더 가깝습니다. 나는 이미 이 실패 모드 (failure mode)에 대해 별도로 글을 쓴 적이 있습니다. 이 포스트는 해당 주의 사항을 전제로 하며, 그보다 한 단계 더 나아갑니다. 즉, 그 주의 사항을 수용하고 그럼에도 불구하고 실제 검증 절차를 구축한 뒤, 두 검증 모두 '통과(green)' 신호가 나오는 것을 지켜본 후에 어떤 일이 벌어지는지에 대해 다룹니다.
제1막: 70개 중 70개를 통과한 인용 감사 (citation audit)
코퍼스 (corpus)는 281개의 세션이었으며, 이는 4,818개의 스레드 (threads)와 4,415개의 행동 지표 (behavioral metrics) 행으로 나뉘어 분석 도중 데이터가 변하지 않도록 고정되었습니다. 나는 내가 재가동한 메인 모델이 고정된 테이블을 읽고 먼저 자신의 주장을 기록하도록 했으며, 외부 모델이 데이터를 보기 전에 이를 봉인했습니다. 그 다음, 동일한 테이블을 6개의 외부 벤더 (vendor) 제품군에 보냈고, 각 모델에 자체적인 주장을 도출하도록 요청했습니다. 6개 중 오직 3개만이 깔끔하게 결과를 반환했습니다 — 하나는 무료 티어 (free-tier) 할당량이 0이라 실패했고, 하나는 내부 오류 (internal error)를 일으켰으며, 하나는 응답 스트림 (response stream)이 읽기 도중 잘렸습니다. 내가 봉인한 읽기 결과와 결과가 돌아온 3개의 외부 읽기 결과 사이에서, 최종적으로 4개의 독립적인 제품군이 동일한 수치를 살펴보게 되었습니다: 내가 재가동한 모델, xAI의 Grok, DeepSeek, 그리고 Google의 오픈 모델 (open model)입니다.
그다음 저는 실제로 중요한 검증 단계를 실행했습니다. 네 모델이 인용한 모든 수치를 추출하여, 고정된 데이터베이스(frozen database)와 직접 대조하여 재계산하고, 5% 이상 차이가 나거나 데이터에 전혀 존재하지 않는 수치를 찾아내는 결정론적 감사기(deterministic auditor)를 가동했습니다. 70개의 인용구가 입력되었고, 70개 모두 '통과(PASS)' 판정을 받았습니다. 공유된 학습 계보(training lineage)가 없는 네 개의 모델 전체에서 환각(hallucination)된 숫자는 단 하나도 없었습니다.
이것은 제가 쓰러뜨리기 위해 설정한 허수아비(strawman)가 아닌, 진정으로 좋은 결과입니다. 이는 모델이 그저 그럴듯하게 들리는 통계치를 지어내는 실제 실패 모드(failure mode)를 배제해 줍니다. 하지만 이것이 배제하지 못하는 것은, 모델이 정확하게 인용된 실제 숫자를 읽고도 그로부터 잘못된 결론을 도출하는 경우입니다. 그런 일이 한 번 발생했으며, 사례로 사용하기에 충분할 만큼 명확했습니다.
표의 한 행은 Claude Sonnet 5의 메인 역할(main-role) 스레드에 속해 있었는데, 이는 9개로 구성된 작은 집단이었습니다. 여기서 tool_error_rate를 포함한 네 가지 행동 지표(behavioral metrics)가 모두 정확히 0.000으로 나타났습니다. DeepSeek 모델은 그 0.000을 정확하게 인용했고, 그것이 정밀하고 오류 없는 도구 사용(tool use)을 의미한다고 결론지은 뒤, 그 해석을 바탕으로 라우팅 제안(routing suggestion)을 구축했습니다. 반면 제가 사용한 모델은 동일한 행을 보고 이를 측정 아티팩트(measurement artifact, 측정 오류)일 가능성이 높다고 표시했습니다. 이 코퍼스(corpus)에서 Sonnet 5는 메인 역할 스레드에서 거의 활동하지 않으며, 이 지표들의 대부분은 해당 스레드에서 거의 수행하지 않는 파일 편집(file edits)으로부터 파생됩니다. 비율의 분모가 되는 편집 횟수가 없으면, 그 비율은 낮은 것이 아니라 정의되지 않은(undefined) 상태이며 기본값인 0으로 설정됩니다. 이 9개의 희소한(sparse) 스레드 전체에서 중앙값(median) 도구 오류율이 0이라는 것은, 실적이 아니라 데이터가 없는 것과 같은 종류의 '비신호(non-signal)'입니다. 즉, 결합 퇴화(tie-degenerate) 상태이지 기록이 아닙니다. 0은
제2막: 엄격하게 설계되었음에도 여전히 부족했던 테스트
팬아웃(fan-out) 감사는 의도적으로 느슨하게 설계되었습니다. 여러 모델이 고정된 테이블을 바탕으로 자유 연상(free-associate)하게 한 뒤, 나중에 산술(arithmetic) 능력을 평가하는 방식입니다. 하지만 하나의 지표에는 더 엄격한 처리를 적용했습니다. 데이터를 확인하기 전, 저는 동일 파일 재편집률(same-file re-edit rate)에 대해 공식적인 동등성 검정(equivalence test)인 TOST(two one-sided tests, 양측 단측 검정)를 사전 등록했습니다. 이는 제가 새로 출시한 메인 모델의 메인 역할 스레드(main-role threads)를 이전 플래그십 모델인 Claude Opus 4.8의 스레드와 비교하는 것이었습니다. 저는 사전에 임계값(margin)을 통합 표준 편차(pooled standard deviation)의 0.75로 설정하고, 단순한 규칙을 약속했습니다. 즉, 관찰된 차이(observed difference)를 둘러싼 전체 신뢰 구간(confidence interval)이 해당 임계값 안에 들어와야만 테스트를 통과하는 것으로 정의했습니다.
| 항목 | 값 |
|---|---|
| 재출시된 모델, 메인 역할 세션 (n) | 54 |
| ... |
제가 약속한 규칙에 따라, 이 테스트는 깔끔하게 통과되었습니다. 전체 구간이 임계값 안에 들어왔기 때문입니다. 이것은 바람직한 종류의 검증입니다. 결과가 나에게 유리할지 여부를 알기 전에 미리 정해둔 임계값에 따라 수치를 평가했기 때문입니다. 따라서 저는
- 그 여유 폭은 거의 무엇이든 통과할 수 있을 만큼 충분했습니다. 0.75의 풀링 표준 편차 (pooled standard deviations) 구역은 관대한 편입니다. 이렇게 느슨한 기준을 통과하는 것은, 더 엄격하고 어렵게 얻어낸 통과보다 가치가 떨어집니다.
- 그 여유 폭을 통과한 구간은 0을 포함하지도 않았습니다. [+0.015, +0.163]은 결코 0을 교차하지 않습니다. 이는 실질적이고 방향성이 있는 차이가 존재함을 의미합니다. 즉, 재출시된 모델이 플래그십 모델보다 동일한 파일을 측정 가능한 수준으로 더 자주 재편집한다는 것이며, 확인된 부호(sign)가 있는 격차에 대해 "동등하다"는 표현은 잘못된 단어입니다.
- 지표가 결코 결정의 근거는 아니었습니다. 동일 파일 재편집률 (Same-file re-edit rate)은 편집 동작을 나타내는 하나의 대리 지표 (proxy)일 뿐입니다. 이는 어떤 모델이 더 자주 정답을 맞혔는지, 두 모델이 다룬 작업이 실제로 완료되었는지, 혹은 그 결과에 도달하기까지 얼마나 걸렸는지에 대해서는 아무것도 말해주지 않습니다. 후자야말로 하나를 다른 하나보다 우선적으로 라우팅 (routing)하도록 정당화할 수 있는 실제 축 (axes)들입니다.
두 검증이 공유하는 형태
두 가지 실패 사례를 나란히 놓으면 일치합니다. 인용 감사 (citation audit)에서의 "통과" 정의는 "숫자를 그대로 복사했는가"였습니다. 동등성 테스트 (equivalence test)에서의 "통과" 정의는 "격차가 내가 미리 정해둔 구역 안에 있는가"였습니다. 두 검증 모두 제가 실제로 답을 얻고 싶었던 질문, 즉 "이것을 이해했는가, 그리고 이 두 모델이 실제로 상호 교체 가능한가"라는 질문은 던지지 않았습니다. 어느 쪽 검증에서든 통과 점수를 받았다는 것은 진실이지만 좁은 범위의 무언가를 알려주었을 뿐이며, 저는 검증이 결코 내리지 않은 더 넓은 주장을 스스로 채워 넣었습니다.
이 상황이 저를 어디로 이끌었는지에 대한 솔직한 버전은 다음과 같습니다: 제가 재출시한 메인 모델과 Claude Opus 4.8을 구분하기 위해 관찰된 행동 신호는 약합니다. 하나의 지표, 하나의 축, 그리고 실재하지만 작고 제한적인 격차일 뿐입니다. 살아남는 전체 주장은 이것뿐입니다. "그들은 상호 교체 가능하다"는 것은 과잉 해석입니다. "가격만 보고 라우팅하라"는 것도 과잉 해석입니다. 두 가지 모두 제가 적대적 통과 (adversarial pass)를 거치기 전에 도달하려 했던 결론들이었으며, 제가 구축한 그 어떤 검증도 설계되지 않았던 단 한 가지 행동을 리뷰어들이 수행함으로써 두 결론 모두 무너졌습니다.
꼭 알아둘 만한 세부 사항이 하나 더 있습니다. Act Two에서 운영 추론(operational reasoning)을 공격했던 리뷰어는 DeepSeek의 모델이었습니다. 이 모델은 Act One에서 Sonnet 5의 0으로 처리된 행을 잘못 읽었던 바로 그 계열입니다. 같은 계열이지만 결과가 다르고, 두 가지 다른 작업에 사용되었습니다. 여기서 얻을 교훈은 '이 공급업체를 덜 신뢰하라'는 것이 아닙니다. 사각지대는 특정 모델에게 영구적으로 속하는 것이 아니라 검증(check) 자체에 속한다는 것입니다. 인용 감사(citation audit)는 어떤 모델이 수행하든 해석에는 항상 무지할 수밖에 없습니다. 적대적 반박 통과(adversarial refute pass)는 어떤 모델이 실행하든, 인용 감사가 잡아낼 수 없는 것을 포착해낼 수 있습니다.
제가 변경하는 사항들
의도적으로 좁게 초점을 맞춘 두 가지 변경 사항입니다:
- LLM에 위임하는 모든 분석은 이제 단순한 인용 통과(citation pass)가 아니라 해석 통과(interpretation pass)를 거칩니다. 다른 계열의 모델이 동일한 주장을 읽고 그것들을 반박하기 위해 사용됩니다. 즉, 숫자가 올바르게 인용되었는지와 별개로, 그 숫자로부터 도출된 결론이 실제로 지지하는 유일한 결론인지 여부입니다. 이것들은 서로 다른 질문이며, 단 하나의 감사로는 둘 다 답할 수 없습니다.
- 모든 동등성 주장(equivalence claim)은 판정(verdict)뿐만 아니라 방향성(direction)도 보고해야 합니다. 마진은 데이터를 보기 전에 실제 의사결정 임계값에 연결되어야 하며, 단순한 통계적 관습에 기반해서는 안 됩니다. 그리고 테스트 결과가 어떤 방향으로 나오든, 신뢰 구간이 0을 제외하는지 여부를 보고합니다. 넓은 마진과 방향성을 가진 간격으로 통과한 경우와, 좁은 마진과 0을 가로지르는(straddles) 간격을 가진 간격으로 통과한 경우는 다른 발견입니다. 하지만 단순히 'PASS'라는 단어만으로는 어떤 경우인지 알 수 없습니다.
더 많은 참고 자료는 hexisteme.github.io/notes에서 확인하실 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기