두 AI 리뷰가 일치해도 두 리뷰가 아니다: 나는 주장을 받아들이기 전에 검증하는 법을 배웠다
Source: Dev.to
한밤중에 두 번의 감시, 동일한 점수
5월 17일 저녁, 나는 Counterpart Toolkit 버전 0.4.1을 마무리하고 외부 리뷰 두 개에 제출하기로 했다. 선언문과 열네 가지 규칙을 ChatGPT‑4o 세션에 붙여넣고, 정확히 같은 내용을 Claude.ai 웹 세션에도 붙여넣었다. 기다렸다가 몇 분 뒤 두 판정이 도착했다. 한쪽은 8/10, 다른 쪽도 8/10. 이론적 장치에 대한 비판이 거의 동일했는데—운용적 근거 없이 부르디외를 끌어들인 점—단순화 제안도 똑같고, M1‑M5 계측기의 신선함에 대한 시각도 동일했다. 처음 30초 동안은 직감이 작동했다. 두 독립적인 리뷰어가 같은 점수와 같은 비판을 줬으니, 교리는 제대로 조정된 것이고 나는 바로 공개해도 된다고 생각했다.
그때 나는 멈췄다. 그 수렴이 마치 같은 공급업체에서 듀플렉스로 산 바로미터처럼 느껴졌기 때문이다.
곧 나는 그 수렴이 실제로 무엇을 측정하고 있는지 깨달았다. 서로 크게 겹치는 코퍼스를 학습한 두 언어 모델—기술 기사, 공개 GitHub 레포, Stack Overflow 토론, 10년간의 블로그—은 오류가 상관관계를 가진다. 그들이 공유하는 것은 외부 현실이 아니라 학습 교차점이다. 두 모델 모두 이론적 장치가 과도하다고 판단한다면, 그것이 진실이라는 것이 아니라 그 형식의 텍스트에서 흔히 나타나는 결함이라는 통계적 패턴을 인식하고 있다는 뜻이다.
물론, 수렴하는 두 인간 리뷰어는 각각 별개의 측정이다. 하지만 그 비유는 오해의 소지가 있다. 인간 리뷰어는 서로 다른 전기, 다른 독서 경험, 때로는 상반된 학파를 가지고 있다. 반면 LLM은 그런 텍스처를 지니지 않은 동일한 기반 위에 있다. 고전적 인식론에서 교차 검증은 독립적인 출처를 전제로 한다. 같은 코퍼스로 훈련된 두 통계 모델은 독립성을 자동으로 갖지 않는다—증명해야 하며, 실제로 거의 증명되지 않는다.
이 직관 덕분에 나는 몇 일간의 무의미한 재작성 작업을 피할 수 있었을지도 모른다. 하지만 여전히 추측에 불과했다. 실질적인 검증이 필요했다.
첫 번째 검증, 같은 저녁에
동시에 진행하던 부수 프로젝트—게임 개발 레포— 덕분에 지난 주에 WebFetch를 공부하게 되었다. Claude 어시스턴트가 “25 MB PDF의 전체 OCR 텍스트를 반환한다”고 말했으며, 나는 그 주장에 기반해 수집 파이프라인을 만들었다. 현재 세션에서 명령을 실행해 확인해 보니, 콘솔에 다음과 같은 원시 출력이 나타났다: maxContentLength size of 10485760 exceeded. 이 주장은 기술적으로 불가능했다. 파이프라인은 존재하지 않는 메커니즘에 의존하고 있었던 것이다. 어시스턴트의 표현이 자신감 넘치고 구조화돼 있었으며, 충분히 사실처럼 보였기 때문에 나는 테스트하지 않았다.
두 번째 검증, 다음 날
같은 게임 개발 레포를 사용했다. 대화형 감시가 “18개의 도메인 레전시 액션을 포함하고 있다”고 설명한 기술 블로그를 가리켰다—바로 내가 찾던 자료였다. 스크래핑하기 전에 블로그 인덱스에 WebFetch를 실행했다. 원시 반환값은: “개발 연대기 기사 8개, 선언된 주제에 관한 기사 0개”. 이 주장은 일관된 환각이었다. “~의 블로그에 X가 있다”는 패턴은 모델이 구문적으로 타당하기 때문에 쉽게 만들어내는 통계적 조합일 뿐, 사실 존재를 검증하는 내부 메커니즘은 전혀 없다.
세 번째 검증, 그 아침에, 교리 자체에 대해
전날 Claude.ai를 통해 외부 Claude가 내 doctrine-counterpart 레포를 감시하고, 스크린샷과 함께 “6개 중 6개의 SKILL.md 파일에 깨진 YAML frontmatter가 있다”는 진단을 내렸다—높은 자신감으로 7.5/10으로 강등하는 근거로 사용되었다. 그 아침 나는 레포에 있는 12개의 SKILL.md 파일 모두에 yaml.safe_load를 실행했다. 원시 결과: 11/12은 정상, 1/12만 깨졌다. 시스템적인 결함은 존재하지 않았다. 실제로 깨진 파일 하나는 시각적 평가자가 찾아내지 못했는데, 이는 평가자가 “시스템적 결함”이라고 결론 내리면서 개별 사례를 지목하지 않았기 때문이다. 그가 본 것은 GitHub의 Markdown 렌더링이 frontmatter를 표로 처리해 보여주는 호스트 렌더링 특성일 뿐, 원시 소스 상태와는 무관했다.
세 가지 외부 주장을 테스트했고, 세 가지를 반증했다. 부분적인 겹침도, 미묘한 반박도 아니었다—세 주장 모두 실질적인 검증에 의해 무너졌다. 물질적 테스트가 없었다면 이 비율은 눈에 띄지 않았을 것이다.
Counterpart Toolkit v0.7
나는 5월 20일, 이 세 사건이 발생한 이틀 뒤에 R12를 수정했다. 공식 텍스트는 다음과 같다:
“외부 AI(다른 Claude, ChatGPT, 대화형 스파링) 가 (a) 직접 확인 가능한 구체적인 도구의 동작, (b) 외부 리소스의 내용, (c) 샘플링 가능한 시스템 구조에 대해 제시하는 모든 주장은, 건축적 의사결정의 입력으로 삼기 전에 반드시 물질적으로 테스트되어야 한다. 테스트 비용 ≈ 1개의 쉘 명령. 테스트 없이 믿는 비용 = 존재하지 않는 메커니즘에 전적으로 의존하는 파이프라인. 두 외부 AI 리뷰가 동일한 진단으로 수렴한다면 이는 R5 목적상 하나의 출처에 불과하며, 두 개가 아니다—교차‑서브스트레이트 독립 검증은 인간 하나 혹은 기계적으로 구분된 하나의 탐지(로그, 메트릭, 샘플 실행)를 필요로 한다.”
두 리뷰어가 하나보다 낫다고 주장할 사람은 없을 것이다—하지만 이 공식은 해부될 가치가 있다. 두 LLM이 수렴한다는 것은 검증이 아니다. 그것은 검증 가능한 외부성을 갖지 않은 통계적 교차점, 즉 고아된 수렴이다. 아래는 6개월 전 메타‑AI 기술 리드에게 들었을 법한 반론에 대한 세 가지 물질적 반론이다.
-
공유된 학습 통계
코퍼스가 핵심 부분에서 겹치는 두 모델은 동일한 구문 범위에서 오류가 상관관계를 가진다. 그들의 일치는 학습 교차점을 측정한다. 이 경우 수렴은 전형적인 진술—사전 학습이 잘 형성된 것으로 인식하는 문장—에 더 잘 나타나며, 진실된 진술에선 덜 나타난다. 두 개념은 다르다. -
도구와 리소스에 대한 상관 환각
특정 도구의 동작이나 외부 리소스의 사실적 내용에 대해 두 모델은 가장 통계적으로 그럴듯한 결과를 환각한다. 이는 종종 틀리며 거의 항상 자신감 있게 제시된다. 내 세 가지 검증이 이를 명확히 보여준다. -
비대칭적 비용
물질적 검증은 쉘 명령 하나, 15초, 때로는 그보다 적게 든다. 검증되지 않은 수렴에 기반한 건축적 결정은 재작성에 며칠, 파이프라인 전체를 처음부터 다시 구축하는 데 수 주일이 들 수 있다. 수정된 R12는 이 비대칭적 비용을 반영해, 주장을 입력으로 삼는 모든 커밋 전에 검증을 의무화한다.
불신이 아니라 검증을 기르는 것이 목표다. 그리고 검증은 자신에게서 시작한다—내 주장에 먼저 R12를 적용하고, 시각적 감시가 칭찬하거나 비난하기 전에 yaml.safe_load로 내 레포를 직접 확인한다. 물질적으로 이견이 없는 에이전트는 상대가 아니다—그저 말을 하는 타자일 뿐이다. 두 에이전트가 테스트 없이 동의한다면, 그것은 두 명의 리뷰어가 아니라 복제된 하나의 타자이다. 이 규칙은 한 줄 명령으로 구현된다.
도구 / 리소스 / 구조에 대한 외부 주장을 채택하기 전에:
$
레포: github.com/michelfaure/doctrine-counterpart. 수정된 R12는 CLAUDE.md에 명시돼 있으며, 세 가지 창시 사건은 v0.7-candidates.md에 기록돼 있다. 다음 건축적 결정 중 하나라도 검증되지 않은 믿음을 피한다면, 이 규칙은 이미 비용을 회수한 것이다.
Counterpart Toolkit v0.7. R12 수정 2026‑05‑20, N=3 다중‑서브스트레이트 사건