メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

ブーストレランカー

ベクトル距離に基づくセマンティック類似度の計算のみに依存する代わりに、ブーストレランカーを使用すると、検索結果に意味のある方法で影響を与えることができます。これは、メタデータフィルタリングを使用して検索結果を迅速に調整するのに理想的です。

検索要求にブーストレランカー関数が含まれている場合、Milvusはその関数内のオプションなフィルタリング条件を使用して検索結果の候補の中から一致を検索し、指定された重みを適用して一致したエンティティのスコアをブーストします。これにより、一致したエンティティのランキングを最終結果で昇格または降格できます。

ブーストレランカーの使用タイミング

交差エンコーダーモデルまたはフュージョンアルゴリズムに依存する他のランカーとは異なり、ブーストレランカーはオプションのメタデータ駆動ルールを直接ランキングプロセスに注入するため、以下のシナリオで特に適しています。

ユースケース

なぜブーストレランカーが適しているのか

ビジネス駆動型のコンテンツ優先順位付け

  • EC検索結果でプレミアム商品を強調表示

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

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

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

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

インデックスの再構築やベクトル埋め込みモデルの変更(時間のかかる操作)を必要とせず、リアルタイムでオプションのメタデータフィルターを適用することで検索結果の特定のアイテムをすぐに昇格または降格できます。このメカニズムにより、進化するビジネス要件に簡単に適応できる柔軟で動的な検索ランキングが可能になります。

戦略的コンテンツの降格

  • 完全に削除することなく在庫が少ないアイテムのプロミネンスを減らす

  • 検閲せずに潜在的に問題のある用語を含むコンテンツのランクを下げる

  • 技術的検索で引き続きアクセスできるように古いドキュメントを降格

  • マーケットプレース検索で競合他社の商品の可視性を控えめに減らす

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

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

ブーストレランカーの仕組み

以下の図は、ブーストレランカーの主なワークフローを示しています。

Hq0awfjC7h0Ty3bvsUEcasOHncb

データを挿入する際、Zilliz Cloudはそれをセグメント間で分散します。検索中、各セグメントは候補セットを返し、Zilliz Cloudはこれらのすべてのセグメントからの候補をランキングして最終結果を生成します。検索要求にブーストレランカーが含まれている場合、Zilliz Cloudは各セグメントからの候補結果に適用して、潜在的な精度の損失を防止し、リコールを改善します。

結果を確定する前、Milvusはこれらの候補を以下のようにブーストレランカーで処理します:

  1. ブーストレランカーで指定されたオプションのフィルタリング式を適用して、式に一致するエンティティを識別します。

  2. ブーストレランカーで指定された重みを適用して、識別されたエンティティのスコアをブーストします。

📘注釈

マルチベクトルハイブリッド検索のランカーとしてブーストレランカーを使用することはできません。ただし、サブリクエスト(AnnSearchRequest)のいずれかのランカーとしては使用できます。

ブーストレランカーの例

以下の例は、シングルベクトル検索でブーストレランカーを使用する方法を示しています。この検索では、上位5つの最も関連性の高いエンティティを返すと同時に、抽象ドックタイプを持つエンティティのスコアに重みを追加する必要があります。

  1. セグメント内の検索結果候補を集める。

    以下の表では、Milvusがエンティティを2つのセグメント(0001および0002)に分散し、各セグメントが5つの候補を返すと仮定します。

    ID

    ドックタイプ

    スコア

    ランク

    セグメント

    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

    0265

    2

    0002

    561

    abstract

    0.366

    3

    0002

    344

    abstract

    0.444

    4

    0002

    276

    abstract

    0.845

    5

    0002

  2. ブーストレランカーで指定されたフィルター式を適用 (doctype='abstract')。

    以下の表のドックタイプフィールドで示されるように、Milvusはdoctypeabstractに設定されたすべてのエンティティを後続の処理のためにマークします。

    ID

    ドックタイプ

    スコア

    ランク

    セグメント

    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

    0265

    2

    0002

    561

    abstract

    0.366

    3

    0002

    344

    abstract

    0.444

    4

    0002

    276

    abstract

    0.845

    5

    0002

  3. ブーストレランカーで指定された重みを適用 (weight=0.5)。

    前のステップで識別されたすべてのエンティティは、ブーストレランカーで指定された重みで乗算され、ランクに変化が生じます。

    ID

    ドックタイプ

    スコア

    加重スコア

    (= スコア × 重み)

    ランク

    セグメント

    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より大きい重みを使用します。

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

    ID

    ドックタイプ

    スコア

    加重スコア

    ランク

    セグメント

    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

