기술

RAG 검색 필터에 저자 축만 있었더니, 남의 사업 참고자료가 1순위 근거였습니다

2026.09.298분 읽기

사내 문서 지식그래프 검색 도구를 운영하면서 한 공공 발주처 사업의 자료 묶음을 색인에 넣었습니다. 그 묶음에는 그 사업의 자기 산출물뿐 아니라 참고하려고 같이 넣어 둔 다른 발주처의 산출물이 섞여 있었습니다. 비슷한 사업은 어떻게 썼는지를 물어보려고 일부러 넣은 것입니다.

곁가지로 남아 있던 이 건은 '참고자료는 안 해도 될 것 같다'는 물음에서 다시 열렸습니다. 열어 보니 안 해도 되는 일이 아니었습니다. 지금 답을 망치고 있는 상태였습니다.


표시가 없으면 괜찮은 게 아니라 통과합니다

검색은 문서 종류 칸이 '참고자료'로 표시된 문서만 근거에서 뺍니다. 그런데 그 폴더의 16건은 '일반' 종류로 색인돼 있었습니다. 표시가 없으니 필터에 걸릴 것이 없고, 그대로 근거로 올라오고 있었습니다.

이게 제외 목록 방식 필터의 성질입니다. 빼야 할 것에 라벨을 붙이는 구조라, 라벨이 안 붙은 문서는 조용히 통과합니다. 에러도 안 나고 로그도 안 남습니다. 색인에 넣을 때 종류를 반드시 정하게 만들거나, 기본값을 통과가 아닌 쪽에 두어야 이 자리가 막힙니다.


저자 축은 사업 축을 대신하지 못합니다

섞여 있던 문서 중에는 다른 발주처의 ISP 산출물이 있었고, 그 문서의 발주처 칸에는 이번 사업의 발주처 이름이 붙어 있었습니다. 우리 쪽 사람이 쓴 문서를 우리가 색인했으니 저자 축(누가 썼나)으로는 아무 문제가 없습니다.

틀린 것은 다른 축이었습니다. 이 문서가 어느 사업의 것인가입니다. 저자 축은 이미 잘 돌고 있었고, 그래서 더 위험했습니다. 한 축이 멀쩡하면 다른 축도 막혀 있는 것처럼 보입니다.

누가 썼나 — 저자 축. 우리 산출물인지 남이 준 자료인지를 가릅니다

어느 사업 것인가 — 사업 축. 이번 사업 자료인지 참고용으로 끌어온 자료인지를 가릅니다

어떤 종류의 문서인가 — 종류 축. 근거로 쓸 문서인지 참고자료인지를 가릅니다

셋은 서로 직교합니다. 하나가 잘 돈다고 나머지가 따라오지 않습니다. 이번에 비어 있던 것은 세 번째였습니다.

RAG 필터의 세 축이 서로 직교한다는 것을 보여주는 다이어그램


고치기 전에 점수를 재 뒀습니다

표시를 바꾸기 전에 같은 질문을 던져 점수를 받아 뒀습니다. 남의 사업 목표 모델을 이번 사업 범위로 물었습니다. 남의 사업 자료가 0.836 으로 이번 사업의 자기 산출물(0.723)보다 위에 섰습니다.

이 한 줄이 우선순위를 뒤집었습니다. 그 전까지 이 건은 '안 해도 될 것 같은 정리'였습니다. 점수를 받고 나니 '이 발주처의 목표 모델이 뭐냐'는 질문에 남의 사업 목표 모델이 1순위 근거로 붙는 상태였다는 것이 됩니다. 문제인지 아닌지를 판정하는 근거는 고치기 전 숫자뿐입니다. 고치고 나면 그 숫자는 다시 못 잽니다.


저장소가 둘이면 고치는 자리도 둘입니다

바꾼 범위는 경로 15개였고, 내용 해시 기준으로 문서 10건 · 청크 2,105개를 '참고자료'로 돌렸습니다. 내역은 다른 발주처의 ISP 산출물 6종(같은 파일이 두 폴더에 중복으로 들어와 있었습니다) · 공개된 업계 산정 가이드 2건 · 개인 비용 정산표 1건입니다.

고칠 자리는 두 곳이었습니다. 검색 필터가 보는 것은 벡터 저장소의 payload(청크마다 붙는 메타데이터)이고, 화면과 집계가 보는 것은 그래프 저장소의 문서 노드 속성입니다. 한쪽만 고치면 검색은 걸러지는데 화면에는 '일반'으로 남습니다. 에러가 안 나니 그 상태가 오래 갑니다.

속성만 갈아 끼우는 방식이라 재임베딩은 없었습니다. 비용은 0원입니다. 폴더 단위로 표시를 바꾸는 스크립트는 레포에 남겼습니다. 기본이 시늉만 내는 모드이고, 경로 조각을 줘서 다른 폴더에도 쓸 수 있고, 되돌리기 옵션이 있고, 끝나면 두 저장소를 다시 세어 보여줍니다. 두 저장소를 같이 세는 것이 이 스크립트의 핵심입니다.

