省流:优先选择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]范围内,为不同的度量类型提供标准化基础。 -
权重分配:为每个向量检索路径分配权重
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算法对每个检索器的排名进行加权和合并。公式如下:
这里,𝑁表示不同检索路径的数量,rank𝑖(𝑑)是由第𝑖个检索器检索到的文档𝑑的排名位置,𝑘是平滑参数,通常设置为60。
-
综合排名:基于组合分数对检索到的结果进行重新排序,以生成最终结果。
要使用此策略,应用RRFRanker
实例。
from pymilvus import RRFRanker # 默认k值为60 ranker = RRFRanker() # 或指定k值 ranker = RRFRanker(k=100)
RRF允许在不指定明确权重的情况下平衡各字段的影响。多个字段一致认可的顶级匹配项将在最终排名中优先考虑。
总结与建议
总结
-
Milvus混合搜索通过重排策略优化多向量检索的结果,提高搜索质量
-
目前支持两种主要重排策略:加权评分(WeightedRanker)和倒数排名融合(RRFRanker)
-
WeightedRanker适用于明确知道各向量字段重要性的场景,允许用户手动设置权重
-
RRFRanker适用于各向量字段重要性相近或不确定的场景,无需手动设置具体权重
建议
-
对于多模态搜索(如图像+文本),如果知道某一模态更重要,建议使用WeightedRanker
-
当不确定各向量字段相对重要性时,RRFRanker是更简单、更稳健的选择
-
使用WeightedRanker时,建议进行权重调优实验,找到最适合应用场景的权重组合
-
对于高精确度要求的应用,可考虑结合两种重排策略或自定义重排逻辑
-
记得考虑不同度量类型(如IP、L2等)的分数分布差异,理解Milvus的归一化处理机制