Reranking
Zilliz Cloud Hybrid Search 功能通过多路搜索单路召回实现更精准的搜索结果。多路搜索会返回多组结果,因此需要通过 Reranking 对多组搜索结果进行重新排序,最终合并成一组结果,实现单路召回。本节将介绍 Zilliz Cloud 中支持的 Reranking 策略并指导您挑选合适的 Reranking 策略。
概述
本小节将展示 Zilliz Cloud Hybrid Search 的主要流程。下图以双路搜索为例,一路基于文本进行基本 ANN 搜索,另一路基于图片进行基本 ANN 搜索。每一路搜索都会根据各自内部搜索的相似性 Score 对搜索结果排序,返回出一组搜索结果。两路搜索共返回两组结果 Limit 1 和 Limit 2。随后,采用 Reranking 策略,对两组结果的 Score 基于统一的标准进行折算和重新排序,将两组搜索结果合并,返回出一组最终的搜索结果 Limit(final)。
在 Hybrid Search 中,Reranking 是一个关键步骤,能够整合多路向量搜索的结果,确保最终输出相关性最高的准确结果。目前,Zilliz Cloud 支持以下几种 Reranking 策略:
-
WeightedRanker: 通过计算不同向量搜索得分(score)或距离(distance)的加权平均值来合并结果。这种策略会根据每个向量字段的重要性分配权重。
-
RRFRanker: 基于排名来组合结果。
WeightedRanker
WeightedRanker 策略根据每一路搜索的重要性,对每一路搜索的结果分配不同的权重。
实现机制
WeightedRanker 策略的的重排基本流程如下:
-
收集搜索得分: 收集每一路搜索的结果和得分 (score_1、score_2)。
-
得分归一化: 每一路搜索可能使用不同的相似度类型,因此每一路搜索返回的结果 score 分布会有所不同。例如:使用 IP 作为相似度类型时,搜索结果的 score 范围在 [-∞,+∞];使用 L2 作为相似度类型时,搜索结果的 score 范围在 [0,+∞]。由于两路搜索结果的 score 范围不同,无法直接进行排序,因此需要对每一路搜索的得分进行归一化,通过
arctan
函数转换范为围在 [0,1] 之间的得分(score_1_normalized、score_1_normalized)。转换后的得分值越接近 1, 表示对应搜索结果的相似性更高。 -
分配权重: 根据对不同列的侧重,为归一化后的得分(score_1_normalized、score_1_normalized)分配权重 wi。每一路的权重的范围在 [0,1] 之间。最终获得两组加权后的得分(score_1_weighted、score_2_weighted)。
-
融合得分: 根据加权后的得分(score_1_weighted、score_2_weighted)从高到低进行排名,得出一组最终得分(score_final)。
示例
本示例以图像和文本的多模态 Hybrid Search (topK=5)为例,展示了 Hybrid Search 过程中,WeightedRanker 策略如何对两路 ANN Search 结果进行重排。
- 图像 ANN 搜索结果 (topK=5):
ID | Score (图像) |
---|---|
101 | 0.92 |
203 | 0.88 |
150 | 0.85 |
198 | 0.83 |
175 | 0.8 |
- 文本 ANN 搜索结果(topK=5):
ID | Score (文本) |
---|---|
198 | 0.91 |
101 | 0.87 |
110 | 0.85 |
175 | 0.82 |
250 | 0.78 |
- 使用 Weighted Reranker 对两组搜索结果归一化、分配权重。假设图像 ANN 搜索权重为 0.6,文本搜索权重为 0.4。
ID | Score (图像) | Score (文本) | 最终加权后的 Score |
---|---|---|---|
101 | 0.92 | 0.87 | 0.6×0.92+0.4×0.87=0.90 |
203 | 0.88 | N/A | 0.6×0.88+0.4×0=0.528 |
150 | 0.85 | N/A | 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 | Not in Image | 0.85 | 0.6×0+0.4×0.85=0.34 |
250 | Not in Image | 0.78 | 0.6×0+0.4×0.78=0.312 |
- 对分配权重的搜索结果进行重排后的最终结果(topK=5):
排名 | ID | 最终 Score |
---|---|---|
1 | 101 | 0.90 |
2 | 198 | 0.86 |
3 | 175 | 0.81 |
4 | 203 | 0.528 |
5 | 150 | 0.51 |
用法
使用 WeightedRanker 策略时,需要在 WeightedRanker
中传入权重值。Hybrid search 中有几路搜索,就需要传入几个数值。传入的数值应当在 [0,1] 之间。权重值越接近 1 表示越重要。
假设 Hybrid Search 中有两路搜索:文本搜索和图片搜索。其中第一路文本搜索更为重要,需要分配更多的权重。
- Python
- Java
- 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))
rerank: WeightedRanker(0.8, 0.3)
export rerank='{
"strategy": "ws",
"params": {"weights": [0.8,0.3]}
}'
RRFRanker
RRF(Reciprocal Rank Fusion) 是一种数据融合方法,它基于排名的互反值来组合排名列表。这种重排策略能够有效平衡每一路向量搜索的重要性。
实现机制
RRF 策略的的重排基本流程如下:
-
收集搜索排名: 收集每一路搜索的结果排名 (rank_1、rank_2)。
-
融合排名:根据公式折算每一路的排名 (rank_rrf_1、rank_rrf_2)。
计算公式中,N 表示不同检索路径的数量,ranki(d) 是第 i 个检索器检索的文档 d 的排名位置,k 是平滑参数,通常设置为 60。
-
综合排名: 根据组合得分重新对检索结果进行排名,以产生最终结果。
示例
本示例以文本稀疏-稠密向量的 Hybrid Search (topK=5) 为例,展示了 Hybrid Search 过程中,RRFRanker如何对两路 ANN Search 结果进行重排。
- 稀疏文本向量 ANN 搜索结果 (topK=5):
ID | Rank (稀疏) |
---|---|
101 | 1 |
203 | 2 |
150 | 3 |
198 | 4 |
175 | 5 |
- 稠密文本向量 ANN 搜索结果(topK=5):
ID | Rank (稠密) |
---|---|
198 | 1 |
101 | 2 |
110 | 3 |
175 | 4 |
250 | 5 |
- 使用 RRF 对两组搜索结果排名进行折算。假设 RRF Reranking 的参数设置为
k=60
。
ID | Score (稀疏) | Score (稠密) | 最终 Score |
---|---|---|---|
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 | N/A | 1/(60+2) = 0.01613 |
150 | 3 | N/A | 1/(60+3) = 0.01587 |
110 | N/A | 3 | 1/(60+3) = 0.01587 |
250 | N/A | 5 | 1/(60+5) = 0.01554 |
- 对搜索结果进行重排后的最终结果(topK=5):
排名 | ID | 最终 Score |
---|---|---|
1 | 101 | 0.01639 |
2 | 203 | 0.01613 |
3 | 198 | 0.01593 |
4 | 150 | 0.01587 |
5 | 110 | 0.01587 |
用法
使用 RRF 策略时,需要在 RRFRanker
中传入参数值 k
。k
是平滑参数,可以有效地改变全文搜索和向量搜索的相对重要性权重。该参数的默认值为 60
,可调参数值为(0, 16384) 之间的浮点数,建议设置在 [10, 100]。虽然 k=60
是较为常用的选择,但最佳的 k 值因具体应用和数据特性而有所差异。我们建议根据您的实际情况测试并调整该参数值以获取最佳性能。
- Python
- Java
- NodeJS
- cURL
from pymilvus import RRFRanker
ranker = RRFRanker(100)
import io.milvus.v2.service.vector.request.ranker.RRFRanker;
RRFRanker ranker = new RRFRanker(100);
rerank: RRFRanker("100")
"rerank": {
"strategy": "rrf",
"params": {
"k": 100
}
}
export rerank='{
"strategy": "rrf",
"params": {"k": 100}
}'
选择合适的 Reranking 策略
选择 Reranking 策略时,需要考虑是否对多路搜索中的某一或某几路搜索有所侧重。
如果希望结果能够更侧重某个向量字段,推荐使用 WeightedRanker。因为 WeightedRanker 允许您通过分配更高的权重来强调某些向量字段。例如,在多模态搜索中,文本描述可能被认为比图像中的颜色分布更重要。
如果没有明确的侧重时,推荐使用 RFF。因为 RRF 能够有效平衡每一路向量搜索的重要性。