Han Sarang / Articles2 min read
[YYYY.MM.DD]RAG · Retrieval

Buddybot에 BM25를 더한 이유

[도입 2–3문장 — 이 글이 다루는 문제와, 읽고 나면 얻어 갈 수 있는 것]

Published
[YYYY.MM.DD]
Reading
2 min
Tags
RAGBM25EmbeddingChromaDB

01들어가며

Buddybot은 대학생이 자연어로 학사 정보를 찾을 수 있게 돕는 RAG 챗봇입니다. 전체 구조는 케이스 스터디에 정리했고, 이 글은 그중 검색 단계만 다룹니다.

To write — 계기이 주제를 글로 남기게 된 구체적인 순간 하나.

02문제 상황

To write — 문제Dense 검색만 썼을 때 결과가 어긋난 질문 유형과 실제 질의 예시 1–2개. 재현 가능한 수준으로.

03하이브리드 검색 구성

검색은 두 갈래로 나눠 수행한 뒤 결과를 합칩니다.

  • Dense — SentenceTransformers 임베딩 + ChromaDB 유사도 검색
  • Sparse — BM25 키워드 매칭

결과 결합

두 결과는 [결합 방식 — 예: RRF, 가중합]으로 합친 뒤 상위 [k]개를 컨텍스트로 사용합니다.

python[파일 경로 — 예: backend/retrieval.py]
# 예시 — 실제 결합 로직으로 교체하세요
def hybrid_search(query: str, k: int = 5):
    dense = vector_store.similarity_search(query, k=k)
    sparse = bm25.get_top_n(query, documents, n=k)
    return merge(dense, sparse)[:k]

위 예시의 merge() 자리에 실제 결합 로직이 들어갑니다.

04결과와 배운 점

Results측정한 지표가 있다면 측정 방법과 함께(예: 평가 질문 n개 기준). 측정하지 않았다면 수치를 적지 않습니다.
Lessons다시 한다면 바꿀 것 1–2가지 — 구체적인 기술 판단으로.