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 구현은 add_document()search() 메서드를 사용하여 벡터 스토어와 유사한 API를 유지합니다. 이러한 일관성 덕분에 두 시스템을 함께 사용하기가 쉬워집니다.

더 나은 검색 결과

시맨틱 검색만으로는 실패했던 동일한 쿼리를 BM25를 통해 실행하면 훨씬 더 나은 결과를 얻을 수 있습니다. 이 알고리즘은 정확한 인시던트 ID를 포함하는 섹션을 올바르게 우선시하여, 의미상 관련이 있을 수는 있지만 찾고 있는 특정 용어를 포함하지 않는 섹션보다 더 높은 순위를 부여합니다.

이제 검색 결과는 Financial Analysis와 같은 관련 없는 콘텐츠를 반환하는 대신, 실제로 해당 인시던트를 다루는 Software Engineering 섹션과 Cybersecurity 섹션을 제대로 표면화합니다.

다음 단계

이제 시맨틱 검색과 어휘 검색 시스템이 독립적으로 작동하게 되었으므로, 다음 단계는 이들의 결과를 병합하는 것입니다. 이 하이브리드 접근 방식은 임베딩의 시맨틱 이해와 키워드 일치의 정밀성을 결합하여 RAG 파이프라인을 위한 더욱 견고한 검색 경험을 만들어 줄 것입니다.