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

FastembedSparseDocumentEmbedder

使用此组件为文档列表添加稀疏嵌入。

pipeline 中的最常见位置在索引管道中的 DocumentWriter 之前
强制运行变量“documents”:文档列表
输出变量“documents”:一个文档列表(已添加稀疏嵌入)
API 参考FastEmbed
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/fastembed

要计算字符串的稀疏嵌入,请使用 FastembedSparseTextEmbedder

概述

FastembedSparseDocumentEmbedder 计算文档列表的稀疏嵌入,并将获得的向量存储在每个文档的sparse_embedding 字段中。它使用 FastEmbed 支持的稀疏嵌入 模型

此组件计算的向量对于对一组文档执行稀疏嵌入检索是必需的。在检索过程中,代表查询的稀疏向量会与文档的向量进行比较,以识别最相似或最相关的文档。

兼容模型

您可以在 FastEmbed 文档 中找到支持的模型。

目前,支持的模型基于 SPLADE,这是一种用于生成文本稀疏表示的技术,其中嵌入中的每个非零值都是 BERT WordPiece 词汇表中术语的重要性权重。有关更多信息,请参阅 我们的文档,其中进一步解释了基于稀疏嵌入的检索器。

安装

要开始使用此集成与 Haystack,请使用以下命令安装软件包:

pip install fastembed-haystack

参数

您可以设置模型将存储在缓存目录中的路径。此外,您还可以设置单个onnxruntime 会话可以使用

cache_dir= "/your_cacheDirectory"
embedder = FastembedSparseDocumentEmbedder(
	model="prithivida/Splade_PP_en_v1",
	cache_dir=cache_dir,
	threads=2
)

如果您想使用数据并行编码,可以设置参数parallelbatch_size.

  • 如果parallel > 1,将使用数据并行编码。建议用于大型数据集的离线编码。
  • 如果parallel 为 0,则使用所有可用核心。
  • 如果为 None,则不使用数据并行处理;使用默认的onnxruntime 线程。

👍

如果您基于同一模型创建 Sparse Text Embedder 和 Sparse Document Embedder,Haystack 会在后台使用共享资源来节约资源。

Embedding 元数据

文本文档通常包含元数据。如果元数据具有独特性且在语义上具有意义,您可以将其与文档的文本一起嵌入以改进检索。

您可以通过使用稀疏 Document Embedder 轻松实现这一点

from haystack.preview import Document
from haystack_integrations.components.embedders.fastembed import FastembedSparseDocumentEmbedder

doc = Document(text="some text",
							 metadata={"title": "relevant title",
												 "page number": 18})

embedder = FastembedSparseDocumentEmbedder(
	model="prithivida/Splade_PP_en_v1",
	metadata_fields_to_embed=["title"]
)

docs_w_sparse_embeddings = embedder.run(documents=[doc])["documents"]

用法

单独使用

from haystack.dataclasses import Document
from haystack_integrations.components.embedders.fastembed import FastembedSparseDocumentEmbedder
document_list = [
	Document(content="I love pizza!"), 
	Document(content="I like spaghetti")
]

doc_embedder = FastembedSparseDocumentEmbedder()
doc_embedder.warm_up()

result = doc_embedder.run(document_list)
print(result['documents'][0])

# Document(id=..., 
# 				 content: 'I love pizza!', 
#					 sparse_embedding: vector with 24 non-zero elements)

在 pipeline 中

目前,稀疏嵌入检索仅支持QdrantDocumentStore.
首先,使用以下命令安装软件包:

pip install qdrant-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 进行稀疏嵌入检索