セマンティック検索と検索拡張生成を行う

このチュートリアルでは、セマンティック検索と検索拡張生成(RAG)向けにテキスト エンベディングを作成して使用するエンドツーエンドのプロセスについて説明します。

このチュートリアルでは、次のタスクについて説明します。

  • Vertex AI エンベディング モデルで BigQuery ML リモートモデルを作成する。
  • リモートモデルと ML.GENERATE_EMBEDDING 関数を使用して、BigQuery テーブルのテキストからエンベディングを生成する。
  • ベクトル インデックスを作成してエンベディングにインデックスを付け、検索パフォーマンスを高める。
  • VECTOR_SEARCH 関数でエンベディングを使用して、類似したテキストを検索する。
  • ML.GENERATE_TEXT 関数を使用してテキストを生成し、ベクトル検索の結果からプロンプト入力を補強して結果を改善することで、RAG を行う。

このチュートリアルでは、BigQuery の一般公開テーブル patents-public-data.google_patents_research.publications を使用します。

必要なロール

このチュートリアルを実行するには、次の Identity and Access Management(IAM)ロールが必要です。

  • BigQuery データセット、接続、モデルを作成して使用する: BigQuery 管理者(roles/bigquery.admin)。
  • 接続のサービス アカウントに権限を付与する: Project IAM 管理者(roles/resourcemanager.projectIamAdmin)。

これらの事前定義ロールには、このドキュメントのタスクを実行するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

  • データセットを作成する: bigquery.datasets.create
  • 接続を作成、委任、使用する: bigquery.connections.*
  • デフォルトの接続を設定する: bigquery.config.*
  • サービス アカウントの権限を設定する: resourcemanager.projects.getIamPolicyresourcemanager.projects.setIamPolicy
  • モデルを作成して推論を実行する。
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

BigQuery の料金の詳細については、BigQuery ドキュメントの BigQuery の料金をご覧ください。

Vertex AI の料金の詳細については、Vertex AI の料金のページをご覧ください。

始める前に

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. [アクションを表示] > [データセットを作成] をクリックします。

    [データセットを作成] のメニュー オプション。

  4. [データセットを作成] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

bq

新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

  1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

  2. データセットが作成されたことを確認します。

    bq ls

API

定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

テキスト エンベディング生成用のリモートモデルを作成する

ホストされる Vertex AI テキスト エンベディング生成モデルを表すリモートモデルを作成します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のステートメントを実行します。

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    クエリが完了するまでに数秒かかります。完了後、モデル embedding_model が [エクスプローラ] ペインの bqml_tutorial データセットに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

テキスト エンベディングを生成する

ML.GENERATE_EMBEDDING 関数を使用して特許の要約からテキスト エンベディングを生成し、BigQuery テーブルに書き込み、検索できるようにします。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のステートメントを実行します。

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT *, abstract AS content
        FROM `patents-public-data.google_patents_research.publications`
        WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
      )
    )
    WHERE LENGTH(ml_generate_embedding_status) = 0;

完了まで 5 分ほどかかる場合があります。

ML.GENERATE_EMBEDDING 関数を使用したエンベディング生成は、Vertex AI LLM の割り当てやサービスを利用できないことが原因で失敗する場合があります。エラーの詳細は ml_generate_embedding_status 列に返されます。空の ml_generate_embedding_status 列は、エンベディング生成が成功したことを示します。

BigQuery でテキスト エンベディング生成を行う他の方法については、事前トレーニング済みの TensorFlow モデルを使用したテキスト エンベディングのチュートリアルをご覧ください。

ベクトル インデックスを作成する

エンベディング列にベクトル インデックスを作成すると、その列で実行されるベクトル検索で近似最近傍探索手法が使用されます。この手法により、ベクトル検索のパフォーマンスが向上しますが、再現率が低下し、より近似的な結果が返されるというトレードオフがあります。

ベクトル インデックスを作成するには、CREATE VECTOR INDEX データ定義言語(DDL)ステートメントを使用します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次の SQL ステートメントを実行します。

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(ml_generate_embedding_result)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}')

