Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

RAG 파이프라인을 구축할 때, 시맨틱 검색만으로는 항상 최상의 결과를 반환하지 못한다는 것을 금방 알게 될 것입니다. 때로는 시맨틱 검색이 놓칠 수 있는 정확한 용어 일치가 필요합니다. 해결책은 BM25라는 기법을 사용하여 시맨틱 검색과 어휘 검색을 결합하는 것입니다.

시맨틱 검색만 사용할 때의 문제점

문서에서 "INC-2023-Q4-011"과 같은 특정 인시던트 ID를 검색한다고 가정해 보겠습니다. 이 정확한 용어가 관련 섹션에 여러 번 등장하지만, 시맨틱 검색은 의미상 유사하지만 실제로는 찾고 있는 특정 용어를 포함하지 않는 관련 없는 섹션을 반환할 수 있습니다.

이는 시맨틱 검색이 정확한 일치보다는 의미에 초점을 맞추기 때문에 발생합니다. 정확한 용어 일치가 필요할 때는 다른 접근 방식이 필요합니다.

하이브리드 검색 전략

해결책은 두 가지 검색을 병렬로 실행하고 결과를 병합하는 것입니다:

  • 시맨틱 검색 - 의미 기반 매칭을 위해 임베딩과 벡터 데이터베이스를 사용합니다
  • 어휘 검색 - 정확한 용어 매칭을 위해 고전적인 텍스트 검색을 사용합니다
  • 결과 병합 - 더 나은 커버리지를 위해 두 결과 세트를 결합합니다

BM25의 작동 방식

BM25(Best Match 25)는 RAG 파이프라인에서 어휘 검색을 위한 널리 사용되는 알고리즘입니다. 검색 쿼리를 처리하는 방식은 다음과 같습니다:

이 알고리즘은 다음과 같은 주요 단계를 따릅니다:

  1. 쿼리 토큰화 - 사용자의 질문을 개별 용어로 분해합니다
  2. 용어 빈도 계산 - 각 용어가 모든 문서에서 얼마나 자주 등장하는지 확인합니다
  3. 희귀도에 따른 용어 가중치 부여 - 덜 자주 사용되는 용어는 더 높은 중요도 점수를 받습니다
  4. 최적의 일치 항목 찾기 - 가중치가 높은 용어의 인스턴스를 더 많이 포함하는 청크를 반환합니다

핵심은 "INC-2023-Q4-011"과 같은 희귀한 용어가 "a"나 "the"와 같은 일반적인 단어보다 검색에서 훨씬 더 중요하다는 것입니다.

BM25 검색 시스템을 설정하는 방법은 다음과 같습니다:

python
# BM25 스토어를 생성합니다
store = BM25Index()

# 스토어에 문서를 추가합니다
for chunk in chunks:
    store.add_document({"content": chunk})

# 스토어를 검색합니다
results = store.search("What happened with INC-2023-Q4-011?", 3)

BM25 구현은 시맨틱 검색 시스템과 동일한 API를 제공합니다 - 둘 다 add_document()search() 메서드를 가지고 있어 함께 사용하기 쉽습니다.

더 나은 검색 결과

시맨틱 검색만으로는 실패했던 동일한 쿼리를 BM25로 실행하면 훨씬 더 나은 결과를 얻을 수 있습니다. 관련 없는 섹션을 반환하는 대신, BM25는 실제로 특정 검색어를 포함하는 섹션에 우선순위를 부여합니다.

이 알고리즘은 "INC-2023-Q4-011"이 희귀하고 중요한 용어임을 정확하게 식별하고, 이를 포함하는 문서를 쿼리의 일반적인 단어만 포함하는 문서보다 훨씬 높게 순위를 매깁니다.

다음 단계

이제 시맨틱 검색과 어휘 검색 시스템이 독립적으로 작동하게 되었으므로, 다음 단계는 이들의 결과를 병합하는 것입니다. 이 하이브리드 접근 방식은 시맨틱 검색의 맥락적 이해와 어휘 검색의 정확한 용어 매칭의 정밀성을 결합하여 두 가지 장점을 모두 제공합니다.

두 검색 시스템은 유사한 API를 사용하므로, 두 시스템을 병렬로 쿼리하고 그 결과를 하나의 더 포괄적인 결과 세트로 결합하는 것이 간단합니다.