근거가 없으면 기권하라고 만든 시스템인데, 그 논문의 수치 120개 중 27개는 근거를 못 찾았습니다

소개

제가 쓰고 있는 논문은 정직성을 성능으로 삼는 시스템을 다룹니다. 유전자 변이를 해석할 때 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.4430.6710.714

본문에서 계산한 퍼센트

5개

21.425.058.975.578.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번이었습니다. 답을 코드로 쓸 수 있는데 안 쓰고 있었습니다.

배운 점

  1. 원칙을 만든 곳과 지킨 곳이 달랐습니다. 근거 없이 답하지 말라는 규칙을 시스템에 넣었고, 주장에도 적용했습니다. 그런데 숫자에는 안 넣었습니다. 규칙은 그것이 필요하다고 느낀 자리에만 생깁니다. 지어낸 인용이 환자 안전 문제가 되는 것은 절실했고, 논문 수치의 출처는 그만큼 절실하지 않았습니다.

  2. 숫자는 근거가 있어 보인다는 이유로 통과합니다. 소수점 세 자리는 정밀해 보이고, 정밀해 보이면 계산된 것처럼 읽힙니다. 리뷰어가 5점을 준 재현성 항목에서도 표본 확인으로 끝났습니다. 의심받지 않는 형식이 검수를 통과시킵니다.

  3. 사람 리뷰와 기계 검사가 같은 자리를 짚었습니다. 리뷰어는 읽고 "신뢰구간이 없다"고 했고, 검사기는 세고 "근거 추적이 안 된다"고 했습니다. 방법이 다른데 결론이 겹칩니다. 겹치는 자리는 진짜 문제일 가능성이 높습니다.

  4. 22%는 오류율이 아니라 추적 실패율입니다. 27개가 틀렸다는 뜻이 아닙니다. 맞는지 확인할 경로가 없다는 뜻입니다. 이 둘을 섞으면 "내 논문에 오류가 22%"라는 틀린 결론이 나옵니다. 검사기가 내놓는 판정이 무엇을 뜻하는지는 검사기를 만든 사람이 정의해야 합니다.

  5. 기권은 성능을 깎는 대신 신뢰를 남깁니다. 시스템이 근거 없는 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점을 주면서 "대표 수치를 표본으로 확인했다"고 적은 문장. 이 글의 출발점이다

3
3개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.