• Milvusについて
  • スタート
  • コンセプト
  • ユーザーガイド
  • データインポート
  • AIツール
  • 管理ガイド
  • ツール
  • 統合
  • チュートリアル
  • よくあるご質問
  • API Reference

ブースト・ランカーCompatible with Milvus v2.6.2+

ブースト・ランカーは、ベクトル距離に基づいて計算された意味的類似性だけに頼るのではなく、意味のある方法で検索結果に影響を与えることができます。メタデータフィルタリングを使って検索結果を素早く調整するのに理想的です。

検索リクエストにBoost Ranker機能が含まれている場合、Milvusは機能内のオプションのフィルタリング条件を使用して検索結果候補の中から一致するものを見つけ、指定されたウェイトを適用することで一致したエンティティのスコアをブーストし、最終結果における一致したエンティティの順位を昇格または降格させます。

Boost Rankerを使用するタイミング

クロスエンコーダーモデルやフュージョンアルゴリズムに依存する他のランカーとは異なり、Boost Rankerはオプションのメタデータドリブンルールをランキングプロセスに直接注入します。

使用例

使用例

Boost Rankerが効果的な理由

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

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

  • ユーザーエンゲージメント指標(閲覧数、「いいね!」数、シェア数など)が高いコンテンツの認知度を高める

  • タイムセンシティブな検索アプリケーションで最近のコンテンツを上位表示する

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

  • 正確なフレーズまたは関連性の高いキーワードに一致する検索結果を高める

インデックスを再構築したり、ベクトル埋め込みモデルを変更したりする必要がなく、オプションのメタデータフィルタをリアルタイムに適用することで、検索結果で特定のアイテムを即座に昇格または降格させることができます。このメカニズムにより、進化するビジネス要件に容易に適応する、柔軟でダイナミックな検索ランキングが可能になります。

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

  • 完全に削除することなく、在庫の少ないアイテムの順位を下げます。

  • 検閲を行うことなく、好ましくない用語が含まれる可能性のあるコンテンツのランクを下げる。

  • 技術的な検索でアクセス可能な状態を維持しながら、古いドキュメントの順位を下げます。

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

  • 低品質表示(フォーマットの問題、長さが短いなど)のコンテンツの関連性を低下させます。

複数のBoost Rankerを組み合わせて、よりダイナミックで強固なウェイトベースのランキング戦略を実施することもできます。

ブースト・ランカーのメカニズム

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

Boost Ranker Mechanism ブーストランカーのメカニズム

データを挿入すると、milvusはデータをセグメントに分散します。検索中、各セグメントは候補のセットを返し、Milvusはすべてのセグメントからこれらの候補をランク付けし、最終結果を生成します。検索リクエストにBoost Rankerが含まれている場合、Milvusは各セグメントからの候補結果にBoost Rankerを適用し、潜在的な精度の低下を防ぎ、リコールを向上させます。

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

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

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

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

Boost ランカーの使用例

次の例は、最も関連性の高い上位 5 つのエンティティを返す必要がある単一ベクトル検索で Boost ランカーを使用し、抽象 doc タイプのエンティティのスコアに重みを追加する例です。

  1. 検索結果の候補をセグメントで収集する。

    次の表は、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

  2. Boost Ranker (doctype='abstract') で指定されたフィルタリング式を適用する

    以下の表のDocType フィールドで示されるように、Milvusはdoctypeabstract に設定されたすべてのエンティティをマークし、さらなる処理を行う。

    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

  3. 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より大きいウェイトを使用します。

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

    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

パラメータ

必須か?

説明

値/例

name

はい

このファンクションの一意な識別子

"boost"

input_field_names

はい

関数を適用するベクトルフィールドのリスト(Boost Rankerでは空でなければならない)

[]

function_type

はい

呼び出すFunctionのタイプ。リランキング戦略を指定するにはRERANK

FunctionType.RERANK

params.reranker

はい

リランカーのタイプを指定する。

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

"boost"

params.weight

はい

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

値は浮動小数点数でなければならない。

  • 一致するエンティティの重要性を強調するには、スコアを押し上げる値に設定します。

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

1

params.filter

No

検索結果のエンティティ間のマッチングに使用するフィルタ式を指定する。フィルタリングの説明」で説明した、有効な基本フィルタ式を指定できます。

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

"doctype == 'abstract'"

params.random_score

No

01 の間の値をランダムに生成するランダム関数を指定します。以下の 2 つのオプション引数を持つ:

  • seed (数値)擬似乱数生成器(PRNG)を開始するための初期値を指定する。

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

    seedfield の両方を設定し、同じシードとフィールド値を使用することで、世代間の一貫性を確保することをお勧めします。

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

単一のBoost Rankerで検索する

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

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インスタンスの作成に必要なパラメータを示します。

パラメータ

必須か?

説明

値/例

functions

Yes

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

["fix_weight_ranker", "random_weight_ranker"]

params.boost_mode

いいえ

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

指定可能な値は以下のとおりです:

  • Multiply

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

    これが既定値です。

  • Sum

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

"Sum"

params.function_mode

いいえ

さまざまなブースト・ランカからの加重値の処理方法を指定します。

指定可能な値は以下のとおりです:

  • Multiply

    一致するエンティティの最終スコアが、すべての Boost Rankers からの加重値の積に等しいことを示します。

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

  • Sum

    一致するエンティティの最終スコアが、すべてのブースト・ランカーからの加重値の合計に等しいことを示します。

"Sum"