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

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

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

概要

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

カスタム ランキングを使用すると、次のことが可能になります。

  • 可視化: 検索結果の最終的な ランキングに影響するシグナルを把握します。
  • 既存のシグナルの調整: セマンティック類似性、キーワード マッチング、ドキュメントの鮮度など、さまざまなシグナルの重みを調整します。
  • ビジネス ロジックの組み込み: ドキュメント データから独自のカスタム シグナルをランキング式に直接追加します。
  • 体系的な最適化: オープンソースの 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 と B よりもセマンティック関連性が若干低くなります。
4 ホテル C ペット可ですが、「プールなし」と「ブティック」であるため、この特定のクエリとの関連性が大幅に 低下します。

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

カスタム ランキング

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

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

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

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

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

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

  2. 密な逆ランク変換関数 drr() を使用して、すべてのスコアを同じスケールに変換します。

  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 の場合、これは複数のシグナルを組み合わせて各検索結果の新しいスコアを計算するキュレーションされた式です。

標準シグナル

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

シグナル名 説明
default_rank 標準の Agent Search ランキング アルゴリズムによって決定されるドキュメントのデフォルトのランク。
semantic_similarity_score クエリとコンテンツのエンベディングに基づいて計算されたスコア。検索クエリがドキュメントのコンテンツにどの程度類似しているかを判断します。これは、Google 独自のアルゴリズムを使用して計算されます。
relevance_score 複雑な クエリとドキュメントのインタラクションを処理するディープ関連性モデルによって生成されるスコア。このモデルは、コンテンツのコンテキストでクエリの意味と 意図を判断します。これは、Google 独自のアルゴリズムを使用して計算されます。
keyword_similarity_score キーワード マッチングを重視したスコア。このシグナルは、 Best Match 25(BM25)ランキング関数を使用します。
document_age

ドキュメントの経過時間(時間単位)。浮動小数点値をサポートしています。たとえば、0.5 は 30 分、50 は 2 日と 2 時間を意味します。

document_age がゼロ以外になるようにするには、スキーマ内のフィールドをキープロパティ update_timecreate_time にマッピングする必要があります。これらのフィールドは document_age の計算に使用されます。 update_time が使用できない場合、カスタム ランキングでは create_time をフォールバックとして使用して document_age を決定します。 キープロパティをマッピングする方法については、 スキーマを更新するをご覧ください。

pctr_rank ユーザー イベントデータに基づいて計算された、予測コンバージョン率を示すランク。このシグナルは、予測されるクリック率(pCTR)を使用して、ユーザーの視点から検索結果の関連性 を測定します。
topicality_rank Google 独自のアルゴリズムを使用して計算された、キーワード類似度調整を示すランク。
boosting_factor ドキュメントに適用したすべてのカスタム ブーストの組み合わせ。

カスタム シグナル

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

シグナル名は、英字とアンダースコア(_)の組み合わせです。 次の名前は予約済みであり、シグナル名として使用できません: logexprrdrris_nanfill_nangeo_distance

地理距離 - 導出されたシグナル

