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

TransformersSimilarityRanker

使用此组件根据与查询的相似性对文档进行排名。该TransformersSimilarityRanker是一个强大的、基于模型的 Ranker,它使用交叉编码器模型来生成文档和查询的嵌入。

🚧

旧组件

此组件被视为旧组件,将不再接收更新。在未来版本中可能会被弃用,并在弃用期后被移除。
请考虑使用 SentenceTransformersSimilarityRanker 代替,因为它提供了相同的功能和附加功能。

pipeline 中的最常见位置在查询管道中,在返回文档列表的组件(例如 Retriever)之后
必需的初始化变量"token"(仅适用于私有模型):Hugging Face API 令牌。可以设置为HF_API_TOKENHF_TOKEN 环境变量设置。
强制运行变量“documents”:文档列表

“query”: 查询字符串
输出变量“documents”:文档列表
API 参考Rankers (排序器)
GitHub 链接https://github.com/deepset-ai/haystack/blob/main/haystack/components/rankers/transformers_similarity.py

概述

TransformersSimilarityRanker根据文档与查询的相似程度对文档进行排名。它使用 Hugging Face Hub 的预训练交叉编码器模型来嵌入查询和文档。然后,它会比较这些嵌入以确定它们的相似程度。结果是一个按排名顺序排列的Document对象列表,其中与查询最相似的文档排在最前面。

TransformersSimilarityRanker在查询管道中非常有用,例如检索增强生成(RAG)管道或文档搜索管道,以确保检索到的文档按相关性排序。您可以在检索器(例如InMemoryEmbeddingRetriever)之后使用它来改进搜索结果。当使用TransformersSimilarityRanker与检索器一起使用时,请考虑将检索器的top_k 设置为较小的值。这样,Ranker 需要处理的文档就会更少,这有助于加快管道的处理速度。

默认情况下,此组件使用cross-encoder/ms-marco-MiniLM-L-6-v2模型,但它是灵活的。您可以通过调整 Ranker 初始化时的model参数来切换到不同的模型。有关不同初始化设置的详细信息,请参阅此组件的 API 参考。

您也可以在管道之外设置device 参数以在 CPU 或 GPU 上使用 HF 模型。

授权

该组件默认使用HF_API_TOKEN 环境变量。否则,您可以在初始化时使用token – 请参阅下面的代码示例。

ranker = TransformersSimilarityRanker(token=Secret.from_token("<your-api-key>"))

用法

单独使用

您可以使用TransformersSimilarityRanker,以根据您的查询对文档进行排序。

此示例使用TransformersSimilarityRanker来对两个简单文档进行排名。要运行 Ranker,请传递一个查询,提供文档,并设置要返回的文档数量。top_k 参数中设置要返回的文档数量。

from haystack import Document
from haystack.components.rankers import TransformersSimilarityRanker

docs = [Document(content="Paris"), Document(content="Berlin")]

ranker = TransformersSimilarityRanker()
ranker.warm_up()

ranker.run(query="City in France", documents=docs, top_k=1)

在 pipeline 中

TransformersSimilarityRanker在查询管道中,当在检索器之后使用时效率最高。

以下是一个管道的示例,该管道使用InMemoryDocumentStore 基于关键字搜索(使用InMemoryBM25Retriever)设置要排名的文档数量。然后,它使用TransformersSimilarityRanker来根据查询的相似性对检索到的文档进行排名。该管道使用 Ranker 的默认设置。

from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.rankers import TransformersSimilarityRanker

docs = [Document(content="Paris is in France"), 
        Document(content="Berlin is in Germany"),
        Document(content="Lyon is in France")]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)

retriever = InMemoryBM25Retriever(document_store = document_store)
ranker = TransformersSimilarityRanker()
ranker.warm_up()

document_ranker_pipeline = Pipeline()
document_ranker_pipeline.add_component(instance=retriever, name="retriever")
document_ranker_pipeline.add_component(instance=ranker, name="ranker")

document_ranker_pipeline.connect("retriever.documents", "ranker.documents")

query = "Cities in France"
document_ranker_pipeline.run(data={"retriever": {"query": query, "top_k": 3}, 
                                   "ranker": {"query": query, "top_k": 2}})

📘

排序器 (Ranker)top_k

在上面的示例中,检索器和 Ranker 的top_k 值不同。检索器的top_k 指定了它返回的文档数量。然后,Ranker 对这些文档进行排序。

您可以为 Ranker 设置相同或更小的top_k 值。Ranker 的top_k 是它返回的文档数量(如果它是管道中的最后一个组件)或转发到下一个组件的数量。在上面的管道示例中,Ranker 是最后一个组件,因此运行管道时获得的输出是前两个文档,如 Ranker 的top_k.

调整top_k 值可以帮助您优化性能。在这种情况下,检索器较小的top_k 值意味着 Ranker 需要处理的文档更少,这可以加快管道的运行速度。


相关链接

在我们的 API 参考中查看参数详情