기술

RAG 는 세지 못합니다, 집계 질문에는 표를 통째로 붙였습니다

2026.10.068분 읽기

자매 법인(사기탐지 솔루션사)용으로 사내 문서 검색 플랫폼을 새로 만들고 있습니다. 문서를 찾아 읽고 답하는 채팅이 붙어 있어서, 그 답을 매번 같은 기준으로 재려고 검수지를 만들었습니다. 문항 21개를 '왜 틀렸나'로 묶어 보니 한 덩어리가 통째로 비어 있었습니다.

집계 질문이었습니다. '어디어디 있어'·'몇 곳이야'·'가장 많은 게 뭐야' 같은, 세어야 답이 나오는 질문입니다.


세는 질문만 한 덩어리로 실패했습니다

실패한 문항은 생김새가 서로 닮아 있었습니다.

'우리가 진행한 것 중에 보험사는 어디어디 있어' → 한 곳만 답했습니다. 표를 세어 보면 세 곳입니다

'금융권 중에 어떤 업권 고객이 가장 많아' → '판단할 수 없습니다'. 표에는 업권별 분포가 그대로 들어 있었습니다

고객사와 제품은 이미 표에 칸으로 있었습니다. 세기만 하면 되는 자료가 시스템 안에 있었다는 뜻입니다. 그런데 채팅은 그 표를 보지 않고 문서 검색으로만 답하려 했습니다.


검색을 더 좋게 해도 세지는 못합니다

첫 번째 길은 검색을 손보는 쪽입니다. 임베딩을 바꾸거나 순위를 조정합니다. 이 길은 막혀 있습니다. 비슷한 이름을 서로 가깝게 놓을 수는 있어도 거르지는 못합니다. 그리고 상위 N건만 본다는 성질이 그대로 남습니다. 20건 중 보험사가 한 곳이면 그대로 '한 곳'이라 답합니다. 21번째에 있는 것을 아예 모릅니다.

더 고약한 쪽은 '없음'입니다. 검색은 '못 찾은 것'과 '없는 것'을 가를 수 없습니다. 그래서 정직한 모델일수록 '판단할 수 없습니다'로 물러납니다. 답이 틀린 것이 아니라 답할 수 없는 질문을 시킨 것입니다.

그래서 고칠 자리는 답이 아니라 자료였습니다. 검색 순위를 아무리 다듬어도 세는 질문은 같은 자리에서 다시 막힙니다.

상위 N건만 보는 검색과 표 전체를 세는 방식의 차이를 좌우로 비교한 그림


표를 통째로 붙이는 쪽으로 갔습니다

두 번째 길은 검색 결과와 별개로, 질문이 세는 모양이면 표 전체를 자료로 붙여서 같이 넘기는 쪽입니다. 같은 자리에 선례가 이미 있었습니다. '누가 최근에 무슨 일을 했나'를 날짜순 글로 풀어 붙이던 자리입니다. 같은 방식, 같은 자리라 검색 엔진 쪽은 손대지 않았습니다.

고객사 표와 제품 표를 합쳐도 수십 행이라 전부 넣을 수 있었습니다. 세는 질문을 가려내는 자리를 하나 만들고, 걸리면 두 표를 자료로 붙였습니다. 검색 결과는 근거로 그대로 같이 보냅니다.


설계에서 걸린 네 군데

두 신호가 다 있어야 붙입니다 — 종류를 가리키는 낱말(고객사·업권·보험사)과 세는 신호(어디어디·몇 곳·가장 많은). 한쪽만으로 걸면 '그 고객사 현장 검증 요건은?' 같은 문서 질문에도 표가 붙어 근거 자리를 차지합니다

고객사 이름은 신호로 넣지 않습니다 — 넣으면 그 회사가 나오는 모든 문서 질문에 표가 붙습니다

거르지 않고 전부 붙입니다 — 질문에 맞춰 거르면 '없다'와 '걸러졌다'를 또 못 가릅니다. 세는 질문에 반쪽 목록을 주는 것이 가장 나쁩니다

표가 반만 채워져 있으면 그렇다고 적습니다 — '연결된 프로젝트' 칸이 절반도 이어져 있지 않아서, 0을 '거래 없음'으로 읽으면 또 틀립니다. 자료 안에 경고로 적어 그 칸으로 세지 않게 했습니다

자료를 더 넣는 변경은 공짜가 아닙니다. 넣는 만큼 다른 근거가 밀려납니다. 그래서 붙이는 문을 좁게 만드는 쪽을 골랐습니다.

종류 낱말과 세는 신호 두 가지가 모두 있을 때만 표를 붙이는 관문 구조 그림


'이 표가 전부다' 한 줄이 값을 했습니다

