検索結果のランキングをカスタマイズする

検索ニーズは業界によって異なり、時々刻々と変化するため、デフォルトのランキング動作がすべてのビジネスニーズに最適とは限りません。この問題を解決するには、カスタム ランキングを使用してランキングの動作を変更します。

このページでは、検索リクエストでカスタム ランキング式を使用する方法と、式を調整する方法について説明します。この機能は、構造化データ、非構造化データ、ウェブサイト データで使用できます。

概要

カスタム ランキングでは、意味的関連性スコアやキーワード類似性スコアなどのモデル計算シグナルと、距離やドキュメントの経過時間などのカスタム フィールドなどのドキュメントベースのシグナルのセットに依存する数式を指定できます。

カスタム ランキングでは、次のことができます。

  • 可視性を高める: 検索結果の最終的なランキングに影響するシグナルを把握します。
  • 既存のシグナルを調整する: 意味的類似性、キーワード マッチング、ドキュメントの鮮度などのさまざまなシグナルの重みを調整します。
  • ビジネス ロジックを組み込む: ドキュメント データから独自のカスタム シグナルをランキング式に直接追加します。
  • 体系的に最適化する: オープンソースの Python ライブラリを使用して、最適なランキング式をプログラムで検出します。

カスタム ランキングの必要性 - 例

ホテル予約ウェブサイトで次の文字列がクエリされたシナリオを考えてみましょう。

luxury hotel with a large rooftop pool in Vancouver, pet-friendly and close to airport.

たとえば、次のエントリが取得されたとします。

  • ホテル A:空港を一望できるバンクーバー屈指の高級ホテル。素晴らしい屋上プールがあります。ペットの同伴はご遠慮ください。
  • ホテル B:バンクーバーのダウンタウンにある、スタイリッシュなモダンホテル。広々とした客室を備えたペット同伴可のホテルです。大きな屋内プールとフィットネス センターを備えています。」
  • ホテル C: 「水族館近くの魅力的なペット同伴可のブティック ホテル(市内中心部から徒歩 10 分)。美しい庭園の中庭がある。プールはありません。
  • ホテル D: 「象徴的な素朴なリゾート。絶品の料理と完璧なサービスで知られています。屋内プールとスパを併設しています。ペット同伴可(要リクエスト)」

カタログ内のすべてのホテルには、キロメートル(km)単位のフィールド distance_from_airport が含まれています。

エンベディング ベースのランキング

検索システムは、クエリを単一のエンベディングに変換します。次に、このクエリ エンベディングをカタログ内のすべてのホテルのエンベディングと比較します。クエリのエンベディングに数値的に最も近いエンベディングを持つホテルが上位にランク付けされます。

エンベディングのみに基づく関連性検索によるランキングは次のようになります。

ランキング ホテル このランキングの理由として考えられること
1 ホテル A 高級、空港、屋上プールというキーワードと非常に強い意味的関連性があります。「ペット不可」は望ましくありませんが、他の強い一致が優先されます。
2 ホテル B 「ペット可」と「プール」のセマンティック マッチングが良好。しかし、「屋上」ではなく「屋内」、「高級」ではなく「モダン」と「スタイリッシュ」、「空港」ではなく「ダウンタウン」とすると、A よりも関連性が低くなります。
3 ホテル D ペット可、大きなプールという点では意味的に強く一致していますが、「屋上」ではなく「屋内」、「高級」ではなく「素朴」であるため、A や D よりも意味的な関連性が若干低くなっています。
4 ホテル C ペット可という点は強いが、「プールなし」と「ブティック」という点が、この特定のクエリとの関連性を大幅に低下させている。

このランキングでは、最も関連性の高い結果が得られません。ホテル A は、多くのユーザーが好まない可能性がある「ペット不可」であるにもかかわらず、上位にランク付けされています。ホテル D は多くの条件に合致していますが、「素朴」というステータスが必ずしも「高級」にマッピングされるとは限らず、「屋内」プールは「大型」と「屋外」の完全一致よりもランクが低いため、ランクが低くなっています。

カスタム ランキング

たとえば、このシナリオの例として、次のランキング式を構成したとします。この式のコンポーネントについては、カスタム ランキングの実装についてをご覧ください。

