RAG 개선안 중 가장 싼 것부터 쓰는 게 맞다. 그리고 가장 싼 것은 LLM 호출을 늘리지 않는 것들 — 순서 바꾸기, 하이브리드 검색, 리랭킹이다. 이 글은 검색 레이어 자체를 다룬다. 결론부터 말하면 BM25는 아직 안 죽었고, 한국어에서는 더 안 죽었다.
같은 모델로 통제한 비교: 하이브리드는 언제 이기나
BGE-M3는 하나의 모델이 dense·sparse·multi-vector 세 점수를 동시에 내기 때문에, 모델을 바꾸지 않고 검색 방식만 바꾼 비교가 가능하다. nDCG@10 기준:
| 벤치마크 | BM25 | Dense | Sparse | Dense+Sparse |
|---|---|---|---|---|
| MIRACL (짧은 질의) | 31.9 | 69.2 | 53.9 | 70.4 |
| MLDR (장문 문서) | 53.6 | 52.5 | 62.2 | 64.8 |
짧은 질의에서 하이브리드 이득은 +1.2점뿐이지만 장문 문서에서는 dense 52.5 → 64.8로 +12.3점이고, 무엇보다 BM25(53.6)가 dense(52.5)를 이긴다. 사내 위키·계약서·매뉴얼처럼 문서가 긴 RAG라면 하이브리드는 선택이 아니다. Fudan의 전수 비교도 같은 방향이다 — TREC DL19 mAP가 BM25 30.13에서 하이브리드 47.14로 오르는데 지연은 0.07초 → 3.20초, 그리고 여기에 HyDE를 얹으면 52.13이지만 11.16초다(④편).
dense가 구조적으로 못 잡는 것들
Azure의 문서는 키워드가 유리한 경우를 못 박아 뒀다 — 제품 코드, 고도로 전문화된 은어, 날짜, 사람 이름. 국내 사례가 더 생생하다. 컬리가 사내 문서 RAG를 두 번 갈아엎은 기록에서:
- 역인덱스만 쓰던 1차에서는 "샛별"과 "새벽배송"이 매칭되지 않았다 — dense가 필요한 지점.
- 임베딩만 쓴 2차에서는 "DOS-bot", "TICKET-1234" 같은 약어·식별자가 서브워드로 분해되며 의미를 잃었다 — BM25가 필요한 지점.
- 결정적으로, 문서의 약 85%가 임베딩 모델의 512토큰 한도를 넘어 앞부분만 색인되고 있었다.
- 최종안은 요약 임베딩 + 본문 BM25 하이브리드(시맨틱 top3 + 키워드 top2 병합).
마지막 항목이 한국어의 함정이다. 한글은 토큰 효율이 나빠 900자만 넘어도 512토큰을 넘긴다. 임베딩 모델을 고를 때 컨텍스트 길이도 기준이어야 한다 — gemini-embedding-001은 2,048토큰, BGE-M3는 8,192, voyage-4는 32,000이다.
합치는 방법: RRF는 기본값이지 정답이 아니다
Elasticsearch의 RRF는 1/(60+rank)로 두 순위를 합치고 "튜닝이 필요 없다"고 홍보한다. 그런데 Amazon의 융합 함수 분석은 반대 결론이다 — RRF가 오히려 파라미터에 민감하고, 가중 점수 합(convex combination)이 도메인 안팎 모두에서 더 강건하며 튜닝할 파라미터가 하나뿐이라 소량 샘플로 맞출 수 있다. Weaviate는 v1.24부터 relativeScoreFusion을 기본값으로 바꾸며 FIQA에서 recall 약 +6%를 근거로 들었다. 평가셋 100~200건만 있으면 가중치 하나 튜닝으로 얻는 공짜 이득이다.
리랭커: 후보를 좁힌 뒤에만
- 한계효용: Anthropic 측정에서 top-20 검색 실패율은 임베딩만 5.7% → 하이브리드 2.9% → 리랭킹 1.9%. 하이브리드가 절반을 줄이고 리랭커가 남은 것의 1/3을 더 줄인다. 순서는 반드시 하이브리드 먼저.
- 리랭커는 정확도가 아니라 지연으로 고른다: 같은 Fudan 실험에서 TILDEv2 MRR@10 27.83에 0.02초, monoT5 31.78에 4.5초, RankLLaMA 32.35에 82.4초. 제일 정확한 모델이 온라인 서빙 불가다.
- 작아도 된다: Qwen3-Reranker는 4B(MTEB-R 69.76)와 8B(69.02)가 사실상 동급이고, 0.6B만으로도 같은 크기 임베딩 대비 MTEB-R +4.0, 장문(MLDR) +17.0을 얹는다.
- 과금 단위를 확인하라: Cohere는 건당(Bedrock 기준 1,000쿼리당 $2.00)인데 "1 search = 질의 1 + 문서 최대 100개"이고 500토큰 넘는 문서는 청크마다 1문서로 카운트된다. Voyage는 토큰당(rerank-2.5 $0.05/1M). 긴 청크를 많이 넣으면 유불리가 뒤집힌다.
한국어 검색의 두 갈래 준비물
BM25 쪽은 형태소 분석기가 곧 품질이다. Nori(mecab-ko-dic)는 Elasticsearch 기본이지만 사전이 고정적이고, Kiwi는 오타 교정과 사전 갱신이 있으며 정확도는 웹문서 약 87%·문어체 약 94%다. LY의 일본어 사례가 교훈적이다 — 모델번호 "AW-10DP3"이 "AW/10/DP/3"으로 쪼개졌다. 상품코드·티켓번호·식별자는 형태소 분석에서 빼고 keyword 필드로 따로 색인해야 한다.
Dense 쪽은 기본값을 의심해야 한다. 고려대 KURE 리더보드의 한국어 8종 평균 nDCG@10은 KURE-v1 0.695 > BGE-m3 0.687 > multilingual-e5-large 0.664 > OpenAI text-embedding-3-large 0.617. 다만 평균으로 고르지 말 것 — 데이터셋별 편차가 모델 편차보다 훨씬 크고(XPQA는 최고가 0.444, Belebele은 최저가 0.895), 상위 두 모델 격차는 0.3% 수준이라 임베딩 교체로 얻을 게 많지 않다. 예산은 파싱과 리랭커에 쓰는 편이 낫다(③편). 마지막으로 토스의 경고 — 임베딩 모델 교체는 인덱스 전면 리빌드이고, 호환 안 되는 벡터가 섞이지 않게 버전 관리 인프라가 따로 필요하다. 다음 글은 색인 단위를 손보는 계층이다.
— RAG 종류 총정리 시리즈 ② / 다음 글: 청킹·Contextual Retrieval·파싱 — 색인 단위를 똑똑하게
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.