ブーストレランカー
ベクトル距離に基づく意味的類似性の計算のみに依存する代わりに、ブーストレランカーを使用して、検索結果に意味のある方法で影響を与えることができます。これは、メタデータフィルタリングを使用して検索結果を迅速に調整するのに理想的です。
検索リクエストにブーストレランカー関数が含まれている場合、Milvusは関数内のオプションのフィルタリング条件を使用して検索結果候補の中から一致を検索し、指定された重みを適用してそれらの一致のスコアをブーストし、最終結果で一致したエンティティのランクを促進または抑制するのに役立ちます。
ブーストレランカーの使用場面
クロスエンコーダーモデルや融合アルゴリズムに依存する他のランカーとは異なり、ブーストレランカーはオプションのメタデータ駆動ルールを直接ランキングプロセスに注入するため、以下のようなシナリオでより適しています。
使用例 | 例 | ブーストレランカーがうまく機能する理由 |
|---|---|---|
ビジネス駆動型のコンテンツ優先順位付け |
| インデックスの再構築やベクトル埋め込みモデルの変更(時間のかかる作業)をする必要がなく、実時間でオプションのメタデータフィルターを適用して検索結果の特定のアイテムを即座に促進または抑制できます。このメカニズムにより、進化するビジネス要件に簡単に適応できる柔軟で動的な検索ランキングが可能になります。 |
戦略的内容のランク下げ |
|
複数のブーストレランカーを組み合わせて、より動的で堅牢な重みベースのランキング戦略を実装することもできます。
ブーストレランカーの仕組み
以下の図は、ブーストレランカーの主なワークフローを示しています。

