▶️25

[영상] 한글 BM25 + FAISS 하이브리드 검색

Day 1: 멀티모달 RAG

학습 목표

한국어 BM25가 효과적인 이유와 형태소 분석의 필요성을 설명할 수 있다 FAISS IndexFlatL2와 IndexIVFFlat의 차이를 성능 관점에서 비교할 수 있다 BM25 + FAISS 하이브리드에서 RRF 점수 합산 방식을 설명할 수 있다 멀티모달 RAG가 필요한 제조 시나리오를 두 가지 이상 제시할 수 있다

영상 핵심 정리 — 한글 BM25 + FAISS 하이브리드

한국어 BM25의 함정

한국어는 교착어라 동일 개념이 다양한 형태로 표현된다. 형태소 분석 없이 BM25 적용하면 '베어링의'와 '베어링을'을 다른 단어로 취급해 재현율 급락.

# 나쁨
tokenize = str.split

# 권장 (kiwipiepy)
from kiwipiepy import Kiwi
kiwi = Kiwi()
def ko_tokenize(text):
    return [t.form for t in kiwi.tokenize(text)
            if t.tag not in ('JX','JC','EP','EF')]

from rank_bm25 import BM25Okapi
bm25 = BM25Okapi([ko_tokenize(d) for d in corpus])

FAISS 인덱스 선택

인덱스방식벡터 수정확도속도
IndexFlatL2전수 탐색~100만100%느림
IndexIVFFlat클러스터 분할1억+~97%빠름
IndexHNSWFlat그래프 탐색수천만~99%매우 빠름
import faiss, numpy as np
dim = 768
quantizer = faiss.IndexFlatL2(dim)
index = faiss.IndexIVFFlat(quantizer, dim, nlist=100)
index.train(np.array(embeddings, dtype='float32'))
index.add(np.array(embeddings, dtype='float32'))

RRF 점수 합산

BM25 순위:  베어링 → 1위, 모터 → 3위
벡터 순위:  베어링 → 2위, 모터 → 1위

RRF(베어링) = 1/(60+1) + 1/(60+2) = 0.0328
RRF(모터)   = 1/(60+3) + 1/(60+1) = 0.0327
→ 베어링 1위

함정 주의: FAISS는 메타데이터 필터링 기능 없음. '3호기 관련 문서만 검색' 필요하면 Qdrant/Chroma로 전환.

다음 task와의 연결

'텍스트 + 이미지 통합 RAG 패턴'에서 오늘 파이프라인에 이미지 임베딩(CLIP/GPT-4o Vision)을 추가한다.

AI로 학습하기 — 꿀팁
🤖BM25+FAISS 하이브리드 검색 구현 요청AI 학습 팁

AI 에이전트에게 한국어 형태소 분석기를 활용한 BM25와 FAISS IndexIVFFlat 하이브리드 검색 파이프라인을 구현하게 하고, RRF 공식 적용이 올바른지 검토하세요.

한국어 제조 설비 매뉴얼 검색 시스템을 위한 하이브리드 검색 파이프라인을 Python으로 구현해줘. Kiwi 형태소 분석기로 조사·어미를 제거해 BM25 토크나이징하고, FAISS IndexIVFFlat으로 1억 벡터를 100ms 내 검색하는 코드를 작성해줘. RRF 공식(score = Σ 1/(k + rank_i), k=60)으로 두 검색 결과를 결합하는 방법도 포함해줘.
이 팁이 도움이 됐나요?
핵심 포인트
  • 한국어 BM25: Mecab/Kiwi 형태소 분석기로 조사·어미 제거 후 토크나이징 필수
  • FAISS(Meta): 순수 벡터 라이브러리, IndexIVFFlat로 1억 벡터 100ms 이내 검색
  • RRF 공식: score = Σ 1/(k + rank_i), k=60
  • 멀티모달 필요: CAD 도면 결함 분석, 설비 사진 이상 탐지, PDF 표 추출