地理距離などの導出されたシグナルは、標準シグナルとカスタム シグナルに基づいて計算されます。地理距離は、出発地と目的地の間の距離を計算する関数です。geo_distance() 関数は geo_distance(source_location, destination_location) と表されます。次の引数で構成されます。

  • 出発地または source_location: 距離の計算の起点。次のいずれかのタイプを指定できます。

    • クエリの場所: 自然言語理解モデルを使用してクエリから解析される場所。たとえば、クエリ Hotels along the M6では、自然言語理解モデルは Hotelsを検索 パラメータの「何」M6「どこ」の部分として抽出します。「どこ」 の部分はクエリの場所であり、点、ポリライン、円、ポリゴンとして表すことができます。

      {
       "query": "Hotels along M6",
       "ranking_expression": "geo_distance(query_loc, c.hotel_location)",
       "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • リクエストの場所の座標: 検索リクエストで明示的に指定された場所(ユーザーの緯度と経度など)。たとえば、クエリを Hotels として指定し、緯度と経度を使用して場所を指定できます。

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "point": {
              "latitude": 52.23034637633789,
              "longitude": 20.98339855121653
            }
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • リクエストの場所の住所: 検索リクエストで明示的に指定された住所。たとえば、クエリを Hotels として指定し、参照用の住所を指定できます。

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "address": "1800 Amphibious Blvd. Mountain View, CA 94045"
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
  • 目的地または destination_location: 距離の計算の目的地。c.office_locationc.home_location などのカスタム取得可能フィールドです。

関数内のこれらの引数の順序は変更できません。つまり、出発地は常に geo_distance() 関数内の最初の引数であり、その後に目的地が続きます。 この関数は、出発地と目的地の緯度と経度を使用して、距離をメートル単位で計算します。

ランキング式の構文

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

  • 数値(double: シグナルまたは式に重みを追加する正または負の浮動小数点値。

  • シグナル(signal: 標準シグナルのセクションに記載されているシグナルの名前。

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

  • 数学関数:

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

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

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

  • 密な逆ランク変換関数(drr:

    この関数は drr(expression, k, eps) と表されます。まず、ドキュメントを expression の値で降順に並べ替え、ドキュメントにランクを割り当てます。式の値が eps の範囲内にある場合、値は同じとみなされます。次に、式 1 / (rank_i + k) を使用して最終値を計算します。この式では、rank_i は並べ替えられたリスト内のドキュメントの位置(0 から始まる)、k は指定する正の浮動小数点数です。

    drr() 関数は通常、すべてのスコアを同じスケールに変換し、追加の正規化を不要にするために使用されます。

    Google では、以前の逆ランク変換関数(rr)よりもこの関数を使用することをおすすめします。これは、シグナルが上位の結果で結び付いている場合に優れた結果が得られるためです。たとえば、サンフランシスコのホテルを検索する場合、市内には多くのホテルがあるため、多くのホテルが同じ地理距離シグナルを共有します。

    eps パラメータの詳細:

    • eps パラメータを使用すると、2 つのシグナルが等しいかどうかを判断する際の柔軟性が高まります。同等のシグナルは、boosting_factorgeo_distance、カテゴリ カスタム、整数カスタムのタイプのシグナルで最もよく見られます。

    • この関数は、1 つのドキュメントの式の値が別のドキュメントの式の値と 等しいかどうかを判断します。eps=0 の場合、値が等しいとみなされるには 完全に同じである必要があります。eps>0 の場合、 eps で指定された範囲内の値は等しいとみなされます。

    • 具体的には、x1x2 がシグナル値の場合、2 つの絶対差が eps 以下(つまり abs(x1-x2) <= eps)の場合、同じ値とみなされます。デフォルトでは eps=0 です。つまり、x1 == x2 の場合、値は同じとみなされます。eps=0 のデフォルトは整数では適切に機能しますが、浮動小数点演算の不正確さにより、浮動小数点数では失敗する場合があります。たとえば、1/5 が 0.20000000000001 または 0.19999999999 と評価される場合があります。

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

    rr() 関数は通常、すべてのスコアを同じスケールに変換し、追加の正規化を不要にするために使用されます。

    この関数はサポートされていますが、Google では新しい密な逆ランク変換関数(drr)をおすすめします。

  • 非数値(NaN)処理関数:

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

ランキング式の例

検索リクエストの rankingExpression フィールドで使用できるランキング式の例をいくつか示します。

  • 基本的な線形結合:

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

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

    drr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    
  • geo_distance() 関数で密な逆ランクを使用する複雑な式。geo_distance() 関数で eps パラメータを使用する方法を示しています。

    drr(keyword_similarity_score, 16) * 0.8 + drr(geo_distance(query_loc, c.office_location) * -1, 16, 0.00001) * 0.2
    

    この式では、乗算係数は負の値であるため、距離が大きいほど式の値が小さく(より負の値)、逆ランクでは距離が大きいほどランキング スコアが低くなります。

レスポンス内のシグナル

検索レスポンスでドキュメントが返されると、検索結果には、データストアからドキュメントを取得するために使用される 標準シグナルとカスタム シグナルが一覧表示されます。 rankSignals フィールドにこれらのシグナルが一覧表示されます。

キーワード類似度のテキスト フィールド

構造化データストアで検索レスポンスに keywordSimilarityScore シグナルを取得するには、スキーマを更新して次の操作を行う必要があります。

  • キーワード マッチングに不可欠なテキスト フィールドをキープロパティ titledescription にマッピングする
  • テキスト フィールドのアノテーションを Searchable に更新する

検索結果のドキュメントのランキングをカスタマイズするには、手動で 式を作成して 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 ライブラリを使用してランキング式を調整する

より高度なユースケースでは、式に最適な重みを見つけるのが難しい場合があります。これを解決するには、オープンソース ツールである Agent Search のランキング調整 Python ライブラリを使用して、ユースケースに適した式を作成します。

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

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

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