← Resources
By Sora Kashiwagi
— Senior Engineer, Vector Search
·
· TUTORIAL
하이브리드 검색: RAG를 위한 BM25와 벡터 검색 결합
키워드(BM25)와 벡터 검색은 정반대 방식으로 실패하는데, 바로 그 점이 프로덕션 RAG가 둘을 결합하는 이유다. 이 가이드는 두 방법의 원리, 퓨전(RRF)이 결과를 합치는 방식, 리랭킹의 역할, 그리고 하이브리드가 순수 벡터 검색을 의미 있게 능가하는 시점을 설명한다.
서로 다른 방식으로 실패하는 두 종류의 검색
BM25(어휘 또는 키워드 검색)는 정확한 단어 일치를 기준으로 문서에 점수를 매기며, 희귀한 단어에 더 높은 가중치를 부여하고 길이에는 페널티를 준다. 결정론적이며 역색인 위에서 동작한다. 벡터(시맨틱) 검색은 쿼리와 문서를 밀집 임베딩으로 인코딩하고 최근접 이웃 유사도로 검색하여, 언어를 넘어서도 의미·동의어·바꿔쓰기를 포착한다.
이 둘의 약점은 서로 거울상이다. BM25는 동의어와 개념을 놓친다: "database memory issues" 쿼리는 단어가 다르면 "cache eviction policies"라는 제목의 페이지를 찾지 못한다. 반면 벡터 검색은 정확한 토큰——두문자어, SKU, 오류 코드, ID, 모델 번호——을 놓치고 시맨틱 드리프트를 겪는다. 예를 들어 "Nike running shoes" 쿼리에 임베딩상으로는 가깝지만 잘못된 "Adidas running shoes" 결과를 반환한다. 실패 방식이 서로 보완적이기 때문에 어느 하나만으로는 충분하지 않다.
하이브리드 검색이 하는 일
하이브리드 검색은 어휘(BM25)와 밀집(벡터) 검색을 병렬로 실행한 뒤, 두 개의 순위 결과 목록을 하나로 합친다. 바로 이 합치기 단계가 흥미로운 부분인데, BM25 점수와 벡터 유사도 점수는 완전히 다른 척도에 있어 단순히 더할 수 없기 때문이다.
그래서 대표적인 퓨전 방법인 Reciprocal Rank Fusion (RRF)은 원시 점수가 아니라 순위 위치만 사용한다. 각 문서의 퓨전 점수는 두 검색기 전체에 걸쳐 1을 (k에 해당 순위를 더한 값)으로 나눈 값의 합이며, k는 작은 상수(일반적으로 60; 일부 연구는 20 사용)다. 점수 분포를 완전히 무시하므로 RRF는 정규화가 필요 없고 "바로 사용 가능"하다——이것이 대부분의 벡터 데이터베이스에서 기본값인 이유다.
RRF 대 가중 퓨전
RRF가 유일한 선택지는 아니다. 가중(alpha) 퓨전은 두 점수 세트를 정규화한 뒤 조정 가능한 가중치로 블렌딩한다: alpha 0은 순수 키워드, 1은 순수 벡터, 0.5는 균등이며, 기본값은 흔히 시맨틱 쪽으로 약 0.75에 설정된다. 일부 엔진은 상대 점수 퓨전과 분포 기반 퓨전도 제공한다.
트레이드오프는 이렇다: RRF는 견고하고 파라미터가 적어, 코퍼스별 튜닝을 원치 않을 때 이상적이다. 가중 퓨전은 조정 다이얼을 제공한다——식별자가 많은 기술 콘텐츠에서 정확한 단어 일치를 우선하려면 alpha를 낮추고, 자연어 질문에서 시맨틱을 우선하려면 alpha를 높인다. 우선 RRF로 시작하고, 한쪽 검색기로 편향시킬 명확한 이유가 생기면 가중 퓨전을 꺼내 쓰라.
리랭킹의 위치
하이브리드 검색은 첫 번째 단계이고, 리랭킹은 두 번째 단계다. 빠른 검색기(BM25, 벡터 또는 하이브리드)가 후보 집합을 가져오면, 크로스 인코더가 쿼리와 문서를 완전한 크로스 어텐션으로 한 번의 패스에서 함께 인코딩하여 각 후보를 다시 채점한다. 크로스 인코더는 첫 단계 검색기보다 훨씬 정확하지만 전체 코퍼스에 대해 실행하기에는 비용이 너무 크므로, 상위 k개 후보만 재채점한다.
따라서 표준 프로덕션 파이프라인은 다음과 같다: 하이브리드 검색(BM25 + 벡터, RRF로 퓨전) → 크로스 인코더 또는 LLM 리랭커 → 상위 결과를 모델 컨텍스트에 입력. 각 단계는 가장 잘하는 일을 맡는다——먼저 재현율, 마지막에 정밀도.
실제로 도움이 될까? 그리고 osFoundry에서 구축하기
성능 향상은 실제로 존재하지만 데이터에 따라 다르다. Elastic의 BEIR 연구에 따르면 RRF 하이브리드는 BM25 단독 대비 평균 NDCG@10을 약 18% 끌어올렸고, 강력한 학습형 인코더 대비로는 더 작은 차이로 앞섰으며, 테스트한 모든 데이터셋에서 BM25와 동등하거나 더 나은 결과를 보였다. 밀집 모델이 개선됨에 따라 하이브리드의 한계 이득은 좁아졌으며——도메인 내 데이터에서는 흔히 몇 퍼센트 수준이다——그럼에도 도메인 외 코퍼스, 희귀 단어, 자연어와 정확한 식별자가 뒤섞인 쿼리에서는 여전히 가장 큰 효과를 낸다. 하이브리드는 프로덕션 기본값으로 남아 있다.
osFoundry의 커스텀 RAG 파이프라인은 이를 블랙박스가 아니라 조립 가능한 단계로 노출한다: BM25 단계와 벡터 단계가 병렬로 실행되고, 퓨전 단계(기본은 RRF, 옵션으로 가중 퓨전)가 이를 합치며, 리랭킹 단계가 모델에 도달하기 전에 결과를 다듬는다. config에서 지식 베이스별로 어휘 대 시맨틱 균형을 조정할 수 있어, 배관 코드를 직접 작성하지 않고도 retrieve-fuse-rerank 패턴을 그대로 구현할 수 있다.
Frequently asked questions
- 키워드 검색과 시맨틱 검색의 차이는 무엇인가요?
- BM25 같은 키워드(어휘) 검색은 정확한 단어를 일치시키고 희귀 단어에 가중치를 준다——정확하지만 동의어에는 맹점이 있다. 시맨틱(벡터) 검색은 의미를 임베딩에 인코딩하고 유사도로 일치시키므로 바꿔쓰기와 관련 개념을 포착하지만, ID나 오류 코드 같은 정확한 토큰은 놓칠 수 있다. 두 방법은 서로 반대되는 상황에서 강점을 발휘한다.
- 하이브리드 검색이란 무엇인가요?
- 하이브리드 검색은 키워드(BM25)와 벡터 검색을 병렬로 실행하고 퓨전 알고리즘으로 두 순위 결과를 하나의 목록으로 합친다. 두 방법이 서로 다른 방식으로 실패하기 때문에 존재한다——벡터는 동의어와 개념을 처리하고, BM25는 정확한 단어, 식별자, 희귀 전문 용어를 잘 포착한다——따라서 결합하면 재현율과 정밀도가 모두 향상된다.
- Reciprocal Rank Fusion (RRF)이란 무엇인가요?
- RRF는 원시 점수가 아니라 순위 위치만 사용해 두 순위 목록을 합친다. 각 문서의 퓨전 점수는 검색기 전체에 걸쳐 1을 (k에 해당 순위를 더한 값)으로 나눈 값의 합이며, k는 작은 상수(일반적으로 60)다. BM25와 벡터 검색의 호환되지 않는 점수 척도를 무시하기 때문에 정규화가 필요 없고 바로 사용해도 잘 작동한다.
- 하이브리드 검색이 순수 벡터 검색보다 나은 때는 언제인가요?
- 쿼리가 자연어와 정확한 식별자를 뒤섞거나, 희귀하거나 도메인 특화된 전문 용어를 쓰거나, 도메인 외 콘텐츠에서 실행되거나, 다국어인 경우다. 순수 벡터 검색은 잘 임베딩된 도메인 내 데이터에 대한 순수 개념적 질문에는 충분할 수 있다. 코드와 제품명으로 가득한 기술 지식 베이스에서는 하이브리드가 분명히 더 낫다.
- 벡터 검색이 정확한 단어와 ID를 놓치는 이유는 무엇인가요?
- 임베딩은 텍스트를 고정 크기 벡터로 압축하여 의미를 포착하지만 정확한 철자는 포착하지 못한다. 그래서 오류 코드, SKU, 두문자어 같은 희귀 토큰은 뭉개져 사라진다——이 특성을 때로 구조적 맹점이라고 부른다. 모델은 어떤 구절이 무엇에 관한 것인지는 알지만, 검색한 문자열 그대로가 들어 있는지는 알지 못한다. 바로 그것이 BM25가 잘하는 부분이다.
- RRF와 가중 퓨전 중 어느 것을 써야 하나요?
- RRF로 시작하라: 견고하고 파라미터가 적으며 코퍼스별 튜닝이 필요 없다. 한쪽 검색기로 편향시킬 명확한 이유가 있을 때 가중(alpha) 퓨전으로 전환하라——식별자가 많은 콘텐츠에서 정확한 단어 일치를 선호하려면 낮은 alpha, 자연어 질문에서 시맨틱을 선호하려면 높은 alpha를 사용한다.
- 하이브리드 검색이 지연 시간이나 비용을 늘리나요? 그만한 가치가 있나요?
- 검색 두 번과 퓨전 단계를 실행하므로 약간의 오버헤드가 있고, 리랭킹을 더하면 그만큼 더 늘어난다. 대부분의 RAG 시스템에서는 특히 기술 콘텐츠나 혼합 콘텐츠 코퍼스에서 재현율과 정밀도 향상이 그 비용을 정당화한다. 잘 임베딩된 순수 개념적 데이터에서 지연 시간이 중요하다면 순수 벡터로 충분할 수 있다——자신의 쿼리로 측정해 보라.
Sources