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

QdrantSparseEmbeddingRetriever

一个基于稀疏嵌入的检索器,与 Qdrant 文档存储兼容。

pipeline 中的最常见位置1. 在 RAG 管道中,Text Embedder 之后,PromptBuilder 之前

2. 语义搜索管道中的最后一个组件
3. 在 extractive QA 管道中,Text Embedder 之后,ExtractiveReader 之前
必需的初始化变量"document_store": QdrantDocumentStore 的一个实例
强制运行变量“query_sparse_embedding”: 一个 SparseEmbedding 对象,包含查询的矢量表示
输出变量“documents”:文档列表
API 参考Qdrant
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/qdrant

概述

QdrantSparseEmbeddingRetriever 是一个基于稀疏嵌入的检索器,与 QdrantDocumentStore 兼容。

它会比较查询和文档的稀疏嵌入,并根据结果从QdrantDocumentStore.

使用QdrantSparseEmbeddingRetriever 时,请确保它具有查询和文档的稀疏嵌入。您可以通过在索引管道中添加稀疏文档 Embedder,并在查询管道中添加稀疏文本 Embedder 来实现此目的。

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

📘

稀疏嵌入支持

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

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

安装

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

pip install qdrant-haystack

用法

单独使用

此检索器需要QdrantDocumentStore 并索引文档即可运行。

from haystack_integrations.components.retrievers.qdrant import QdrantSparseEmbeddingRetriever
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,
)

doc = Document(content="test", sparse_embedding=SparseEmbedding(indices=[0, 3, 5], values=[0.1, 0.5, 0.12]))
document_store.write_documents([doc])

retriever = QdrantSparseEmbeddingRetriever(document_store=document_store)
sparse_embedding = SparseEmbedding(indices=[0, 1, 2, 3], values=[0.1, 0.8, 0.05, 0.33])
retriever.run(query_sparse_embedding=sparse_embedding)

在 pipeline 中

在 Haystack 中,您可以使用 Fastembed Embedders 计算稀疏嵌入。

首先,使用以下命令安装软件包:

pip install fastembed-haystack

然后,尝试这个管道

from haystack import Document, Pipeline
from haystack.components.writers import DocumentWriter
from haystack_integrations.components.retrievers.qdrant import QdrantSparseEmbeddingRetriever
from haystack_integrations.document_stores.qdrant import QdrantDocumentStore
from haystack.document_stores.types import DuplicatePolicy
from haystack_integrations.components.embedders.fastembed import FastembedDocumentEmbedder, FastembedTextEmbedder

document_store = QdrantDocumentStore(
    ":memory:",
    recreate_index=True,
    use_sparse_embeddings=True
)

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."),
]

sparse_document_embedder = FastembedSparseDocumentEmbedder()
writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.OVERWRITE)

indexing_pipeline = Pipeline()
indexing_pipeline.add_component("sparse_document_embedder", sparse_document_embedder)
indexing_pipeline.add_component("writer", writer)
indexing_pipeline.connect("sparse_document_embedder", "writer")

indexing_pipeline.run({"sparse_document_embedder": {"documents": documents}})

query_pipeline = Pipeline()
query_pipeline.add_component("sparse_text_embedder", FastembedSparseTextEmbedder())
query_pipeline.add_component("sparse_retriever", QdrantSparseEmbeddingRetriever(document_store=document_store))
query_pipeline.connect("sparse_text_embedder.sparse_embedding", "sparse_retriever.query_sparse_embedding")

query = "Who supports fastembed?"

result = query_pipeline.run({"sparse_text_embedder": {"text": query}})

print(result["sparse_retriever"]["documents"][0])  # noqa: T201

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

其他参考资料

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