Milvus WeightedRanker 对比 RRF 重排机制

devtools/2025/3/22 9:45:38/

省流:优先选择WeightedRanker 

以rag为例,优先选择bm25全文检索,其次选择向量检索

Milvus混合搜索中的重排机制

Milvus通过hybrid_search() API启用混合搜索功能,结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程,解释其重要性以及Milvus中不同重排策略的实现。

概述

下图说明了Milvus中混合搜索的执行过程,并强调了重排在这一过程中的作用。

重排过程

混合搜索中的重排是一个关键步骤,它整合了来自多个向量字段的结果,确保最终输出具有相关性并准确排序。目前,Milvus提供以下重排策略:

  • WeightedRanker:这种方法通过计算不同向量搜索得分(或向量距离)的加权平均值来合并结果。它根据每个向量字段的重要性分配权重。

  • RRFRanker:这种策略基于不同向量列中的排名来合并结果。

加权评分 (WeightedRanker)

WeightedRanker策略根据每个向量字段的重要性为每个向量检索路径的结果分配不同权重。当不同向量字段的重要性各不相同时,应用此重排策略,允许通过分配更高的权重来强调某些向量字段。例如,在多模态搜索中,文本描述可能比图像中的颜色分布更为重要。

WeightedRanker的基本过程如下:

  • 检索期间收集分数:从不同的向量检索路径收集结果及其分数。

  • 分数归一化:将每个路径的分数归一化到[0,1]范围内,其中接近1的值表示更高的相关性。由于不同度量类型的分数分布不同,这种归一化非常重要。例如,IP的距离范围是[-∞,+∞],而L2的距离范围是[0,+∞]。Milvus使用arctan函数,将值转换到[0,1]范围内,为不同的度量类型提供标准化基础。

    arctan函数

  • 权重分配:为每个向量检索路径分配权重w𝑖。用户指定权重,这些权重反映了数据源的可靠性、准确性或其他相关指标。每个权重范围为[0,1]。

  • 分数融合:计算归一化分数的加权平均值以得出最终分数。然后根据这些从高到低的分数对结果进行排序,生成最终排序结果。

加权重排器

要使用此策略,应用WeightedRanker实例并通过传入多个数值参数来设置权重值。

from pymilvus import WeightedRanker
​
# 使用WeightedRanker以指定权重组合结果
rerank = WeightedRanker(0.8, 0.8, 0.7)

请注意:

  • 每个权重值范围从0(最不重要)到1(最重要),影响最终的聚合分数。

  • WeightedRanker中提供的权重值总数应等于您之前创建的AnnSearchRequest实例的数量。

  • 值得注意的是,由于不同度量类型的测量方式不同,我们将召回结果的距离归一化,使其位于[0,1]区间内,其中0表示不同,1表示相似。最终分数将是权重值和距离的总和。

倒数排名融合 (RRFRanker)

RRF是一种数据融合方法,它基于排名的倒数来合并排名列表。当没有明确的重要性优先级时,这是平衡每个向量字段影响的有效方法。当您希望对所有向量字段给予同等考虑,或者当对每个字段的相对重要性存在不确定性时,通常使用这种策略。

RRF的基本过程如下:

  • 检索期间收集排名:多个向量字段的检索器检索并排序结果。

  • 排名融合:RRF算法对每个检索器的排名进行加权和合并。公式如下:

    rrf排名器

    这里,𝑁表示不同检索路径的数量,rank𝑖(𝑑)是由第𝑖个检索器检索到的文档𝑑的排名位置,𝑘是平滑参数,通常设置为60。

  • 综合排名:基于组合分数对检索到的结果进行重新排序,以生成最终结果。

要使用此策略,应用RRFRanker实例。

from pymilvus import RRFRanker
​
# 默认k值为60
ranker = RRFRanker()
​
# 或指定k值
ranker = RRFRanker(k=100)

RRF允许在不指定明确权重的情况下平衡各字段的影响。多个字段一致认可的顶级匹配项将在最终排名中优先考虑。

总结与建议

总结

  1. Milvus混合搜索通过重排策略优化多向量检索的结果,提高搜索质量

  2. 目前支持两种主要重排策略:加权评分(WeightedRanker)和倒数排名融合(RRFRanker)

  3. WeightedRanker适用于明确知道各向量字段重要性的场景,允许用户手动设置权重

  4. RRFRanker适用于各向量字段重要性相近或不确定的场景,无需手动设置具体权重

建议

  1. 对于多模态搜索(如图像+文本),如果知道某一模态更重要,建议使用WeightedRanker

  2. 当不确定各向量字段相对重要性时,RRFRanker是更简单、更稳健的选择

  3. 使用WeightedRanker时,建议进行权重调优实验,找到最适合应用场景的权重组合

  4. 对于高精确度要求的应用,可考虑结合两种重排策略或自定义重排逻辑

  5. 记得考虑不同度量类型(如IP、L2等)的分数分布差异,理解Milvus的归一化处理机制


http://www.ppmy.cn/devtools/169127.html

相关文章

C++之模板二番战

本节我们将要介绍模板的深入知识。 文章目录 前言 一、非类型模板参数 1.1 非类型模板参数的特点 1.2 非类型模板参数的使用场景 1.3 非类型模板参数的使用实例 二、模板特例化 2.1 模板特例化的概念 2.2 函数模板特例化 2.3 函数模板特例化规则 2.4 完全特例化和偏特…

对RIP协议工作原理的分析【复习篇】

路由的分类 **静态路由:**通过网络管理员手工添加的路由条目 **动态路由:**所有路由器都运行相同的路由协议,之后通过路由器之间相互沟通、交流,最终计算出前往未知网段的路由条目 根据范围分类 AS自治系统 类型描述例子IGP&…

鸿蒙保姆级教学

鸿蒙(HarmonyOS)是华为推出的一款面向全场景的分布式操作系统,支持手机、平板、智能穿戴、智能家居、车载设备等多种设备。鸿蒙系统的核心特点是分布式架构、一次开发多端部署和高性能。以下是从入门到大神级别的鸿蒙开发深度分析&#xff0c…

水一个人的时候

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 设置画布 fig, ax plt.subplots() ax.set_xlim(-2, 2) ax.set_ylim(-2, 2) ax.set_aspect(equal) ax.axis(off) # 隐藏坐标轴 # 初始化爱心图案 heart_line, ax.pl…

nRF54L10—超低功耗无线 SoC

nRF54L10与nRF54L15和nRF54L05共同组成了nRF54L系列。nRF54L系列中的所有无线SoC都集成了超低功耗多协议2.4 GHz无线电和MCU(微控制器单元)功能,配备128MHz的Arm Cortex-M33处理器以及全面的外设集合。该系列提供多种封装和内存大小选择&…

阿里云平台Vue项目打包发布

目录: 1、vue项目打包2、通过ngixn发布vue的打包文件 1、vue项目打包 在你的vue项目下执行npm run build命令进行打包。 2、通过ngixn发布vue的打包文件 直接将打包的dist文件拷贝到nginx目录下即可。 修改nginx.conf的配置文件的相关配置,如端口或者ro…

Ubuntu20.04 Bevfusion TensorRt部署

记录一下第一次跑BevFusion的时候遇到的问题,网上相关资料较少,因此分享给大家如遇同样的问题 由于我的电脑是新配的5070,所以基本上驱动啥的都是最新版本 我的环境 os:ubuntu20.04 Tesnort:TensorRT-10.9.0.34 cuda:12.8 cudnn:8.9.7 pro…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker:在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…