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)

추가 참고 자료

더 알아보기 (Learn more)