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)를 사용해 결과 병합 및 재정렬
파이프라인에서 주로 사용되는 위치
- RAG 파이프라인에서
ChatPromptBuilder앞 - 하이브리드 검색 파이프라인의 마지막 컴포넌트
- 추출적 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_retriever와 embedding_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를 추가할 필요가 없답니다.
더 알아보기
- API Reference
- Solr GitHub 링크
- 패키지 이름:
solr-haystack