소개
제가 쓰고 있는 논문은 정직성을 성능으로 삼는 시스템을 다룹니다. 유전자 변이를 해석할 때 LLM이 그럴듯한 근거를 지어내지 않게 만드는 것이 목표입니다.
핵심 장치가 기권(abstention)입니다. 근거를 못 찾으면 답을 내지 않고 "판단 보류"로 물러납니다. 원고에 이 렇게 적혀 있습니다.
A usable decision-support draft must instead be auditable line by line and must abstain rather than fabricate.
한 줄씩 감사할 수 있어야 하고, 지어내느니 기권해야 한다는 뜻입니다. 실제로 근거가 없는 변이 10건 전부를 시스템이 기권으로 처리했습니다.
원고 자체도 같은 태도로 썼습니다.
원고의 자기 진술
뜻
not claimed as a novel classifier
규칙 엔진은 새로 만든 것이 아니라고 못 박음
remains uncontrolled and is quantified only by the no-retrieval floor
통제 못 한 부분을 통제 못 했다고 밝힘
not powered for an accuracy claim
표본이 작아 정확도를 주장할 수 없다고 미리 씀
we do not claim
남이 먼저 한 것을 내 것이라 하지 않음
이번 주 과제가 검수 하네스입니다. 그래서 이 원칙을 원고 자신에게 적용해 보기로 했습니다. 근거 없이 쓴 숫자가 있는지 세는 것입니다.
진행 방법
사용 도구: Claude Code, Python 3
Step 1. 리뷰어가 남긴 한 문장
원고에 리뷰 하네스를 두 번 돌려 둔 기록이 있습니다. 2회차 리뷰의 재현성 항목에 이런 문장이 있었습니다.
Offline-from-snapshots, 90 tests, scripts named per result; spot-checked headline numbers reconcile with committed JSONs.
대표 수치 몇 개를 표본으로 확인했더니 커밋된 결과 파일과 맞더라는 뜻입니다. 5점 만점에 5점을 준 근거입니다.
여기서 걸렸습니다. 표본만 확인했습니다. 근거 없이 답하지 말라는 원고가, 정작 자기 수치는 표본으로만 확인받았습니다.
Step 2. 전수로 바꾸기
원고의 모든 숫자를 커밋된 결과 파일과 대조하는 검사기를 만들었습니다.
PAT = re.compile(r"(?<![\w.])(0\.\d{2,4}|\d{1,3}\.\d{1,2}(?=\s?%))(?![\w.])")
PAT_N = re.compile(r"\bn\s?=\s?(\d{1,4})\b")
대조 대상은 저장소에 커밋된 결과 파일입니다.
자료
개수
data/benchmark/ JSON
16개
data/cohorts/ JSON
4개
원고 (참고문헌·코드블록 제외)
13,325단어
반올림 표기까지 허용했습니다. 원본이 0.8432여도 원고에 0.843으로 적혔으면 근거 있음으로 칩니다.
Step 3. 결과
원고 고유 수치 120개
근거 있음 93개 (78%)
근거 못 찾음 27개 (22%)
항목
값
원고의 고유 수치
120개
결과 파일에서 근거를 찾은 것
93개 (78%)
근거를 못 찾은 것
27개 (22%)
그 27개의 본문 등장 횟수
41회
Step 4. 27개가 무엇인가
오류라는 뜻이 아닙니다. 열어 보니 세 갈래였습니다.
갈래
개수
예
성능 지표(파생값)
21개
0.443, 0.671, 0.714
본문에서 계산한 퍼센트
5개
21.4, 25.0, 58.9, 75.5, 78.6
표본 수
1개
n=56
성능 지표 21개는 원자료에서 계산한 값입니다. 결과 파일에 그 형태로 저장되지 않았을 뿐, 계산 과정이 있으면 재현됩니다. 문제는 그 계산 과정이 어디 있는지 원고에 안 적혀 있다는 것입니다.
퍼센트 5개가 더 걸립니다. 21.4는 본문에 5회 나옵니다. 그런데 분모가 무엇인지 원고를 읽어서는 확인이 안 됩니다.
Step 5. 이 수치가 리뷰 지적과 겹칩니다
1회차 리뷰의 Major 지적 5건을 다시 봤습니다. 그중 둘이 정확히 이 자리였습니다.
리뷰 지적
제 검사기가 걸러 낸 것
수치마다 신뢰구간을 붙이라
성능 지표 21개에 구간 없음
잠정 판정의 방향을 밝히라
21.4가 5회 나오는데 방향 표기가 문제였던 그 수치
사람 리뷰어가 읽고 지적한 것을, 검사기가 근거 추적 실패로 잡아냈습니다. 같은 자리를 다른 방법으로 찾았습니다.
Step 6. 기권 장치가 어디에 있고 어디에 없었나
정리하니 이렇게 갈렸습니다.
대상
근거가 없을 때
시스템의 변이 판정
기권한다. 근거 없는 10건 전부 보류 처리
원고의 자기 주장
못 박는다. "새롭다고 주장하지 않음", "통제 못 함" 명시
원고의 수치
아무 표시 없이 그냥 적힌다
기권 장치를 두 군데는 넣고 한 군데는 안 넣었습니다. 판정에도 넣고 주장에도 넣었는데, 숫자에는 없습니다.
숫자는 근거가 있어 보입니다. 소수점 세 자리까지 적혀 있으면 어딘가에서 계산된 것처럼 읽힙니다. 그래서 의심을 안 받고 통과합니다.
결과와 배운 점
측정 결과
항목
값
원고
13,325단어, 그림 15종, 표 4종
리뷰 하네스 실행
2회
지적 항목
회차당 23건
Major
5건 → 0건
Minor
8건 → 7건
판정
MAJOR REVISION → Minor revision
평균 점수
3.92 → 4.00
유일하게 내려간 기준
Clarity (3.5 → 3.0)
원고 마지막 수정
2026-06-16
정지 기간
50일
남은 Minor 중 새 데이터가 필요한 것
0건
이번 주 산출물
scripts/verify_manuscript_numbers.py와 docs/manuscript/number_reconciliation.json을 만들었습니다. 다시 돌리면 같은 결과가 나오고, 원고를 고칠 때마다 27이 줄어드는지 확인할 수 있습니다.
그리고 검수 라우팅 규칙 다섯 줄을 정했습니다.
1. 답을 코드로 쓸 수 있는가? → 자동 게이트
2. 기대값을 만들 수 있는가? → 정답 케이스
3. 입력만으로 판단할 수 있는가? → 아니면 REVIEW_REQUIRED
4. 같은 이유로 세 번 실패했는가? → 재시도 중단
5. 검사기가 돌았다는 것 말고
최종 산출물이 있는가? → 없으면 완료 아님
수치 대조는 1번이었습니다. 답을 코드로 쓸 수 있는데 안 쓰고 있었습니다.
배운 점
원칙을 만든 곳과 지킨 곳이 달랐습니다. 근거 없이 답하지 말라는 규칙을 시스템에 넣었고, 주장에도 적용했습니다. 그런데 숫자에는 안 넣었습니다. 규칙은 그것이 필요하다고 느낀 자리에만 생깁니다. 지어낸 인용이 환자 안전 문제가 되는 것은 절실했고, 논문 수치의 출처는 그만큼 절실하지 않았습니다.
숫자는 근거가 있어 보인다는 이유로 통과합니다. 소수점 세 자리는 정밀해 보이고, 정밀해 보이면 계산된 것처럼 읽힙니다. 리뷰어가 5점을 준 재현성 항목에서도 표본 확인으로 끝났습니다. 의심받지 않는 형식이 검수를 통과시킵니다.
사람 리뷰와 기계 검사가 같은 자리를 짚었습니다. 리뷰어는 읽고 "신뢰구간이 없다"고 했고, 검사기는 세고 "근거 추적이 안 된다"고 했습니다. 방법이 다른데 결론이 겹칩니다. 겹치는 자리는 진짜 문제일 가능성이 높습니다.
22%는 오류율이 아니라 추적 실패율입니다. 27개가 틀렸다는 뜻이 아닙니다. 맞는지 확인할 경로가 없다는 뜻입니다. 이 둘을 섞으면 "내 논문에 오류가 22%"라는 틀린 결론이 나옵니다. 검사기가 내놓는 판정이 무엇을 뜻하는지는 검사기를 만든 사람이 정의해야 합니다.
기권은 성능을 깎는 대신 신뢰를 남깁니다. 시스템이 근거 없는 10건을 전부 보류하면 정확도 수치는 올라가지 않습니다. 대신 그 결과를 임상에서 쓸 수 있게 됩니다. 원고 수치도 같습니다. "이 값의 계산 근거는 아직 문서에 없음"을 표시하면 보기 좋진 않아도 읽는 사람이 어디를 믿을지 알게 됩니다.
시행착오
처음에는
0.05나1.00같은 값까지 세어 근거 없음이 크게 나왔습니다. 유의수준처럼 어디에나 나오는 값은 대조 대상에서 뺐습니다. 안 뺐으면 22%가 훨씬 커졌을 것입니다.반올림을 허용하지 않았을 때는 근거 있음이 더 낮았습니다. 원본
0.8432와 원고0.843을 다른 값으로 셌기 때문입니다. 표기 방식이 판정을 바꿉니다.정규식에
n=패턴을 가변 길이 뒤돌아보기로 넣었다가 실행이 안 됐습니다. 별도 패턴으로 분리했습니다. 검사기부터 안 돌면 검수가 시작되지 않습니다.
앞으로의 계획
성능 지표 21개의 계산 스크립트를 만들겠습니다. 지금은 값만 있고 과정이 없습니다. 스크립트가 생기면 22%가 줄고, 다음에 값이 바뀌어도 자동으로 다시 계산됩니다.
퍼센트 5개에 분모를 붙이겠습니다.
21.4%가 아니라21.4%(12/56)로 씁니다. 리뷰어가 지적한 "방향을 밝히라"도 같이 해결됩니다.원고에도 기권 표시를 넣겠습니다. 계산 근거가 아직 없는 수치는 그렇다고 적습니다. 시스템에 넣은 장치를 문서에 옮기는 일입니다.
3주차의 루브릭에 이 검사기를 항목으로 넣겠습니다. "수치 근거 추적률"은 통과와 불통과가 명확해 점수로 매길 수 있습니다.
도움 받은 글 (옵션)
23기 AI 결과물 검수 2주차 강의 (엔지니어H): 지식 베이스 워크스페이스 구축 과제와 "완성이 안 되더라도 실패 사례를 공유하라"는 안내, 3주차에 루브릭을 얹는 계획
발표 "하네스의 배신": 두 AI가 서로 지적하고 인정하는 것을 검증으로 착각한 사례와, 규칙으로 정해야 할 것을 안 정해 둬서 17단계까지 간 과정. 검사기가 움직이는 것과 결과가 검증되는 것은 다르다는 결론
로미오 님의 사례글 "[2편] 검수가 실제로 잡아낸 것들": 숫자는 원문에 있는데 출처가 틀린 오출처로 결론 3건이 뒤집힌 기록. 통과와 불통과 두 갈래로는 부족하다는 지적이 제 라우팅 규칙의 세 번째 칸이 되었다
제 원고의 2회차 리뷰 기록: 재현성에 5점을 주면서 "대표 수치를 표본으로 확인했다"고 적은 문장. 이 글의 출발점이다