メインコンテンツまでスキップ

Boost Ranker

ベクトル距離に基づいて計算される意味的類似性のみに依存する代わりに、Boost Ranker を使用すると、意味のある形で検索結果に影響を与えることができます。メタデータフィルタリングを使用して検索結果をすばやく調整するのに最適です。

検索リクエストに Boost Ranker 関数が含まれている場合、Milvus は関数内のオプションのフィルタリング条件を使用して検索結果候補の中から一致を見つけ、指定された重みを適用してそれらの一致のスコアをブーストします。これにより、最終結果における一致したエンティティの順位を上げたり下げたりするのに役立ちます。

Boost Ranker を使用する場合

クロスエンコーダーモデルやフュージョンアルゴリズムに依存する他の ranker とは異なり、Boost Ranker はオプションのメタデータ駆動ルールをランキングプロセスに直接注入します。そのため、以下のようなシナリオにより適しています。

ユースケース

Boost Ranker が効果的に機能する理由

ビジネス主導のコンテンツ優先順位付け

  • E コマースの検索結果でプレミアム商品を目立たせる

  • ユーザーエンゲージメント指標(閲覧数、いいね、シェアなど)が高いコンテンツの可視性を高める

  • 時間に敏感な検索アプリケーションで最近のコンテンツを上位にする

  • 検証済みまたは信頼できるソースからのコンテンツを優先する

  • 完全一致のフレーズや関連性の高いキーワードに一致する結果をブーストする

インデックスの再構築やベクトル埋め込みモデルの変更といった時間のかかる操作を行う必要なく、リアルタイムでオプションのメタデータフィルタを適用することで、検索結果内の特定の項目を即座に昇格または降格できます。この仕組みにより、進化するビジネス要件に容易に適応できる、柔軟で動的な検索ランキングが可能になります。

戦略的なコンテンツのダウンランキング

  • 在庫の少ない商品を完全に削除することなく目立ちにくくする

  • 検閲することなく、問題となる可能性のある用語を含むコンテンツの順位を下げる

  • 技術検索では引き続きアクセス可能にしつつ、古いドキュメントの順位を下げる

  • マーケットプレイス検索で競合製品の可視性をさりげなく下げる

  • 品質が低いことを示す特徴(フォーマットの問題、短い長さなど)を持つコンテンツの関連性を下げる

複数の Boost Ranker を組み合わせて、より動的で堅牢な重みベースのランキング戦略を実装することもできます。

Boost Ranker の仕組み

次の図は、Boost Ranker の主なワークフローを示しています。

Hq0awfjC7h0Ty3bvsUEcasOHncb

データを挿入すると、Zilliz Cloud はそれを複数のセグメントに分散します。検索時には、各セグメントが候補のセットを返し、Zilliz Cloud はすべてのセグメントからの候補をランク付けして最終結果を生成します。検索リクエストに Boost Ranker が含まれている場合、Zilliz Cloud は精度低下の可能性を防ぎ、リコールを改善するために、各セグメントからの候補結果にそれを適用します。

結果を確定する前に、Milvus はこれらの候補を次のように Boost Ranker で処理します。

  1. Boost Ranker で指定されたオプションのフィルタ式を適用し、式に一致するエンティティを特定します。

  2. Boost Ranker で指定された重みを適用し、特定されたエンティティのスコアをブーストします。

📘Notes

Boost Ranker はマルチベクトルハイブリッド検索では使用できません。

Boost Ranker の例

次の例は、上位 5 件の最も関連性の高いエンティティを返し、doctype が abstract のエンティティのスコアに重みを追加する必要がある単一ベクトル検索での Boost Ranker の使用方法を示しています。

  1. セグメント内で検索結果候補を収集します。

    次の表では、Milvus がエンティティを 2 つのセグメント(00010002)に分散し、各セグメントが 5 件の候補を返すものと仮定しています。

    IDDocTypeScoreRanksegment
    117abstract0.34410001
    89abstract0.45620001
    257body0.57830001
    358title0.78840001
    168body0.89950001
    46body0.18910002
    48body026520002
    561abstract0.36630002
    344abstract0.44440002
    276abstract0.84550002
  2. Boost Ranker で指定されたフィルタ式を適用します (doctype='abstract')。

    次の表の DocType フィールドが示すように、Milvus は doctypeabstract に設定されているすべてのエンティティを以降の処理対象としてマークします。

    IDDocTypeScoreRanksegment
    117abstract0.34410001
    89abstract0.45620001
    257body0.57830001
    358title0.78840001
    168body0.89950001
    46body0.18910002
    48body026520002
    561abstract0.36630002
    344abstract0.44440002
    276abstract0.84550002
  3. Boost Ranker で指定された重みを適用します (weight=0.5)。

    前のステップで特定されたすべてのエンティティに、Boost Ranker で指定された重みが掛けられ、その結果、順位に変化が生じます。

    IDDocTypeScoreWeighted Score
    (= score x weight)
    Ranksegment
    117abstract0.3440.17210001
    89abstract0.4560.22820001
    257body0.5780.57830001
    358title0.7880.78840001
    168body0.8990.89950001
    561abstract0.3660.18310002
    46body0.1890.18920002
    344abstract0.4440.22230002
    48body0.2650.26540002
    276abstract0.8450.42350002
    📘Notes

    重みは、選択した浮動小数点数である必要があります。上記の例のように、スコアが小さいほど関連性が高い場合は、1 未満の重みを使用してください。そうでない場合は、1 より大きい重みを使用してください。

  4. 重み付けされたスコアに基づいてすべてのセグメントから候補を集約し、結果を確定します。

    IDDocTypeScoreWeighted ScoreRanksegment
    117abstract0.3440.17210001
    561abstract0.3660.18320002
    46body0.1890.18930002
    344abstract0.4440.22240002
    89abstract0.4560.22850001

