検索結果をランク付けする

このページでは、Vertex AI ランキング モデル エンドポイントを使用して、アプリケーションの検索結果をランク付けする方法について説明します。

Vertex AI Ranking API は、ドキュメントのリストを取得し、ドキュメントが特定のクエリ(検索文字列)にどの程度関連しているかに基づいてドキュメントをランク付けします。ai.rank() 関数を使用すると、ドキュメントが特定のクエリにどの程度適切に回答しているかのスコアが返されます。

このページの手順は、AlloyDB for PostgreSQL と生成 AI のコンセプトに詳しい方向けのものです。

AlloyDB は ai スキーマを予約して作成します。

始める前に

検索結果をランク付けする前に、次の操作を行います。

Discovery Engine API を有効にする

コンソール

  1. API を有効にします。
  2. [プロジェクトを確認] の手順で、[次へ] をクリックして、変更するプロジェクトの名前を確認します。
  3. [API を有効にする] の手順で、[有効にする] をクリックして Discovery Engine API を有効にします。この API をすでに有効にしている場合、ここには表示されません。

gcloud

ランキング モデルを使用するには、Discovery Engine API を有効にする必要があります。
PROJECT_ID は実際の Google Cloud プロジェクト ID に、PROJECT_NUMBER は対応するプロジェクト番号に置き換えます。

    # Enable Discovery Engine API
    gcloud services enable discoveryengine.googleapis.com --project=PROJECT_ID
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com" \
    --role="roles/discoveryengine.viewer"

Vertex AI モデルでは、ランク付け用にモデルを登録する必要はありません。次の例に示すように、Vertex AI モデル名を model_id として使用できます。

    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-default-003',
        search_string => 'Affordable family-friendly vacation spots in Southeast Asia?',
        documents =>
    ARRAY[
      'Luxury resorts in South Korea',
      'Family vacation packages for Vietnam: Ha Long Bay and Hoi An',
      'Budget-friendly beaches in Thailand perfect for families',
      'A backpacker guide to solo travel in India'])

セマンティック ランカーの一般的なユースケースは、ベクトル検索で返された結果を再ランク付けして、クエリの順序を改善することです。次の例は、このユースケースでセマンティック ランキング モデルを使用する方法を示しています。この例では、ベクトル検索を使用してクエリ personal fitness equipment の初期結果セットを取得します。これらの結果は再ランク付けされ、上位 5 件の結果が返されます。

    WITH initial_ranking AS (
      SELECT id, description, ROW_NUMBER() OVER () AS ref_number
      FROM product
      ORDER BY
        embedding <=> google_ml.embedding(
          'gemini-embedding-001', 'personal fitness equipment')::vector
      LIMIT 10
    ), reranked_results AS (
      SELECT index, score
      FROM ai.rank(
          model_id => 'semantic-ranker-default-003',
          search_string => 'personal fitness equipment',
          documents => (SELECT ARRAY_AGG(description ORDER BY ref_number) FROM initial_ranking),
          top_n => 5)
    )
    SELECT id, description
    FROM initial_ranking, reranked_results
    WHERE initial_ranking.ref_number = reranked_results.index
    ORDER BY reranked_results.score DESC;
  

使用可能なモデルとユースケースの一覧については、サポートされているモデルをご覧ください。

Vertex AI と統合して拡張機能をインストールする

  1. Vertex AI と統合します
  2. google_ml_integration の最新バージョンがインストールされていることを確認します。
    1. インストールされているバージョンを確認するには、次のコマンドを実行します。

              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.3
              (1 row)
            
    2. 拡張機能がインストールされていない場合、またはインストールされているバージョンが 1.4.3 より前の場合は、次のコマンドを実行して拡張機能を更新します。

              CREATE EXTENSION IF NOT EXISTS google_ml_integration;
              ALTER EXTENSION google_ml_integration UPDATE;
            

      上記のコマンドを実行したときに問題が発生した場合、または上記のコマンドを実行しても拡張機能がバージョン 1.4.3 に更新されない場合は、AlloyDB サポートにお問い合わせください。

    3. バージョンが最新であることを確認したら、upgrade_to_preview_version プロシージャを実行してプレビュー機能をインストールします。

              CALL google_ml.upgrade_to_preview_version();
              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.4
              (1 row)
            

必要なロール

ディスカバリー エンジンのランキング モデルを使用するために必要な権限を取得するには、your project に対するディスカバリー エンジン閲覧者(roles/discoveryengine.viewer)の Identity and Access Management(IAM)ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

検索結果をランク付けする

次の SQL クエリは、検索結果をランク付けする方法を示しています。

SELECT
  ai.rank(
    model_id => 'MODEL_ID',
    search_string => 'SEARCH_STRING',
    documents => ARRAY['DOCUMENT_1', 'DOCUMENT_2', 'DOCUMENT_3']);

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

パラメータ 説明
MODEL_ID 定義するモデル エンドポイントの一意の ID。
SEARCH_STRING レコードのランク付けに使用する検索文字列。
DOCUMENTS レコードを識別する一意の文字列。

サポートされている Vertex AI ランキング モデルの一覧については、サポートされているモデルをご覧ください。

Vertex AI ランキング モデルを使用して検索結果をランク付けするには、次のクエリを実行します。

SELECT index, score
FROM
  ai.rank(
    model_id => 'semantic-ranker-default-003',
    search_string => 'AlloyDB is a PostgreSQL compatible AI database that is ready for production.',
    documents =>
      ARRAY[
        'Alloys are made from combination of metals',
        'The best enterprise-ready PostgreSQL database.',
        'You can feel the heat in Alloy apartments.']);

レスポンスは、各ドキュメントと、検索クエリとの関連性に基づくスコアで構成された表になります。レスポンスの例を次に示します。

 index | score
-------+------------
     2 |  0.33
     1 |  0.28
     3 |  0.16
(3 rows)

エンベディングに変換されたレビューの説明のリストを含む AlloyDB データベースの例について考えてみましょう。次のサンプルコード スニペットは、ランキング モデルを使用し、クエリに対するレビューの説明の意味的類似度に基づいて、上位にランク付けされた商品の名前を取得する方法を示しています。

WITH initial_ranking AS (
    SELECT product_id, name, review, review_id, ROW_NUMBER() OVER () AS ref_number
    FROM user_reviews
    ORDER BY
      review_desc_embedding <=> google_ml.embedding(
        'gemini-embedding-001', 'good desserts')::vector
    LIMIT 10
  ), reranked_results AS (
    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-512',
        search_string => 'good desserts',
        documents => (SELECT ARRAY_AGG(review ORDER BY ref_number) FROM initial_ranking),
        top_n => 5)
  )
SELECT product_id, name
FROM initial_ranking, reranked_results
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC;

次のステップ