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

Boost Ranker

ベクトル距離に基づく意味的類似度だけに依存するのではなく、Boost Ranker を使うことで検索結果に意図した影響を与えられます。メタデータフィルタリングを用いて検索結果を素早く調整したい場合に最適です。

検索リクエストに Boost Ranker 関数が含まれる場合、Milvus は関数内の任意のフィルタリング条件に基づいて検索候補から該当するエンティティを特定し、指定された重みを適用してスコアを変更します。これにより、最終結果において該当エンティティの順位を上げたり下げたりできます。

Boost Ranker の使用場面

クロスエンコーダーモデルや融合アルゴリズムに依存する他のランカーとは異なり、Boost Ranker はメタデータに基づく任意のルールをランキングプロセスに直接組み込めるため、以下のような場面で特に有効です。

ユースケース

Boost Ranker が効果的な理由

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

  • Eコマース検索結果でプレミアム商品を強調表示する

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

  • 時間的制約のある検索アプリケーションで最新コンテンツを上位に表示する

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

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

インデックスの再構築やベクトル埋め込みモデルの変更といった時間のかかる操作を必要とせず、リアルタイムで任意のメタデータフィルタを適用することで、検索結果内の特定アイテムを即座に昇格・降格できます。この仕組みにより、変化するビジネス要件にも柔軟かつ動的に対応できる検索ランキングを実現できます。

戦略的なコンテンツの降格

  • 在庫が少ないアイテムを完全に除外せずに目立たなくする

  • 検閲を行わずに、問題となる可能性のある用語を含むコンテンツのランクを下げる

  • 技術検索で古いドキュメントへのアクセスを維持しつつランクを下げる

  • マーケットプレイス検索で競合製品の可視性を控えめに下げる

  • 品質が低いことを示すコンテンツ(書式の問題、短い長さなど)の関連性を下げる

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

Boost Ranker の仕組み

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

Hq0awfjC7h0Ty3bvsUEcasOHncb

データを挿入すると、Zilliz Cloud はそれをセグメント全体に分散します。検索時は各セグメントが候補セットを返し、Zilliz Cloud が全セグメントの候補をランキングして最終結果を生成します。検索リクエストに Boost Ranker が含まれる場合、Zilliz Cloud は精度低下を防ぎ再現率を向上させるため、各セグメントの候補結果に対して Boost Ranker を適用します。

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

  1. Boost Ranker で指定された任意のフィルタリング式を適用し、その式に合致するエンティティを特定します。

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

📘Notes

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

Boost Ranker の例

以下の例では、最も関連性の高い上位 5 つのエンティティを返す単一ベクトル検索において、abstract ドキュメントタイプを持つエンティティのスコアに重みを加えるために Boost Ranker を使用する方法を示します。

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

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

    IDDocTypeスコアランクセグメント
    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 に設定されているすべてのエンティティを以降の処理対象としてマークします。

    IDDocTypeスコアランクセグメント
    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 で指定された重みが乗算され、その結果としてランクが変動します。

    IDDocTypeスコア重み付きスコア
    (= スコア × 重み)
    ランクセグメント
    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. 重み付きスコアに基づいて全セグメントの候補を集約し、最終結果を確定します。

    IDDocTypeスコア重み付きスコアランクセグメント
    117abstract0.3440.17210001
    561abstract0.3660.18320002
    46body0.1890.18930002
    344abstract0.4440.22240002
    89abstract0.4560.22850001

Boost Ranker の使用方法

このセクションでは、Boost Ranker を使用して単一ベクトル検索の結果に影響を与える方法について、具体例を通じて説明します。

Boost Ranker の作成

検索リクエストの reranker として Boost Ranker を指定する前に、以下のように 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
}
)

パラメーター

必須?

説明

値/Example

name

はい

この Function の一意な識別子

"boost"

input_field_names

はい

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

[]

function_type

はい

呼び出す Function のタイプ。再ランキング戦略を指定するには RERANK を使用します。

FunctionType.RERANK

params.reranker

はい

reranker のタイプを指定します。

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

"boost"

params.weight

はい

生の検索結果において、条件に一致するエンティティのスコアに乗算される重みを指定します。

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

  • 一致するエンティティの重要性を高めるには、スコアが大きくなる値を設定します。

  • 一致するエンティティの優先度を下げるには、スコアが小さくなる値を指定します。

1

params.filter

いいえ

検索結果のエンティティから対象を絞り込むためのフィルター式を指定します。「フィルタリングの説明」に記載されている有効な基本フィルター式を使用できます。

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

"doctype == 'abstract'"

params.random_score

いいえ

0 から 1 の範囲で値をランダムに生成する関数を指定します。以下の 2 つのオプション引数があります。

  • seed (number) 疑似乱数生成器 (PRNG) の初期値を指定します。

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

同じシードとフィールド値を用いて生成結果の一貫性を確保するため、seedfield の両方を設定することを推奨します。

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

単一の Boost Ranker を使った検索

Boost Ranker 関数の準備ができたら、検索リクエストで参照できます。以下の例では、idvectordoctype の各フィールドを持つコレクションが作成済みであることを前提としています。

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 を使用した検索

1 回の検索で複数の Boost Ranker を組み合わせて、検索結果に反映させることができます。これを行うには、複数の 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 を使用します。一方は検出されたすべてのエンティティに固定の重みを適用し、もう一方はランダムな重みを割り当てます。そして、これら 2 つの ranker を FunctionScore で参照します。この FunctionScore では、重みが検出されたエンティティのスコアにどのように影響するかも定義されています。

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

パラメーター

必須?

説明

値/Example

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"