データを挿入する際、Zilliz Cloudはデータをセグメントに分散配置します。検索中、各セグメントは候補のセットを返し、Zilliz Cloudはこれらのすべてのセグメントの候補をランキングして最終結果を生成します。検索リクエストにブーストレランカーが含まれている場合、Zilliz Cloudは潜在的な精度損失を防ぎ、再現率を向上させるために各セグメントからの候補結果にそれを適用します。
結果を確定する前に、Milvusは以下の通りブーストレランカーでこれらの候補を処理します:
-
ブーストレランカーで指定されたオプションのフィルタリング式を適用して、式に一致するエンティティを識別します。
-
ブーストレランカーで指定された重みを適用して、識別されたエンティティのスコアをブーストします。
マルチベクトルハイブリッド検索のランカーとしてブーストレランカーを使用することはできません。ただし、そのサブリクエスト(AnnSearchRequest)のいずれかのランカーとして使用することはできます。
ブーストレランカーの例
以下の例は、上位5つの最も関連性の高いエンティティを返す必要がある単一ベクトル検索でブーストレランカーを使用する方法を示しています。また、abstract doc typeのエンティティのスコアに重みを追加します。
-
セグメントで検索結果候補を収集します。
以下の表は、Milvusがエンティティを2つのセグメント(0001と0002)に分散配置し、各セグメントが5つの候補を返すことを想定しています。
ID
DocType
スコア
ランク
セグメント
117
abstract
0.344
1
0001
89
abstract
0.456
2
0001
257
body
0.578
3
0001
358
title
0.788
4
0001
168
body
0.899
5
0001
46
body
0.189
1
0002
48
body
0.265
2
0002
561
abstract
0.366
3
0002
344
abstract
0.444
4
0002
276
abstract
0.845
5
0002
-
ブーストレランカーで指定されたフィルタリング式 (
doctype='abstract') を適用します。以下の表の
DocTypeフィールドで示されているように、Milvusはdoctypeがabstractに設定されたすべてのエンティティを後続処理のためにマークします。ID
DocType
スコア
ランク
セグメント
117
abstract
0.344
1
0001
89
abstract
0.456
2
0001
257
body
0.578
3
0001
358
title
0.788
4
0001
168
body
0.899
5
0001
46
body
0.189
1
0002
48
body
0.265
2
0002
561
abstract
0.366
3
0002
344
abstract
0.444
4
0002
276
abstract
0.845
5
0002
-
ブーストレランカーで指定された重み (
weight=0.5) を適用します。前のステップで識別されたすべてのエンティティは、ブーストレランカーで指定された重みで乗算され、そのランクが変化します。
ID
DocType
スコア
加重スコア
(= スコア x 重み)
ランク
セグメント
117
abstract
0.344
0.172
1
0001
89
abstract
0.456
0.228
2
0001
257
body
0.578
0.578
3
0001
358
title
0.788
0.788
4
0001
168
body
0.899
0.899
5
0001
561
abstract
0.366
0.183
1
0002
46
body
0.189
0.189
2
0002
344
abstract
0.444
0.222
3
0002
48
body
0.265
0.265
4
0002
276
abstract
0.845
0.423
5
0002
📘注意重みは選択した浮動小数点数でなければなりません。上記の例のような場合、スコアが小さいほど関連性が高いことを示す場合は、1未満の重みを使用してください。それ以外の場合は、1より大きい重みを使用してください。
-
すべてのセグメントから重み付きスコアに基づいて候補をアグリゲートし、結果を確定します。
ID
DocType
スコア
加重スコア
ランク
セグメント
117
abstract
0.344
0.172
1
0001
561
abstract
0.366
0.183
2
0002
46
body
0.189
0.189
3
0002
344
abstract
0.444
0.222
4
0002
89
abstract
0.456
0.228
5
0001
ブーストレランカーの使用法
このセクションでは、単一ベクトル検索の結果に影響を与えるためにブーストレランカーを使用する方法の例を見ていきます。
ブーストレランカーの作成
ブーストレランカーを検索リクエストの再ランカーとして渡す前に、以下のように再ランク付け関数として適切に定義する必要があります:
- Python
- Java
- Go
- NodeJS
- cURL
from pymilvus import Function, FunctionType
ranker = Function(
name="boost",
input_field_names=[], # 空のリストでなければなりません
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"filter": "doctype == 'abstract'",
"random_score": {
"seed": 126,
"field": "id"
},
"weight": 0.5
}
)
import io.milvus.v2.service.vector.request.ranker.BoostRanker;
BoostRanker ranker = BoostRanker.builder()
.name("boost")
.filter("doctype == \"abstract\"")
.weight(5.0f)
.randomScoreField("id")
.randomScoreSeed(126)
.build();
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
filter: "doctype == 'abstract'",
random_score: {
seed: 126,
field: "id",
},
weight: 0.5,
},
};
# restful
パラメータ | 必須? | 説明 | 値/例 |
|---|---|---|---|
| はい | この関数の一意の識別子 |
|
| はい | 関数を適用するベクトルフィールドのリスト(ブーストレランカーの場合は空のリストでなければなりません) |
|
| はい | 呼び出す関数のタイプ;再ランク付け戦略を指定するには |
|
| はい | 再ランカーのタイプを指定します。 ブーストレランカーを使用するには |
|
| はい | 元の検索結果で一致したエンティティのスコアにかけられる重みを指定します。 値は浮動小数点数である必要があります。
|
|
| いいえ | 検索結果エンティティの中からエンティティを一致させるために使用されるフィルター式を指定します。 フィルタリングの説明で言及されている有効な基本フィルター式を使用できます。 注意: |
|
| いいえ | 0から1の間の値をランダムに生成するランダム関数を指定します。以下の2つのオプション引数があります:
|
|
単一ブーストレランカーによる検索
ブーストレランカー関数が準備できたら、検索リクエストで参照できます。以下の例では、すでに以下のフィールドを持つコレクションが作成されていると想定しています:id、vector、およびdoctype。
- Python
- Java
- Go
- NodeJS
- cURL
from pymilvus import MilvusClient
# Milvusサーバーに接続
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
# コレクションが設定されていると想定
# 作成されたランカーを使用した類似性検索を実行
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.functionScore(FunctionScore.builder()
.addFunction(ranker)
.build())
.build());
SearchResp searchResp = client.search(searchReq);
// go
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
// Milvusサーバーに接続
const client = new MilvusClient({
address: 'YOUR_CLUSTER_ENDPOINT',
token: 'YOUR_CLUSTER_TOKEN'
});
// コレクションが設定されていると想定
// 類似性検索を実行
const searchResults = await client.search({
collection_name: 'my_collection',
data: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911],
anns_field: 'vector',
output_fields: ['doctype'],
rerank: ranker,
});
console.log('検索結果:', searchResults);
# restful
複数ブーストレランカーによる検索
単一の検索で複数のブーストレランカーを組み合わせて検索結果に影響を与えることができます。これを行うには、複数のブーストレランカーを作成し、それらをFunctionScoreインスタンスで参照し、検索リクエストのランカーとしてFunctionScoreインスタンスを使用します。
以下の例では、0.8から1.2の間の重みを適用することによりすべての識別されたエンティティのスコアを修正する方法を示しています。
- Python
- Java
- Go
- NodeJS
- cURL
from pymilvus import MilvusClient, Function, FunctionType, FunctionScore
# 固定重みのブーストレランカーを作成
fix_weight_ranker = Function(
name="boost",
input_field_names=[], # 空のリストでなければなりません
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"weight": 0.8
}
)
# 0と0.4の間でランダムに生成された重みのブーストレランカーを作成
random_weight_ranker = Function(
name="boost",
input_field_names=[], # 空のリストでなければなりません
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"random_score": {
"seed": 126,
},
"weight": 0.4
}
)
# 関数スコアを作成
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)
# 作成された関数スコアを使用した類似性検索を実行
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function fixWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.8")
.build();
CreateCollectionReq.Function randomWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.4")
.param("random_score", "{\"seed\": 126}")
.build();
Map<String, String> params = new HashMap<>();
params.put("boost_mode","Multiply");
params.put("function_mode","Sum");
FunctionScore ranker = FunctionScore.builder()
.addFunction(fixWeightRanker)
.addFunction(randomWeightRanker)
.params(params)
.build();
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.addFunction(ranker)
.build());
SearchResp searchResp = client.search(searchReq);
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const fix_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
weight: 0.8,
},
};
const random_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
random_score: {
seed: 126,
},
weight: 0.4,
},
};
const ranker = {
functions: [fix_weight_ranker, random_weight_ranker],
params: {
boost_mode: "Multiply",
function_mode: "Sum",
},
};
await client.search({
collection_name: "my_collection",
data: [[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field: "vector",
params: {},
output_field: ["doctype"],
ranker: ranker
});
# restful
具体的には、2つのブーストレランカーがあります:1つはすべての見つかったエンティティに固定重みを適用し、もう1つはそれらにランダムな重みを割り当てます。次に、これらの2つのランカーをFunctionScoreで参照し、見つかったエンティティのスコアに重みがどのように影響するかを定義します。
以下の表は、FunctionScoreインスタンスを作成するために必要なパラメータを示しています。
パラメータ | 必須? | 説明 | 値/例 |
|---|---|---|---|
| はい | ターゲットランカーの名前をリストで指定します。 |
|
| いいえ | 指定された重みが一致したエンティティのスコアにどのように影響するかを指定します。 可能な値は以下の通りです:
|
|
| いいえ | さまざまなブーストレランカーから得られた加重値がどのように処理されるかを指定します。 可能な値は以下の通りです:
|
|