표만 붙이면 끝나지 않았습니다. 자료 머리에 한 줄을 같이 적었습니다.

이 표가 전부다 — 여기 있으면 있는 것이고, 여기 없으면 아직 등록되지 않은 것이다. 문서에서 못 찾았다고 없다고 하지 않는다.

이 줄이 없으면 모델은 표를 받고도 '검색 자료는 일부이므로 단정할 수 없습니다'로 물러납니다. 표를 주는 것과 '이게 전부다'라고 말해 주는 것은 다른 일입니다. 모델이 자료의 완결성을 혼자 판단할 수는 없으니, 그 판단을 자료 쪽에서 미리 닫아 준 것입니다.

고친 뒤 업권 질문은 분포를 그대로 답했고, 보험사 질문은 세 곳 전부를 근거 수준을 나눠서 답했습니다. 현장 검증까지 확인된 곳, 제안서만 있는 곳, 표에 등록만 된 곳으로 갈라서 답했습니다.


붙으면 안 될 질문도 같이 시험에 박았습니다

시험 13건을 붙였습니다. 표가 붙어야 할 것 5건과 붙으면 안 될 것 5건이 그 안에 들어 있습니다. 전체 172건이 통과했습니다.

통과만 확인하면 그 시험이 아무것도 안 하는 경우를 못 잡습니다. 그래서 붙이는 조건을 느슨하게 바꿔 봤습니다. 두 신호 중 하나만으로도 붙게 고치니 2건이 빨갛게 떴습니다. 그걸 직접 보고 되돌렸습니다.

집계 질문의 답이 고치기 전과 후에 어떻게 달라졌는지 BEFORE AFTER 로 비교한 그림


자를 세울 때 쓴 숫자도 원본에 대 봐야 합니다

검수지의 기대한 답 2건이 틀려 있어서 바로잡았습니다. 보험사 문항의 기대는 두 곳이었고 표의 실제는 세 곳이었습니다. 업권 문항의 기대 분포도 숫자가 전부 어긋나 있었습니다.

문항 하나는 채팅이 맞고 기대가 틀린 경우였습니다. 매뉴얼 31청크(문서를 쪼갠 조각 31개)에 '로그인'·'인증'이 0건이었는데, 그 문서는 애초에 그런 절차가 없는 문서였습니다. 판정을 실패에서 맞음으로 정정했습니다. 기준이 틀리면 개선이 퇴행으로, 퇴행이 개선으로 보입니다.


이 처방이 통하는 범위

여기까지가 확인한 범위입니다.

표가 없는 질문에는 안 통합니다. 세어야 할 것이 이미 칸으로 있을 때만 쓰는 처방입니다. 표가 없으면 할 일은 자료를 붙이는 것이 아니라 표를 만드는 것입니다

표가 커지면 통째로 붙이는 방식이 깨집니다. 수십 행이라 전부 넣을 수 있었습니다. 수천 행이면 집계를 미리 계산해 넘기거나 질의로 바꿔야 하고, 그때 '걸러진 것'과 '없는 것'의 구분 문제가 다시 돌아옵니다

표가 틀려 있으면 틀린 답을 더 자신 있게 합니다. 반쪽만 채워진 칸이 그 자리였습니다. 경고 한 줄은 완화일 뿐입니다

문을 좁게 만든 대가가 있습니다. 두 신호가 다 있어야 붙이므로 세는 뜻인데 표현이 다른 질문('고객 분포 알려줘')은 안 걸릴 수 있습니다

반쪽만 채워진 칸은 경고로 덮은 것이지 고친 것이 아닙니다. 그건 코드가 아니라 사람이 채우는 일이라 성격이 달라서 별건으로 남겼습니다.


질문의 모양으로 자료의 종류를 고릅니다

'무엇이 적혀 있나'는 문서를 찾아 읽어야 풀리고, '몇 개인가·어디어디 있나'는 표를 세어야 풀립니다. 같은 채팅창에 들어오는 두 질문이 서로 다른 원천을 요구합니다. 검색 품질을 올려서 두 번째를 풀려는 시도는 방향이 틀립니다.

그리고 '모르겠습니다'를 모델 탓으로 읽지 않게 됐습니다. 그 답은 자료가 전부가 아닐 때 나오는 정직한 답입니다. 같은 자리에서 검색 쪽이 조용히 빗나간 사례도 한 번 겪었는데, 거기서도 고칠 자리는 모델이 아니라 자료를 넣는 앞단이었습니다.

집계 질문이 실패하는 자리는 문서 검색 품질과는 다른 축에 있습니다. 문서를 쪼개 넣는 앞단이 틀려서 검색만 조용히 빗나간 사례는 따로 정리해 뒀습니다.

#RAG#집계질의#질의라우팅#구조화데이터#회귀시험