문서 3,871건을 넣은 날 RAG 챗봇은 '사업 1건'이라고 답했습니다
사내 문서 지식그래프 검색 도구에 3개년치 문서를 백필했습니다. 폴더 139개, 문서 3,871건, 요약 카드 3,176장이 한 번에 들어갔습니다. 색인이 끝난 그날 저녁, 회사 대표가 메신저 봇에 '2023년 사업들 목록'을 물었습니다. 도구는 1건을 답했습니다.
밤에는 '공고가 가장 많은 회사 top 5, 연도별'을 물었고 도구는 집계는 못 한다고 답했습니다. 둘 다 고장이 아니었습니다. 전날 설계에서 목록·집계 질문은 대장에서만 고르기로 정해 뒀고, 그 해 대장에 등록된 사업이 실제로 1건이었습니다. 설계대로 동작한 답이 방금 3,871건을 넣은 사람에게는 빈 답으로 보였습니다.
'없다'는 답은 두 가지입니다
챗봇이 없다고 답할 때 원인은 둘 중 하나입니다. 데이터가 없는 경우와, 그 질문을 받을 축이 없는 경우입니다. 겉으로 보이는 답은 똑같습니다. 그래서 첫 반응은 대개 데이터를 더 넣는 쪽으로 갑니다.
이번엔 두 번째였습니다. 원천이 둘이었습니다. 하나는 진행 중 사업을 등록해 둔 대장이고, 다른 하나는 대표의 문서함에 연도별로 쌓인 드라이브 폴더입니다. 백필로 들어온 3,871건은 전부 두 번째에 속했는데, 목록과 집계를 답하는 경로는 첫 번째만 보고 있었습니다. 축이 없으면 데이터를 아무리 넣어도 답이 안 바뀝니다.

축을 세우기 전에 말부터 갈랐습니다
축을 하나 더하려면 그 축을 부르는 말이 있어야 합니다. 그런데 사업·폴더·실적이 한 덩어리로 쓰이고 있었습니다. 말이 뭉쳐 있으면 도구가 어느 원천을 볼지 정할 수 없습니다. 그래서 코드를 고치기 전에 낱말 네 개를 먼저 정했습니다. 정한 사람은 개발자가 아니라 이 도구를 실제로 쓰는 대표였습니다.
말 | 가리키는 것 | 가는 축 |
|---|---|---|
사업 | 대장에 등록한 것 | 대장 축 |
폴더 | 드라이브에 쌓인 물리 폴더 | 폴더 축 |
지난 자료 | 대장에 없는 폴더를 담는 창고의 이름 | 폴더 축 |
실적 | 쓰지 않기로 한 말 | 없음 |
실적을 뺀 이유가 이 표에서 가장 중요합니다. 실적이라는 말에는 했다는 함의가 있습니다. 폴더는 그것을 보장하지 않습니다. 떨어진 제안, 검토만 하고 만 것, 참고자료, 교육 자료가 한 폴더 자리에 같이 있습니다. 보장 못 하는 함의를 가진 말은 도구 어휘에서 뺍니다. 말을 하나 빼는 것도 축을 하나 더하는 것만큼 설계입니다.
폴더를 공고라고 부르려다 40%에서 멈췄습니다
사업 1건이라는 답을 받고 갈 수 있는 길이 셋이었습니다.
길 | 내용 | 판정 |
|---|---|---|
A 흡수 | 연도 폴더도 사업으로 세어 2023년 사업 51건이라 답한다 | 기각 |
B 개명 | 폴더를 공고라고 부르고 공고 축을 새로 판다 | 기각 |
C 신설 | 폴더를 별도 축으로 세우고 공고·제안·수행은 폴더의 성격으로 둔다 | 채택 |
A 는 가장 빠릅니다. 코드 한 줄 없이 집계 대상만 넓히면 됩니다. 기각한 이유는 하나입니다. 51건이라 답하는 순간부터 도구가 거짓을 말합니다. 폴더는 수행한 사업이 아닙니다.
B 는 그럴듯했습니다. 대표가 실제로 공고라는 말로 물었으니 그 말에 맞춰 축을 파면 됩니다. 실측이 이 길을 막았습니다. 폴더 139개 중 제안요청서를 가진 것은 40% 였습니다. 나머지를 공고라 부르면 또 거짓입니다. 이름으로 분류하려던 시도였고, 실측 한 번에 무너졌습니다.
이름이 아니라 내용물로 성격을 정했습니다
C 를 골랐습니다. 폴더는 물리 단위라 세는 데 거짓이 없습니다. 2023년 폴더 51개는 참입니다. 그 위에 성격을 얹었습니다. 성격은 폴더 안 요약 카드가 가진 문서 종류의 집합으로 정합니다.
공고 = {제안요청서, 입찰서류}
제안 = {제안서, 견적서}
수행 = {계약서, 사업수행계획서, 착수계, 중간보고서, 결과보고서, 산출물목록}이렇게 두면 한 폴더가 공고이면서 동시에 수행일 수 있고, 어느 쪽도 거짓이 아닙니다. 공고가 가장 많은 회사라는 질문은 폴더 축에서 성격을 세는 집계가 됩니다. 온톨로지에서 무엇을 클래스로 두고 무엇을 속성으로 둘지가 여기서 갈립니다. 이름을 클래스로 승격시키면 그 이름이 안 맞는 60% 가 전부 거짓말이 됩니다.
경계를 하나 더 그었습니다. 수행 폴더는 폴더 축이지만 수행한 사업은 대장 축 그대로입니다. 같은 낱말이라도 앞에 무엇이 붙느냐로 축이 갈립니다. 그리고 사업으로 물어 0건이 나오면 그 해 폴더는 몇 개 있다고 안내하는 한 줄을 붙였습니다. 축이 둘이라는 사실을 사용자가 외우게 하지 않기 위해서입니다.

