하이브리드 검색, 키워드와 의미를 한 번에 잡는 법
요약
- 키워드로 훑는 희소 검색(BM25) 과 의미로 훑는 밀집 검색(벡터) 을 함께 돌려, 한쪽이 놓치는 걸 다른 쪽이 메우도록 결과를 합치는 방식입니다.
- 두 방식의 강점과 약점이 정확히 반대입니다. 밀집은 패러프레이즈에 강하지만 정확한 용어와 희귀 토큰에 약하고, 희소는 정확한 단어와 코드에 강하지만 다른 말로 물으면 못 잡습니다.
- 동작은 세 단계입니다. 두 검색을 병렬로 돌려 각각 top-k를 뽑고, 융합하고, 필요하면 크로스인코더로 재정렬합니다.
- 관건은 융합입니다. 두 검색기의 점수 척도가 달라서 그냥 더하면 숫자 큰 쪽이 결과를 지배합니다.
- 주요 벡터 DB가 하이브리드를 기본 제공합니다. 실무에서는 융합법과 가중치를 평가로 튜닝하는 문제가 됩니다.
희소와 밀집, 서로 반대로 약하다
검색기는 크게 두 계열입니다. 하이브리드를 이해하려면 먼저 이 둘이 어디서 강하고 어디서 무너지는지를 봐야 합니다.
희소 검색(sparse)은 단어를 셉니다. 대표가 BM25입니다. 질의와 문서에 등장한 단어의 빈도를 보고 점수를 매깁니다. 역색인을 쓰기 때문에 빠르고, 무엇보다 정확한 토큰을 정확히 잡습니다. 제품코드 ERR-2004, 약어, 고유명사, 법조문 번호처럼 "이 단어가 그대로 들어 있는가"가 중요한 질의에서 강합니다.
약점은 어휘 불일치입니다. 질의와 문서가 같은 뜻을 다른 단어로 쓰면 겹치는 단어가 없어 못 잡습니다.
밀집 검색(dense)은 의미를 잽니다. 질의와 문서를 각각 임베딩 벡터로 바꾼 뒤 코사인 유사도로 가까운 것을 찾습니다. "앱이 튕긴다"와 "애플리케이션 비정상 종료"처럼 단어가 하나도 안 겹쳐도 의미가 가까우면 잡아냅니다.
약점은 반대입니다. 희귀한 정확 토큰을 하나의 의미 벡터로 뭉개서, ERR-2003과 ERR-2004처럼 비슷해 보이지만 달라야 하는 것을 잘 구분하지 못합니다.
| 희소 (BM25) | 밀집 (벡터) | |
|---|---|---|
| 매칭 기준 | 단어 빈도 | 의미, 임베딩 거리 |
| 강점 | 정확 용어, 희귀 토큰, 코드, 약어 | 패러프레이즈, 동의어, 다국어 |
| 약점 | 어휘 불일치 | 정확 토큰 변별력 부족 |
| 인프라 | 역색인 | 벡터 인덱스 (ANN) |
강점과 약점이 정확히 반대라는 게 핵심입니다. 그래서 둘을 합치면 한쪽의 구멍을 다른 쪽이 메웁니다. 이게 하이브리드 검색의 존재 이유입니다.
하이브리드가 각각을 이기는 두 장면
말로만 들으면 추상적이니 한쪽 단독이 무너지는 장면을 보겠습니다.
장면 1. 정확한 코드와 희귀 토큰이면 희소가 이깁니다.
질의가 "ERR-2004 재시도" 라고 해봅시다. 정답 문서에 ERR-2004가 그대로 박혀 있으면 BM25가 즉시 최상위로 올립니다. 반면 밀집 임베딩은 이 희귀 코드를 의미 벡터로 뭉개서 ERR-2003이나 ERR-2010 문서와 잘 구분하지 못합니다.
장면 2. 다른 말로 물으면 밀집이 이깁니다.
질의가 "앱이 자꾸 튕겨요" 인데 정답 문서엔 "애플리케이션 비정상 종료" 라고 적혀 있다고 해봅시다. 겹치는 단어가 하나도 없어 BM25는 못 잡습니다. 밀집 임베딩은 두 표현이 의미 공간에서 가까워 잡아냅니다.
이제 두 신호를 융합하면 어떻게 되는지 한 질의로 합쳐 보겠습니다.
질의: "구독 자동 갱신 해지"
| 문서 | 내용 | BM25 순위 | 벡터 순위 | 융합 결과 |
|---|---|---|---|---|
| D1 | "구독 갱신 해지 방법" (정확 용어 일치) | 1등 | 4등 | 상위 |
| D2 | "auto-renewal 끄기" (핵심어가 영문 표기) | 없음 | 1등 | 상위 |
| D3 | "결제 수단 변경 안내" (주제 어긋남) | 2등 | 8등 | 하위 |
융합하면 D1과 D2가 함께 상위로 올라옵니다. BM25 단독이면 영문 표기 D2를 통째로 놓치고, 벡터 단독이면 D1의 정확 매칭 우위를 제대로 살리지 못합니다. 하이브리드는 두 문서를 모두 건집니다.
반면 어느 신호에도 두각을 못 낸 D3는 자연스럽게 아래로 밀립니다. 여러 리스트에서 고루 상위에 오른 문서가 강하다는 원리가 그대로 나타납니다.
파이프라인 세 단계
질의
│
├──► 희소 검색 (BM25) 순위와 점수 리스트
│
└──► 밀집 검색 (벡터) 순위와 점수 리스트
│
▼
융합 (RRF 또는 가중 점수)
│
▼
크로스인코더 재정렬 (선택)
│
▼
최종 top-k
1단계 병렬 검색. 같은 질의를 희소와 밀집 검색기에 동시에 던져 각각 top-k 후보를 받습니다.
2단계 융합. 여기가 관건입니다. 문제는 두 검색기의 점수 척도가 다르다는 것입니다. BM25 점수는 상한이 없고 코사인 유사도는 0에서 1 근처라, 그냥 더하면 숫자 큰 쪽이 결과를 지배합니다.
그래서 융합에는 두 갈래가 있습니다.
순위 융합(RRF) 은 점수를 아예 버리고 순위만 더합니다. 각 문서의 순위 역수를 합쳐서 재정렬합니다.
RRF 점수 = Σ 1 / (k + rank) 보통 k = 60
척도를 맞출 필요가 없어 튜닝 부담이 적습니다. 주요 벡터 DB가 기본 융합법으로 채택하고 있습니다.
점수 융합 은 점수를 정규화한 뒤 가중치로 섞습니다.
최종점수 = alpha × 밀집점수 + (1 - alpha) × 희소점수
점수의 크기 정보를 살릴 수 있지만 정규화와 가중치를 잘 잡아야 합니다.
3단계 재정렬. 선택입니다. 융합으로 거른 상위 후보를 크로스인코더로 다시 정렬합니다. 융합이 후보를 거칠게 좁히고 재정렬이 상위 정밀도를 끌어올리는 2단 구성이 널리 쓰입니다.
조정 옵션
| 옵션 | 언제 조정하나 |
|---|---|
| 가중치 alpha | 의미 매칭이 더 중요하면 밀집 쪽으로, 정확 용어가 관건이면 희소 쪽으로 기울입니다 |
| 융합법 선택 | RRF는 척도 무관하고 견고합니다. 점수 크기가 중요하면 점수 융합을 봅니다 |
| RRF의 k | 완충 상수. 표준은 60입니다. 작으면 최상위가 결과를 압도하고, 크면 하위 순위까지 고르게 반영돼 평탄해집니다 |
| top-k 컷 | 각 검색기에서 몇 개까지 융합에 넣을지. 후보 폭과 비용의 트레이드오프 |
| 희소 방식 | 고전 BM25는 운영이 단순하고, 학습형 희소 SPLADE는 어휘 확장으로 어휘 불일치를 완화하지만 추가 모델과 역색인 운영 비용이 듭니다 |
| 재정렬 추가 | 상위 정밀도를 더 올리려면 크로스인코더를 얹습니다 |
언제 쓰고 언제 안 쓰나
적합한 곳은 의미 검색과 정확 키워드가 둘 다 중요한 도메인입니다. 법률, 의료, 기술문서, 이커머스 같은 곳이고, 실무 RAG의 기본값으로 자주 쓰입니다.
밀집 단독으로 충분한 경우도 구분해둘 필요가 있습니다. 질의가 전부 자연어 문장이고 정확 토큰 매칭이 관건이 아니라면, 두 인덱스를 운영하고 가중치를 튜닝하는 비용이 이득보다 클 수 있습니다. 이 판단은 평가로 확인합니다.
벡터 DB별 지원 방식
주요 벡터 DB와 검색엔진이 하이브리드를 기본 제공합니다. 다만 융합 방식과 기본값이 제각각이라 옮겨갈 때 그대로 동작하지 않습니다.
Qdrant는 Query API의 prefetch로 밀집과 희소 하위 질의를 각각 돌린 뒤 rrf 융합이나 분포 기반 점수 융합인 dbsf로 합칩니다.
Elasticsearch는 rrf 리트리버로 BM25 질의와 kNN 벡터 질의를 융합합니다. rank_constant가 기본 60이고, rank_window_size로 융합 전 후보 폭을 조절합니다.
Weaviate는 벡터 검색과 BM25F 키워드 검색을 융합합니다. alpha로 비중을 조절하는데 1이면 순수 벡터, 0이면 순수 키워드입니다.
Pinecone은 희소와 밀집 벡터를 함께 다룹니다. 한 인덱스에 둘 다 담으려면 메트릭을 dotproduct로 만들어야 합니다. 여기서 주의할 점이 있는데, BM25 점수가 코사인 범위로 정규화돼 있지 않아 가중치 없이 합치면 희소가 점수를 지배합니다. alpha 가중을 명시해야 합니다.
LangChain과 LlamaIndex의 하이브리드 리트리버로도 구성할 수 있습니다. 비용은 도구가 아니라 임베딩과 인프라에서 나옵니다.
마치며
핵심 세 가지로 정리합니다.
- 하이브리드 검색은 정확 용어에 강한 희소(BM25) 와 의미에 강한 밀집(벡터) 을 함께 돌려 서로의 약점을 메웁니다.
- 관건은 척도가 다른 두 결과의 융합입니다. 순위만 쓰는 RRF가 견고해서 표준이고, 점수를 정규화해 가중합하는 방식이 대안입니다.
- 대부분의 벡터 DB가 기본 제공하므로, 실무에서는 가중치와 k를 평가로 튜닝하고 필요하면 재정렬을 얹는 문제로 좁혀집니다.
용어 정리
| 용어 | 한 줄 뜻 |
|---|---|
| 하이브리드 검색 | 희소와 밀집 검색을 함께 돌려 결과를 융합하는 방식 |
| 희소 검색 (sparse) | 단어 빈도 기반 검색. 역색인 사용. 대표는 BM25 |
| 밀집 검색 (dense) | 임베딩 벡터 거리 기반 의미 검색 |
| BM25 | 단어 빈도로 관련도를 매기는 전통 전문검색 점수 함수 |
| 어휘 불일치 | 같은 뜻을 다른 단어로 써서 키워드가 안 겹치는 문제 |
| RRF | 점수 대신 순위 역수를 더해 합치는 융합법 |
| 점수 융합 | 점수를 정규화한 뒤 가중치로 섞는 융합 |
| alpha | 밀집과 희소를 섞는 비율 파라미터 |
| SPLADE | 어휘를 확장하는 학습형 희소 검색 모델 |
| 크로스인코더 | 질의와 문서를 함께 넣어 관련도를 정밀 재점수하는 재정렬 모델 |
참고자료
- Robertson & Zaragoza, "The Probabilistic Relevance Framework: BM25 and Beyond" (2009)
- Cormack, Clarke & Büttcher, "Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods" (SIGIR 2009)
- Formal, Piwowarski & Clinchant, "SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking" (SIGIR 2021, arXiv:2107.05720)
- Qdrant, Hybrid Queries 공식 문서
- Elasticsearch, Reciprocal rank fusion 공식 문서
- Weaviate, Hybrid search 공식 문서
- Pinecone, Hybrid search 공식 문서
'RAG > Retrieval' 카테고리의 다른 글
| Reranking (0) | 2025.11.12 |
|---|---|
| HNSW (0) | 2025.01.06 |
| Chunking (청킹) 이란? (0) | 2024.11.01 |
댓글