rankingExpression = rr(semantic_similarity_score, 32) * 0.4 + rr(keyword_similarity_score, 32) * 0.3 + rr(c.distance_from_airport * -1, 32) * 0.8

ここで、distance_from_airport はカタログ内の取得可能なフィールドであり、c.distance_from_airport はシグナルとして機能します。

カスタム ランキングでは、ドキュメントの関連性に影響するさまざまなシグナルを考慮します。次に、有効な構文を使用して、これらのシグナルを含む数式を作成します。この式では、シグナルを正規化し、導出されたスコアに重みを追加します。最終的なカスタム スコアが計算され、ドキュメントがランク付けされます。

この例では、このプロセスは次のように説明できます。

  1. 各ホテルには、セマンティック類似度スコアとキーワード類似度スコアが割り当てられます。また、空港からの距離は、ドキュメントから導き出される重要なシグナルです。

  2. 逆順位変換関数 rr() は、すべてのスコアを同じスケールに変換するために使用されます。

  3. 各シグナルから導き出されたスコアに重みが付けられ、すべての個々のスコアの合計が各ホテルのカスタム ランキング スコアになります。

各ホテルのさまざまなシグナルは、次のように表にまとめられます。

ホテル semantic_similarity_score keyword_similarity_score c.distance_from_airport カスタム ランキング スコア カスタム ランキング エンベディング ベースのランキング
ホテル A 9.0 6.2(「空港」、「高級」、「屋上プール」) 5.0 0.04879 2 1
ホテル B 7.5 5.6(「ペット可」、「ダウンタウン」、「室内プール」、「スタイリッシュ」) 12.5 0.04691 3 2
ホテル C 5.0 3.4(「ペット可」、「ダウンタウン」) 18 0.04525 4 4
ホテル D 8.0 4.5(「室内プール」、「ペット可」、「素朴」) 1 0.04890 1 3

2 つのランキング方法を比較すると、カスタム ランキングでは、純粋なエンベディング ベースのランキングよりも、ユーザーのニーズに合致する可能性が高い、より慎重なランキングが提供されます。

カスタム ランキングの実装について

検索結果でカスタム ランキングを取得するには、次のフィールドを指定して search メソッドを呼び出す必要があります。

  • ランキング式バックエンドrankingExpressionBackend): このフィールドは、次のランキング メカニズムのどれを使用するかを示します。

    • RANK_BY_EMBEDDING: このフィールドが指定されていない場合のデフォルト値です。これを選択すると、結果は、エンベディング ベースまたは関連性ベースのいずれかの事前定義されたランキング式に従ってランク付けされます。
    • RANK_BY_FORMULA: これにより、デフォルトのランキングがオーバーライドされ、rankingExpression フィールドにカスタム数式を指定できます。
  • ランキング式rankingExpression): このフィールドには、取得したドキュメントのランキングを決定する数式が含まれています。

    • RANK_BY_EMBEDDING の場合、関連性スコアに基づく(double * relevanceScore)か、エンベディングに基づく(double * dotProduct(embedding_field_path))のいずれかです。

    • RANK_BY_FORMULA の場合、これは複数のシグナルを組み合わせて各検索結果の新しいスコアを計算するキュレートされた式です。

標準シグナル

Vertex AI Search には、カスタム ランキングの作成に使用できるさまざまなシグナルが用意されています。利用可能な標準シグナルは次のとおりです。

シグナル名 説明
default_rank 標準の VAIS ランキング アルゴリズムによって決定されるドキュメントのデフォルトのランク
semantic_similarity_score クエリとコンテンツのエンベディングに基づいて計算されたスコア。検索クエリとドキュメントのコンテンツの類似度を判断するために使用されます。これは、Google 独自のアルゴリズムを使用して計算されます。
relevance_score 複雑なクエリとドキュメントのインタラクションを処理するディープ関連性モデルによって生成されるスコア。モデルは、コンテンツのコンテキストでクエリの意味と意図を判断します。これは、Google 独自のアルゴリズムを使用して計算されます。
keyword_similarity_score キーワード マッチングを重視したスコア。このシグナルは、Best Match 25(BM25)ランキング関数を使用します。
document_age ドキュメントの経過時間(単位は時間)。浮動小数点値をサポートします。たとえば、値が 0.5 の場合は 30 分、50 の場合は 2 日 2 時間を意味します。
pctr_rank ユーザー イベント データに基づいて計算された、予測コンバージョン率を示すランク。このシグナルは、予測クリック率(pCTR)を使用して、ユーザーの視点から検索結果の関連性を測定します。
topicality_rank Google の独自のアルゴリズムを使用して計算された、キーワードの類似性調整を示すランク。
boosting_factor ドキュメントに適用したすべてのカスタム ブーストの組み合わせ。