ブーストレランカーの使用方法

このセクションでは、シングルベクトル検索の結果に影響を与えるためにブーストレランカーを使用する方法の例を示します。

ブーストレランカーの作成

検索要求の再ランカーとしてブーストレランカーを渡す前に、以下のように再ランキング関数として適切に定義する必要があります:

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

パラメータ

必須?

説明

値/例

name

はい

この関数の一意識別子

"boost"

input_field_names

はい

関数を適用するベクトルフィールドのリスト(ブーストレランカーでは空のリストにする必要があります)

[]

function_type

はい

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

FunctionType.RERANK

params.reranker

はい

再ランカーのタイプを指定します。

ブーストレランカーを使用するにはboostに設定する必要があります。

"boost"

params.weight

はい

生の検索結果で一致したエンティティのスコアに乗算される重みを指定します。

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

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

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

1

params.filter

いいえ

検索結果エンティティの中から一致するエンティティを見つけるために使用されるフィルター式を指定します。これはフィルタリングの説明で述べられている有効な基本フィルター式のいずれかでも構いません。

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

"doctype == 'abstract'"

params.random_score

いいえ

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

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

  • field (文字列) 乱数生成の乱数要素として使用される値を持つフィールドの名前を指定します。一意の値を持つフィールドで十分です。

    同じseedとfieldの値を使用して生成間で一貫性を確保するために、どちらの値も設定することをお勧めします。

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

単一のブーストレランカーでの検索

ブーストレランカー関数の準備ができたら、検索要求で参照できます。以下の例では、すでに以下のフィールドを持つコレクションを作成したと仮定しています:idvector、およびdoctype

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
)

複数のブーストレランカーでの検索

検索結果に影響を与えるために、単一の検索で複数のブーストレランカーを組み合わせることができます。これを行うには、複数のブーストレランカーを作成し、FunctionScoreインスタンスで参照し、検索要求でFunctionScoreインスタンスをランカーとして使用します。

以下の例は、識別されたすべてのエンティティのスコアを0.8から1.2の重みで修正する方法を示しています。

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

# FunctionScoreを作成
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)

# 作成したFunctionScoreを使用して類似性検索を実行
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つのブーストレランカーがあります:1つは見つかったすべてのエンティティに固定重みを適用し、もう1つはそれらにランダム重みを割り当てます。次に、これらの2つのランカーをFunctionScoreで参照し、見つかったエンティティのスコアに重みがどのように影響するかを定義します。

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

パラメータ

必須?

説明

値/例

functions

はい

リスト内のターゲットランカーの名前を指定します。

["fix_weight_reranker", "random_weight_reranker"]

params.boost_mode

いいえ

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

可能な値は以下の通りです:

  • Multiply

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

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

  • Sum

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

"Sum"

params.function_mode

いいえ

さまざまなブーストレランカーからの重み付き値がどのように処理されるかを指定します。

可能な値は以下の通りです:

  • Multiply

    一致したエンティティの最終スコアがすべてのブーストレランカーからの重み付き値の積と等しいことを示します。

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

  • Sum

    一致したエンティティの最終スコアがすべてのブーストレランカーからの重み付き値の和と等しいことを示します。

"Sum"