QdrantHybridRetriever
QdrantHybridRetriever
밀집(dense)과 희소(sparse) 임베딩을 모두 기반으로 하는, Qdrant Document Store와 호환되는 Retriever예요.
출처: 문서
본문
| 항목 | 내용 |
|---|---|
| 파이프라인에서 가장 흔한 위치 | 1. RAG 파이프라인에서 Text Embedder 다음, PromptBuilder 앞 2. 하이브리드 검색 파이프라인의 마지막 컴포넌트 3. 추출형 QA 파이프라인에서 Text Embedder 다음, TransformersExtractiveReader 앞 |
| 필수 init 변수 | document_store: QdrantDocumentStore 인스턴스 |
| 필수 run 변수 | query_embedding: 쿼리를 나타내는 밀집 벡터 (float 목록). query_sparse_embedding: 쿼리의 벡터 표현을 담은 SparseEmbedding 객체 |
| 출력 변수 | documents: 문서 목록 |
| API reference | Qdrant |
| GitHub 링크 | qdrant 통합 |
| 패키지 이름 | qdrant-haystack |
개요
QdrantHybridRetriever는 QdrantDocumentStore와 호환되는, 밀집과 희소 임베딩을 모두 기반으로 하는 Retriever예요.
쿼리와 문서의 밀집·희소 임베딩을 비교하고, Reciprocal Rank Fusion으로 점수를 융합해 QdrantDocumentStore에서 쿼리에 가장 관련 있는 문서를 가져와요.
하이브리드 검색 파이프라인: 결과를 병합·융합할 때 추가 커스터마이징이 필요하다면,
DocumentJoiner를 사용한 하이브리드 검색 파이프라인을 만드는 것을 고려해 보세요.자세한 단계는 하이브리드 검색 파이프라인 튜토리얼을 확인할 수 있어요.
QdrantHybridRetriever를 사용할 때는 쿼리와 문서에 밀집·희소 임베딩이 모두 준비되어 있어야 해요. 이렇게 하면 되죠:
- 인덱싱 파이프라인에 (밀집) 문서 Embedder와 희소 문서 Embedder 추가
- 쿼리 파이프라인에 (밀집) 텍스트 Embedder와 희소 텍스트 Embedder 추가
query_embedding과 query_sparse_embedding 외에도 QdrantHybridRetriever는 top_k(가져올 최대 문서 수)와 filters(검색 공간을 좁히기) 같은 선택적 파라미터를 받아요.
희소 임베딩 지원: 희소 임베딩 지원을 사용하려면
QdrantDocumentStore를use_sparse_embeddings=True로 초기화해야 해요. 기본값은False예요.이 기능을 비활성화한 상태로 이전에 만든 Document Store나 컬렉션을 사용하고 싶다면 기존 데이터를 마이그레이션해야 해요.
migrate_to_sparse_embeddings_support유틸리티 함수를 활용하면 됩니다.
설치
Qdrant를 Haystack에서 사용하려면 먼저 패키지를 설치하세요:
pip install qdrant-haystack
사용법
단독으로 사용하기
from haystack_integrations.components.retrievers.qdrant import QdrantHybridRetriever
from haystack_integrations.document_stores.qdrant import QdrantDocumentStore
from haystack.dataclasses import Document, SparseEmbedding
document_store = QdrantDocumentStore(
":memory:",
use_sparse_embeddings=True,
recreate_index=True,
return_embedding=True,
wait_result_from_api=True,
)
doc = Document(
content="test",
embedding=[0.5] * 768,
sparse_embedding=SparseEmbedding(indices=[0, 3, 5], values=[0.1, 0.5, 0.12]),
)
document_store.write_documents([doc])
retriever = QdrantHybridRetriever(document_store=document_store)
embedding = [0.1] * 768
sparse_embedding = SparseEmbedding(indices=[0, 1, 2, 3], values=[0.1, 0.8, 0.05, 0.33])
retriever.run(query_embedding=embedding, query_sparse_embedding=sparse_embedding)
파이프라인에서 사용하기
현재는 Fastembed Sparse Embedder로 희소 임베딩을 계산할 수 있어요. 먼저 패키지를 설치하세요:
pip install fastembed-haystack
아래 예제는 밀집 임베딩 계산에도 Fastembed Embedder를 사용해요.
from haystack import Document, Pipeline
from haystack.components.writers import DocumentWriter
from haystack_integrations.components.retrievers.qdrant import QdrantHybridRetriever
from haystack_integrations.document_stores.qdrant import QdrantDocumentStore
from haystack.document_stores.types import DuplicatePolicy
from haystack_integrations.components.embedders.fastembed import (
FastembedTextEmbedder,
FastembedDocumentEmbedder,
FastembedSparseTextEmbedder,
FastembedSparseDocumentEmbedder,
)
document_store = QdrantDocumentStore(
":memory:",
recreate_index=True,
use_sparse_embeddings=True,
embedding_dim=384,
)
documents = [
Document(content="My name is Wolfgang and I live in Berlin"),
Document(content="I saw a black horse running"),
Document(content="Germany has many big cities"),
Document(content="fastembed is supported by and maintained by Qdrant."),
]
indexing = Pipeline()
indexing.add_component(
"sparse_doc_embedder",
FastembedSparseDocumentEmbedder(model="prithvida/Splade_PP_en_v1"),
)
indexing.add_component(
"dense_doc_embedder",
FastembedDocumentEmbedder(model="BAAI/bge-small-en-v1.5"),
)
indexing.add_component(
"writer",
DocumentWriter(document_store=document_store, policy=DuplicatePolicy.OVERWRITE),
)
indexing.connect("sparse_doc_embedder", "dense_doc_embedder")
indexing.connect("dense_doc_embedder", "writer")
indexing.run({"sparse_doc_embedder": {"documents": documents}})
querying = Pipeline()
querying.add_component(
"sparse_text_embedder",
FastembedSparseTextEmbedder(model="prithvida/Splade_PP_en_v1"),
)
querying.add_component(
"dense_text_embedder",
FastembedTextEmbedder(
model="BAAI/bge-small-en-v1.5",
prefix="Represent this sentence for searching relevant passages: ",
),
)
querying.add_component(
"retriever",
QdrantHybridRetriever(document_store=document_store),
)
querying.connect(
"sparse_text_embedder.sparse_embedding",
"retriever.query_sparse_embedding",
)
querying.connect("dense_text_embedder.embedding", "retriever.query_embedding")
question = "Who supports fastembed?"
results = querying.run(
{
"dense_text_embedder": {"text": question},
"sparse_text_embedder": {"text": question},
},
)
print(results["retriever"]["documents"][0])
# Document(id=...,
# content: 'fastembed is supported by and maintained by Qdrant.',
# score: 1.0)
추가 참고 자료
- 📓 Tutorial: Creating a Hybrid Retrieval Pipeline
- 🧑🍳 Cookbook: Sparse Embedding Retrieval with Qdrant and FastEmbed