文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

QdrantHybridRetriever

一个基于密集和稀疏嵌入的 Retriever,兼容 Qdrant 文档存储。

pipeline 中的最常见位置1. 在一个 Text Embedder 之后,并在一个 RAG 流水线中的 PromptBuilder 之前

2. 混合搜索流水线中的最后一个组件
3. 在一个 Text Embedder 之后,并在一个抽取式 QA 流水线中的 ExtractiveReader 之前
必需的初始化变量"document_store": QdrantDocumentStore 的一个实例
强制运行变量“query_embedding”: 一个代表查询的密集向量(浮点数列表)

“query_sparse_embedding”: 一个包含查询向量表示的 SparseEmbedding 对象
输出变量“document”: 文档列表
API 参考Qdrant
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/qdrant

概述

QdrantHybridRetriever 是一个基于密集和稀疏嵌入的 Retriever,兼容 QdrantDocumentStore

它会比较查询和文档的密集和稀疏嵌入,并从QdrantDocumentStore 中提取与查询最相关的文档,并使用 Reciprocal Rank Fusion 合并分数。

👍

混合检索流水线

如果您希望对合并或融合结果进行更进一步的定制,可以考虑使用 DocumentJoiner 创建一个混合检索流水线。

您可以在我们的混合检索流水线 教程 中查看详细步骤。

使用QdrantHybridRetriever,确保它具有包含密集和稀疏嵌入的查询和文档。您可以通过

  • 在您的索引流水线中添加一个(密集)文档 Embedder 和一个稀疏文档 Embedder,
  • 在您的查询流水线中添加一个(密集)文本 Embedder 和一个稀疏文本 Embedder。

除了query_embeddingquery_sparse_embedding 之外,QdrantHybridRetriever 还接受其他可选参数,包括top_k(要检索的文档的最大数量)和filters(用于缩小搜索范围)。

📘

稀疏嵌入支持

要使用稀疏嵌入支持,您需要将QdrantDocumentStore 初始化为use_sparse_embeddings=True,该选项默认为

False。如果您想使用在此功能禁用时创建的文档存储或集合,则必须迁移现有数据。您可以通过利用migrate_to_sparse_embeddings_support 实用函数来实现。

安装

要开始在 Haystack 中使用 Qdrant,请先使用以下命令安装软件包:

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)

在 pipeline 中

目前,您可以使用 Fastembed Sparse Embedders 计算稀疏嵌入。
首先,使用以下命令安装软件包:

pip install fastembed-haystack

在下面的示例中,我们也使用了 Fastembed Embedders 来计算密集嵌入。

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 = query_mix.run(
    {"dense_text_embedder": {"text": question},
     "sparse_text_embedder": {"text": question}}
)

print(result["retriever"]["documents"][0])

# Document(id=...,
#  content: 'fastembed is supported by and maintained by Qdrant.',
#  score: 1.0)

其他参考资料

📓 教程: 创建混合检索流水线

🧑‍🍳 食谱:使用 Qdrant 和 FastEmbed 进行稀疏嵌入检索