하이브리드 검색: BM25와 밀집 벡터를 Reciprocal Rank Fusion으로 결합하기 (공유 스케일 없음)
요약
BM25의 어휘 기반 검색과 밀집 벡터 검색을 Reciprocal Rank Fusion(RRF)으로 결합하는 하이브리드 검색 기법을 설명합니다. 점수 스케일 차이 문제를 해결하기 위해 순위 기반의 RRF를 사용하거나 정규화 후 가중 합을 사용하는 방법을 다룹니다.
핵심 포인트
- BM25는 키워드 일치에 강하고, 밀집 벡터는 의미적 유사성에 강함
- RRF는 점수 스케일과 관계없이 순위만을 사용하여 두 리스트를 효과적으로 결합
- 가중 합 방식 사용 시 BM25의 원시 점수가 벡터 점수를 압도하지 않도록 정규화 필수
- 하이브리드 검색은 재현율을 높이고, 리랭커는 정밀도를 개선함
현대의 검색 시스템에는 각각 절반만 보이는 두 가지 강력한 도구가 있습니다. **어휘 기반 검색(Lexical search, BM25)**은 실제 단어를 일치시킵니다. 정확한 키워드, 제품 코드, 오류 ID 및 희귀 기술 용어에서는 타의 추종을 불허하지만, 문자 그대로 작동하기 때문에
Reciprocal Rank Fusion (RRF)은 점수를 버립니다. 점수들은 서로 호환되지 않는 스케일(BM25는 0수십 단위, 코사인 유사도는 01 단위)에 존재하기 때문입니다. 대신 RRF는 문서가 나타나는 모든 리스트에 대해 1/(k + rank)를 더합니다. 어디에서든 1위를 차지한 문서는 큰 투표권을 얻습니다. 두 리스트 모두에서 괜찮은 순위를 기록하는 것도 점수가 쌓입니다. 특정 리스트에서 검색되지 않은 문서는 해당 리스트로부터 단순히 0을 기여합니다.
def rrf(rankings, k=60):
score = {}
for ranked in rankings: # 예: [lex, dense]
...
각 정답이 한 리스트에서 1위였기 때문에, 각각은 최고치인 1/(k+1)의 투표를 얻어 두 리스트 모두에서 상위로 떠오릅니다. 작은 k 값은 1위 기록이 지배하도록 만들고, 큰 k 값은 투표를 평탄화하여 리스트 간의 일치 여부가 더 중요하게 작용하도록 합니다.
대안, 그리고 정규화의 함정
α·BM25 + (1−α)·dense 방식을 통해 점수를 직접 결합할 수도 있습니다. 하지만 최소-최대 정규화 (min-max normalize) 없이는, 어떤 α를 선택하더라도 BM25의 원시 크기(raw magnitude)가 코사인 유사도를 압도해 버립니다. 먼저 각 리스트를 0–1 사이로 정규화하면 α는 실제 조절 가능한 다이얼이 됩니다. 가중 합 (weighted sum)은 신중하게 정규화하고 α를 튜닝하면 RRF보다 성능이 좋을 수 있지만, 그 보정(calibration) 작업이야말로 RRF가 순위만을 사용함으로써 생략할 수 있게 해주는 바로 그 지점입니다.
이것이 실제 모습입니다: Weaviate, Elasticsearch/OpenSearch, Qdrant, Milvus, 그리고 pgvector는 모두 RRF가 내장된 네이티브 BM25+벡터 하이브리드 검색을 제공합니다. 하이브리드 검색은 재현율 (recall)을 해결하고 (두 답변 모두 검색됨), 그 이후에 적용되는 리랭커 (reranker)는 LLM이 단어를 읽기 전에 정밀도 (precision)를 해결합니다 (가장 좋은 답변이 1위에 위치함).
라이브 엔진을 직접 시도해 보세요 — 쿼리, 융합 방법, 그리고 정규화 토글을 바꿔가며 테스트할 수 있습니다: https://dev48v.infy.uk/ai/days/day57-hybrid-search.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기