AI VIDEO BRIEFING

하이브리드 RAG 검색 완전 정복 — BM25·임베딩·RRF·리랭커 직접 구현

키워드 검색 BM25와 밀집 임베딩을 RRF로 합치고 리랭커를 더해, 벡터 DB 없이도 NDCG로 평가 가능한 프로덕션급 하이브리드 RAG 검색을 처음부터 구현하는 과정을 정리했다.

BM25 + 임베딩 + 리랭커: 처음부터 만드는 프로덕션급 하이브리드 RAG 검색 영상 대표 이미지

핵심 메시지

  • 하이브리드 검색은 키워드 기반 BM25(희소 검색)와 의미 기반 밀집 임베딩(dense)을 결합한다. 둘은 서로의 약점을 정확히 보완한다.
  • 서로 척도가 다른 두 검색 결과는 점수가 아니라 '순위'만으로 합치는 RRF(상호 순위 융합, k=60)로 결합한다.
  • 코히어(Cohere) 같은 크로스 인코더 리랭커를 마지막에 얹으면 NDCG@10 기준 점수가 크게 뛴다(이 데이터셋에서 약 47까지).
  • 100만 청크 이하 규모라면 벡터 DB 없이 NumPy 배열을 디스크에 저장해 메모리에서 검색해도 충분하다.
  • 제대로 평가하려면 BEIR 같은 정답 데이터셋이 필요하며, 없을 때는 LLM으로 문서마다 질문을 생성해 자체 평가셋을 만들 수 있다.

쉽게 이해하기

이 튜토리얼은 'RAG가 무엇인지'는 알지만 직접 만들고 최적화·평가해 본 적 없는 엔지니어를 대상으로, BM25·밀집 임베딩·RRF·리랭커를 처음부터 조립해 프로덕션급 하이브리드 검색 시스템을 만든다. 출발점은 데이터다. 정답이 라벨링된 BEIR 벤치마크의 금융 QA 데이터셋(질의·코퍼스·관계 쌍)을 사용해, 검색 품질을 객관적으로 측정할 기준을 먼저 확보한다.

첫 단계는 BM25다. 키워드 중첩과 TF-IDF 방식 가중치로 점수를 매기는 희소 검색으로, 정확한 용어·식별자·희귀 단어에는 강하지만 표현이 바뀐 의역에는 약하다. bm25s 라이브러리로 코퍼스를 토큰화하고 인덱스를 만들면 5만 7천 문서가 33MB 디스크 파일로 저장되며, 별도 데이터베이스 없이 1~2초 만에 인덱싱이 끝난다.

두 번째 단계는 밀집 임베딩이다. OpenAI의 text-embedding-3-small(1,536차원)로 코퍼스를 벡터화한다. 핵심은 벡터 DB를 쓰지 않고 NumPy 배열(.npy, 약 350MB)로 디스크에 저장한다는 점이다. 정규화된 벡터끼리는 코사인 유사도가 단순 내적(dot product)으로 계산되므로, NumPy 행렬 곱만으로 전체 코퍼스에 대한 유사도 검색을 직접 구현한다. 밀집 검색은 의역과 의미에 강해 BM25가 약한 지점을 정확히 메운다.

세 번째 단계는 두 결과를 합치는 RRF(상호 순위 융합)다. BM25의 코사인 점수와 밀집 검색의 유사도 점수는 척도가 달라 직접 비교할 수 없으므로, 점수 대신 순위만 사용한다. 원 논문에서 제시된 평활 상수 k=60을 그대로 써서 각 문서의 1/(k+순위)를 더해 통합 순위를 만든다. 네 번째 단계로 코히어의 rerank v4 fast 크로스 인코더를 얹어, 질의와 후보 문서를 함께 보고 최종 순서를 재정렬한다.

마지막은 평가다. 정보 검색의 표준 지표 NDCG@10으로 측정하면, 이 데이터셋에서 BM25 단독은 약 28, 밀집 검색은 더 높고, RRF 결합은 그 중간이지만, 여기에 리랭커를 더하면 약 47로 크게 뛴다. 다만 모든 코퍼스에 전체 스택이 필요한 것은 아니며, 실험으로 최적 조합을 찾아야 한다. 실무에서는 정답 데이터셋이 없으므로, 각 문서를 LLM에 넣어 '이 문서로 답할 수 있는 현실적인 질문'을 생성해 자체 평가셋을 구축하라고 조언한다.

주요 인사이트

  • BM25와 밀집 임베딩은 한쪽이 이기는 지점에서 다른 쪽이 정확히 지는 상호 보완 관계라서, 결합했을 때 시너지가 크다.
  • 서로 다른 검색 알고리즘의 결과를 합칠 때는 비교 불가능한 점수 대신 순위를 쓰는 RRF가 단순하면서도 효과적인 표준 기법이다.
  • 100만 청크 이하의 현실적 규모에서는 벡터 DB의 복잡성 없이 NumPy 배열을 메모리에 올려 내적으로 검색하는 편이 더 간결하다.
  • 리랭커라는 '한 줄 추가'가 NDCG를 크게 끌어올린다는 점은, 검색 품질이 '어떤 질문에 어떤 문서가 뜨는가'라는 미세한 순위 차이에 달려 있음을 보여준다.
  • AI로 한 방에 시스템을 찍어내기는 쉬워졌지만, 토큰 ID·어휘 매핑·정규화 같은 내부 동작을 직접 만져 보지 않으면 최적화와 디버깅이 불가능하다.

자주 묻는 질문

하이브리드 검색에서 BM25와 밀집 임베딩의 차이는?

BM25는 키워드 중첩 기반의 희소 검색으로 정확한 용어·식별자·희귀 단어에 강하지만 의역에 약하다. 밀집 임베딩은 의미를 벡터로 포착해 표현이 달라진 질문에 강하다. 둘은 서로의 약점을 보완한다.

척도가 다른 두 검색 결과를 어떻게 합치나?

RRF(상호 순위 융합)를 쓴다. 비교 불가능한 점수 대신 각 검색의 순위만 사용해 1/(k+순위)를 더하며, 원 논문의 평활 상수 k=60을 그대로 적용한다.

반드시 벡터 데이터베이스가 필요한가?

아니다. 약 100만 청크 이하라면 임베딩을 NumPy 배열(.npy)로 디스크에 저장하고 메모리에 올려 정규화된 벡터의 내적으로 검색하면 충분하다. 영상의 5만 6천 문서 임베딩도 약 350MB에 불과하다.

정답 데이터셋이 없을 때 검색 품질을 어떻게 평가하나?

각 문서를 LLM에 넣어 '이 문서로 답할 수 있는 현실적인 질문'을 생성하게 하면, 질의·문서·관계로 구성된 자체 평가셋을 만들 수 있다. 이를 NDCG로 측정해 개선한다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식