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

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

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

概要

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

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

  • 可視化: 検索結果の最終的な ランキングに影響するシグナルを把握します。
  • 既存のシグナルの調整: セマンティック類似度、キーワードのマッチタイプ、ドキュメントの鮮度など、さまざまなシグナルの重みを調整します。
  • ビジネス ロジックの組み込み: ドキュメント データから独自のカスタム シグナルをランキング式に直接追加します。
  • 体系的な最適化: オープンソースの 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 時間を意味します。
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": {
              "lat": 52.23034637633789,
              "lon": 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 呼び出しで使用できます。