사내 그룹웨어(ERP)에 6년치 결재문서·규정·이사회 자료가 쌓여 있었다. 있는 건 아는데, 꺼내 쓰는 사람은 없었다. 이걸 통째로 내려받아 검색 창고로 만들고 ChatGPT와 Claude에 연결했다. 이제 "작년 이사회에서 무슨 안건을 다뤘지?"라고 물으면, 원본 문서를 인용한 답이 돌아온다. 이 페이지는 그 과정이 어떤 순서로, 왜 그렇게 만들어졌는지를 따라 할 수 있게 풀어쓴 해설이다.
한 줄로 줄이면 이렇다. 서고에 사서를 앉혔다. 문서를 아무리 쌓아도, 찾아주는 사람이 없으면 그건 지식이 아니라 짐이다. 이 시스템은 ERP의 결재문서를 매일 밤 내려받아(서고 입고), 전부 텍스트로 바꿔 색인하고(도서 목록 작성), AI가 그 색인을 도구로 뒤질 수 있게 연결한다(사서 채용). 그래서 누구든 이렇게 물을 수 있다:
답은 항상 근거 문서번호·제목·날짜와 함께 온다. 문서에 없는 내용이면 "확인 안 됨"이라고 답하게 되어 있다 — 아는 척하는 사서는 사서가 아니니까.
계획서 한 장에서 출발한 게 아니다. 질문 하나에서 출발해, 매 단계의 발견이 다음 단계를 불렀다. 날짜는 실제 대화 기록 보관소(ChatVault — 구축자가 모든 AI 대화를 모아 두는 개인 아카이브)에서 복원한 것이다.
일곱 단계가 위에서 아래로 흐른다. ①~③은 AI를 전혀 쓰지 않는 순수 기계 작업이고(그래서 비용이 0에 가깝다), AI는 ④부터 등장한다. 이 순서 자체가 이 시스템의 비용 철학이다.
ERP엔 공식 API가 없다. 그런데 열쇠는 이미 있다: 내가 매일 로그인해서 쓰는 크롬 창이다. 원격 조종 포트를 열어 둔 채 크롬을 띄우면, 수집 스크립트가 그 창에 올라타 브라우저의 인증을 그대로 빌려 쓴다. ERP가 요구하는 요청 서명(위조 방지 도장)도 브라우저 안에서 계산시켜 값만 받아온다 — 서명 열쇠는 브라우저 밖으로 꺼내지 않는다.
내려받은 문서는 한 건당 폴더 하나: 메타정보(기안자·결재선·날짜) + 본문 파일 + 첨부 원본 + "완료 도장"(.done 마커).
도장이 찍힌 문서는 다시 안 받으니, 매일 밤 돌려도 새 문서만 쌓인다.
AI는 HWP나 스캔 PDF를 바로 못 읽는다. 그래서 모든 문서를 마크다운 한 장(doc.md)으로 변환한다. 위쪽엔 문서번호·제목·날짜·기안자 같은 명찰을, 아래엔 본문과 첨부파일 텍스트를 담는다. 첨부는 PDF·HWP(표 포함)·엑셀·이미지까지 풀고, 스캔본은 OCR(문자인식)로 읽되 "숫자는 오독 가능, 원본 대조 필요"라는 경고 배너를 자동으로 붙인다.
가장 큰 복병은 겉보기엔 본문이 있는데 실제론 빈 껍데기인 문서였다. ERP가 내려주는 본문 파일이 사실은 빈 양식 틀인 경우가 많았던 것. 이런 문서는 대기열에 등록해 두고, ERP 뷰어의 "PC저장" 기능으로 실제 내용이 담긴 PDF를 다시 내려받는 보충 배치(refill)가 매일 조금씩 채운다. 이때 기존 파일은 절대 덮어쓰지 않고 새 파일·새 마커로 저장한다 — 원본은 건드리지 않는다는 원칙.
추출된 텍스트 전체를 SQLite 데이터베이스 하나에 색인한다. 쓴 기술은 화려한 AI가 아니라 SQLite에 내장된 전문검색(FTS5)이다. 글자를 3자씩 잘라 색인하는 trigram 방식이라 한국어도 형태소 분석 없이 부분일치 검색이 된다. 결재문서·규정 조문·이사회 자료가 종류 딱지를 달고 한 DB에 들어 있고, 검색 한 번에 1초 미만, 비용 0원.
벡터 임베딩(의미 기반 검색)도 만들어서 실제 질의 수십 개로 비교해 봤다 — 결과는 전문검색과 동률. 정형화된 공문 코퍼스에선 키워드 검색이 이미 충분했다. 그래서 임베딩은 "보류"로 결론. 유행이 아니라 측정이 결정하게 한 대목이다.
처음 계획은 "문서마다 AI가 요약 카드를 만들자"였다. 이 배치가 이틀 만에 API 환산 약 $550어치를 태우고 세션 한도에 걸려 멈췄다. 문서가 수천 건이면 전량 AI 처리는 돈 먹는 하마가 된다는 걸 몸으로 배운 것이다.
그래서 구조를 3층으로 바꿨다. 전량은 기계가(검색 색인·텍스트 캐시), AI는 선별한 것만. 어떤 문서가 요약할 가치가 있는지도 AI에게 묻지 않고 규칙(SQL)으로 거른다 — 반복 서식(근태·지출결의)은 제외하고, 제목에 이사회·예산·규정·협약 같은 고가치 단어가 있는 것만 후보로. 배치엔 "사용량 한도(429) 감지 시 즉시 전체 중단" 규칙도 박았다. 한도는 재시도한다고 풀리지 않으니까.
MCP(Model Context Protocol)는 AI에 외부 도구를 꽂는 표준 규격이다. 검색·문서 열람·첨부 읽기·지식 저장, 이 도구들을 MCP 서버로 노출하면 ChatGPT와 Claude가 직접 서고를 뒤진다.
같은 서버 코드를 두 벌(인스턴스)로 나눠 띄운 게 핵심이다 — 설정만 달리한 같은 프로그램을 두 개 실행해 두는 것. 일반 직원용 인스턴스는 민감문서(급여·인사·평가 등 2,255건)를 검색 색인 단계에서 아예 제외해서, 차단이 아니라 "존재 자체가 안 보이는" 상태로 만들었다. 관리부서용 인스턴스만 전체를 본다. 명단은 키워드 추측이 아니라 문서 단위 목록(deny-list)으로 관리한다.
외부 연결은 3겹이다: MCP 서버는 사설망(Tailscale) 주소에만 묶어 두고 → 공개 서버(Caddy)가 추측 불가능한 시크릿 주소를 그쪽으로 이어 주고 → 그 주소를 ChatGPT 커넥터(유료 플랜의 개발자 모드)에 등록한다. URL 자체가 열쇠인 구조.
여기까지는 "찾아주는" 시스템이다. 지식노트는 거기에 기억을 붙인다. 질문에 답하다가 재사용 가치가 있는 결론이 나오면 — 예컨대 여러 문서를 조합해야 나오는 통계나 제도 정리 — AI가 근거 문서번호와 함께 노트로 저장한다. 다음에 비슷한 질문이 오면 검색이 그 노트를 먼저 내민다. 질문 → 답변 → 저장 → 재사용의 순환. 쓰는 사람이 많아질수록 창고가 똑똑해진다.
저장은 아무거나 안 받는다. 서버가 직접 검사한다:
전사 검색이 도서관 전체라면, 팩은 특정 주제 하나를 위해 꾸린 지식 상자다. "이 주제만큼은 깊고 정확하게 답해야 한다" 싶을 때 만든다. 상자 안엔 목표 선언문(mission), 사람용 지도, 개념·관계 목록, 그리고 모든 주장의 원문 발췌(증거)가 들어 있다.
만드는 절차는 5단계다: 범위와 합격 기준을 먼저 동결하고 → 증거를 모으고 → 개념·관계를 추출하고 (증거 없는 항목은 격리) → 독립 검사자가 위조 여부를 전수 검사하고 → 마지막으로 팩 파일만 보고 시험 문제를 풀게 해서 합격해야 완성이다. 이 방식은 앞서 해부했던 OpenCrab에서 차용해, 파일럿 두 개가 연속 합격하며 검증됐다.
따라 만들 사람이 같은 곳에서 넘어지지 않도록, 대표 함정 여섯 개만 추렸다. 전체 15개는 AI용 설계서에 있다.
ERP가 주는 본문 파일이 실은 빈 양식 틀. 겉보기 글자 수로 판정하면 속는다.
맥에서 파일명 속 한글이 눈엔 같아도 컴퓨터엔 다른 글자. 비교 전 정규화 필수 — 매칭 버그의 단골 원인.
API 사용량 한도(429)에 걸렸는데 재시도를 반복하면 토큰만 태운다. 감지 즉시 전체 중단이 정답.
"상위 버전 문서입니다" 같은 뷰어 배너가 본문으로 오인된 게 후보의 92%였다. 상투 문구 목록으로 차단.
ERP 화면이 개편되자 배치가 이틀간 조용히 헛돌았다. 성공 코드가 아니라 "진전량"을 감시해야 한다.
한글(HWP) 자동화용 COM 방식은 원격 터미널에서 무한 정지한다. 서버에선 hwp5 라이브러리로 파싱.
준비물은 생각보다 짧다: 상시 켜 둘 PC 한 대, Python, SQLite(내장 검색이면 충분), 그리고 코드를 다뤄 줄 AI(Claude Code 등). 외부에서 ChatGPT로 쓰려면 유료 플랜과 공개 서버 하나가 추가로 필요하다. 다만 준비물이 짧다고 일까지 짧은 건 아니다 — 원본 구현도 AI와 붙어 약 7주가 걸렸다. 아래 설계서는 그 시행착오를 건너뛰게 해 주는 지름길이다.
이 해설과 짝을 이루는 AI 실행용 재현 설계서(마크다운 문서)는 아래 버튼으로 바로 내려받을 수 있다. 단계별 구현 스펙·데이터 스키마·안전 규칙·함정 15개가 담겨 있어서, AI에게 통째로 주고 이렇게 지시하면 된다:
설계서의 마일스톤은 M1(수집·추출)부터 M6(팩)까지 순서가 정해져 있고, M2까지는 AI API 비용이 사실상 들지 않는다. 작게 시작해서 실사용으로 검증하며 넓히는 순서다.