## 문제는 "검증했습니다"라는 말이 공짜라는 것
1편에서 작업 폴더의 규격을 만들었습니다. 문서에는 이런 문장이 적혀 있었습니다.
> "검증을 통과한 결과물만 정식 문서로 올린다."
좋은 규칙입니다. 그런데 이걸 사람이 지키는 규칙으로 두면 바쁠 때 안 지킵니다.
AI에게 맡기면 더 안 지킵니다.
이유는 단순합니다. AI가 "검증했습니다"라고 말하는 데 드는 비용이 0이기 때문입니다.
정말 검증했는지, 안 하고 말만 한 건지 구분할 방법이 없습니다.
심지어 AI 본인도 구분 못 할 때가 있습니다.
그래서 이 단계의 원칙을 딱 하나로 잡았습니다.
> 합격/불합격 판정은 AI의 말이 아니라 프로그램이 낸다.
프로그램은 거짓말을 못 합니다. 통과시키거나, 막거나 둘 중 하나입니다.
---
## 만들면서 지킨 세 가지 원칙
프로그램을 짜기 전에 제약을 세 개 걸었습니다. 이게 나중에 크게 도움이 됐습니다.
하나. 추가 설치가 필요 없어야 합니다.
파이썬만 깔려 있으면 돌아가야 합니다. "이것도 설치하세요, 저것도 설치하세요"가 시작되는
순간, 스터디에서 절반이 첫날에 이탈합니다. 실제로 겪어본 일입니다.
둘. 같은 걸 넣으면 항상 같은 게 나와야 합니다.
분류든, 검색이든, 합격 판정이든 — AI를 한 번도 부르지 않습니다.
AI를 부르는 순간 오늘과 내일의 결과가 달라지고, 그러면 "이게 개선된 건지 그냥 다른 건지"를
알 수 없게 됩니다.
셋. 프로그램마다 자기 시험을 들고 다닙니다.
각 프로그램에 "자가진단" 기능을 넣었습니다. 릴리스 전에 이것만 다 돌려보면 됩니다.
별도 테스트 도구를 안 써도 되니까 관리가 단순해집니다.
---
## 첫 번째 — 관심 주제를 "다이얼" 하나로
파이프라인의 입구입니다. 여기가 좀 재밌습니다.
내 관심 주제를 설정 파일 하나로 정의합니다. 라디오 주파수 맞추듯이요.
```
포함할 단어 : hallucination, fact verification, LLM-as-a-judge ...
꼭 있어야 할 단어 : lm
빼야 할 단어 : token compression, KV-cache, multimodal
기준점 : 4점 이상이면 내 관심사
```
이 파일 하나가 두 가지 일을 동시에 합니다.
1. 지금 갖고 있는 논문 더미에서 관심 논문 골라내기
2. 앞으로 매일 올라오는 새 논문이 내 관심사인지 판정하기
관심사가 바뀌면 이 파일 하나만 고치면 됩니다. 그래서 "다이얼"이라고 부릅니다.
### 진짜 되나 싶어서 실험했습니다
솔직히 반신반의했습니다. AI 없이 단어 매칭만으로 논문 분류가 될까 싶었거든요.
논문 15편을 준비했습니다. 관심 주제와 관련된 7편, 전혀 무관한 8편.
결과:
> 관련 7편 → 7편 다 찾음. 무관 8편 → 하나도 잘못 집지 않음.
AI를 한 번도 안 불렀습니다. 컴퓨터 켜져 있으면 몇 초면 끝나고, 몇 번을 돌려도 결과가 같습니다.
"AI 없이 되는 일은 AI를 쓰지 않는다"가 이때부터 이 프로젝트의 방침이 됐습니다.
### 그런데 실험 데이터부터 오염돼 있었습니다
이 15편의 제목과 초록은 논문 사이트에서 그대로 복사한 것이었습니다.
"그대로 복사했으니 원문과 같겠지" — 이게 틀렸습니다.
검수하던 사람이 잡아냈습니다. 세 편의 초록에 **논문 사이트가 표시용으로 바꿔놓은 링크
텍스트 잔재**가 섞여 있었습니다. 웹페이지에서는 링크가 "this https URL"처럼 보이는데,
공식 데이터에는 진짜 주소가 들어 있습니다. 화면을 복사하면 가짜가 딸려옵니다.
공식 데이터로 전부 교체하고, 15편 전건을 다시 대조해서 15개 다 일치하는 걸 확인했습니다.
> 교훈: 시험 문제가 틀려 있으면 채점 결과 전체가 무의미합니다.
> 그리고 "복사해왔다"와 "원문과 같다"는 다른 얘기입니다.
---
## 두 번째 — 논문 가져오기와 "지난번 이후 새 논문만"
내 주제의 논문을 자동으로 가져오는 프로그램을 만들었습니다.
논문 아이디를 주거나, 검색어를 주면 제목과 초록을 원문 그대로 받아옵니다.
여기에 옵션을 하나 붙였습니다. "이 날짜 이후에 나온 것만."
이게 있으면 지속 서베이가 됩니다. 매주 한 번 돌리면 지난주 이후 새로 나온 논문만
들어옵니다. 이미 본 건 안 들어오고요.
작은 것 두 개에 신경 썼습니다.
- 날짜 정보가 없거나 이상한 논문은 조용히 넣지 않고, 빼면서 경고를 띄웁니다.
조용히 넣으면 나중에 "왜 이게 여기 있지?"가 됩니다.
- 검색어 + 날짜 조합일 때는 최신순으로 정렬해서 요청합니다.
안 그러면 "50편만 가져와" 했을 때 오래된 논문 50편으로 채워져서 새 논문을 못 봅니다.
### 에러 메시지도 기능입니다
처음 만든 버전을 실제 사용자 시나리오로 돌려봤더니, 논문 사이트가 잠깐 응답을 안 할 때
시뻘건 에러 문구가 화면 가득 쏟아졌습니다. 사용자는 자기가 뭘 잘못했는지 알 수 없습니다.
전부 사람 말로 바꿨습니다.
- 일시적으로 요청이 몰렸을 때 → 45초 기다렸다가 한 번 더 시도, 그래도 안 되면 안내
- 인터넷이 끊겼을 때, 주소를 못 찾을 때, 시간 초과 → 각각 다른 안내 문구
> "왜 안 되는지 모르겠다"가 신규 사용자를 가장 빨리 떠나보냅니다.
---
## 세 번째 — 지식 창고, 그리고 이 프로젝트의 핵심
여기가 이 편의 본론입니다.
### 메모 한 장을 두 칸으로 나눴습니다
정리한 지식을 메모 파일로 쌓는데, 각 메모를 두 부분으로 강제 분리했습니다.
```
## 지금 맞는 내용
(새로 알게 되면 통째로 갈아엎음)
## 히스토리
(계속 쌓기만 함. 기존 줄은 절대 수정·삭제 금지)
- 2026-07-20 최초 작성 · 출처 arXiv:2512.17776
```
왜 나눴냐면 — 이 둘을 섞으면 "지금 맞는 게 뭔지"와 "어떻게 여기까지 왔는지"가 뒤엉키기
때문입니다. 위키를 오래 써보신 분은 아실 텐 데, 문서 하나에 수정 이력이 본문처럼 섞이면
나중엔 아무도 못 읽습니다.
위 칸은 덮어쓰고, 아래 칸은 쌓기만 합니다. 규칙이 단순해서 지켜집니다.
### 검색은 두 방식을 섞었습니다
메모가 쌓이면 찾을 수 있어야 합니다. 검색 방식을 두 개 돌려서 결과를 합칩니다.
- 하나는 데이터베이스에 내장된 정식 검색 기능
- 하나는 글자 단위로 비슷한 걸 찾는 방식 (한글 검색에 강합니다)
둘 다 돌려서 순위를 합칩니다. 한쪽이 놓친 걸 다른 쪽이 잡습니다.
여기서 하나 지킨 게 있습니다. 검색 점수 계산 공식을, 예전에 다른 프로젝트에서 **이미
검증을 마친 코드에서 그대로 복사**해왔습니다. 그리고 "손대지 말 것"이라고 적어놨습니다.
> 검증된 걸 가져올 때는 손대지 않고 가져옵니다.
> "조금 더 좋게 만들어봤다"가 검증 이력을 무효로 만듭니다.
### 그리고 이 프로젝트의 심장 — 승격 게이트
정식 지식 창고에 메모를 올리는 걸 "승격"이라고 부릅니다.
여기에 검문소를 세웠습니다. 공항 보안검색대와 정확히 같은 역할입니다.
통과하려면 이걸 다 만족해야 합니다.
| 검사 항목 | 통과 못 하면 |
|---|---|
| 제목·날짜·태그 등 필수 정보가 다 있는가 | 거부 |
| 출처가 적혀 있는가 | 거부 |
| 두 칸(지금 맞는 내용 / 히스토리) 구조로 되어 있는가 | 거부 |
| 이미 있는 메모와 제목이 같은데 아이디가 다른가 | 거부 (중복) |
| 히스토리의 기존 줄을 고치거나 지웠는가 | 거부 |
| 정해진 작업 폴더를 거쳐서 온 파일인가 | 거부 |
그리고 기본 동작이 "미리보기만" 입니다. 뭐가 어떻게 바뀔지 보여주고 멈춥니다.
실제로 반영하려면 승인 옵션을 따로 붙여야 합니다.
이제 문서에 적힌 "검증 통과한 것만 올린다"가 말이 아니라 잠금장치가 됐습니다.
### 마지막 항목은 검수자가 찾아냈습니다
표의 마지막 줄 — "정해진 작업 폴더를 거쳐서 온 파일인가" — 이건 처음엔 없었습니다.
검수하던 쪽에서 이걸 실제로 뚫어봤습니다.
> 아무 데나 있는 파일을 승격 명령에 넣었더니, 그냥 정식 지식 창고에 들어갔습니다.
검문소가 가방 안은 검사하는데 어디서 온 사람인지는 안 물어본 겁니다.
작업 폴더를 거쳐야 검수 과정을 통과한 결과물인데, 그걸 건너뛴 파일이 그대로 꽂힐 수
있었습니다.
### 같은 라운드에서 나온 또 하나 — 조용히 사라지던 메모
메모 두 개가 우연히 같은 아이디를 갖고 있으면, 프로그램이 **아무 말 없이 하나를
없애고 있었습니다.** 에러도 안 나고, 경고도 없고, 결과는 정상처럼 보입니다.
이걸 발견 즉시 중단으로 바꿨습니다.
> 교훈: 조용한 실패가 제일 위험합니다.
> 데이터가 사라지는데 "정상 완료"가 뜨면 아무도 모릅니다.
> 확신할 수 없으면 일단 막는다 — 이게 이 프로젝트의 기본값이 됐습니다.
### 서로 반대되는 논문을 찾아주는 기능
메모끼리 연결을 걸 때 관계 종류를 붙일 수 있게 했습니다.
"이 논문을 지지함", "이 논문을 확장함", 그리고 "이 논문과 상충함."
그러면 감사 기능이 서로 반대되는 결론의 논문 쌍을 목록으로 뽑아줍니다.
서베이에서 이게 제일 중요한 정보인데, 보통은 묻힙니다.
논문 A가 "효과 있다"고 하고 논문 B가 "효과 없다"고 하면, 그게 그 분야의 진짜 쟁점이거든요.
그런데 각각 따로 읽으면 둘 다 그럴듯해서 넘어갑니다.
---
## 네 번째 — 내용이 진짜 논문에 있는지 대조하기
앞의 검문소가 형식을 봤다면, 이건 내용을 봅니다.
요약문에 적힌 숫자와 인용 문구가 실제 원문에 있는지 글자 단위로 대조합니다.
없으면 불합격.
여기서 중요한 결정을 하나 했습니다.
> 원문을 찾을 수 없으면, "검사 생략"이 아니라 "불합격"입니다.
"원문이 없어서 확인을 못 했습니다 → 일단 통과" 는 가장 큰 구멍입니다.
틀린 걸 심어놓고 원문만 안 주면 다 통과되니까요.
### 숫자 검사가 생각보다 어려웠습니다
처음엔 퍼센트랑 소수점만 검사하고 정수는 아예 뺐습니다. 안전하게 간 거죠.
검수자가 지적했습니다. "999개 데이터셋" 같은 지어낸 정수를 못 잡는다고요.
정수를 넣으려니 문제가 터졌습니다. 문서에 있는 숫자가 전부 걸립니다.
```
p.6 Table 1 §3 arXiv:2303.08896 2026-07-20 1. 2. 3. (목차 번호)
```
전부 정수입니다. 이걸 다 "논문에 없는 숫자"라고 잡으면 쓸 수가 없습니다.
앞뒤 문맥을 보는 방식 대신 가려내기 방식으로 풀었습니다.
쪽수 표기, 표 번호, 논문 아이디, 날짜, 목차 번호를 먼저 지워버리고 남은 숫자만 검사합니다.
4자리는 연도일 가능성이 높으니 제외하고, 작은 숫자(12 이하)는 "seven" 같은 영어 표기도
인정해줍니다.
이 정도 손질을 해야 실용적이 됩니다. 검사 하나 제대로 만드는 게 이렇게 손이 갑니다.
### 못 하는 것은 못 한다고 적었습니다
초록의 핵심 내용을 요약이 얼마나 덮는지 재는 기능도 넣었는데,
이건 경고만 띄우고 불합격은 안 시킵니다.
이유를 문서에 적어놨습니다. **한글로 완전히 의역한 요약은 이 방식에서 점수가 낮게
나옵니다.** 글자가 안 겹치니까요. 불합격으로 막으면 멀쩡한 결과물이 차단됩니다.
한계를 알고 쓰는 지표로 남겼습니다.
---
## 하이라이트 — 검사기를 검사하는 장치
여기까지 오면 당연한 질문이 나옵니다.
> 이 검사기들이 실제로 잘 걸러내는지는 누가 확인하나요?
답을 만들었습니다. 공항 보안검색대를 생각하시면 됩니다.
실제로 공항에서는 가짜 위험물을 몰래 통과시켜보는 테스트를 합니다. 검색요 원이
그걸 잡아내는지 보는 거죠.
똑같이 했습니다.
### 일부러 틀린 메모 5개를 만들어 넣었습니다
| 심어놓은 것 | 어느 검사가 잡아야 하나 |
|---|---|
| 원문에 없는 숫자 94.2 (실제로 없는 걸 확인함) | 내용 대조 |
| 원문에 없는 인용 문구 | 내용 대조 |
| 출처가 아예 없음 | 검문소 |
| 히스토리 기존 줄을 몰래 고침 | 검문소 |
| 필수 정보 누락 | 검문소 |
| 정상 메모 1개 (모든 숫자·인용이 실재) | 통과해야 정상 ★ |
마지막 줄이 핵심입니다. 그리고 처음엔 없었습니다.
거부율만 재면 어떻게 되냐면 — "전부 다 거부하는 검사기"가 100점을 받습니다.
그러면 정상 결과물도 다 막히는데, 점수만 보면 완벽해 보입니다.
통과해야 정상인 케이스를 하나 넣어야 "과잉 차단"이 보입니다.
검수자가 이걸 지적해서 추가했습니다.
### 검색 성능도 같이 채점합니다
질문 12개를 만들고, 각각 어느 메모가 1등으로 나와야 하는지 정답을 미리 적어뒀습니다.
그걸 한꺼번에 돌려서 적중률을 냅니다.
여기서 지킨 규칙이 하나 있습니다.
채점기가 검색을 따로 구현하지 않고, 진짜 검색 기능을 그대로 불러다 씁니다.
따로 만들면 채점기가 실제와 다른 걸 재게 됩니다. 흔히 하는 실수입니다.
### 채점 기준부터 검사합니다
"이 질문의 정답은 이 메모"라고 적어놨 는데, 그 메모에 정말 그 내용이 있는지부터 확인합니다.
없으면 채점 자체를 중단합니다. 기준이 틀린 채로 채점하면 결과가 무의미하니까요.
그런데 여기서 검수자가 구멍을 찾았습니다.
정답 근거 문구를 비워두면 검사가 그냥 통과했습니다.
"빈 문자열이 본문에 있는가?"는 컴퓨터 입장에서 항상 참이거든요. 아무 글에나
빈 문자열은 들어 있습니다.
비어 있으면 검사 전에 위반으로 처리하도록 고쳤습니다.
---
## 결과 — 숫자로 나온 것
| 무엇 | 결과 |
|---|---|
| 검색 1등 적중 | 12개 중 12개 (100%) |
| 심어놓은 오류 잡아낸 비율 | 5개 중 5개 (100%) |
| 정상 메모 통과 | 1개 중 1개 · 과잉 차단 0건 |
| 내용 대조 검사를 추가하기 전 | 5개 중 3개 ← ★ |
| 논문 데이터 원문 일치 | 15편 중 15편 |
| 논문 분류 | 관련 7/7 · 무관 오탐 0/8 |
### 네 번째 줄이 이 편의 결론입니다
검문소(형식 검사)**만** 있을 때는 5개 중 3개만 잡았습니다.
못 잡은 두 개가 뭐냐면 — 지어낸 숫자와 가짜 인용문입니다.
이 두 메모는 형식이 완벽했습니다. 제목 있고, 태그 있고, 출처도 적혀 있고,
두 칸 구조도 맞았습니다. 내용만 거짓말이었습니다.
내용 대조 검사를 얹으니 5개 전부 잡혔습니다.
> 교훈: 검문소 하나로는 부족합니다.
> 형식 검사와 내용 검사는 아예 다른 층이고, 한 층만 있으면 다른 층이 잡을 것이 그대로
> 통과합니다.
> 그리고 이 사실은 — 일부러 틀린 걸 심어서 돌려봐야 알 수 있습니다.
---
## 처음 온 사람을 위한 5분 체험
여기까지 만들고 나서 깨달았습니다. 처음 설치한 사람은 아무것도 못 합니다.
논문 데이터도 없고, 메모도 없고, 관심 주제 설정을 뭘로 채워야 할지도 모릅니다.
빈 방에 던져놓고 "자유롭게 해보세요"라고 하는 격입니다.
그래서 샘플만으로 5~10분 안에 한 바퀴 도는 체험을 넣었습니다.
```
① 작업 폴더 만들기
② 샘플 논문·메모 자동으로 채워넣기
③ 분류 돌리기 → 15편 중 7편 추출되는 화면
④ 검색해보기 → 질문 하나 던지고 근거 문장까지 보기
⑤ ★검문소에서 막히는 것 보기 (출처 없는 메모 / 히스토리 변조 메모)
⑥ 정상 메모 승격시키기 → 바로 검색되는지 확인
```
⑤가 이 체험의 백미입니다.
보통 데모는 "잘 되는 것"을 보여줍니다. 여기서는 "막히는 것" 을 보여줍니다.
출처 없는 메모를 올리려고 하면 빨간 글씨로 거부되고, 정식 문서가 만들어지지 않습니다.
이 장면 하나가 "이 도구가 뭐 하는 물건인지"를 제일 빠르게 설명합니다.
말로 10분 설명하는 것보다 낫습니다.
그리고 ⑥의 마지막 — 방금 만든 지식이 즉시 검색된다는 게 좋습니다.
"쌓인다"는 게 말이 아니라 눈앞에서 일어납니다.
---
## 이 편에서 배운 것 다섯 가지
1. 합격 판정은 프로그램이 냅니다.
"검증했습니다"라는 말에는 비용이 없습니다. 프로그램이 막는 데는 있습니다.
2. 확신할 수 없으면 일단 막습니다.
원문을 못 찾으면 통과가 아니라 불합격. 중복을 만나면 병합이 아니라 중단.
판정 불가는 통과가 아니라 "판정 불가"라고 표시.
조용히 통과시키는 길은 전부 구멍입니다.
3. 검사기도 검사 대상입니다.
일부러 틀린 걸 심어서 돌려봤더니, 검사기 자신의 구멍이 두 개 나왔습니다.
4. "통과해야 정상인 것"을 꼭 같이 넣습니다.
거부율만 재면 전부 막는 게 만점입니다.
5. 검증된 코드는 손대지 않고 가져옵니다.
개선하는 순간 그 검증 이력이 무효가 됩니다.
---
## 그런데 이상한 점이 하나 있었습니다
이 단계에서 나온 심각한 결함들을 다시 보면, 공통점이 있습니다.
- 검문소가 출처 위치를 안 봤던 것 → A가 잡음
- 정답 근거를 비워두면 통과하던 것 → A가 잡음
- 지어낸 정수를 못 잡던 것 → A가 잡음
그리고 B는 같은 라운드에서 "문제 없음"이라고 판정했습니다.
여기서 A와 B는 서로 다른 회사의 AI입니다. 한쪽 눈에는 안 보이는 게 있다는 뜻입니다.
이걸 개발 방식으로 굳히고, 나아가 누구나 따라 할 수 있는 실습으로 만든 이야기가
다음 편입니다.