ブースト・ランカーCompatible with Milvus v2.6.2+
ブースト・ランカーは、ベクトル距離に基づいて計算された意味的類似性だけに頼るのではなく、意味のある方法で検索結果に影響を与えることができます。メタデータフィルタリングを使って検索結果を素早く調整するのに理想的です。
検索リクエストにBoost Ranker機能が含まれている場合、Milvusは機能内のオプションのフィルタリング条件を使用して検索結果候補の中から一致するものを見つけ、指定されたウェイトを適用することで一致したエンティティのスコアをブーストし、最終結果における一致したエンティティの順位を昇格または降格させます。
Boost Rankerを使用するタイミング
クロスエンコーダーモデルやフュージョンアルゴリズムに依存する他のランカーとは異なり、Boost Rankerはオプションのメタデータドリブンルールをランキングプロセスに直接注入します。
使用例 |
使用例 |
Boost Rankerが効果的な理由 |
|---|---|---|
ビジネス主導のコンテンツ優先順位付け |
|
インデックスを再構築したり、ベクトル埋め込みモデルを変更したりする必要がなく、オプションのメタデータフィルタをリアルタイムに適用することで、検索結果で特定のアイテムを即座に昇格または降格させることができます。このメカニズムにより、進化するビジネス要件に容易に適応する、柔軟でダイナミックな検索ランキングが可能になります。 |
戦略的コンテンツダウンランキング |
|
複数のBoost Rankerを組み合わせて、よりダイナミックで強固なウェイトベースのランキング戦略を実施することもできます。
ブースト・ランカーのメカニズム
次の図は、Boost Rankerの主なワークフローを示しています。
ブーストランカーのメカニズム
データを挿入すると、milvusはデータをセグメントに分散します。検索中、各セグメントは候補のセットを返し、Milvusはすべてのセグメントからこれらの候補をランク付けし、最終結果を生成します。検索リクエストにBoost Rankerが含まれている場合、Milvusは各セグメントからの候補結果にBoost Rankerを適用し、潜在的な精度の低下を防ぎ、リコールを向上させます。
結果を確定する前に、Milvusはこれらの候補をBoost Rankerで以下のように処理します:
Boost Rankerで指定されたオプションのフィルタリング式を適用し、式に一致するエンティティを特定する。
Boost Ranker で指定された重みを適用して、特定されたエンティティのスコアをブーストする。
Boost Ranker をマルチベクトルハイブリッドサーチのランカーとして使用することはできません。ただし、サブリクエスト(AnnSearchRequest)のランカーとして使用することはできます。
Boost ランカーの使用例
次の例は、最も関連性の高い上位 5 つのエンティティを返す必要がある単一ベクトル検索で Boost ランカーを使用し、抽象 doc タイプのエンティティのスコアに重みを追加する例です。
検索結果の候補をセグメントで収集する。
次の表は、Milvusがエンティティを2つのセグメント(0001と 0002)に分配し、各セグメントが5つの候補を返すと仮定しています。
ID
docタイプ
スコア
ランク
セグメント
117
抽象的
0.344
1
0001
89
抽象
0.456
2
0001
257
ボディ
0.578
3
0001
358
タイトル
0.788
4
0001
168
ボディ
0.899
5
0001
46
ボディ
0.189
1
0002
48
ボディ
0265
2
0002
561
抽象的
0.366
3
0002
344
抽象
0.444
4
0002
276
アブストラクト
0.845
5
0002
Boost Ranker (
doctype='abstract') で指定されたフィルタリング式を適用する。以下の表の
DocTypeフィールドで示されるように、Milvusはdoctypeがabstractに設定されたすべてのエンティティをマークし、さらなる処理を行う。ID
DocType
スコア
ランク
セグメント
117
抽象的
0.344
1
0001
89
抽象
0.456
2
0001
257
ボディ
0.578
3
0001
358
タイトル
0.788
4
0001
168
ボディ
0.899
5
0001
46
ボディ
0.189
1
0002
48
ボディ
0265
2
0002
561
抽象的
0.366
3
0002
344
抽象
0.444
4
0002
276
アブストラクト
0.845
5
0002
Boost Ranker (
weight=0.5) で指定された重みを適用する。前のステップで識別されたすべてのエンティティに、Boost Ranker で指定された重みが乗算され、ランクが変更される。
ID
DocType
スコア
重み付きスコア
(=スコア×重み)
ランク
セグメント
117
抽象的
0.344
0.172
1
0001
89
抽象的
0.456
0.228
2
0001
257
ボディ
0.578
0.578
3
0001
358
タイトル
0.788
0.788
4
0001
168
ボディ
0.899
0.899
5
0001
561
抽象的
0.366
0.183
1
0002
46
ボディ
0.189
0.189
2
0002
344
抽象的
0.444
0.222
3
0002
48
ボディ
0.265
0.265
4
0002
276
抽象的
0.845
0.423
5
0002
重みは浮動小数点数で指定する。上記の例のように、スコアが小さいほど関連性が高い場合は、1より小さいウェイトを使用します。そうでない場合は、1より大きいウェイトを使用します。
すべてのセグメントの候補を、重み付けされたスコアに基づいて集計し、結果を確定する。
ID
DocType
スコア
重み付けスコア
順位
セグメント
117
抽象的
0.344
0.172
1
0001
561
抽象的
0.366
0.183
2
0002
46
ボディ
0.189
0.189
3
0002
344
抽象的
0.444
0.222
4
0002
89
抽象的
0.456
0.228
5
0001
Boost Rankerの使用法
このセクションでは、単一ベクトル検索の結果に影響を与えるBoost Rankerの使用例を紹介します。
Boost Rankerの作成
検索リクエストのリランカーとしてBoost Rankerを渡す前に、以下のようにBoost Rankerをリランカー関数として適切に定義する必要があります:
from pymilvus import Function, FunctionType
ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
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
パラメータ |
必須か? |
説明 |
値/例 |
|---|---|---|---|
|
はい |
このファンクションの一意な識別子 |
|
|
はい |
関数を適用するベクトルフィールドのリスト(Boost Rankerでは空でなければならない) |
|
|
はい |
呼び出すFunctionのタイプ。リランキング戦略を指定するには |
|
|
はい |
リランカーのタイプを指定する。 Boost Ranker を使用するには |
|
|
はい |
生の検索結果で一致したエンティティのスコアに乗 じる重みを指定する。 値は浮動小数点数でなければならない。
|
|
|
No |
検索結果のエンティティ間のマッチングに使用するフィルタ式を指定する。フィルタリングの説明」で説明した、有効な基本フィルタ式を指定できます。 注: |
|
|
No |
|
|
単一のBoost Rankerで検索する
Boost Ranker関数の準備ができたら、検索リクエストで参照することができます。以下の例では、id、vector、doctype というフィールドを持つコレクションを作成済みであると仮定している。
from pymilvus import MilvusClient
# Connect to the Milvus server
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Assume you have a collection set up
# Conduct a similarity search using the created ranker
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("http://localhost:19530")
.token("root:Milvus")
.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';
// Connect to the Milvus server
const client = new MilvusClient({
address: 'localhost:19530',
token: 'root:Milvus'
});
// Assume you have a collection set up
// Conduct a similarity search
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('Search results:', searchResults);
# restful
複数のBoostランカーを使った検索
検索結果に影響を与えるために、1つの検索で複数のBoost Rankerを組み合わせることができます。そのためには、複数のBoost Rankersを作成し、FunctionScoreインスタンスでそれらを参照し、検索リクエストでFunctionScoreインスタンスをランカーとして使用します。
次の例では、0.8から1.2 の間の重みを適用して、識別されたすべてのエンティティのスコアを変更する方法を示します。
from pymilvus import MilvusClient, Function, FunctionType, FunctionScore
# Create a Boost Ranker with a fixed weight
fix_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"weight": 0.8
}
)
# Create a Boost Ranker with a randomly generated weight between 0 and 0.4
random_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"random_score": {
"seed": 126,
},
"weight": 0.4
}
)
# Create a Function Score
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)
# Conduct a similarity search using the created Function Score
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つのBoostランカーがある。1つは見つかったすべてのエンティティに固定の重みを適用し、もう1つはランダムな重みを割り当てる。そして、これら2つのランカーをFunctionScoreで参照し、重みが発見されたエンティティのスコアにどのように影響するかも定義する。
次の表に、FunctionScoreインスタンスの作成に必要なパラメータを示します。
パラメータ |
必須か? |
説明 |
値/例 |
|---|---|---|---|
|
Yes |
対象ランカーの名前をリストで指定する。 |
|
|
いいえ |
指定された重みが、一致するエンティティのスコアにどのように影響するかを指定します。 指定可能な値は以下のとおりです:
|
|
|
いいえ |
さまざまなブースト・ランカからの加重値の処理方法を指定します。 指定可能な値は以下のとおりです:
|
|