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

MetaFieldRanker

MetaFieldRanker 根据您指定的元字段的值对文档进行排名。它是一个轻量级的 Ranker,可以在不减慢管道速度的情况下提高管道的结果。

pipeline 中的最常见位置在查询管道中,紧随返回文档列表的组件之后,例如 Retriever
必需的初始化变量"meta_field": 要进行排名的元字段的名称
强制运行变量“documents”:文档列表

“top_k”:要返回的文档的最大数量。如果未提供,则返回收到的所有文档。
输出变量“documents”:文档列表
API 参考Rankers (排序器)
GitHub 链接https://github.com/deepset-ai/haystack/blob/main/haystack/components/rankers/meta_field.py

概述

MetaFieldRanker 按降序或升序对文档进行排序,具体取决于特定元字段的值。这意味着返回的Document 对象列表按选定的顺序排列,字符串值按字母顺序或反向字母顺序排序(例如,东京、巴黎、柏林)。

MetaFieldRanker 附带可选参数weightranking_mode,您可以使用它们将检索器分配的文档分数与其元字段的值结合起来进行排名。该weight 参数允许您在排名过程中平衡文档内容和元字段的重要性。该ranking_mode 参数定义了如何组合检索器和 Ranker 的分数。

此 Ranker 在查询管道中很有用,例如检索增强生成 (RAG) 管道或文档搜索管道。它确保文档按其元字段的值进行排序。您也可以在检索器(例如InMemoryEmbeddingRetriever)之后使用它,将检索器的分数与文档的元值结合起来以改进排名。

默认情况下,MetaFieldRanker 仅根据元字段对文档进行排序。您可以通过将weight 设置为小于 1 来调整此设置。有关不同初始化设置的更多详细信息,请参阅此组件的 API 参考。

用法

单独使用

您可以在管道外部使用此 Ranker 对文档进行排序。

此示例使用MetaFieldRanker 对两个简单文档进行排名。运行 Ranker 时,您会传递query,提供documents 并使用top_k 参数中设置要返回的文档数量。

from haystack import Document
from haystack.components.rankers import MetaFieldRanker

docs = [Document(content="Paris", meta={"rating": 1.3}), Document(content="Berlin", meta={"rating": 0.7})]

ranker = MetaFieldRanker(meta_field="rating")

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

在 pipeline 中

以下是一个管道的示例,该管道使用InMemoryDocumentStore 基于关键字搜索(使用InMemoryBM25Retriever)设置要排名的文档数量。然后,它使用MetaFieldRanker 根据元字段rating 对检索到的文档进行排名,使用 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 MetaFieldRanker

docs = [Document(content="Paris", meta={"rating": 1.3}),
        Document(content="Berlin", meta={"rating": 0.7}),
        Document(content="Barcelona", meta={"rating": 2.1})]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)

retriever = InMemoryBM25Retriever(document_store = document_store)
ranker = MetaFieldRanker(meta_field="rating")

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}})

相关链接

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