← ~/blog
2026. 07. 03. Creative Engine

직관은 자주 틀린다 — 그래서 우리는 증명한다

직관에 반하는 주장을 어떻게 증거로 바꾸는가. 합격선을 측정 전에 못 박고, 모킹 없이 실제 모델로, 여러 시드의 신뢰구간으로 재현 가능하게 — 그리고 우리 자신을 적대적으로 검토해 한계를 정직하게 닫는다. 데모와 운영을 가르는 증명의 규율.

직관은 자주 틀린다 — 그래서 우리는 증명한다

지난 글에서 우리는 AAOS와 CLMS에 이름을 붙이며, 기억의 currency를 사전 등록된 실험으로 측정해 본 관점을 공유했다. 결정의 궤적을 숨기면 ‘why’가 무너지고, 변경을 맥락과 함께 보여주면 되살아난다는 것. 그리고 직관적인 빠른 처방 몇 가지가 오히려 역효과를 낸다는 것. 그 글 끝에, 방법론을 더 깊이 들여다보는 후속 글을 약속했다.

이 글이 그 후속이다. 다만 주인공은 무엇을 발견했는가가 아니다. 그 수치를 어떻게 믿을 수 있게 만들었는가 — 증명의 규율이다.

직관은 자주 틀린다, 그래서 우리는 측정한다

코딩 에이전트가 아이디어와 구현 사이의 거리를 빠르게 좁히는 시대다. 그래서 차별점은 점점 무엇을 발견했나가 아니라 그걸 어떻게 믿을 수 있게 만들었나로 옮겨간다. 그럴싸한 데모는 누구나 만든다. 데모와 운영을 가르는 건 자기 결론을 스스로 공격해 falsify 가능하게 못 박는 규율이다.

앞 글의 발견들은 하나같이 직관과 어긋났다. “낡은 건 숨기면 깔끔하지 않나”, “더 똑똑한 모델이면 알아서 풀지 않나”, “쓰지 말라고 명시하면 안 쓰지 않나” — 셋 다 측정 앞에서 무너졌다. 직관이 자주 틀리기 때문에, 우리는 결론을 narrate하지 않고 측정한다. 아래는 그 수치를 벌어들인 방법이다.

측정 전에 합격선을 못 박는다 — 사전 등록

가장 먼저 하는 일은 실험을 돌리는 게 아니라, 무엇을 합격으로 볼지 결과를 보기 전에 글로 고정하는 것이다. 가설마다 숫자로 된 pass/fail bar를 미리 커밋한다. “이 정책이 저 정책보다 ‘why’ 정확도가 유의하게 높으면 합격”처럼, 판정 기준을 데이터가 들어오기 전에 못 박는다.

이게 왜 중요한가. 결과를 본 뒤에 기준을 정하면, 사람은 거의 무의식적으로 “마침 잘 나온 숫자”에 맞춰 기준을 옮긴다. 사후에 그린 과녁은 늘 명중한다. 측정 전 약속은 그 유혹을 차단하는 1차 방어선이다 — 결론이 “내러티브”가 아니라 “측정”이 되게 하는.

그리고 약속이 빗나갔을 때, 우리는 그걸 retrofit하지 않고 disclose한다. 약한 모델 티어에서 신뢰구간이 겹쳐 분리가 안 나오면, 사후에 기준을 느슨하게 고치는 대신 “이 구간에서는 directional이지만 CI-separated는 아니다”라고 정직하게 강등해 적는다. 정직한 다운그레이드가 사후 보정보다 언제나 낫다.

모킹 없이, 여러 시드로, 재현 가능하게

사전 등록이 무엇을 잴지를 고정한다면, 다음 세 가지는 어떻게 재는지를 고정한다.

모킹 없이. 보고하는 모든 수치는 실제 모델 — 로컬 모델과 frontier 모델 — 과 실제 백엔드 위에서 나온다. 공급자나 키가 없으면 조용히 가짜 fixture로 때우는 게 아니라 fail-loud로 멈춘다. 모킹은 배관이 제대로 연결됐는지 확인하는 self-test에만 쓰고, 보고되는 셀에는 단 하나도 들어가지 않는다. “테스트 환경에서는 잘 됐다”가 운영을 보장하지 못하는 이유를, 우리는 측정 단계에서부터 거부한다.

여러 시드로. 한 번 돌려 나온 숫자는 우연일 수 있다. 그래서 독립된 시드를 여럿 두고 평균과 95% 신뢰구간을 함께 본다. 핵심은 신뢰구간이 겹칠 때의 태도다. 두 정책의 CI가 겹치면 “이 표본 크기에선 분리됐다고 말할 수 없다(not-separated)“라고 보고한다 — 보기 좋은 쪽을 골라 조용히 드롭하지 않는다. 분리되지 않은 결과를 분리된 것처럼 쓰는 것이야말로 가장 흔한 자기기만이다.