通常、ベクトル インデックスの作成には数秒しかかかりません。ベクトル インデックスが入力され、使用可能になるまでさらに 2~3 分かかります。

ベクトル インデックスを使用できるかどうか確認する

ベクトル インデックスは非同期で入力されます。インデックスが使用できる状態かどうかを確認するには、INFORMATION_SCHEMA.VECTOR_INDEXES ビューをクエリして、coverage_percentage 列の値が 0 よりも大きく、last_refresh_time 列の値が NULL でないことを確認します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次の SQL ステートメントを実行します。

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

ベクトル インデックスを使用してテキストの類似度検索を行う

VECTOR_SEARCH 関数を使用して、テキストクエリから生成されたエンベディングに一致する関連特許を検索します。

top_k 引数は、返される一致数を決定します。この場合は 5 です。fraction_lists_to_search オプションは、検索するベクトル インデックス リストの割合を決定します。作成したベクトル インデックスには 500 個のリストがあるため、.01fraction_lists_to_search 値は、このベクトル検索がそれらのリストのうち 5 つをスキャンすることを示しています。ここに示されているように、fraction_lists_to_search の値が小さいほど、再現率が低くなり、パフォーマンスが向上します。ベクトル インデックス リストの詳細については、num_lists ベクトル インデックス オプションをご覧ください。

このクエリでエンベディングの生成に使用するモデルは、比較するテーブルのエンベディングの生成に使用するモデルと同じである必要があります。そうしないと、検索結果が正確になりません。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次の SQL ステートメントを実行します。

    SELECT query.query, base.publication_number, base.title, base.abstract
    FROM VECTOR_SEARCH(
      TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
      (
      SELECT ml_generate_embedding_result, content AS query
      FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT 'improving password security' AS content))
      ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')

    出力は次のようになります。

    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    |            query            | publication_number |                       title                     |                      abstract                   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    | improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
    | improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
    | improving password security | SG-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
    | improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
    | improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

テキスト生成用のリモートモデルを作成する

ホストされる Vertex AI テキスト生成モデルを表すリモートモデルを作成します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のステートメントを実行します。

    CREATE OR REPLACE MODEL `bqml_tutorial.text_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'gemini-2.0-flash-001');

    クエリが完了するまでに数秒かかります。完了後、モデル text_model が [エクスプローラ] ペインの bqml_tutorial データセットに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

ベクトル検索の結果で拡張されたテキストを生成する

ML.GENERATE_TEXT 関数を使用して、検索結果をプロンプトとしてフィードし、テキストを生成します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のステートメントを実行します。

    SELECT ml_generate_text_llm_result AS generated, prompt
    FROM ML.GENERATE_TEXT(
      MODEL `bqml_tutorial.text_model`,
      (
        SELECT CONCAT(
          'Propose some project ideas to improve user password security using the context below: ',
          STRING_AGG(
            FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
            ',\n')
          ) AS prompt,
        FROM VECTOR_SEARCH(
          TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
          (
            SELECT ml_generate_embedding_result, content AS query
            FROM ML.GENERATE_EMBEDDING(
              MODEL `bqml_tutorial.embedding_model`,
             (SELECT 'improving password security' AS content)
            )
          ),
        top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
      ),
      STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));

    出力は次のようになります。

    +------------------------------------------------+------------------------------------------------------------+
    |            generated                           | prompt                                                     |
    +------------------------------------------------+------------------------------------------------------------+
    | These patents suggest several project ideas to | Propose some project ideas to improve user password        |
    | improve user password security.  Here are      | security using the context below: patent title: Active     |
    | some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
    | upon:                                          | of adherence to password policy, patent abstract:          |
    |                                                | An active new password entry dialog provides a compact     |
    | **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
    | entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
    | adherence to password policy":**               | applicable password policies is included in the display    |
    |                                                | and updated as new password characters are being...        |
    +------------------------------------------------+------------------------------------------------------------+
     

クリーンアップ

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