“RAG 가 엉뚱한 답을 낸다”는 문의의 대부분은 생성 모델의 문제가 아닙니다. 답에 필요한 문서가 검색 결과에 없었던 것입니다. 그리고 한국어에서 문서가 검색에 안 잡히는 이유는 대개 토크나이저에서 시작합니다. 토크나이저는 문서와 질의를 토큰으로 쪼개는 첫 단계라, 여기서 어긋나면 그 위에 BM25 를 올리든 벡터를 올리든 문서는 나오지 않습니다.
말로만 하면 누구나 하는 얘기라, 숫자로 재 봤습니다.
무엇을 쟀나
- 문서: 나라장터 공고명 183,240건. 개찰 데이터에서 공고번호로 중복을 제거한 것으로, 용역 11만·공사 7만 건입니다. 제목 길이 중앙값은 27자입니다.
- 엔진: Elasticsearch 9.5.2 에 한국어 형태소 분석기 Nori 를 붙인 단일 노드. 질의는
match기본값(OR, BM25). 대부분의 팀이 처음 배포하는 그대로입니다. - 비교: Nori 기본 설정 한 벌과, 이 코퍼스에서 뽑은 사용자 사전을 붙인 설정 한 벌.
사전은 질의나 정답을 보고 만들지 않았습니다. 제목 전체를 기본 설정으로 분석해서, 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). 문서는 A 로, 질의는 B 로 분석되면 만나지 못합니다.
- 탈락한 결과가 흔한 토큰과 같아질 때(진단 2). 재공고 가 공고 가 되면 정답이 수천 건의 오답 사이에 묻힙니다.
처방 세 줄
- 사전은 코퍼스에서 뽑습니다. 사람이 단어를 떠올려 넣는 게 아니라, 실제 문서를 분석해서 쪼개지거나 사라지는 어절을 통계로 걷어 올립니다. 이번 코퍼스에서는 2,147항이 자동으로 나왔습니다.
- 사라지는 단어에는 사람이 분절을 붙입니다. 맨홀, 재선충병 처럼 긴 어절 안에서만 나오는 단어는 자동 통계가 놓칩니다. 19항이 손으로 갔습니다. 자동 80, 사람 20 이 이번 실측입니다.
- 색인과 검색의 분석기를 나눕니다. 색인은 전체와 분절을 둘 다 넣고(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 이 됐습니다. 사전은 만능이 아니고, 그래서 골든셋을 동결하고 재측정하는 절차가 사전보다 먼저입니다.
한계
- 제목만 있는 코퍼스입니다. 본문과 첨부까지 색인하는 검색은 토큰이 많아 효과가 희석될 수 있습니다.
- 정답이 자동 판정입니다. 사람이 보면 정답인 문서를 놓치고, 우연히 단어가 들어간 문서를 정답으로 셉니다. 두 설정에 같은 잣대를 댔으므로 차이는 믿을 만하고, 절대값은 낮춰 봐야 합니다.
- 골든셋이 진단이 지목한 어절 중심입니다. 임의의 질의 100개로 재면 개선 폭은 이보다 작습니다. 대조군 15개가 그 하한입니다.
- 동의어는 이 글의 사전 위에 따로 쟀습니다. 아래 각주.
각주 — 동의어 (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·결과도 같은 저장소에 있습니다. 측정 스냅샷이라 저장소는 보관(읽기 전용) 상태입니다.