붙이고 나서 잰 것
폴더 목록 도구를 업무 화면 쪽에 붙였습니다. 폴더·지난 자료·공고라는 말에 연도·발주처·순위를 묻는 말이 같이 올 때만 이 도구로 갑니다. 문서 엔진의 폴더 목록 API 가 폴더마다 문서 종류 집합을 같이 내주도록 먼저 고쳤고, 응답은 5분 캐시로 두되 실패하면 30초만 잡습니다. LLM 호출은 없습니다. 판정이 전부 규칙 층에서 끝나기 때문에 이 경로의 추론 비용은 0원입니다.
저녁에 메신저로 직접 물어 봤습니다.
2023년 폴더 뭐뭐 있어 — 51개
특정 발주처 폴더 — 21개. 별칭이 색인 단계에서 정규명으로 합쳐져 있어 한 번에 잡혔습니다
공고 가장 많은 회사 top 5 연도별 — 발주처 A 12건(연도별 2·4·3·3), B 7, C 6, D 4, E 3. 그래프를 직접 조회한 값과 일치했습니다
사업으로 물어 0건일 때 폴더 쪽으로 안내하는 한 줄
가장과 많은이라는 말이 따로 떨어져 나올 때는 순위로 보지 않도록 막았습니다. 두 낱말이 붙어야 순위 질의로 갑니다. 테스트는 896개가 통과했고, 옛 엔진에는 문서 종류 집합이 없으니 엔진을 먼저 배포하고 화면을 나중에 올렸습니다.
새 축이 옛 관문을 그냥 지나갔습니다
배포 전 리뷰가 잡은 것이 이번 작업에서 가장 값비쌌습니다. 이 도구에는 공개 채널로 사내 문서 내용이 나가지 않게 막는 관문이 있습니다. 관문은 답에 붙은 근거 칸을 보고 판단합니다. 그런데 폴더 목록 답은 구조상 근거 칸이 비어 있었습니다. 관문은 검사할 것이 없으니 그대로 통과시켰습니다.
1차 수정도 안 막혔습니다. 값을 채워 보냈는데 답변기가 그 값을 도중에 떨어뜨렸습니다. 고쳤다고 생각한 상태로 한 번 더 지나갔습니다. 실제 질문 요청 경로를 그대로 타는 테스트를 쓰고 나서야 닫혔습니다. 옛 코드에서 실패하고 새 코드에서만 통과하는 것을 눈으로 확인했습니다. 옛 코드에서도 통과하는 테스트는 아무것도 증명하지 않습니다.
그 밖에 리뷰가 같이 잡은 것은 엔진이 멈췄을 때 매 턴 60초를 기다리는 타임아웃, 발주처가 둘 붙는 질문, 조사가 틀어지는 문장, top 0 같은 경계값이었습니다. 실제 메신저 경로로 확인한 4건은 의도대로 나왔고, 공개 채널에서는 1:1 로 물어 달라는 안내로 차단됐습니다.

