📝 한 줄 요약 (바쁘면 이것만)
검증 장치를 하나 만들었는데, 그 장치 자신의 게이트가 "쓰지 마라"고 판정했습니다. 그 뒤로 4단계 실험이 연속으로 실패했고, 마지막엔 그 게이트가 제 오진까지 잡아냈습니다. 하루 37커밋, LLM 호출 2,145콜을 태운 기록입니다.(레포: https://github.com/kims6305-bjk/reflection-probe-gate (MIT, README 한/영/중))
🎯 이런 분께 추천해요
AI 답변에 "자기검증(self-correction)" 레이어를 붙일지 고민 중인 분
"검증을 더 넣으면 무조건 더 안전해진다"는 직관을 의심해본 적 있는 분
p값·파레토 같은 통계 용어는 들어봤어도 실무에 어떻게 쓰는지 감이 안 오는 분
RAG 말고 온톨로지/지식그래프를 왜 쓰는지 실물 사례로 보고 싶은 분
📚 시작 전에 — 용어부터 정리하고 갑니다
통계·실험설계 용어가 몇 개 나옵니다. 먼저 다 풀고 시작하겠습니다.
파레토(Pareto) — 이탈리아 경제학자 빌프레도 파레토에서 온 말입니다. 핵심은 "누군가를 손해 보게 하지 않고는 아무도 더 좋아질 수 없는 상태"예요.
피자 8조각을 두 명이 나눈다고 해봅시다. 4:4로 나눴는데 제가 5조각을 먹으려면 상대는 3조각으로 줄어야 합니다. 한쪽을 올리려면 반드시 다른 쪽을 깎아야 하는 상태, 이게 파레토입니다.
파레토 프론티어(Pareto frontier) — "더 이상 공짜 이득이 없는 점들"을 전부 이어놓은 경계선입니다.
프론티어 안쪽에 있으면 = 아직 낭비가 있다. 둘 다 개선할 여지가 있다.
프론티어 위에 있으면 = 한쪽을 얻으려면 다른 쪽을 내줘야 한다.
프론티어 바깥은 = 지금 방법으로는 도달 못 한다.
파레토 최적(Pareto optimal) — 프론티어 위에 올라간 상태입니다. 주의할 게 있는데, 파레토 최적은 "가장 좋은 하나"가 아니에요. 프론티어 위의 모든 점이 다 파레토 최적입니다. 리콜 100%/정밀도 60%인 점과 리콜 80%/정밀도 95%인 점이 둘 다 파레토 최적일 수 있습니다. 어느 쪽을 고를지는 통계가 아니라 도메인이 정합니다.
파레토 지배(dominance) — 후보 B가 기준 A를 지배한다는 건, B가 모든 지표에서 A 이상이고 최소 하나는 초과한다는 뜻입니다. 지배하면 무조건 채택해도 됩니다. 지배하지 못하면 그건 개선이 아니라 교환입니다.
이 글에서 계속 나올 두 표현입니다.
파레토 바깥이동: 프론티어 자체를 밀어냈다 = 진짜 개선
파레토 열등이동: 아무것도 안 좋아지고 뭔가만 나빠졌다 = 순손실
제가 생각하는 "파레토 엔지니어링" — 여기가 이 글의 핵심 관점입니다.
하네스(harness)는 AI를 감싸서 검사·게이트·재시도를 붙이는 장치입니다. 메타하네스는 그 하네스 자체를 자동으로 진화시키는 루프고요.
지금 공개된 메타하네스 구현들은 목적함수가 단일 스칼라입니다. "정답률" 하나만 올리면 이긴 걸로 칩니다. 그런데 그러면 토큰·지연·비용을 무한정 태워서 정답률을 올리는 변이가 항상 이깁니다. 나머지 축의 악화는 아예 측정되지 않아요.
하네스를 조이면 좋아진다는 직관은 프론티어 안쪽에서만 참입니다. 프론티어 위에서는 조이는 만큼 다른 축이 깎입니다. 그래서 목적은 스칼라가 아니라 벡터(성능, 비용)여야 하고, 채택 조건은 "점수가 올랐다"가 아니라 "파레토 지배했다"여야 합니다.
그리고 하나 더 — 매 반복마다 변이를 강제하면 안 됩니다. baseline이 이미 프론티어 모서리에 있으면 상방이 0이고 하방만 열려 있어서, 변이를 강제할수록 기대값이 음수가 됩니다. "더 개선할 게 없다"도 정당한 결론이어야 합니다.
리플렉션 프로브(reflection probe) — Anthropic 인터프리터빌리티 팀의 2026년 논문(Verbalizable Representations Form a Global Workspace in Language Models)에 이런 발견이 있습니다. "모델에게 물어보면 말할 내용"과 "모델이 조용히 추론하는 내용"이 인과적으로 이어져 있다는 겁니다. 그리고 모델이 속으로는 이의를 알아채고도 출력에 반영하지 않는 "BUT-갭"이 88%였습니다.
논문의 본체 기법은 모델 내부(residual stream)에 접근해야 해서 API 사용자는 못 씁니다. 그래서 저는 그 인과 발견만 프롬프트 레벨로 번역했습니다 — 답변을 다 만든 뒤에 "이 답에서 네가 근거를 못 대는 부분을 말해봐"라고 되묻는 노드를 파이프라인에 꽂는 겁니다.
"프로브(probe)"는 원래 신경망 내부를 찔러보는 진단 도구를 뜻하는데, 저는 그걸 "모델 자신에게 되묻는 질문"으로 옮긴 겁니다. 즉 이 단어는 탐침(진단)이라는 뜻이지 "교정기"가 아닙니다. 이 구분이 나중에 중요해집니다 — 진단 도구를 성능 개선 도구로 착각하면 파레토 열등이동이 나옵니다.
A/B 게이트 — A/B는 같은 조건에서 딱 하나만 다르게 두 판을 돌려 비교하는 겁니다. 여기서는 arm A = 프로브 없음, arm B = 프로브 붙임.
게이트는 그 비교 결과를 보고 채택할지 폐기할지를 기계적으로 판정하는 관문입니다. 중요한 건 판정 기준을 결과 보기 전에 미리 못 박는다는 것입니다. 결과를 본 뒤에 기준을 정하면 사람은 무의식적으로 자기 결과에 유리한 기준을 고르니까요.
이 실험의 게이트는 3층이었습니다.
주지표 — 이게 좋아져야 채택할 이유가 생긴다 (인용오류율)
가드레일 — 이게 나빠지면 주지표가 좋아져도 폐기 (답변정확도, 과교정율)
통계 검정 — 차이가 우연인지 아닌지 (McNemar 검정)
p값 — "아무 효과도 없는데 순전히 우연으로 이 정도 차이가 나올 확률"입니다.
동전을 10번 던져 앞면이 7번 나왔다고 해봅시다. 조작된 동전일까요? 정상 동전으로도 7번쯤은 흔합니다 → p값이 크다 → "조작됐다"고 말 못 합니다. 그런데 100번 던져 70번이면 정상 동전으로 그럴 확률이 매우 낮습니다 → p값이 작다 → "우연으로 보긴 어렵다"가 됩니다.
관례상 p < 0.05면 "통계적으로 유 의하다"고 합니다.
이 글에 나오는 McNemar 검정은 "같은 대상을 두 조건에서 각각 측정했을 때" 쓰는 검정입니다. 이 실험이 정확히 그 구조예요 — 같은 주장을 프로브 있이/없이 각각 채점했으니까요.
🔴 여기서 제가 실수를 하나 했고, 그 기록도 남겼습니다. 사전 선언 문서에 "불일치쌍 5건이면 p=0.031"이라고 썼는데, 양측 검정의 2배를 빠뜨린 계산 오류였습니다. 실제로 5건의 양측 p값은 0.0625로 유의하지 않고, 임계는 6건입니다. 판정 함수를 독립 재계산으로 검증하다 발견했고, 결과를 보기 전이라 무결성엔 영향이 없었습니다. 교훈: 판정 공식은 쓰기 전에 다른 경로로 한 번 더 계산해봐야 합니다.
baseline — 개선을 재는 기준선입니다. "우리 방법이 좋다"는 말은 항상 "무엇보다?"를 요구하는데, 그 무엇이 baseline입니다.
이 글에서 baseline이 결정적인 이유가 있습니다. baseline이 이미 완벽하면 개선할 축이 없습니다. 그러면 어떤 검증 레이어를 붙여도 상방은 0이고 하방(부작용)만 남습니다. 그래서 이 실험이 남긴 첫 번째 실무 규칙이 이거예요.
레이어를 붙이기 전에 baseline 오류율부터 재라. 0%면 붙이지 마라.
라벨 — 각 사례에 사람이 붙인 정답표입니다. 이게 있어야 "기계 판정이 맞았는지"를 잴 수 있어요. 이 실험의 라벨은 3종입니다.
라벨
의미
S (Supported)
주장이 제공된 근거에 명시돼 있거나 직접 도출된다
C (Contradicted)
근거가 주장과 반대되는 내용을 진술한다
I (Insufficient)
근거만으로는 확인 불가. 회계적으로 맞는 말이어도 근거 범위 밖이면 I
🔴 라벨링의 핵심 규칙은 이겁니다. "이 주장이 참인가"를 묻지 않습니다. "제공된 근거가 이 주장을 지지하는가"만 묻습니다. 도메인 지식으로 참/거짓을 판정하기 시작하면 라벨이 오염됩니다.
그리고 라벨은 블라인드로 찍습니다 — 기계가 뭐라고 판정했는지 안 보이게 열을 숨깁니다. 기계 판정을 보고 라벨하면 그건 정답표가 아니라 기계 판정의 복사본이 됩니다.
🎬 왜 시작했나
출발점은 위에서 말한 Anthropic 논문이었습니다. "물어보면 말할 내용 = 조용히 추론하는 내용"이라는 인과 발견을 프롬프트 레벨로 옮겨 리플렉션 프로브를 만들었죠.