RRF Ranker
Reciprocal Rank Fusion (RRF) Ranker は、Zilliz Cloud ハイブリッド検索のリランキング戦略であり、生の類似度スコアではなく、ランキング位置に基づいて複数のベクトル検索パスからの結果のバランスを取ります。個々の統計ではなくプレーヤーのランキングを考慮するスポーツトーナメントのように、RRF Ranker は、各アイテムが異なる検索パスでどれだけ上位にランク付けされているかに基づいて検索結果を組み合わせ、公平でバランスの取れた最終ランキングを作成します。
RRF Ranker を使用するタイミング
RRF Ranker は、明示的な重要度重みを割り当てることなく、複数のベクトル検索パスからの結果のバランスを取りたいハイブリッド検索シナリオ向けに特別に設計されています。特に次の場合に効果的です。
ユースケース | 例 | RRF Ranker がうまく機能する理由 |
|---|---|---|
重要度が等しいマルチモーダル検索 | 両方のモダリティが等しく重要である画像-テキスト検索 | 任意の重み割り当てを必要とせずに結果のバランスを取る |
アンサンブルベクトル検索 | 異なる埋め込みモデルからの結果を組み合わせる | 特定のモデルのスコアリング分布を優先することなく、ランキングを民主的にマージする |
多言語検索 | 複数の言語にわたるドキュメントの検索 | 言語固有の埋め込み特性に関係なく、結果を公平にランク付けする |
専門家による推奨 | 複数の専門家システムからの推奨を組み合わせる | 異なるシステムが比較できないスコアリング方法を使用する場合に、コンセンサスランキングを作成する |
ハイブリッド検索アプリケーションで、明示的な重みを割り当てることなく複数の検索パスのバランスを民主的に取る必要がある場合、RRF Ranker は理想的な選択肢です。
RRF Ranker のメカニズム
RRFRanker 戦略の主なワークフローは次のとおりです。
-
検索ランキングを収集: ベクトル検索の各パスからの結果のランキング (rank_1, rank_2) を収集します。
-
ランキングをマージ: 各パスからのランキング (rank_rrf_1, rank_rrf_2) を式に従って変換します。
計算式には、検索数を表す N が含まれます。ranki(d) は、i 番目のリトリーバーによって生成されたドキュメント d のランキング位置です。k は、通常 60 に設定される平滑化パラメーターです。
-
ランキングを集計: 結合されたランキングに基づいて検索結果を再ランク付けし、最終結果を生成します。

RRF Ranker の例
この例では、疎密ベクトルに対するハイブリッド検索 (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.03252247
198
4
1
1/(60+4)+1/(60+1) = 0.03201844
175
5
4
1/(60+5)+1/(60+4) = 0.03100962
203
2
N/A
1/(60+2) = 0.01612903
150
3
N/A
1/(60+3) = 0.01587302
110
N/A
3
1/(60+3) = 0.01587302
250
N/A
5
1/(60+5) = 0.01538462
-
再ランキング後の最終結果 (topK=5):
ランク
ID
最終スコア
1
101
0.03252247
2
198
0.03201844
3
175
0.03100962
4
203
0.01612903
5
150
0.01587302
5
110
0.01587302
RRF Ranker の使用法
RRF リランキング戦略を使用する場合、パラメーター k を設定する必要があります。これは、全文検索とベクトル検索の相対的な重みを効果的に変更できる平滑化パラメーターです。このパラメーターのデフォルト値は 60 で、(0, 16384) の範囲で調整できます。値は浮動小数点数である必要があります。推奨値は [10, 100] の間です。k=60 は一般的な選択ですが、最適な k の値は特定のアプリケーションとデータセットによって異なります。最適なパフォーマンスを達成するために、特定のユースケースに基づいてこのパラメーターをテストおよび調整することをお勧めします。
RRF Ranker の作成
コレクションが複数のベクトルフィールドで設定されたら、適切な平滑化パラメーターを使用して RRF Ranker を作成します。
- Python
- Java
- NodeJS
- Go
- cURL
from pymilvus import Function, FunctionType
rerank = Function(
name="rrf",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "rrf",
"k": 100 # Optional
}
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function rerank = CreateCollectionReq.Function.builder()
.name("rrf")
.functionType(FunctionType.RERANK)
.param("reranker", "rrf")
.param("k", "100")
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const rerank = {
name: "rrf",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "rrf",
k: 100,
},
};
// Go
# Restful
パラメータ | 必須? | 説明 | 値/例 |
|---|---|---|---|
| はい | この関数のユニークな識別子 |
|
| はい | 関数を適用するベクトルフィールドのリスト(RRF Rankerの場合は空である必要があります) | [] |
| はい | 呼び出す関数のタイプ。リランキング戦略を指定するには |
|
| はい | 使用するリランキングメソッドを指定します。 RRF Rankerを使用するには |
|
| いいえ | ドキュメントのランクの影響を制御する平滑化パラメータ。 詳細については、RRF Rankerのメカニズムを参照してください。 |
|
ハイブリッド検索への適用
RRF Rankerは、複数のベクトルフィールドを組み合わせるハイブリッド検索操作のために特別に設計されています。ハイブリッド検索でこれを使用する方法は次のとおりです。
- Python
- Java
- NodeJS
- Go
- cURL
from pymilvus import MilvusClient, AnnSearchRequest
# Connect to Milvus server
milvus_client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")
# Assume you have a collection setup
# Define text vector search request
text_search = AnnSearchRequest(
data=["modern dining table"],
anns_field="text_vector",
param={},
limit=10
)
# Define image vector search request
image_search = AnnSearchRequest(
data=[image_embedding], # Image embedding vector
anns_field="image_vector",
param={},
limit=10
)
# Apply RRF Ranker to product hybrid search
# The smoothing parameter k controls the balance
hybrid_results = milvus_client.hybrid_search(
collection_name,
[text_search, image_search], # Multiple search requests
ranker=rerank, # Apply the RRF ranker
limit=10,
output_fields=["product_name", "price", "category"]
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.AnnSearchReq;
import io.milvus.v2.service.vector.request.HybridSearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.build());
List<AnnSearchReq> searchRequests = new ArrayList<>();
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("text_vector")
.vectors(Collections.singletonList(new EmbeddedText("\"modern dining table\"")))
.limit(10)
.build());
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("image_vector")
.vectors(Collections.singletonList(new FloatVec(imageEmbedding)))
.limit(10)
.build());
HybridSearchReq hybridSearchReq = HybridSearchReq.builder()
.collectionName(COLLECTION_NAME)
.searchRequests(searchRequests)
.ranker(rerank)
.limit(10)
.outputFields(Arrays.asList("product_name", "price", "category"))
.build();
SearchResp searchResp = client.hybridSearch(hybridSearchReq);
import { MilvusClient, FunctionType } from "@zilliz/milvus2-sdk-node";
const milvusClient = new MilvusClient({ address: "YOUR_CLUSTER_ENDPOINT" });
const text_search = {
data: ["modern dining table"],
anns_field: "text_vector",
param: {},
limit: 10,
};
const image_search = {
data: [image_embedding],
anns_field: "image_vector",
param: {},
limit: 10,
};
const search = await milvusClient.search({
collection_name: collection_name,
data: [text_search, image_search],
output_fields: ["product_name", "price", "category"],
limit: 10,
rerank: rerank,
});
// go
# restful
ハイブリッド検索の詳細については、マルチベクトルハイブリッド検索を参照してください。