Dense 검색은 의미를 이해하지만 정확한 키워드를 놓치고, BM25는 키워드를 정확히 찾지만 동의어를 인식하지 못합니다. 하이브리드 검색은 두 방식의 결과를 결합하여 서로의 약점을 보완합니다. 이 페이지에서는 왜 단순 결합이 어려운지, RRF가 이를 어떻게 해결하는지를 구체적으로 다룹니다.
왜 둘 다 필요한가: 구체적 실패 사례
Dense만 사용할 때의 실패
Sparse(BM25)만 사용할 때의 실패
주의 실무에서 가장 흔한 실수: “Dense 검색이면 충분하다”고 판단하고 BM25를 생략하는 것입니다. 고유명사, 제품 코드, 오류 메시지 등 정확한 문자열 매칭이 중요한 쿼리 가 전체의 20-40%를 차지하는 경우가 많습니다.
점수 결합의 어려움: 왜 단순히 더할 수 없는가
두 검색 결과를 합치려면 점수를 비교해야 합니다. 하지만:(x - min) / (max - min))를 적용하려면 해당 쿼리의 최솟값/최댓값을 알아야 합니다. 하지만 쿼리 “Delta Lake”는 BM25 점수가 0(x - μ) / σ)도 마찬가지로, 점수 분포의 평균(μ)과 표준편차(σ)가 쿼리마다 크게 달라 쿼리 간 비교가 불안정 합니다. 이것이 점수 기반 결합이 실무에서 잘 동작하지 않는 근본적 이유입니다.
RRF (Reciprocal Rank Fusion) 상세
핵심 아이디어: 점수 대신 순위(rank)를 사용
RRF는 점수의 절대값을 무시하고, 각 검색 방식에서의 순위 만을 사용합니다. 순위는 1, 2, 3, … 으로 항상 같은 스케일이므로 결합이 자연스럽습니다.수식
k=60의 의미
k 값은 상위 순위와 하위 순위의 차이를 얼마나 부드럽게 할 것인지 조절합니다:예시: 어느 문서가 최종 상위?
참고 비유: 두 명의 심사위원이 독립적으로 순위를 매긴 후, 양쪽 모두에게 높은 평가를 받은 후보를 최종 선발합니다. 한 심사위원에게만 극찬받은 후보보다, 두 심사위원 모두에게 좋은 평가를 받은 후보가 선발됩니다.
Databricks Vector Search의 하이브리드 검색
Databricks Vector Search는query_type="hybrid" 설정으로 하이브리드 검색을 지원합니다:
현재 제약 사항과 해결
| 제약 | 설명 | 해결 방법 |
|---|---|---|
| BM25 가중치 조절 불가 | Dense:Sparse 비율을 직접 조절할 수 없음 | 현재는 기본 RRF에 의존 |
| 한국어 토큰화 | 내장 BM25가 공백 기반 토큰화 사용 | Kiwi 전처리 후 토큰화된 텍스트를 별도 컬럼으로 저장 |
| 필터 + 하이브리드 | 필터 조건과 하이브리드를 동시에 적용 시 성능 이슈 가능 | 필터 범위를 좁게 설정 |
참고 실무 팁: 한국어 환경에서 Databricks VS의 하이브리드 검색 BM25 품질을 높이려면, 원본 텍스트와 함께 Kiwi로 형태소 분석한 텍스트를 별도 컬럼에 저장하고, 해당 컬럼을 BM25 소스로 지정하는 방법을 고려하세요. 자세한 내용은 한국어 RAG 최적화를 참고하세요.
다음: 검색 결과를 더 정밀하게 정렬하고 싶다면? → Re-ranking