노트 · 검색 품질 진단

검색이 못 찾으면 RAG 는 답할 수 없다 — 한국어는 토크나이저부터 본다

2026-09-06 · 시즐론 이광연

“RAG 가 엉뚱한 답을 낸다”는 문의의 대부분은 생성 모델의 문제가 아닙니다. 답에 필요한 문서가 검색 결과에 없었던 것입니다. 그리고 한국어에서 문서가 검색에 안 잡히는 이유는 대개 토크나이저에서 시작합니다. 토크나이저는 문서와 질의를 토큰으로 쪼개는 첫 단계라, 여기서 어긋나면 그 위에 BM25 를 올리든 벡터를 올리든 문서는 나오지 않습니다.

말로만 하면 누구나 하는 얘기라, 숫자로 재 봤습니다.

무엇을 쟀나

사전은 질의나 정답을 보고 만들지 않았습니다. 제목 전체를 기본 설정으로 분석해서, 30번 이상 나오는 어절 가운데 두 조각 이상으로 쪼개지거나 글자가 사라지는 것을 모두 항목으로 올렸습니다. 2,147항이 자동으로 나왔고, 19항은 손으로 분절을 붙였습니다.

진단 1 — 같은 단어가 문맥마다 다르게 쪼개진다

30번 이상 등장한 어절 2,273개를 보면, 382개(16.8%)가 문맥에 따라 둘 이상의 방식으로 쪼개집니다. 그 어절들의 출현 86,021회 가운데 7,322회(8.5%)가 소수 분절입니다. 질의가 다수 분절로 분석되면 이 8.5% 의 문서는 조용히 빠집니다. 에러도 없고 로그도 없습니다.

어절 출현 쪼개진 방식 (횟수)
소액수의 2,460 소액+수 (1,988) · 액수 (352) · 소액+수의 (120)
연간단가 1,329 연간+단가 (1,012) · 연간+다+이 (317)
수의견적 893 수+견적 (581) · 수+의견 (312)
지방하천 517 지방+천 (279) · 지방+하천 (238)
소상공인 130 상공+이 (61) · 소+상공+이 (52) · 소+상+공인 (17)
전자견적 173 자견 (101) · 전+자견 (70) · 전자+견적 (2)

Nori 는 문장 전체를 놓고 가장 그럴듯한 분절 경로를 고릅니다. 그래서 앞뒤 단어가 바뀌면 같은 단어의 분절도 바뀝니다. 사전에 없는 단어일수록 심합니다.

진단 2 — 글자가 그냥 사라진다

접두사·접미사·조사로 분류된 조각은 검색 토큰에서 버려집니다. 그 판단이 틀리면 단어의 일부가 사라집니다.

입력 기본 설정 토큰 결과
맨홀 “맨”이 접두사로 버려짐. 홀 로 검색되는 셈
재공고 공고 “재” 탈락. 3,295건의 재공고가 모든 안내공고와 같은 급
단가계약 다+이+계약 단가 가 다+이 로
전자견적 자견
하수관로 하수+관 “로” 탈락
과업지시서 과업+지시 “서” 탈락
정보화전략계획 정보+전략+계획 “화” 탈락

반례 — 틀려도 똑같이 틀리면 산다

단가계약은 다+이+계약 으로 쪼개지는데도 기본 설정에서 상위 10건이 전부 정답이었습니다. 문서도 질의도 같은 방식으로 틀리기 때문입니다. 토크나이저가 틀린 것 자체는 검색을 죽이지 않습니다. 죽는 조건은 둘입니다.

  1. 문맥에 따라 다르게 쪼개질 때(진단 1). 문서는 A 로, 질의는 B 로 분석되면 만나지 못합니다.
  2. 탈락한 결과가 흔한 토큰과 같아질 때(진단 2). 재공고 가 공고 가 되면 정답이 수천 건의 오답 사이에 묻힙니다.

처방 세 줄

  1. 사전은 코퍼스에서 뽑습니다. 사람이 단어를 떠올려 넣는 게 아니라, 실제 문서를 분석해서 쪼개지거나 사라지는 어절을 통계로 걷어 올립니다. 이번 코퍼스에서는 2,147항이 자동으로 나왔습니다.
  2. 사라지는 단어에는 사람이 분절을 붙입니다. 맨홀, 재선충병 처럼 긴 어절 안에서만 나오는 단어는 자동 통계가 놓칩니다. 19항이 손으로 갔습니다. 자동 80, 사람 20 이 이번 실측입니다.
  3. 색인과 검색의 분석기를 나눕니다. 색인은 전체와 분절을 둘 다 넣고(decompound mixed), 검색은 사전 토큰만 씁니다(none). 질의에서 상수도관 이 상수도관+상수도+관 으로 풀리면 관 이 붙는 문서가 상위를 흐립니다.

decompound 모드만 바꾸는 것은 아무 효과가 없었습니다. 사전이 없으면 쪼갤 전체가 없기 때문입니다.

결과

질의 50개로 쟀습니다. 진단 2 의 어절로 만든 질의 15개, 진단 1 의 어절 20개, 그리고 기본 설정이 이미 잘 하는 대조군 15개. 정답은 사람이 판정하지 않고 부분문자열로 자동 판정했습니다. 질의의 어절이 제목에 모두 들어 있으면 정답입니다.

설정 P@10 R@50 MRR
Nori 기본 0.906 0.852 0.977
사전 + 색인 mixed·검색 none 0.986 0.979 1.000