これらのフィールドに加えて、取得可能としてマークされているドキュメント内の任意のカスタム フィールドを使用できます。これを行うには、フィールド名に c. 接頭辞を追加します。たとえば、date_approved という名前のカスタム フィールドがある場合、c.date_approved をカスタム シグナルとして使用できます。

シグナル名は、アルファベット文字とアンダースコア(_)の組み合わせです。次の予約名はシグナル名として使用できません。logexprris_nanfill_nan

ランキングの数式の構文

カスタム ランキング式は、次のコンポーネントを含む数式です。

  • 数値(double: 信号または式に重みを加える正または負の浮動小数点値。

  • シグナル(signal: [利用可能なシグナル] セクションに表示されているシグナルの名前。

  • 算術演算子: +(加算)と *(乗算)。

  • 数学関数:

    • log(expression): 自然対数
    • exp(expression): 自然対数の底

    これらの式はそれぞれ、シグナルで記述された式である引数を 1 つだけ受け取ります。

    有効な関数の例: exp(c.document_age)log(keywordSimilarityScore * 0.2 + 1.0)

  • 逆ランク変換関数(rr: この関数は rr(expression, k) と表されます。まず、ドキュメントを expression の値で降順に並べ替え、ドキュメントにランクを割り当てます。次に、式 1 / (rank_i + k) を使用して最終値を計算します。ここで、rank_i はソートされたリスト内のドキュメントの位置(0 から始まる)、k はユーザーが指定する正の浮動小数点数です。

    rr() 関数は、すべてのスコアを同じスケールに変換し、追加の正規化の必要性を排除します。

  • 数値ではない(NaN)処理関数:

    • is_nan(expression): 式が NaN と評価された場合(ドキュメントのシグナルが欠落している場合など)、1 が返されます。それ以外の場合は、0 が返されます。
    • fill_nan(arg_expression, fill_with_expression): arg_expression が NaN と評価された場合、fill_with_expression を返します。それ以外の場合、arg_expression を返します。これは、特定のシグナルが欠落している可能性のあるドキュメントを処理するうえで重要です。

ランキング数式の例

  1. 基本的な線形結合:

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  2. 逆ランクと NaN 処理を使用する複雑な式:

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + topicality_rank * 0.5
    
  3. 逆ランク、指数関数、NaN 処理を使用する複雑な式:

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    

検索結果のドキュメントのランキングをカスタマイズするには、手動で数式を作成して search API 呼び出しに追加します。

  1. ランキング式を作成します。

  2. 検索結果を取得します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search",
    "query": "QUERY",
    "rankingExpression": "RANKING_EXPRESSION",
    "rankingExpressionBackend": "RANK_BY_FORMULA"
    }'
    

    次のように置き換えます。

Python ライブラリを使用してランキング式を調整する

より高度なユースケースでは、数式に最適な重みを見つけるのが難しい場合があります。この問題を解決するには、オープンソース ツールである Vertex AI Search のランキング チューニング Python ライブラリを使用して、ユースケースに適した式を導き出します。

一般的なワークフローは次のとおりです。

  1. 対応する正解ラベルを含むクエリのデータセットを準備します。これらのゴールデン ラベルは、検索レスポンスの SearchResult オブジェクトを関連付けるのに役立つ、ドキュメント ID などの一意の識別フィールドにすることができます。
  2. 代表的なクエリのセットについては、search API を呼び出して、返されたすべてのドキュメントで利用可能なランキング シグナルを取得します。これは SearchResult.rankSignals フィールドで確認できます。このデータは、ゴールデン ラベルとともに保存します。
  3. Python ライブラリを使用して、このデータセットでランキング モデルをトレーニングします。詳細については、Clearbox Python ライブラリをご覧ください。

  4. トレーニング結果の数式をランキング式に変換します。このランキング式は API 呼び出しで使用できます。