검색 필터가 보는 벡터 저장소와 화면이 보는 그래프 저장소를 같이 고쳐야 한다는 구조도


지운 게 아니라 옆으로 치웠습니다

참고자료는 버릴 자산이 아닙니다. 비슷한 사업은 어떻게 썼는지를 물으려면 색인에 있어야 합니다. 그래서 종류만 바꿨습니다. 평소 검색의 근거에서는 빠지고, 참고자료를 켜면 그대로 나옵니다.

다만 개인 비용 정산표 1건은 성격이 달랐습니다. 이건 표시로 가릴 물건이 아니라 애초에 색인에 있으면 안 되는 물건이라, 색인에서 내렸습니다(삭제 API 200). 원본은 드라이브에 그대로 있고 색인만 내린 것입니다. 열흘쯤 전에 신분·계좌·고객 명단이 든 문서를 뺀 것과 같은 조치입니다. 사람이 검색으로 꺼내 볼 물건이 아닌 것은 필터로 가리지 않고 넣지 않습니다.


검증은 실패할 수 있어야 합니다

검증을 짤 때 한 가지를 조심했습니다. '안 나온다'만 세 줄 확인하면, 필터가 일한 것이 아니라 색인이 통째로 깨져도 똑같이 통과합니다. 그래서 켜면 나오는 줄을 가운데 넣었습니다.

검사

결과

평소 검색으로 남의 사업 목표 모델을 묻기

근거 8건 · 남의 사업 자료 0건(전부 이번 사업 자기 산출물)

같은 질문에 참고자료를 켜고 묻기

0.836 으로 그대로 나옴 — 지운 게 아니라 옆으로 치운 것

개인 비용 관련 질문 두 갈래

근거 8건 · 해당 문서 0건

가운데 줄이 이 표의 전부입니다. 첫째 줄과 셋째 줄은 색인이 사라져도 같은 그림을 냅니다. 참고자료를 켰을 때 같은 점수로 그대로 나온다는 것을 같이 봐야 필터가 일하고 있다는 것이 증명됩니다.

참고자료를 끄면 안 나오고 켜면 같은 점수로 나오는 두 갈래 검증 결과


남은 위험을 같이 적어 뒀습니다

개인 비용 파일의 원본은 드라이브에 그대로 있습니다. 지금은 처리 상태 기록이 남아 다시 색인되지 않습니다. 상태가 초기화되거나 파일 내용이 바뀌면 다음 수집 회차에 들어옵니다. 그래서 다음 수집 명령에 제외 조건 셋을 머리말로 박아 두고, 되돌리는 방법도 같이 남겼습니다. 표시를 바꾼 쪽은 되돌리기 옵션으로, 색인에서 내린 쪽은 재색인으로 복구합니다.

종류 축도 사람이 붙이는 라벨이라 다음에 또 빠질 수 있습니다. 이번에도 폴더 단위로 손으로 표시했습니다. 수집 단계에서 종류를 자동으로 정하는 규칙이 없으면 같은 일이 다음 폴더에서 다시 납니다. 점수 비교도 질문 하나로 잰 것이라, 전체 품질이 얼마나 나빠져 있었는지는 모릅니다. 그걸 알려면 문항 세트로 전수를 재야 합니다.


같은 색인을 운영한다면 볼 자리

필터 축을 적어 봅니다. 저자·사업·문서 종류가 각각 서 있는지, 하나로 다른 하나를 대신하고 있지 않은지 봅니다

라벨이 안 붙은 문서가 통과하는지 확인합니다. 제외 목록 방식이면 기본값이 통과입니다

고치기 전에 점수를 잽니다. 문제인지 아닌지를 판정하는 근거는 그 숫자뿐입니다

저장소가 둘이면 둘 다 고치고, 둘을 같이 세는 도구를 같이 만듭니다

검증에 '켜면 나온다'를 넣습니다. '안 나온다'만 재는 검사는 색인이 깨져도 통과합니다

다음 수집 회차에 도로 들어올 자리를 막습니다. 원본이 살아 있으면 조건이 맞을 때 다시 올라옵니다


마무리

코퍼스가 작고 사업이 하나뿐이면 이 문제는 안 생깁니다. 여러 사업의 자료가 한 색인에 섞일 때만 나옵니다. 참고자료를 아예 안 넣는 선택도 있지만, 그러면 비슷한 사업은 어떻게 썼는지를 물을 수 없습니다. 넣되 종류를 갈라 두는 쪽이 자산을 안 버립니다.

필터가 제외 목록 방식이라 라벨이 늘면 필터도 같이 늘어납니다. 종류가 셋을 넘어가면 제외가 아니라 포함 방식으로 뒤집는 쪽이 맞을 수 있습니다. 지금은 축 하나를 세우고 0.836 대 0.723 한 줄을 남겨 둔 상태입니다. 다음에 같은 일이 생기면 그 줄부터 다시 잽니다.

#RAG#검색필터#문서분류#벡터저장소#지식그래프