만들고 있는 Obsidian 플러그인은 기사 한 편을 넣으면 LLM이 그 안의 개념·인물·회사를 각각 별도 노트로 나눠 저장한다. 같은 기사에서 나온 노트끼리는 같은 사실을 반복하기 쉬워서, 노트를 만든 직후에 LLM이 겹치는 사실을 찾아 한 노트에만 남기고 나머지 노트의 그 문장은 “자세한 내용은 [[그 노트]]에서 다룬다” 같은 링크 문장으로 바꾸는 중복 정리 단계가 있다. 9편에서는 이 단계가 문장을 지운 뒤 남은 문장이 가리킬 곳을 잃는 문제를 쫓다가, 깨지는 모양을 미리 막는 대신 고친 노트를 다른 LLM이 다시 읽어 판정하게 하자는 데까지 왔다. 이 글은 그 판정을 실제로 플러그인에 넣고 돌려 본 기록이다.
판정에 걸리면 그 노트를 통째로 되돌린다 — LLM-as-a-judge
넣은 방식은 단순하다. 중복 정리가 노트 몇 개를 고치면, 고친 노트마다 판정 호출을 한 번씩 동시에 보낸다. 판정은 수정 전 노트, 수정 후 노트, 바뀐 문단을 보고 “이 수정 때문에 새로 생긴 문제가 있는가”를 답한다. 기준은 9편에서 정한 네 가지다. 가리키는 말이 대상을 잃었는가, 링크만 있는 문장이나 끊긴 문장이 생겼는가, 조건이나 목록 일부가 빠져 뜻이 바뀌었는가, 절 제목과 남은 내용이 어긋났는가.
문제가 있다고 하면 그 노트의 재작성을 전부 되돌린다. 판정 호출이 실패하거나 답이 형식에 맞지 않아도 되돌린다. 판정이 틀리면 어느 쪽이든 중복이 하나 남을 뿐이고, 깨진 노트가 저장되지는 않는다. 이 비대칭이 이 방식을 고른 이유다.
원본 6개씩 다섯 번 돌린 결과 — LLM 판정 정확도
다른 PC의 Obsidian을 원격으로 조작하는 테스트 환경에서 기사 6개를 넣고 결과 노트를 전부 직접 읽는 일을 다섯 번 했다. 매번 다른 기사 6개를 썼다.
판정이 돈 노트는 22개였다. 14개는 통과해서 유지됐고 8개는 되돌려졌다. 되돌린 8개 중 7개는 실제로 깨져 있었다. 이런 식이었다.
- 직원 문의를 설명한 문장이 지워져, 다음 문장의 “같은 질문이 이어졌고”가 무엇과 같은 질문인지 알 수 없게 됐다. 게다가 내용을 넘겨받은 노트는 “이 배경과 인사팀의 다른 자동화 사례는 [[원래 노트]]에 정리되어 있다”고 거꾸로 가리키고 있었다. 그대로 뒀다면 두 노트가 서로를 가리키기만 하고, 배경은 어디에도 온전히 남지 않았을 것이다.
- 앞 문장이 링크 문장으로 바뀌어, 다음 문장의 “however”가 무엇과 대비되는지 사라졌다.
- 첫 문장의 주어가 링크 문장으로 바뀌어, 다음 “또한 … 목표로 삼았다”의 주어가 없어졌다.
- 수정 전 노트의 “helped her begin to overcome”(극복하기 시작하도록 도왔다)이 링크 문장으로 옮겨지면서 “helping her overcome”(극복하도록 도왔다)으로 부풀려졌다.
- 한 절의 설명이 다 지워지고 원래 끝에 있던 “See [[…]].” 한 문장만 남았다.
나머지 1개는 지나치게 엄격했다. 판정은 뜻이 바뀌었다고 했지만, 바뀐 문장은 다른 노트로 넘기는 안내 문장이었고 지운 내용도 그 노트에 그대로 있었다. 대가는 중복이 하나 남은 것뿐이었다.
시간도 문제가 아니었다. 판정은 노트 하나에 약 2~12초였고, 기사 6개를 노트로 만드는 데는 매번 4분 반에서 6분 반이 걸렸다.
틀렸다고 생각한 판정이 맞았다 — 재현으로 확인
첫 실행에서 되돌린 노트 하나는 판정 사유가 이상해 보였다. 번호 목록의 항목 끝에 “See [[…]].” 문장이 원래부터 있었는데, 판정이 그 문장을 문제로 걸었기 때문이다. 원래 있던 문장을 새로 생긴 것으로 잘못 읽었다고 보고, 보고서에 “판정 사유는 부정확”이라고 적었다.
확인하려고 플러그인이 보낸 것과 같은 입력을 다시 만들어 변형마다 다섯 번씩 판정을 돌렸다. 그대로 넣으면 다섯 번 중 네 번 걸렸다. See 문장을 모두 빼면 한 번도 안 걸렸고, See 문장은 그대로 두고 그 항목의 재작성만 빼도 다섯 번 중 한 번(다른 사유)만 걸렸다. 그러니 문제는 원래 있던 See 문장 자체가 아니었다. 재작성이 그 항목의 설명을 지워서 굵은 제목과 See 문장 하나만 남았고, 링크 문장이 항목의 유일한 본문이 된 것이었다. 기준에 맞는 판정이었고, 보고서의 “부정확”은 내 쪽의 틀린 짐작이라 고쳐 적었다.
판정이 약하게 보는 것 — 한국어 주어 생략
통과한 14개 중 3개는 경계에 있었다. 셋 다 같은 모양이다. 지운 문장이 다음 문장의 주어나 맥락을 함께 가져갔다.
예를 들어 한 노트는 원하는 기능을 말로 설명해 크롬 번역 확장 프로그램을 만들었다는 두 문장을, 제작 과정은 그 프로그램 노트에서 다룬다는 링크 문장 하나로 바꿨다. 그러자 다음 문장 “설치 중 문제가 생기면 상황을 설명해 해결책을 받았고”가 무엇을 설치하는지 받을 말 없이 남았다. 한국어는 주어를 자주 생략하니 읽으면 뜻은 통하고, 지운 내용도 다른 노트에 다 있어서 정보가 사라지지는 않았다. 판정은 “또한”, “however”처럼 눈에 보이는 연결어는 잘 잡았지만, 이렇게 생략된 주어가 붙잡던 맥락은 약하게 봤다.
대신 치른 값 — LLM 중복 제거가 절반 가까이 되돌려졌다
안전성은 확보됐다. 다섯 번의 실행 동안 깨진 노트가 최종 결과에 남은 적은 없었다. 대신 판정이 돈 노트의 재작성 28건 중 13건, 46%가 되돌려졌다. 되돌린 만큼 처음에 없애려던 중복이 그대로 남는다.
되돌린 사례들은 세 가지 모양으로 다시 묶였다. 지운 문장이 다음 문장의 주어나 가리킬 대상을 가져간 경우, 절이나 목록 항목에 링크 문장만 남은 경우, 새로 넣은 안내 문장이 원래 사실을 요약하다 뜻을 바꾼 경우다. 셋 다 판정이 아니라 그 앞의 중복 정리가 만든 문제다. 그래서 다음 질문은 판정을 어떻게 고칠까가 아니라, 판정이 막고 있는 재작성을 어떻게 덜 깨지게 할까가 됐다.
남는 생각
판정을 넣기 전에는 깨진 노트를 하나도 남기지 않는 것이 목표였다. 그건 이뤘다. 그런데 막는 장치가 확실히 동작하자, 그 장치가 무엇을 얼마나 막고 있는지가 새로 보였다. 되돌린 13건은 판정의 성과이면서, 동시에 판정이 돈 노트의 재작성 가운데 40%가 넘게 깨져 있었다는 측정값이었다(지나치게 엄격했던 1건을 빼도 12건). 그리고 판정이 틀렸다고 생각한 한 건은 내 짐작이 틀린 것이었다. 사유가 이상해 보일 때는 같은 입력을 다시 만들어 돌려 보는 것이 짐작보다 빨랐다.