BigQuery で ML.GENERATE_TEXT_EMBEDDING() を利用してテキストのベクトル(エンベディング)を生成する方法のメモ。
大まかな手順は以下の通り。
- 言語モデル用の外部接続を追加
- 外部接続用のサービスアカウントにロールを設定
- 言語モデルの作成
- 生成AIによるテキストからの生成
1. 言語モデル用の外部接続を追加
- GCP コンソールで「BigQuery」をクリック
- BigQuery の「エクスプローラ」のメニューで「+追加」をクリック
- 「外部データソースへの接続」をクリック
- 以下を設定
- 接続タイプ: Vertex AI リモートモデル ...
- 接続ID: 任意のID(ここでは ai_remote_model)
- ロケーションタイプ: リージョン
- リージョン: 任意のリージョン(ここではus-central1)
- 「接続を作成」ボタンをクリック
2. 外部接続用のサービスアカウントにロールを設定
- BigQuery の当該のプロジェクトに表示される「外部接続」欄に上記で作成した接続ID(us-central1.ai_remote_model)をクリックして接続情報を表示し、サービスアカウントIDをコピー。
- GCP コンソールで「IAMと管理」をクリック
- IAM メニューの「アクセス権を付与」をクリック
- 新しいプリンシパルに上記でコピーしたサービスアカウントIDをペースト
- 「ロールを選択」で「Vertex AI ユーザー」を選択
- 「保存」ボタンをクリック
3. 言語モデルの作成
- BigQuery の当該のプロジェクトのメニューをクリックし、「データセットを作成」をクリック
- 以下を設定
- データセットID: 任意(ここでは test_dataset)
- ロケーションタイプ: リージョン
- リージョン: 任意(ここでは us-central1)
- 「データセットを作成」をクリック
- 以下のクエリを実行して言語モデルを作成
create or replace model {データセット}.{モデル名} # ここでは test_dataset.embedding_model remote with connection {外部接続ID} # ここでは `us-central1.ai_remote_model` options ( endpoint = 'textembedding-gecko-multilingual@001' );
4. テキストからのベクトル生成
以下の SQL でテキストからベクトルを生成することができる。
select * from ml.generate_text_embedding( model test_dataset.embedding_model, (select '私は人間です' as content), struct(true as flatten_json_output) ) ;
実行結果
[{ "text_embedding": ["0.041282802820205688", "-0.049310304224491119", ...], "statistics": "{\"token_count\":3,\"truncated\":false}", "ml_embed_text_status": "", "content": "私は人間です" }]
以下のようにテーブルに格納されたテキストのベクトルを生成することもできる。
テーブル定義
create table test_dataset.text_tbl ( id string, body string ); insert into test_dataset.text_tbl (id, body) values ('01', '晴れています。'); insert into test_dataset.text_tbl (id, body) values ('02', '曇りです。'); insert into test_dataset.text_tbl (id, body) values ('03', '雨が降っています。');
SQL
select t.id as id , t.body as title , ( select text_embedding from ml.generate_text_embedding( model test_dataset.embedding_model, (select t.body as content), struct(true as flatten_json_output) ) ) as s from test_dataset.text_tbl as t ;
実行結果
[{ "id": "01", "body": "晴れています。", "s": ["-0.0071903029456734657", "-0.062979131937026978", ...] }, { "id": "02", "body": "曇りです。", "s": ["-0.020720960572361946", "-0.058550607413053513", ...] }, { "id": "03", "body": "雨が降っています。", "s": ["-0.013185698539018631", "-0.027199963107705116", ...] }]