平衡尺度:利用权重使倒数排序融合 (RRF) 更加智能

作者:来自 Elastic Mridula Sivanandan

在 Elasticsearch 中探索加权倒数排序融合 (RRF),以及它如何通过实际示例工作。

亲自体验向量搜索,使用这个自定进度的 Search AI 实操学习。你现在可以开始免费云试用,或在本地机器上尝试 Elastic。

想象一下:你正在构建一个餐馆搜索,需要平衡位置相关性和菜系匹配。有些查询更关注 "pizza near me, - 离我近的 pizza",而另一些则优先考虑"Italian restaurants that serve cacio e pepe - 提供 cacio e pepe 的意大利餐馆" 或 "highly reviewed Italian restaurants - 评价很高的意大利餐馆"。直到现在,Elasticsearch 的倒数排序融合 (RRF) 一直把所有检索器视为平等,但你的搜索策略不应该如此。

这就是加权 RRF 的用武之地。它不再让每个检索器在搜索结果中拥有同样的权重,而是允许你微调它们的影响,从而创造更细致和更有效的搜索体验。在这篇博客中,我们将探讨加权 RRF 的必要性,并演示如何在不同的搜索场景中使用它。

挑战:一刀切并不适用

RRF 非常适合将不同的检索策略 ------ 比如关键词、语义和向量搜索 ------ 组合成一个单一的排序结果集。但如果对所有检索器一视同仁,当某些检索方法对特定查询类型更有价值时,就可能限制搜索质量。

想象一个餐厅搜索,不同的查询类型需要不同的排序策略:

  • 以位置为中心的查询,比如 "pizza near me",需要以城市、社区或距离等基于位置的信号在排序中占主导。
  • 以菜品为中心的查询,比如 "Italian restaurants that serve cacio e pepe",应当优先考虑菜单项匹配和菜系类型,而不是距离远近。
  • 以质量为中心的查询,比如 "highly reviewed Italian restaurants",应当把评分和评论置于所有其他因素之上。

在加权 RRF 出现之前,平衡这些信号的标准方法是分数的线性组合(分配固定权重并求和)。虽然功能强大,但这种方式往往需要通过多次搜索、自定义打分函数或人工后处理等变通手段,而这些都很难维护和有效调整。

加权 RRF 消除了这些痛点,它提供了一个统一的框架,让每个检索器都有自己的权重,并由 RRF 算法自动处理排序融合。

解决方案:通过加权实现精确

加权 RRF 提供了一种简单但强大的方式,可以为不同的检索器分配不同的重要性等级。每个检索器现在都接受一个权重参数,用来影响它对最终 RRF 分数的贡献。

这对你的搜索意味着什么

加权 RRF 给了你更大的灵活性,可以创建更智能、更贴合需求的搜索体验。

更智能的相关性调优:不再是一刀切的排序。对于概念性查询("find restaurants with cozy atmosphere"),可以给语义搜索检索器更高的权重;而对于具体词语("Margherita pizza"),则提升关键词匹配的权重。

实践中的运作方式

假设你正在构建餐厅搜索。以下是加权 RRF 如何在不同搜索场景下改变查询策略的示例:

场景 1:"Pizza near me" ------ 以位置为中心的搜索

一个用户在手机上搜索 "pizza near me"。在这种情况下,距离最重要。加权 RRF 让我们能够给予基于位置的信号(城市、社区、邮政编码)更多的影响力,而不是关键词 "pizza" 的匹配。

下面是该查询在 JSON 中可能的样子:

bash 复制代码
`

1.  {
2.    "retriever": {
3.      "rrf": {
4.        "retrievers": [
5.          {
6.            "retriever": {
7.              "standard": {
8.                "query": {
9.                  "multi_match": {
10.                    "query": "Vienna",
11.                    "fields": ["city", "neighborhood", "postal_code"]
12.                  }
13.                }
14.              }
15.            },
16.            "weight": 0.8
17.          },
18.          {
19.            "retriever": {
20.              "standard": {
21.                "query": {
22.                  "match": {
23.                    "menu_items": "pizza"
24.                  }
25.                }
26.              }
27.            },
28.            "weight": 0.2
29.          }
30.        ]
31.      }
32.    }
33.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这种加权方式会偏向附近的餐厅,即使菜单文本匹配较弱。

场景 2:"Italian restaurants that serve cacio e pepe" ------ 以菜系和菜品为中心的搜索

在这里,用户想要寻找特定的菜系和菜品。加权 RRF 强调菜系和菜单匹配,同时仍然允许距离作为次要因素发挥作用。

下面是该查询在 JSON 中可能的样子:

markdown 复制代码
`

