만들고 있는 Obsidian 플러그인은 원문 자료를 LLM으로 읽어 개념별 노트로 정리한다. 자료가 쌓이면 같은 대상을 다룬 노트가 두 개 생기기도 해서, 플러그인은 두 노트를 LLM에 보여 주고 “같은 개념이니 합칠까, 다른 개념이니 따로 둘까”를 판단시킨다. 이 글은 그 병합 판단의 규칙을 통째로 바꾼 이야기다.
3편은 이렇게 끝났다. 규칙에 “병합하면 안 되는 사례”로 박아 둔 AI 노동시장 노트 쌍을 실제로 병합해 보니 막을 이유가 없었고, 그래서 그 예시를 지웠다. 그런데 지운 건 예시 하나였다. 그 예시를 낳은 규칙, 즉 “서로 무관한 원본이 같은 일반 주제를 설명할 뿐이면 다른 개념”이라는 원칙은 그대로 남았다. 남은 예시인 “심리적 안전감” 쌍은 흔들린 적 없는 반례라며 함께 남았다.
같은 제품의 노트가 합쳐지지 않았다 — Claude Code와 클로드 코드
문제는 다른 실험에서 드러났다. 이 병합 판단을 판단 전용 모델로 바꿀 수 있는지 재던 중에 (판단 전용 모델 시리즈), 플러그인의 판단 프롬프트를 그대로 넣었더니 “Claude Code”와 “클로드 코드” 노트를 세 번 모두 “다른 개념”이라고 답했다. 같은 제품이다. 이유를 받아 보니, 같은 제품을 다루는 건 맞지만 한쪽은 Uber의 도입 사례이고 다른 쪽은 개인 활용 사례라 구체적 사건이 겹치지 않으므로 별개의 개념이라는 설명이었다.
모델은 규칙을 정확히 따랐다. 규칙이 “원본이 같은 구체적 사건을 가리키는지”를 기준으로 삼았고, 그 기준에 적용 범위가 없어서 제품·회사 노트에도 그대로 쓰였을 뿐이다. 처음에는 “고유한 제품· 회사는 예외”라는 문장을 덧붙이는 쪽으로 고치려 했다. 그런데 고치기 전에, 이 규칙이 애초에 어디서 왔는지부터 다시 보기로 했다.
규칙의 출처를 따라가 보니, 실제로 합쳐 본 적이 없었다 (LLM 병합 판단 기준)
변경 기록을 거슬러 올라가니 출발점은 한 번의 판단이었다. 영어·한국어로 제목이 짝을 이루는 노트 두 쌍이 중복 후보로 올라왔는데(“Psychological Safety”/“심리적 안전감”, “Claude Code”/“클로드 코드”), 본문을 열어 보니 서로 다른 원본 기사에서 나온 노트였다. 그걸 보고 “원본 기사가 다르니 병합하면 안 되는 가짜 양성”으로 판단했고, 다음 날 그 판단이 규칙이 됐다.
빠진 단계가 하나 있었다. “원본 기사가 다르다”는 건 사실 확인이었지만, “그러니 합치면 결과가 나빠진다”는 건 확인한 적이 없는 추측이었다. 그 추측을 직접 시험한 기록은 3편의 AI 노동시장 쌍 하나뿐이었고, 그 시험은 규칙과 반대 결과를 냈다. 규칙의 대표 예시로 남은 심리적 안전감 쌍도, 실제로 병합해 결과를 본 기록은 찾지 못했다.
엇갈림은 하나 더 있었다. 플러그인에는 노트를 만들 때 제목이 겹친 두 노트를 판단하는 단계가 따로 있는데, 이 단계의 프롬프트는 같은 기술 용어를 각각 독립적으로 다시 설명한 노트라면 합치라는 예시를 들고 있었다. 같은 두 노트를 노트 정리 단계는 합치고, 나중에 위키를 훑는 단계는 따로 둬야 한다고 판단하는 상태였다.
카파시의 LLM Wiki는 반대쪽이었다 (Karpathy LLM Wiki)
이 플러그인이 참고한 개념인 카파시의 LLM Wiki를 다시 읽었다. 새 원본이 들어오면 LLM이 “updates relevant entity and concept pages across the wiki”라고 적혀 있다. 새 페이지를 따로 만드는 게 아니라 이미 있는 개념 페이지를 갱신한다는 뜻이다. 원본끼리 말이 다르면 “noting where new data contradicts old claims, strengthening or challenging the evolving synthesis”라고 해서, 나누는 대신 한 페이지 안에서 차이를 표시하고 종합한다. 원본별 내용은 원본마다 따로 두는 요약 페이지가 맡는다.
심리적 안전감을 책 한 권과 매니저 가이드가 각자 설명했다면, 카파시 방식에서는 “심리적 안전감” 페이지 하나에 두 원본의 관점이 함께 정리된다. 내 규칙은 정확히 그 반대를 막고 있었다.
이번에는 말 대신 실제로 합쳐 봤다 — 중복 노트 병합 시험
예측으로 결론을 내지 않고, 3편에서 AI 노동시장 쌍에 했던 걸 남은 쌍들에 똑같이 했다. 테스트용 노트 보관소에서 “같은 일반 개념을 서로 무관한 원본이 설명한” 쌍 다섯 개를 골라, 플러그인의 실제 병합 프롬프트로 세 번씩 합쳤다. 그리고 합친 결과를 두 원본 노트와 직접 대조하고, 합친 노트로 다시 스캔을 돌려 “다시 나누자”는 제안이 나오는지 봤다.
| 쌍 | 원본 사실 보존 | 다시 나누자는 제안 |
|---|---|---|
| 심리적 안전감 (매니저 가이드 / 리더십 전략 글) | 3번 모두 보존 | 없음 (주변 노트 없이 확인) |
| 국민연금 반환일시금 (서로 다른 연금 기사) | 3번 모두 보존 | 없음 |
| 모델 기반 설계 (자율주행 기사 / 개념 설명 글) | 3번 모두 보존 | 없음 |
| 디지털 트윈 (로봇 학습 기사 / 기후 모델 인터뷰) | 3번 모두 보존 | 없음 |
| AI Adoption (AI 보급 통계 / 조직의 AI 도입 방법) | 사실은 보존 | 3번 중 2번 |
네 쌍은 합쳐도 아무 문제가 없었다. 국민연금 쌍에서는 오히려 좋은 일이 일어났다. 두 기사는 반환금의 이자율과, 받은 돈을 나중에 반납할 수 있는지를 서로 다르게 설명하고 있었는데, 합친 노트가 세 번 중 두 번 “자료마다 설명이 다르다”고 짚었다. 따로 두었다면 그 차이는 아무도 모르고 지나갔을 것이다. 카파시가 말한 “충돌 표시”가 지금의 병합 프롬프트로도 일어난 셈이다.
AI Adoption은 달랐다. 이름은 같지만 한쪽은 AI가 사회에 얼마나 퍼졌는지, 다른 쪽은 조직이 AI를 어떻게 들여오는지를 다룬다. 사실은 다 남았지만 합친 노트가 너무 넓어져서, 다시 스캔하자 “조직 도입”과 “인력 영향”으로 나누자는 제안이 나왔다. 이름만 같고 범위가 다른 쌍은 합치면 안 된다는 신호였다.
새 기준: 같은 대상을 같은 범위로 다루는가 (LLM 프롬프트 수정)
그래서 규칙을 이렇게 바꿨다. 두 노트가 같은 대상을 같은 범위로 다루면, 원본이 서로 무관하고 사례가 달라도 같은 개념이다. 대신 다음은 다른 개념이다. 이름이 같아도 중심 주제가 다른 경우, 한쪽이 다른 쪽의 하위 개념인 경우, 이름만 같은 다른 대상(동명이인, 약어만 같은 다른 용어), 개념과 그 개념을 실천하기 위해 이름 붙은 방법론. 원본이 같은지 다른지는 그 자체로 판단 근거가 아니다. 애매하면 따로 둔다는 원칙은 남겼다. 제품·회사·인물도 “같은 대상”에 들어가니, Claude Code 문제는 예외 문장 없이 함께 풀린다.
첫 문구는 너무 세게 걸렸다. 서로 다른 기사에서 나온 두 노트는 같은 개념이라도 강조점이 자연스럽게 다른데, 모델이 이 차이를 “범위가 다르다”로 읽었다. 위 표에서 문제없이 합쳐졌던 네 쌍 중 상당수를 “다른 개념”이라고 해서, 다섯 쌍 15번 판단 중 7번만 맞혔다. “같은 개념을 다른 사례나 강조점으로 설명한 건 범위 차이가 아니다”, “하위 개념은 자기 이름을 가진 별개 개념이다”라는 문장을 더하자 15번 모두 맞혔다. 정답을 정해 둔 다른 노트 쌍 40개에서는 바꾸기 전 규칙이 120번 중 96번, 새 규칙이 119번을 맞혔다. 하위 개념 관계인 쌍들은 문구를 느슨하게 고친 뒤에도 그대로 “다른 개념”으로 남았다.
이 규칙을 노트 정리 단계와 위키를 훑는 단계가 함께 쓰도록 플러그인에 반영했다. 이제 두 단계가 같은 노트 쌍을 두고 서로 다른 답을 내지 않는다.
실제 노트로 다시 돌려 보니, 마지막 관문에 옛 판단이 남아 있었다 (LLM 노트 병합 검증)
문구를 다섯 쌍에 맞춰 다듬은 만큼, 실제 노트로 다시 확인했다. 테스트용 보관소를 비우고 원본 여섯 개를 새로 넣었다. Claude Code를 다룬 영어 기사와 한국어 기사, 심리적 안전감을 다룬 서로 다른 글 두 편, AI 도입을 다룬 영어 글 두 편이다. 노트를 만든 뒤 병합·분할 제안 스캔을 돌리고, 제안이 나오면 실행하기를 제안이 두 번 연속 하나도 안 나올 때까지 반복했다. 스캔 세 번 만에 멈췄다.
Claude Code와 클로드 코드는 첫 스캔에서 병합 제안이 나왔고, 실행해 보니 두 노트의 사실이 모두 들어간 한 노트가 됐다. 다만 영어 노트와 한국어 노트를 합친 결과, 요약 한 문장 안에 영어와 한국어가 이어 붙고 절마다 언어가 달랐다. 병합 프롬프트에는 “원본 언어를 따르라”는 규칙만 있었고, 원본 언어가 둘일 때는 어느 쪽인지 정해 주지 않았던 것이다. 언어가 다른 노트를 합칠 때는 전체를 한국어로 쓰라는 문장을 넣었고, 같은 쌍을 세 번 다시 합쳐 보니 세 번 모두 한국어로 나왔다. 영어 노트끼리 합칠 때는 그대로 영어였다.
심리적 안전감은 막혔다. 세 번째 스캔에서 두 노트를 합치자는 제안이 나왔는데, 실행 직전에 한 번 더 확인하는 감사 단계가 거부했다. 거부 이유는 이랬다.
문서 1은 심리적 안전감의 상위 개념을 다루고 문서 2는 이를 증진하는 리더십 전략이라는 하위 주제를 다루므로 포함 관계에 해당합니다.
이 감사는 노트 본문을 받지 않고 제목·태그·목차만 본다. 그래서 “심리적 안전감 증진을 위한 리더십 전략”이라는 제목을 하위 주제로 읽었다. 실제로는 그 노트가 심리적 안전감의 정의부터 다루는 더 넓은 노트였다. 규칙을 바꿀 때 이 감사는 “하위 개념이면 합치지 말라”만 보니 새 규칙과 충돌하지 않는다고 보고 그대로 뒀는데, 바로 그 하위 개념을 판단하는 방식에 옛 읽기가 남아 있었다.
감사에 두 문장을 더했다. 개념을 설명하면서 그것을 높이는 방법을 함께 다룬 노트는 같은 개념이고, 제목에 “방법”이나 “전략” 같은 말이 붙었다는 것만으로 하위 주제로 보지 말라는 것이다. 처음에는 “같은 개념을 특정 상황에 적용한 설명도 하위 개념이 아니다”까지 넣었는데, 본문 없이 제목과 목차만 보는 감사에서는 진짜 하위 개념 쌍까지 통과시켰다(다섯 번 중 두 번, 한 번). 그 문장을 빼자 실제로 거부됐던 쌍은 다섯 번 모두 통과했고, 원래 감사가 거부하던 하위 개념 쌍 네 개는 다섯 번 모두 그대로 거부됐다.
AI 도입 쪽은 이번에는 확인하지 못했다. 두 글에서 같은 이름의 노트가 만들어지지 않아서, 이름은 같고 범위가 다른 쌍이 아예 생기지 않았다.
이 결과를 어디까지 믿을 수 있나
- 문구는 다섯 쌍을 보고 다듬었다. 15번 중 15번은 그 다섯 쌍에 맞춰진 숫자일 수 있다. 실제 노트로 한 번 다시 확인했지만 원본 여섯 개, 한 라운드다. 이름은 같고 범위가 다른 쌍을 따로 두는지는 실제 노트로 아직 확인하지 못했다.
- 병합이 늘어나면 병합의 약점도 더 드러난다. 출처가 다른 두 노트를 합칠 때 한쪽에만 있던 내용이 가끔 빠지는 문제가 이 플러그인에 아직 남아 있다. 이번 15번 병합에서는 나오지 않았지만, 언어가 다른 노트를 합친 세 번 중 한 번은 본문 문장 하나가 관련 링크로만 남았다. 실제 사용에서 네 번에 한 번꼴로 본 적이 있는 문제라 계속 지켜봐야 한다.
- 합친 노트는 되돌리기 어렵다. 3편에서 본 것처럼 한 번 합쳐진 노트는 다음 스캔이 다시 나누지 않는다. 잘못 합치면 손으로 풀어야 하니, “애매하면 따로 둔다”는 원칙은 그대로 둔다.
남는 생각
3편에서 배운 건 “기준을 고친 뒤에는 그 기준을 만들게 한 원래 사례를 다시 확인해야 한다”였다. 이번에는 그 한 단계 위였다. 원래 사례가 틀렸다고 확인했으면, 그 사례에서 나온 규칙도 다시 봐야 했다. 예시 하나를 지우고 원칙은 남겨 둔 건, 틀린 결론의 증거를 지우면서 결론은 그대로 둔 것과 같았다. 남은 예시가 “흔들린 적 없는 반례”였던 것도 실제로 흔들어 본 적이 없어서였다.
규칙을 뒤집은 결정적인 근거는 판단을 더 정교하게 한 게 아니라, 판단을 실제로 실행해 본 것이었다. “합치면 나빠질 것이다”는 합쳐 보면 확인할 수 있는 말이었고, 그걸 확인하는 데 든 비용은 몇 분과 몇 센트였다.
그리고 같은 실수를 한 번 더 할 뻔했다. 규칙을 세 군데에서 바꾸면서, 네 번째 자리인 병합 직전 감사는 “다른 것을 판단하니 상관없다”며 그대로 뒀다. 그 판단도 확인한 게 아니라 짐작이었고, 실제 노트로 돌려 보고서야 거기 남은 옛 읽기가 드러났다. 기준을 바꿨으면, 그 기준을 쓰는 곳뿐 아니라 그 기준과 비슷한 판단을 하는 곳까지 실제로 돌려 봐야 했다.