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_embedding 和query_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)
其他参考资料
📓 教程: 创建混合检索流水线
更新于 7 个月前