1.  {
2.    "retriever": {
3.      "rrf": {
4.        "retrievers": [
5.          {
6.            "retriever": {
7.              "standard": {
8.                "query": {
9.                  "match": {
10.                    "cuisine_type": "Italian"
11.                  }
12.                }
13.              }
14.            },
15.            "weight": 0.4
16.          },
17.          {
18.            "retriever": {
19.              "standard": {
20.                "query": {
21.                  "match": {
22.                    "menu_items": "cacio e pepe"
23.                  }
24.                }
25.              }
26.            },
27.            "weight": 0.6
28.          }
29.        ]
30.      }
31.    }
32.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这种加权方式会提升那些明确提到该菜品和菜系的餐厅,即使它们距离稍远。

场景 3:"Highly reviewed Italian restaurants" ------ 以质量和菜系为中心的搜索

当质量是首要考虑时,评分占据最重要的权重。加权 RRF 允许评分阈值引导排序,同时将菜系类型作为辅助因素。

下面是该查询在 JSON 中可能的样子:

markdown 复制代码
`

1.  {
2.    "retriever": {
3.      "rrf": {
4.        "retrievers": [
5.          {
6.            "retriever": {
7.              "standard": {
8.                "query": {
9.                  "range": {
10.                    "rating": {"gte": 4.5}
11.                  }
12.                }
13.              }
14.            },
15.            "weight": 0.7
16.          },
17.          {
18.            "retriever": {
19.              "standard": {
20.                "query": {
21.                  "match": {
22.                    "cuisine_type": "Italian"
23.                  }
24.                }
25.              }
26.            },
27.            "weight": 0.3
28.          }
29.        ]
30.      }
31.    }
32.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这种加权方式会提升高评分的 Italian 餐厅,在保持菜系相关性的同时,让评分起主导作用。

加权 RRF 通过为每个检索器设置权重,把这些偏好直接编码进排序中,因此最终的顺序能够反映每个查询真正重要的因素。

底层原理

在计算最终分数时,标准的 RRF 公式被加上了权重:

示例:rank_constant = 60。每个检索器的贡献为:weight × 1 / (rank + rank_constant)。权重越高,影响力越大;排序从 1 开始。

关键技术特性包括:

  • 权重可选:当你需要更精细的控制时,可以选择为每个检索器单独设置权重;如果只有部分检索器需要加权,也可以使用默认权重。
  • 输入校验:权重必须是非负数。

想要进行高级定制和混合评分(包括归一化),请参阅 Linear retriever www.elastic.co/docs/refere...

接下来?

加权 RRF 将 RRF 扩展到生产场景中,这些场景需要比标准 RRF 更多的控制。那些需要对搜索相关性进行细粒度控制的团队,现在可以使用 RRF,而不必再构建自定义解决方案。无论是餐厅搜索中平衡位置和菜系,电商搜索中平衡品牌和类别,还是其他复杂的排序场景,加权 RRF 都能提供你所需的精确度。

我们迫不及待想看到你如何使用加权 RRF 来打造更智能、更灵活的搜索体验。祝搜索愉快!

准备深入了解?请查阅我们官方文档中的 Reciprocal Rank FusionRetriever APIs

原文:www.elastic.co/search-labs...

相关推荐
ACGkaka_1 小时前
ES 学习(九)从文本到词元:分词器如何“拆解“你的数据
大数据·学习·elasticsearch
Elastic 中国社区官方博客2 小时前
如何使用 LogsDB 降低 Elasticsearch 日志存储成本
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·可用性测试
A__tao2 小时前
一键实现 SQL 转 Elasticsearch Mapping(支持字段注释 + meta 描述)
数据库·sql·elasticsearch
老纪的技术唠嗑局1 天前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch1 天前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖1 天前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦1 天前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅1 天前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水1 天前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑1 天前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