セマンティック検索と検索拡張生成を行う
このチュートリアルでは、セマンティック検索と検索拡張生成(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.getIamPolicy
とresourcemanager.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.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
BigQuery の料金の詳細については、BigQuery ドキュメントの BigQuery の料金をご覧ください。
Vertex AI の料金の詳細については、Vertex AI の料金のページをご覧ください。
始める前に
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
データセットを作成する
ML モデルを保存する BigQuery データセットを作成します。
コンソール
Google Cloud コンソールで、[BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
[アクションを表示] > [データセットを作成] をクリックします。
[データセットを作成] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。
残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
bq
新しいデータセットを作成するには、--location
フラグを指定した bq mk
コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset
コマンドのリファレンスをご覧ください。
データの場所が
US
に設定され、BigQuery ML tutorial dataset
という説明の付いた、bqml_tutorial
という名前のデータセットを作成します。bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
このコマンドでは、
--dataset
フラグの代わりに-d
ショートカットを使用しています。-d
と--dataset
を省略した場合、このコマンドはデフォルトでデータセットを作成します。データセットが作成されたことを確認します。
bq ls
API
定義済みのデータセット リソースを使用して datasets.insert
メソッドを呼び出します。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。
テキスト エンベディング生成用のリモートモデルを作成する
ホストされる Vertex AI テキスト エンベディング生成モデルを表すリモートモデルを作成します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
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 テーブルに書き込み、検索できるようにします。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
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)ステートメントを使用します。
[BigQuery] ページに移動します。
クエリエディタで、次の 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
でないことを確認します。
[BigQuery] ページに移動します。
クエリエディタで、次の 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 個のリストがあるため、.01
の fraction_lists_to_search
値は、このベクトル検索がそれらのリストのうち 5 つをスキャンすることを示しています。ここに示されているように、fraction_lists_to_search
の値が小さいほど、再現率が低くなり、パフォーマンスが向上します。ベクトル インデックス リストの詳細については、num_lists
ベクトル インデックス オプションをご覧ください。
このクエリでエンベディングの生成に使用するモデルは、比較するテーブルのエンベディングの生成に使用するモデルと同じである必要があります。そうしないと、検索結果が正確になりません。
[BigQuery] ページに移動します。
クエリエディタで、次の 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 テキスト生成モデルを表すリモートモデルを作成します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
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
関数を使用して、検索結果をプロンプトとしてフィードし、テキストを生成します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタで、次のステートメントを実行します。
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... | +------------------------------------------------+------------------------------------------------------------+
クリーンアップ
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- 検索拡張生成パイプラインで PDF を解析するチュートリアルで、解析された PDF コンテンツに基づいて RAG パイプラインを作成する方法を確認する。