对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

$rerank 聚合管道阶段

$rerank

$rerank 阶段使用 Voyage AI 的重新排序模型对输入文档进行重新排序,并返回按相关性与查询排序的相同文档。$rerank 阶段可以出现在聚合管道的任何位置。MongoDB 建议您在 $vectorSearch、$search、$rankFusion 或 $scoreFusion 阶段之后使用 $rerank。

$rerank管道阶段采用以下语法:

{ "$rerank": { "query": { "text": "<query-text>" }, "path": "<text-field-name>", "numDocsToRerank": <number-of-documents-to-rerank>, "model": "<reranker-model>" }}

$rerank 阶段采用包含以下字段的文档:

字段
类型
必要性
说明

query

对象

必需

用于重新排名的查询。

query.
text

字符串

必需

用于重新排名的查询文本。示例,您可以指定:

  • 您正在搜索的内容

  • 文档的哪些字段最相关

  • 用于澄清歧义查询的补充信息

path

字符串或字符串数组

必需

用于重新排名的字段的路径。如果 $rerank 是中间阶段,请指定前一阶段结果中的字段。

注意:如果 path 中指定的字段不存在,则 $rerank查询将失败。使用先前的 $match 阶段过滤掉缺少字段的文档,或使用 $set 将缺失字段设立为 ""。

numDocsToRerank

Int

必需

发送到 Voyage AI进行重新排名并在结果中返回的最大文档数。根据管道定义的文档顺序选择文档。

最大值必须小于或等于 1000。

model

对象

必需

Voyage AI 模型,用于对文档进行重新排序。值可以是以下模型之一:

  • rerank-3 - 准确率最高的通用重排序模型。推荐用于大多数应用程序。

  • rerank-3-lite - 快速且费用高效的重排序模型,针对延迟敏感型应用程序进行了优化。

  • rerank-2.5 - 通过指令跟踪和多语言支持对质量进行了优化的 Generalist reranker。

  • rerank-2.5-lite - 通过指令跟踪和多语言支持,针对延迟和质量优化了 Generalist reranker。

  • rerank-2 — 旧版模型。

  • rerank-2-lite — 旧版模型。

rerank-3 和 rerank-3-lite 模型可作为预览功能使用,并需要运行 MongoDB 9.0 或更高版本的专用集群。如需了解更多信息,请参阅 要求。

在使用 $rerank 之前,请查看要求、限制和 $rerank 行为。

要使用 $rerank:

  • 确保您的集群运行 MongoDB 9.0 或更高版本。

  • 通过 Project Settings 启用原生重排名。要了解更多信息,请参阅 启用或禁用原生重排名。

rerank-3 和 rerank-3-lite 模型具有以下附加要求:

  • 您的集群必须是运行 MongoDB 9.0 或更高版本的专用集群(M10 或更高版本)。

要了解这些模型的支持状态,请参阅 当前模型状态。

您不能使用 $rerank 阶段:

  • 适用于自管理或 Atlas Local 部署。

  • 用于 $rankFusion 或 $scoreFusion 输入管道。

  • 查询 视图。

    如果您在视图上有 MongoDB Search 或 MongoDB Vector Search 索引,请在源集合上运行 .aggregate() 而不是视图来查询索引。

  • 使用客户端字段级加密或 Queryable Encryption。包含 $rerank 的管道会失败,并出现类似 Unrecognized pipeline stage name: '$rerank' 的错误。

    此限制适用于所有集合,包括没有加密字段的集合,以及在子管道(例如 $unionWith)中使用 $rerank 的情况。

rerank-3 和 rerank-3-lite 模型还有以下附加限制:

  • 仅适用于运行 MongoDB 9.0 或更高版本的专用集群(M10 或更高版本)。

  • 尚不适用于免费集群 (M0) 或 Flex 集群。

$rerank 可以出现在管道中的任何位置。但是,MongoDB 建议在 $search 或 $vectorSearch 等已按排序返回相关文档的阶段之后使用 $rerank。

$rerank 重新排序并返回传递到此阶段的前 numDocsToRerank 个文档。如果 $rerank 是第一阶段,或者先前的阶段未返回确定性排序的结果,则用于 $rerank 的文档可能会在查询之间发生变化。

$rerank 如果 path 中指定的任何字段在一个或多个输入文档中不存在,则返回错误。为了缓解这一问题,请使用:

  • $set 阶段将缺失字段设置为空字符串。

  • $match 阶段可用于过滤掉缺少字段的文档。

要了解有关 $rerank 实施的内存限制以及请求超出限制时返回的错误,请参阅 $rerank 请求因内存限制错误而失败。

query.text 字段确定重排名模型如何对每个文档进行评分。指定的 Voyage 重排名模型 计算查询文本与指定 path 处的每个文档内容之间的相关性分数。对于大多数使用案例,请将 $rerank.query.text 设置为与前面 $search 或 $vectorSearch 阶段的查询相同或相似的文本。

使用 score 变量和 $meta 表达式检索$rerank 阶段结果中每个文档的分数。

示例:将重新排名分数添加到管道

{ "$addFields": { "rerankScore": { "$meta": "score" } }}

$rerank 阶段将 $meta: "score" 的值替换为新分数。要保留 $rankFusion 等前一阶段的值,您可以在 $rerank 阶段之前将分数项目到命名字段中。

示例:保留前一阶段的分数

{ "$addFields": { "originalRankFusionScore": { "$meta": "score" } }},{ "$rerank": { ... }},{ "$addFields": { "rerankScore": { "$meta": "score" } }}

$rerank 阶段可能会涉及大量计算,具体取决于输入的大小,例如要重新排序的字段、要重新排序的文档数量和查询文本。$rerank 在查询时间内共同处理查询和文档。因此,$rerank 可能比索引提供的相关性搜索慢,例如 $search 或 $vectorSearch 的索引。为了平衡准确性和性能,请配置 numDocsToRerank 和 path 以限制输入大小。$rerank 不会在 Atlas 集群资源上运行 Voyage AI 重新排序模型。

$rerank 最适合在资源检索质量优先于超低延迟的工作负载,例如 RAG 和代理 AI 应用程序。对于需要超低延迟的工作负载,MongoDB 建议使用索引驱动的搜索阶段,例如 $search 或 $vectorSearch。

以下示例演示了如何使用 $rerank 阶段根据 Voyage AI重排序器模型对 sample_mflix.embedded_movies集合中的文档重新排序。查询在$match阶段之后使用 $rerank,以使用 rerank-2.5 重新排序器模型对文档重新排序。在以下聚合管道中:

  • $match 阶段筛选文档,以仅包含具有 string 类型的 plot字段的文档。

  • $sort 阶段按 released字段的降序对文档进行排序,以确保确定性的排序。

  • $rerank 阶段使用 rerank-2.5 重排序器模型对文档重新排序以匹配查询。

  • $addFields 阶段将名为 rerankScore 的字段添加到文档中。

db.embedded_movies.aggregate([ { "$match": { "plot": { "$exists": true, "$type": "string" } } }, { "$sort": { "released": -1 } }, { "$rerank": { "model": "rerank-2.5", "query": { "text": "a group of heroes band together to stop a powerful enemy and save the world" }, "numDocsToRerank": 100, "path": ["title", "plot"] } }, { "$addFields": { "rerankScore": { "$meta": "score" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "plot": 1, "rerankScore": 1 } }])