SolrHybridRetriever | Haystack 문서

SolrHybridRetriever | Haystack 문서

SolrHybridRetriever는 Apache Solr를 백엔드 Document Store로 사용하면서 하이브리드 검색을 단일 컴포넌트로 구현한 SuperComponent예요. 키워드 기반 검색(BM25)과 임베딩 기반 검색을 함께 사용해서 두 방식의 장점을 모두 살릴 수 있답니다. 이 컴포넌트는 두 검색 결과를 병합하고 재정렬하는 작업까지 자동으로 처리해 주기 때문에, 파이프라인에서 아주 유용하게 활용할 수 있어요.

개요

SolrHybridRetriever는 두 가지 검색 방식을 결합해요.

  • BM25 검색: BM25 알고리즘을 사용하는 키워드 기반 검색이에요. 문서의 단어 빈도(Term Frequency)와 역문서 빈도(Inverse Document Frequency)를 기반으로 관련 문서를 찾아요. SolrBM25Retriever 컴포넌트를 기반으로 하며, 전통적인 키워드 검색에 적합해요.
  • 임베딩 기반 검색: 벡터 유사도를 사용하는 의미론적 검색이에요. 쿼리와 의미적으로 유사한 문서를 찾아주며, SolrEmbeddingRetriever 컴포넌트를 기반으로 해요.

이 컴포넌트는 다음 작업을 자동으로 처리해요.

  • 제공된 embedder를 사용해 쿼리를 임베딩으로 변환
  • 동일한 Solr 코어에서 두 검색 방식 실행
  • 지정된 조인 모드(기본값은 reciprocal rank fusion)를 사용해 결과 병합 및 재정렬

파이프라인에서 주로 사용되는 위치

  1. RAG 파이프라인에서 ChatPromptBuilder
  2. 하이브리드 검색 파이프라인의 마지막 컴포넌트
  3. 추출적 QA 파이프라인에서 TransformersExtractiveReader

필수 초기화 변수

  • document_store: 검색에 사용할 SolrDocumentStore 인스턴스
  • embedder: TextEmbedder 프로토콜을 구현하는 모든 Embedder

필수 실행 변수

  • query: 쿼리 문자열

출력 변수

  • documents: 쿼리와 일치하는 문서 목록

설치

다음 명령어로 패키지를 설치할 수 있어요.

pip install solr-haystack

선택적 매개변수

이 리트리버는 다양한 선택적 매개변수를 지원해요. 최신 매개변수 목록은 API Reference에서 확인할 수 있어요.

두 검색 브랜치는 각각 다음과 같은 매개변수로 설정해요.

  • BM25 브랜치: filters_bm25, top_k_bm25, filter_policy_bm25, fuzziness, scale_score, all_terms_must_match
  • 임베딩 브랜치: filters_embedding, top_k_embedding, filter_policy_embedding

DocumentJoiner의 매개변수(join_mode, weights, top_k, sort_by_score)는 모두 SolrHybridRetriever 클래스에서 직접 설정할 수 있어요.

또한 bm25_retrieverembedding_retriever 딕셔너리를 사용해 내부 리트리버에 추가 매개변수를 전달할 수 있어요.

retriever = SolrHybridRetriever(
    document_store=document_store,
    embedder=embedder,
    bm25_retriever={"raise_on_failure": True},
    embedding_retriever={"raise_on_failure": False}
)

사용법

다음 예제는 문서를 임베딩과 함께 인덱싱한 뒤, 단일 컴포넌트로 하이브리드 검색을 실행하는 방법을 보여줘요.

from haystack import Document, Pipeline
from haystack.components.embedders import (
    SentenceTransformersDocumentEmbedder,
    SentenceTransformersTextEmbedder,
)
from haystack.components.writers import DocumentWriter
from haystack_integrations.components.retrievers.solr import SolrHybridRetriever
from haystack_integrations.document_stores.solr import SolrDocumentStore

document_store = SolrDocumentStore(
    url="http://localhost:8983/solr", core="haystack", embedding_dim=384
)

model = "sentence-transformers/all-MiniLM-L6-v2"

documents = [
    Document(content="There are over 7,000 languages spoken around the world today."),
    Document(
        content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors."
    ),
    Document(
        content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves."
    ),
]

indexing_pipeline = Pipeline()
indexing_pipeline.add_component(
    "embedder", SentenceTransformersDocumentEmbedder(model=model)
)
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder", "writer")
indexing_pipeline.run({"embedder": {"documents": documents}})

retriever = SolrHybridRetriever(
    document_store=document_store,
    embedder=SentenceTransformersTextEmbedder(model=model),
)
retriever.warm_up()
result = retriever.run(query="How many languages are there?")
print(result["documents"][0])

SolrHybridRetriever는 다른 컴포넌트처럼 파이프라인에서도 사용할 수 있어요. 쿼리 임베딩을 자체적으로 처리하기 때문에, 쿼리 파이프라인에 별도의 Text Embedder를 추가할 필요가 없답니다.

더 알아보기