중간에서 말을 고치지 않습니다
메신저 봇 쪽 도구 설명에서 실적이라는 낱말을 지웠습니다. 대신 사람이 쓴 말을 바꾸지 말고 그대로 넘기라는 문장을 넣고, 폴더·공고 예시를 붙였습니다. 발주처 꼬리말 규칙에도 폴더와 공고를 추가해 특정 발주처의 폴더나 공고를 물으면 그 발주처의 일로 잡히게 했습니다.
이 수정에는 앞선 사건이 있습니다. 일주일 전 중간 에이전트가 사람의 질문에 실적이라는 말을 붙여 다시 보냈고, 그 질문은 대장 경로로 갔습니다. 말이 축을 정하는 구조에서는 중간에서 질문을 더 잘 고쳐 쓰는 행위 자체가 축을 바꾸는 행위입니다. 사람 말을 그대로 전달한다는 것이 이 구조에서는 성능 규칙이 아니라 정합성 규칙입니다.
축을 하나 더할 때 보는 것
빈 답이 나오면 데이터가 없는 것인지 받을 축이 없는 것인지부터 가른다
축을 부르는 말을 먼저 정하고, 정하는 사람은 도구를 쓰는 쪽으로 둔다
보장 못 하는 함의를 가진 낱말은 도구 어휘에서 뺀다
이름으로 분류하려는 순간 그 이름이 실제로 몇 퍼센트에 맞는지 센다
새 축이 지나가는 관문을 같이 열어 보고, 옛 코드에서 실패하는 테스트로 닫는다
중간 에이전트가 사용자 질문을 고쳐 쓰지 못하게 도구 설명에 명시한다
아직 안 잰 것
남은 것은 63문항 품질 측정입니다. 메신저로 확인한 4건은 의도 확인이지 품질 측정이 아닙니다. 축을 하나 더한 것이 다른 질문의 답을 흔들었는지는 아직 모릅니다.
성격 판정이 분류기의 결과라는 점도 남아 있습니다. 139개 중 40% 라는 수치도 요약 카드의 문서 종류 분류를 믿은 값입니다. 분류가 틀리면 성격이 틀리고 순위도 같이 틀립니다. 순위가 그래프 직접 조회와 일치한 것은 도구가 그래프를 제대로 읽었다는 뜻이지 그래프가 맞다는 뜻은 아닙니다.
이 접근이 닫힌 데에는 조건이 하나 있었습니다. 낱말을 정할 사람이 한 명이었습니다. 사용자가 여럿이고 사업이라는 말을 각자 다르게 쓰는 조직이면 어휘 결정이 닫히지 않고, 축을 나눠도 질문이 엉뚱한 축으로 갑니다. 안내 한 줄도 권한이 있는 사람에게만 보이므로, 권한 없는 사람에게는 축이 둘이라는 사실이 여전히 안 보입니다.