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

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 つのセグメント(0001 と 0002)に分散し、各セグメントが 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 は doctype が abstract に設定されているすべてのエンティティを以降の処理対象としてマークします。

    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_match や phrase_match などの高度な演算子を使用すると、検索パフォーマンスが低下します。

"doctype == 'abstract'"

params.random_score

いいえ

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

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

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

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

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

単一の Boost Ranker を使用した検索​

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

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_fields=["doctype"],
ranker=rerank
)

複数の Boost Ranker を使用した検索​

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

以下の例では、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_fields=["doctype"],
ranker=ranker
)

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

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

パラメーター

必須?

説明

値/Example

functions

はい

対象のランカーの名前をリストで指定します。

["fix_weight_ranker", "random_weight_ranker"]

params.boost_mode

いいえ

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

使用可能な値は次のとおりです。

  • Multiply

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

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

  • Sum

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

"Sum"

params.function_mode

いいえ

各 Boost Ranker からの重み付けされた値がどのように処理されるかを指定します。

使用可能な値は次のとおりです。

  • Multiply

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

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

  • Sum

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

"Sum"