재현 가능하게. 온도를 0으로 두어 같은 입력이 같은 출력을 내게 하고, 시드를 고정하고, 모든 raw 입출력을 보존한다. 그래서 어떤 verdict든 요약을 믿는 대신 보존된 raw에서 다시 계산할 수 있다. 메트릭은 raw 입출력의 결정론적 함수로 정의돼 있어, 같은 raw를 받은 사람은 누구든 같은 숫자를 다시 센다. 요약 테이블을 신뢰의 종착점으로 두지 않는다 — 신뢰의 종착점은 누구나 다시 셀 수 있는 raw다.

우리 자신을 공격한다 — 적대적 교차검토와 정직한 천장

가장 어려운 규율은 자기 결론을 스스로 공격하는 것이다.

적대적 교차검토. 한쪽이 결과를 내면, 독립된 패스가 그 측정의 약한 고리를 일부러 찾는다. 한번은 어떤 메트릭이 표현 차이(포매팅·동의어) 때문에 실제로는 멀쩡한 정보를 ‘coverage 손실’로 잘못 잡아내는 걸 발견했다. 이때 선택지는 둘이다 — 결과 위에 패치를 덧대거나, 멈추고 메트릭 자체를 고치거나. 우리는 멈추고 고친 뒤(stop-and-improve), 개선된 메트릭으로 사전 등록한 bar에서 처음부터 다시 돌렸다. 메트릭을 개선하는 비용은 싸고, 실험을 재실행하는 비용은 비싸다. 그 비대칭을 알면서도 재실행을 택하는 것이 규율이다.

공개한 한계는 재실행으로 닫는다, 재라벨로가 아니라. 사전 등록을 하다 보면 도중에 약속을 벗어나는 지점이 생긴다 — 더 많은 사이클이 필요하거나, 약한 티어의 표본을 늘려야 하거나. 그 deviation을 우리는 먼저 정직하게 공개한 뒤, 골드스탠더드로 다시 돌려 실제로 닫는다. 공개된 한계는 라벨을 바꿔 닫히지 않는다. 사전 등록한 bar에서 다시 돌려야 진짜로 닫힌다.

confound 제거. frontier 모델을 평가에 넣을 때, 우리가 씌운 시스템 프롬프트가 결과를 흐릴 수 있다. 그래서 frontier arm은 bare API로 — 어떤 시스템 프롬프트도 얹지 않고 — 돌려, 모델 레벨의 깨끗한 비교를 만든다. 그리고 하나의 발견을 ‘구조적’이라 부르려면 적어도 두 모델 티어에서 살아남아야 한다고 정해 두었다. 한 티어에서만 보이는 효과는 모델의 우연일 수 있으니까.

정직한 천장. 이 모든 걸 통과한 결론에 대해서도 우리는 “증명됐다”의 뜻을 좁게 정의한다 — 재현 가능하고(reproducible), 통계적으로 분리됐고(statistically separated), 두 모델 티어 이상에서 견고한(robust) 결론. 그리고 명시적으로 보편 법칙은 아니다. 한정된 모델군, 한정된 과제군, 정해진 시드와 온도에서의 결과다. 천장이 어디인지를 우리는 묻혀 두지 않고 적는다. 그래야 다음 사람이 어디서부터 의심해야 할지 알 수 있다.

이런 규율은 진공에서 나온 게 아니다. 긴 운영의 기억을 어떻게 다룰지에 대한 논의는 업계에서도 비슷한 방향으로 수렴해 왔다 — 낡은 정보를 무작정 지우기보다 수명과 유효성의 관점에서 다루자는. 그 공개된 합의 위에서, 우리는 우리 운영에 맞는 질문을 측정으로 검증했을 뿐이다.

앞 글에서 가장 값진 발견이 음성 결과였다는 점은 이 규율의 산물이다. 우리가 처음에 옳다고 가정했던 어떤 처방이 실은 역효과를 낸다는 것 — 값비싼 실험이 그 가정을 깨뜨렸고, 그 놀라운 음성 효과가 이후 우리 설계의 방향을 규정했다. 직관이 비싸게 틀리는 걸 직접 목격하는 것, 그게 측정에 투자하는 진짜 이유다.

증명의 규율은 복제되지 않는다

데모와 운영을 가르는 건 “AI 기능”의 유무가 아니다. 자기 결론을 주장이 아니라 측정으로, 그것도 스스로를 공격해가며 falsify 가능하게 못 박는 규율이다. 처방은 복제할 수 있어도, 이 규율은 복제되지 않는다 — 그건 매번 자기 결론을 다시 의심하는 습관이기 때문이다.

우리는 AI 기능을 얹지 않는다. 운영을 떠받치는 엔진을 짓고, 그 설계를 주장이 아니라 측정으로 증명한다.

#engineering #evaluation #research-discipline #reproducibility #aaos #clms
← 목록으로