Boost Ranker の使用方法

このセクションでは、単一ベクトル検索の結果に影響を与えるために Boost Ranker を使用する方法の例を示します。

Boost Ranker を作成する

検索リクエストの reranker として Boost Ranker を渡す前に、次のように reranking 関数として Boost Ranker を適切に定義する必要があります。

python
from pymilvus import Function, FunctionType

rerank = 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
}
)

パラメータ

必須?

説明

値/例

name

はい

この Function の一意の識別子

"boost"

input_field_names

はい

関数を適用するベクトルフィールドのリスト(Boost Ranker では空である必要があります)

[]

function_type

はい

呼び出す Function の種類。reranking 戦略を指定するには RERANK を使用します

FunctionType.RERANK

params.reranker

はい

reranker の種類を指定します。

Boost Ranker を使用するには boost に設定する必要があります。

"boost"

params.weight

はい

生の検索結果内の一致したエンティティのスコアに掛けられる重みを指定します。

値は浮動小数点数である必要があります。

  • 一致したエンティティの重要度を強調するには、スコアをブーストする値に設定します。

  • 一致したエンティティを降格させるには、このパラメータにスコアを下げる値を割り当てます。

1

params.filter

いいえ

検索結果エンティティの中からエンティティを照合するために使用されるフィルタ式を指定します。Filtering Explained で説明されている任意の有効な基本フィルタ式を使用できます。

Note: ==>< などの基本演算子のみを使用してください。text_matchphrase_match などの高度な演算子を使用すると、検索パフォーマンスが低下します。

"doctype == 'abstract'"

params.random_score

いいえ

0 から 1 までの値をランダムに生成する random 関数を指定します。これには次の 2 つのオプション引数があります。

  • seed (number) 疑似乱数生成器(PRNG)を開始するために使用される初期値を指定します。

  • field (string) 乱数生成時のランダム要因として使用されるフィールドの名前を指定します。一意の値を持つフィールドであれば十分です。

    同じ seed と field の値を使用して生成間の一貫性を確保するため、seedfield の両方を設定することを推奨します。

{"seed": 126, "field": "id"}

単一の Boost Ranker で検索する

Boost Ranker 関数の準備ができたら、検索リクエストでそれを参照できます。次の例では、idvectordoctype の各フィールドを持つ collection をすでに作成済みであると仮定しています。

python
from pymilvus import MilvusClient

# Connect to the Milvus server
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# 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=rerank
)

複数の Boost Ranker で検索する

複数の Boost Ranker を 1 回の検索で組み合わせて検索結果に影響を与えることができます。これを行うには、複数の Boost Ranker を作成し、それらを FunctionScore インスタンスで参照し、検索リクエストの ranker として FunctionScore インスタンスを使用します。

次の例は、0.8 から 1.2 の間の重みを適用して、特定されたすべてのエンティティのスコアを変更する方法を示しています。

python
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
)

具体的には、2 つの Boost Ranker があります。1 つは見つかったすべてのエンティティに固定の重みを適用し、もう 1 つはそれらにランダムな重みを割り当てます。次に、これら 2 つの ranker を FunctionScore で参照し、さらに FunctionScore で、見つかったエンティティのスコアに重みがどのように影響するかを定義します。

次の表は、FunctionScore インスタンスの作成に必要なパラメータを示しています。

パラメータ

必須?

説明

値/例

functions

はい

対象の ranker の名前をリストで指定します。

["fix_weight_ranker", "random_weight_ranker"]

params.boost_mode

いいえ

指定された重みが一致したエンティティのスコアにどのように影響するかを指定します。

指定可能な値は次のとおりです。

  • Multiply

    重み付け後の値が、一致したエンティティの元のスコアに指定された重みを掛けた値に等しいことを示します。

    これがデフォルト値です。

  • Sum

    重み付け後の値が、一致したエンティティの元のスコアと指定された重みの合計に等しいことを示します

"Sum"

params.function_mode

いいえ

さまざまな Boost Ranker からの重み付け後の値をどのように処理するかを指定します。

指定可能な値は次のとおりです。

  • Multiply

    一致したエンティティの最終スコアが、すべての Boost Ranker からの重み付け後の値の積に等しいことを示します。

    これがデフォルト値です。

  • Sum

    一致したエンティティの最終スコアが、すべての Boost Ranker からの重み付け後の値の合計に等しいことを示します。

"Sum"

Ctrl I