Reranker
混合搜索通过多个同时进行的 ANN 搜索获得更精确的搜索结果。多次搜索会返回多组结果,这就需要 Reranking 策略来帮助合并和 Reranking 结果,并返回一组结果。本指南将介绍 Milvus 支持的重排策略,并提供选择适当重排策略的提示。
概述
下图显示了在多模态搜索应用程序中进行混合搜索的主要工作流程。图中,一条路径是文本的基本 ANN 搜索,另一条路径是图像的基本 ANN 搜索。每条路径分别根据文本和图像相似度得分生成一组结果**(极限 1和极限 2**)。然后应用重排策略,根据统一的标准对两组结果进行重排,最终将两组结果合并为一组最终的搜索结果,即Limit(final)。
多向量 Reranker
在混合搜索中,Reranker 是整合多向量搜索结果的关键步骤,以确保最终输出的结果是最相关、最准确的。目前,Milvus 支持以下两种重排策略:
-
加权排名:该策略通过计算来自不同向量搜索的得分(或距离)的加权分数来合并结果。权重根据每个向量字段的重要性分配,允许根据特定用例的优先级进行定制。
-
RRFRanker(互易排名融合 Ranker):该策略根据排序合并结果。它使用一种平衡不同搜索结果排名的方法,通常能更公平、更有效地整合不同的数据类型或模式。
加权排名
WeightedRanker 策略会根据向量搜索每条路径结果的重要性为其分配不同的权重。
加权排名机制
WeightedRanker 策略的主要工作流程如下:
-
Collection 搜索得分:收集向量搜索各路径的结果和分数(score_1、score_2)。
-
分数归一化:每次搜索可能会使用不同的相似度指标,从而导致不同的分数分布。例如,使用 "内积"(IP)作为相似度类型可能会产生[-∞,+∞]的分数,而使用 "欧氏距离"(L2)则会产生[0,+∞]的分数。由于不同搜索的得分范围各不相同,无法直接比较,因此有必要对每条搜索路径的得分进行归一化处理。通常情况下,
arctan函数用于将分数转换为 [0, 1] 之间的范围(score_1_normalized, score_2_normalized)。分数越接近 1 表示相似度越高。 -
分配权重:根据分配给不同向量字段的重要性,为归一化分数(score_1_normalized,score_2_normalized)分配权重(wi)。每条路径的权重范围应在 [0,1] 之间。由此得出的加权分数为 score_1_weighted 和 score_2_weighted。
-
合并分数:将加权分数(score_1_weighted、score_2_weighted)从高到低排序,得出一组最终分数(score_final)。
加权 Reranker
加权重排名示例
本例演示了涉及图像和文本的多模态混合搜索(topK=5),并说明了加权 Reranker 策略如何对两次 ANN 搜索的结果进行 Reranking。
- 对图像进行 ANN 搜索的结果(topK=5): ID
| ID
|
得分(图像)
| | --- | --- | |
101
|
0.92
| |
203
|
0.88
| |
150
|
0.85
| |
198
|
0.83
| |
175
|
0.8
|
- 文本的 ANN 搜索结果(topK=5): ID
| ID
|
得分(文本)
| | --- | --- | |
198
|
0.91
| |
101
|
0.87
| |
110
|
0.85
| |
175
|
0.82
| |
250
|
0.78
|
- 使用 WeightedRanker 为图像和文本搜索结果分配权重。假设图像 ANN 搜索的权重为 0.6,文本搜索的权重为 0.4。
| ID
|
得分(图像)
|
得分(文本)
|
加权得分
| | --- | --- | --- | --- | |
101
|
0.92
|
0.87
|
0.6×0.92+0.4×0.87=0.90
| |
203
|
0.88
|
不适用
|
0.6×0.88+0.4×0=0.528
| |
150
|
0.85
|
不适用
|
0.6×0.85+0.4×0=0.51
| |
198
|
0.83
|
0.91
|
0.6×0.83+0.4×0.91=0.86
| |
175
|
0.80
|
0.82
|
0.6×0.80+0.4×0.82=0.81
| |
110
|
不在图像中
|
0.85
|
0.6×0+0.4×0.85=0.34
| |
250
|
不在图像中
|
0.78
|
0.6×0+0.4×0.78=0.312
|
- Reranking 后的最终结果(topK=5): 0.6×0+0.4×0.85=0.34
| 排名
|
ID
|
最终得分
| | --- | --- | --- | |
1
|
101
|
0.90
| |
2
|
198
|
0.86
| |
3
|
175
|
0.81
| |
4
|
203
|
0.528
| |
5
|
150
|
0.51
|
加权排序器的使用
使用加权排名策略时,需要输入权重值。输入权重值的数量应与混合搜索中基本 ANN 搜索请求的数量一致。输入的权重值范围应为 [0,1],权重值越接近 1 表示重要性越高。
例如,假设混合搜索中有两个基本 ANN 搜索请求:文本搜索和图像搜索。如果认为文本搜索更重要,就应该赋予它更大的权重。
- Python
- Java
- Go
- NodeJS
- cURL
from pymilvus import WeightedRanker
rerank= WeightedRanker(0.8, 0.3)
import io.milvus.v2.service.vector.request.ranker.WeightedRanker;
WeightedRanker rerank = new WeightedRanker(Arrays.asList(0.8f, 0.3f))
import "github.com/milvus-io/milvus/client/v2/milvusclient"
reranker := milvusclient.NewWeightedReranker([]float64{0.8, 0.3})
rerank: WeightedRanker(0.8, 0.3)
export rerank='{
"strategy": "ws",
"params": {"weights": [0.8,0.3]}
}'
RRFRanker
互易排名融合(RRF)是一种数据融合方法,它根据排名的倒数来组合排名列表。这种 Reranking 策略能有效平衡向量搜索各路径的重要性。
RRFRanker 的机制
RRFRanker 策略的主要工作流程如下:
-
收集搜索排名:收集向量搜索各路径结果的排名(rank_1、rank_2)。
-
合并排名:根据公式转换各路径的排名(rank_rrf_1,rank_rrf_2)。
计算公式中的N 代表检索次数,ranki*(d* )是第 i 个检索器生成的文档d的排名位置,k是平滑参数,通常设置为 60。
-
汇总排名:根据综合排名对搜索结果 Reranking,得出最终结果。
RRF Reranker
RRFRanker 示例
本例演示了稀疏稠密向量上的混合搜索(topK=5),并说明了 RRFRanker 策略如何对两次 ANN 搜索的结果进行 Reranking。
- 文本稀疏向量上的 ANN 搜索结果(topK=5): ID
| ID
|
排名(稀疏)
| | --- | --- | |
101
|
1
| |
203
|
2
| |
150
|
3
| |
198
|
4
| |
175
|
5
|
- 对文本稠密向量进行 ANN 搜索的结果(topK=5): ID
| ID
|
排名(密集)
| | --- | --- | |
198
|
1
| |
101
|
2
| |
110
|
3
| |
175
|
4
| |
250
|
5
|
- 使用 RRF 重新排列两组搜索结果的排名。假设平滑参数
k设置为 60。
| ID
|
得分(稀疏)
|
得分(密集)
|
最终得分
| | --- | --- | --- | --- | |
101
|
1
|
2
|
1/(60+1)+1/(60+2) = 0.01639
| |
198
|
4
|
1
|
1/(60+4)+1/(60+1) = 0.01593
| |
175
|
5
|
4
|
1/(60+5)+1/(60+4) = 0.01554
| |
203
|
2
|
不适用
|
1/(60+2) = 0.01613
| |
150
|
3
|
不适用
|
1/(60+3) = 0.01587
| |
110
|
不适用
|
3
|
1/(60+3) = 0.01587
| |
250
|
不适用
|
5
|
1/(60+5) = 0.01554
|
- Reranking(topK=5)后的最终结果: Reranker
| 排名
|
ID
|
最终得分
| | --- | --- | --- | |
1
|
101
|
0.01639
| |
2
|
203
|
0.01613
| |
3
|
198
|
0.01593
| |
4
|
150
|
0.01587
| |
5
|
110
|
0.01587
|
RRFRanker 的使用
使用 RRF 重排策略时,需要配置参数k 。这是一个平滑参数,可以有效改变全文搜索与向量搜索的相对权重。该参数的默认值为 60,可在 (0, 16384) 的范围内调整。该值应为浮点数。推荐值在 [10, 100] 之间。虽然k=60 是常见的选择,但k 的最佳值可能因具体应用和数据集而异。我们建议根据具体使用情况测试和调整该参数,以实现最佳性能。
- Python
- Java
- Go
- NodeJS
- cURL
from pymilvus import RRFRanker
ranker = RRFRanker(100)
import io.milvus.v2.service.vector.request.ranker.RRFRanker;
RRFRanker ranker = new RRFRanker(100);
reranker := milvusclient.NewRRFReranker().WithK(100)
rerank: RRFRanker("100")
"rerank": {
"strategy": "rrf",
"params": {
"k": 100
}
}
export rerank='{
"strategy": "rrf",
"params": {"k": 100}
}'
选择正确的 Reranker 策略
在选择重排策略时,需要考虑的一点是,是否需要在向量字段上强调一个或多个基本 ANN 搜索。
-
加权排名:如果您要求结果强调特定的向量字段,建议使用该策略。通过 WeightedRanker,您可以为某些向量字段分配更高的权重,从而更加强调这些向量字段。例如,在多模态搜索中,图片的文字描述可能比图片的颜色更重要。
-
RRFRanker(互易排名融合 Ranker):在没有特定重点的情况下,建议采用这种策略。RRF 可以有效平衡每个向量字段的重要性。