リランキング
ハイブリッド検索は、複数の同時ANN検索により、より正確な検索結果を実現します。複数の検索は複数の結果セットを返し、結果をマージして並べ替え、単一の結果セットを返すために再ランキング戦略が必要です。このガイドでは、Zilliz Cloudでサポートされる再ランキング戦略を紹介し、適切な再ランキング戦略を選択するためのヒントを提供します。
概要について
次の図は、マルチモーダル検索アプリケーションでハイブリッド検索を実行する主なワークフローを示しています。図では、1つのパスはテキスト上の基本的なANN検索であり、もう1つのパスは画像上の基本的なANN検索です。各パスは、それぞれテキストと画像の類似スコアに基づいて一連の結果を生成します(Limit 1およびLimit 2)。その後、再ランキング戦略が適用され、統一された基準に基づいて2つの結果セットが再ランク付けされ、最終的に2つの結果セットが最終的な検索結果セットである**Limit(final)**にマージされます。
ハイブリッド検索において、再ランキングは複数のベクトル検索の結果を統合し、最終的な出力が最も関連性が高く正確であることを確認するための重要なステップです。現在、Zilliz Cloudは、以下の2つの再ランキング戦略をサポートしています
-
WeightedRanker:この戦略は、異なるベクトル検索からのスコア(または距離)の重み付けスコアを計算することによって結果を統合します。重みは、各ベクトルフィールドの重要度に基づいて割り当てられ、特定のユースケースの優先順位に応じてカスタマイズすることができます。
-
RRFRanker(Reciprocal Rank Fusion Ranker):この戦略は、ランキングに基づいて結果を組み合わせます。異なる検索からの結果のランクをバランスさせる方法を使用し、しばしば多様なデータタイプやモダリティのより公正かつ効果的な統合につながります。
WeightedRanker
WeightedRanker戦略は、ベクトル検索の各パスの重要度に基づいて、結果に異なる重みを割り当てます。
WeightedRankerの仕組み
WeightedRanker戦略の主なワークフローは以下の通りです:
-
検索スコア収集:ベクトル検索の各パス(スコア1、スコア2)から結果とスコアを収集します。
-
スコア正規化:各検索は異なる類似性メトリックを使用する場合があり、異なるスコア分布が得られます。たとえば、内積(IP)を類似性タイプとして使用すると、[-∞、+∞]のスコアが得られますが、ユークリッド距離(L 2)を使用すると、[0、+∞]のスコアが得られます。異なる検索からのスコア範囲が異なり、直接比較できないため、検索の各パスのスコアを正規化する必要があります。通常、
arctan
関数を適用して、スコアを[0、1]の範囲に変換します(スコア_1_正規化、スコア_2_正規化)。1に近いスコアは、より高い類似性を示します。 -
重みを割り当てる:異なるベクトル場に割り当てられた重要度に基づいて、重み(wi)が正規化されたスコア(スコア_1_正規化、スコア_2_正規化)に割り当てられます。各パスの重みは[0,1]の範囲である必要があります。結果として得られる重み付きスコアは、スコア_1_重みとスコア_2_重みです。
-
Merge Scores:加重されたスコア(score_1_、score_2_)は、最高から最低までランク付けされ、最終的なスコアセット(score_final)が生成されます。
WeightedRankerの例
この例は、画像とテキストを含むマルチモーダルハイブリッド検索(topK=5)を示し、WeightedRanker戦略が2つのANN検索の結果を再ランク付けする方法を示しています。
- 画像のANN検索の結果(topK=5):
ID | スコア(画像) |
---|---|
101 | 0.92 |
203 | 0.88 |
150 | 0.85 |
198 | 0.83 |
175 | 0.8 |
- テキストに対するANN検索の結果(topK=5):
ID | スコア(テキスト) |
---|---|
198 | 0.91 |
101 | 0.87 |
110 | 0.85 |
175 | 0.82 |
250 | 0.78 |
- WeightedRankerを使用して、画像とテキストの検索結果に重みを付けます。画像ANN検索の重みが0.6、テキスト検索の重みが0.4とします。
ID | スコア(画像) | 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 | 画像にない | 0.85 | 0.6×0+0.4×0.85=0.34 |
250 | 画像にない | 0.78 | 0.6×0+0.4×0.78=0.312 |
- リランキング後の最終結果(topK=5):
ランキング | ID | 最終スコア |
---|---|---|
1 | 101 | 0.90 |
2 | 198 | 0.86 |
3 | 175 | 0.81 |
4 | 203 | 0.528 |
5 | 150 | 0.51 |
WeightedRankerの使い方
WeightedRanker戦略を使用する場合、重み値を入力する必要があります。入力する重み値の数は、ハイブリッド検索の基本ANN検索リクエストの数に対応する必要があります。入力重み値は[0,1]の範囲内にあり、1に近い値ほど重要度が高いことを示します。
例えば、ハイブリッド検索にはテキスト検索と画像検索の2つの基本的なANN検索リクエストがあるとします。テキスト検索がより重要と考えられる場合は、より大きな重みを割り当てる必要があります。
- 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)は、ランキングの逆数に基づいてランク付けされたリストを組み合わせるデータフュージョン手法です。この再ランキング戦略は、ベクトル検索の各パスの重要性を効果的にバランスさせます。
RRFRankerの仕組み
RRFRanker戦略の主なワークフローは以下の通りです:
-
検索ランキングの収集:ベクトル検索の各パスから結果のランキングを収集します(ランク_1、ランク_2)。
-
ランキングの統合:レシピに従って、各パス(rank_rrf_1、rank_rrf_2)のランキングを変換します。
計算レシピには、検索回数を表すNが含まれます。ranki(d)は、i(th)リトリーバによって生成された文書dのランキング位置です。kは、通常60に設定されるスムージングパラメータです。
-
集計ランキング:組み合わせたランキングに基づいて検索結果を再ランク付けし、最終結果を生成します。
RRFRankerの例
この例は、疎密度ベクトルに対するハイブリッド検索(topK=5)を示し、RRFRanker戦略が2つのANN検索の結果を再ランク付けする方法を示しています。
- テキストの疎ベクトルに対するANN検索の結果(topK=5):
ID | ランク(スパース) |
---|---|
101 | 1 |
203 | 2 |
150 | 3 |
198 | 4 |
175 | 5 |
- テキストの密なベクトルに対するANN検索の結果(topK=5):
ID | ランク(密) |
---|---|
198 | 1 |
101 | 2 |
110 | 3 |
175 | 4 |
250 | 5 |
- RRFを使用して、2つの検索結果のランキングを再配置します。スムージングパラメータ
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 | 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 | 最終スコア |
---|---|---|
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,163 8 4)の範囲内で調整できます。値は浮動小数点数である必要があります。推奨値は[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}
}'
適切な再ランキング戦略を選択
再ランキング戦略を選択する際に考慮すべきことの1つは、ベクトル場に対して1つ以上の基本的なANN検索に重点があるかどうかです。
-
WeightedRanker:この戦略は、特定のベクトルフィールドを強調する必要がある場合に推奨されます。WeightedRankerを使用すると、特定のベクトルフィールドにより高い重みを割り当て、それらをより強調することができます。たとえば、マルチモーダル検索では、画像のテキストの説明が、この画像の色よりも重要と考えられる場合があります。
-
RRFRanker(Reciprocal Rank Fusion Ranker):この戦略は、特定の強調がない場合に推奨されます。RRFは、各ベクトル場の重要性を効果的にバランスさせることができます。