15

Hybrid Search 엔진 구현

Day 2: Hybrid Search

학습 목표
  • 한국어 형태소 분석기로 조사·어미를 제거하고 빈도를 보존하는 BM25 토크나이저를 만들 수 있다
  • BM25 + Semantic Search를 결합하는 코드를 작성할 수 있다
  • Score Fusion과 RRF 두 가지 결합 방법을 구현할 수 있다
  • 제조 쿼리 유형별 적응형 가중치를 설정하고 그 근거를 설명할 수 있다

Hybrid Search 엔진 구현

BM25와 Semantic Search를 결합하는 Hybrid Search를 구현하자. 두 가지 결합 방법(Score Fusion, RRF)을 모두 만들고 비교한다.

목표

  1. 한국어 형태소 토크나이저 (조사·어미 제거, 빈도 보존)
  2. BM25 인덱스 구축
  3. Score Fusion (가중 합산) 구현
  4. RRF (Reciprocal Rank Fusion) 구현
  5. 쿼리 유형별 적응형 가중치

먼저: 공백 분리가 무엇을 놓치는지 직접 재라

Day 1 영상은 형태소 분석 없는 한국어 BM25 는 재현율이 떨어진다고 경고했다. 말로 믿지 말고 숫자로 확인한다. 해답 코드의 compare_tokenizers() 는 같은 코퍼스를 공백 분리와 형태소 분석 두 방식으로 색인해 BM25 점수를 나란히 찍는다. OpenAI 키 없이 pip install rank-bm25 kiwipiepy 만으로 돌아간다.

질의는 "베어링 교체 주기"이고 정답은 doc0 이다. 확인할 것 두 가지다.

  • 공백 분리에서 doc0 이 1위인가? 아니라면 무엇이 doc0 을 밀어냈는가?
  • doc0 의 토큰 목록에서 '베어링의'·'베어링을'이 어떻게 처리되었는가?

먼저 돌려 보고, 그 결과를 근거로 아래 토크나이저를 설계하라.

아래 스타터 코드를 완성하세요.

에디터 로딩 중...
힌트 보기
  • 한국어 토크나이저는 kiwipiepy 를 쓴다 (pip install kiwipiepy). 뺄 태그를 나열하지 말고 남길 내용어 태그를 나열하면 조사를 빠뜨리지 않는다
  • 토큰 목록에서 중복을 제거하면 문서 내 빈도가 전부 1 이 되어 k1 포화 곡선이 사라집니다
  • BM25Okapi는 토크나이즈된 코퍼스(2D list)를 생성자에 전달합니다
  • ChromaDB의 distance를 similarity로 변환: similarity = 1 - distance
  • Score Fusion 전에 반드시 Min-Max 정규화를 적용하세요 (BM25와 cosine의 스케일이 다릅니다)
  • RRF에서 검색 결과에 없는 문서의 순위는 initial_k + 1로 설정합니다
정답 보기
에디터 로딩 중...
AI로 학습하기 — 꿀팁
BM25+Semantic 결합 코드 생성AI 학습 팁

BM25와 임베딩 검색 점수를 RRF로 융합하는 Hybrid Search 클래스를 AI로 스캐폴딩하세요. 제조 설비 고장 매뉴얼 검색에 맞게 가중치 파라미터를 노출하도록 요청하세요.

제조 설비 고장 매뉴얼을 검색하는 Hybrid Search 엔진을 Python으로 구현해줘. BM25Retriever와 FAISS 임베딩 검색 결과를 Reciprocal Rank Fusion(RRF)과 Score Fusion 두 방식으로 결합하고, alpha 가중치를 생성자 파라미터로 받는 클래스 구조로 작성해줘.
이 팁이 도움이 됐나요?
실습 — 직접 해보기
RAG Pipeline - 평가·튜닝 탭
하이브리드 alpha 슬라이더를 0에서 1까지 옮기며 hit rate·MRR 이 실제로 어떻게 움직이는지 재보세요. alpha=1 은 벡터만, alpha=0 은 BM25 만입니다.
용어