대조군도 0.947 에서 1.000 으로 올랐습니다. 폐기물처리용역, 포장공사, 청소용역처럼 잘 되는 줄 알았던 질의가 실제로는 상위 50 의 64~86% 만 정답이었습니다. 검색 로그에 실패로 남지 않는 종류의 실패입니다.

크게 움직인 질의:

질의 정답 수 P@10 R@50
맨홀 정비 107 0.5 → 1.0 0.34 → 1.00
전자견적 194 0.3 → 1.0 0.14 → 1.00
재공고 3,295 0.6 → 1.0 0.60 → 1.00
소액수의 2,700 0.7 → 1.0 0.58 → 1.00
폐기물처리용역 (대조군) 6,919 0.5 → 1.0 0.64 → 1.00

맨홀 정비 를 기본 설정에서 치면 질의가 홀+정비 가 되어 “맨홀펌프장 관리권역별 원격감시 통신망 정비 공사” 같은 것이 상위에 오고 진짜 맨홀 정비공사는 뒤로 밀립니다. 사전을 붙이면 “불량맨홀 정비 단가공사”, “하수맨홀 정비공사”, “만안구 맨홀 정비공사”가 상위 5 를 채웁니다. 재공고 는 기본 설정에서 상위 5 중 3건이 그냥 입찰공고였고, 사전 뒤에는 5건 전부 재공고입니다.

모든 질의가 좋아진 것은 아닙니다. 보안관제 는 R@50 이 1.00 에서 0.86 으로 내려갔고, 소규모 수도시설 은 정답 245건 중 상위 50 의 구성이 바뀌어 0.66 이 됐습니다. 사전은 만능이 아니고, 그래서 골든셋을 동결하고 재측정하는 절차가 사전보다 먼저입니다.

한계

각주 — 동의어 (2026-09-07)

같은 컨테이너·같은 잣대로 표기와 약어 짝 20개(누리집↔홈페이지, 스쿨존↔어린이보호구역, EV↔전기차, 워크샵↔워크숍 같은 것)를 검색 분석기에만 synonym_graph 로 붙였습니다. 정답은 어느 표기든 들어 있으면 인정했습니다. 그 짝이 든 질의 24개에서 R@50 이 0.59 에서 0.96 으로, P@10 이 0.75 에서 0.92 로 갔고, 짝이 없는 대조군 10개는 상위 50 이 한 건도 안 바뀌었습니다. 이득은 소수 표기로 검색할 때 납니다 — 제목에 스쿨존은 0건, 어린이보호구역은 305건이라 스쿨존 정비 는 0 에서 0.96 이 됐습니다.

조건이 둘 있습니다. 첫째, 색인 분석기(mixed) 뒤에 붙이면 규칙 어절이 겹치는 토큰으로 분석되어 Elasticsearch 가 거부하고, lenient 를 켜면 오류 대신 규칙이 조용히 사라집니다. 검색 분석기(none) 뒤가 자리입니다. 둘째, 사전이 동의어보다 먼저입니다. 웹사이트·무인비행장치 처럼 여러 토큰으로 쪼개지는 표기는 구문 질의가 되어 희귀 토큰 점수로 원표기 문서를 밀어냅니다 — 홈페이지 개편 P@10 이 1.0 에서 0.2 로 떨어졌고, 그런 표기 8개를 사전에 넣은 뒤에야 1.0 으로 돌아왔습니다. 무정전전원장치↔UPS 는 사전 항목 없이는 규칙 자체가 거부됩니다( 가 사라지는 탈락형).

의미만 가까운 짝(유지보수↔유지관리, 리모델링↔개보수)은 이 코퍼스에서 R@50 이득이 0 이고 원표기 정밀도만 떨어졌습니다. 근거 없이 넣지 않는 편이 낫습니다. 남은 후퇴는 학습관리시스템(LMS) 처럼 두 표기를 병기한 제목이 점수를 두 배로 받는 것이고, 이름을 빌려 온 RFP↔제안요청서는 제목에 8건과 7건뿐이었습니다.

정리

한국어 검색이 틀리는 첫 자리는 토크나이저이고, 그 실패는 로그에 남지 않습니다. 고치는 순서는 실패 질의를 모아 골든셋을 동결하고, 코퍼스에서 사전을 뽑고, 사람이 탈락형을 보정하고, 색인과 검색의 분석기를 나눈 뒤, 같은 골든셋으로 다시 재는 것입니다. 이 코퍼스에서는 그 순서로 P@10 0.906 이 0.986 이 됐습니다.

검색 품질 진단은 이 절차를 고객의 코퍼스와 실패 질의에 그대로 적용하는 2주짜리 작업입니다.

실험 파일

코퍼스(공고명 183,240건)·Dockerfile·스크립트 5개·사전 2,155항·질의 50개·결과·인덱스 설정 원문이 GitHub 저장소 sizlon/nori-user-dictionary-eval 에 한 벌로 있습니다. Elasticsearch 와 Docker 가 있으면 10분 안에 같은 숫자가 나옵니다. 영문 README 에 실행 절차와 예상 출력이, README.ko.md 에 이 글이 그대로 있습니다. 동의어 실험의 규칙 26·질의 42·결과도 같은 저장소에 있습니다. 측정 스냅샷이라 저장소는 보관(읽기 전용) 상태입니다.

이 절차를 고객 코퍼스에 적용하는 서비스: 검색 품질 진단 →

20분 통화 예약