重排
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
# Use WeightedRanker to combine results with specified weights
rerank = WeightedRanker(0.8, 0.8, 0.7)
请注意
每个权重值的范围从 0(最不重要)到 1(最重要),影响最终的综合得分。
WeightedRanker
中提供的权重值总数应等于您之前创建的AnnSearchRequest
实例数。值得注意的是,由于不同度量类型的测量方法不同,我们对召回结果的距离进行了归一化处理,使其位于区间 [0,1],其中 0 表示不同,1 表示相似。最终得分将是权重值和距离的总和。
互易等级融合(RRFRanker)
RRF 是一种数据融合方法,它根据排名的倒数来组合排名列表。它是平衡各向量场影响的有效方法,尤其是在没有明确的重要性优先顺序时。这种策略通常用于想要对所有向量场给予同等考虑,或对每个场的相对重要性存在不确定性时。
RRF 的基本流程如下:
检索时收集排名:检索器跨多个向量字段检索并对结果进行排序。
排名融合:RRF 算法对每个检索器的排名进行权衡和合并。计算公式如下
RRF-ranker
这里,𝑁 代表不同检索路径的数量,rank𝑖(𝑑) 是第 𝑖 个检索器检索到的文档𝑑 的排名位置,𝑘 是平滑参数,通常设置为 60。
综合排名:根据综合得分对检索结果重新排序,得出最终结果。
要使用这一策略,请应用RRFRanker
实例。
from pymilvus import RRFRanker
# Default k value is 60
ranker = RRFRanker()
# Or specify k value
ranker = RRFRanker(k=100)
RRF 允许在不指定明确权重的情况下平衡各领域的影响。在最终排名中,多个字段一致同意的最匹配结果将被优先排序。