BigQuery で ML.GENERATE_TEXT() を使用してテキストを生成する方法のメモ。
大まかな手順は以下の通り。
- 言語モデル用の外部接続を追加
- 外部接続用のサービスアカウントにロールを設定
- 言語モデルの作成
- 生成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.generative_model remote with connection {外部接続ID} # ここでは `us-central1.ai_remote_model` options ( endpoint = 'gemini-pro' );
4. 生成AIでテキストを生成
以下の SQL でテキストからベクトルを生成することができる。
gemini-1.5-pro は "prompt" カラムを処理対象とするため、select ... as prompt としている。
select * from ml.generate_text( model test_dataset.generative_model, (select 'あなたは誰ですか' as prompt), struct(true as flatten_json_output) ) ;
実行結果
[{ "ml_generate_text_llm_result": "私はGoogleによって作られた、大規模言語モデルのジェミニです。私は、日本語、英語、フランス語、スペイン語、ドイツ語、中国語、韓国語、ポルトガル語、ロシア語、イタリア語、アラビア語、ヒンディー語、トルコ語、ベトナム語、インドネシア語、マレー語、タイ語、フィリピン語、オランダ語、ポーランド語、ウクライナ語、ルーマニア語、チェコ語、ハンガリー語、スウェーデン語、デンマーク語、ノルウェー語、フィンランド語、ギリシャ語、ブル", "ml_generate_text_rai_result": "[{\"category\":1,\"probability\":1,\"probability_score\":0.051558189,\"severity\":1,\"severity_score\":0.1046602},{\"category\":2,\"probability\":1,\"probability_score\":0.014559518,\"severity\":1,\"severity_score\":0.026355354},{\"category\":3,\"probability\":1,\"probability_score\":0.14829372,\"severity\":1,\"severity_score\":0.15215819},{\"category\":4,\"probability\":1,\"probability_score\":0.080646612,\"severity\":1,\"severity_score\":0.040769264}]", "ml_generate_text_status": "", "prompt": "あなたは誰ですか" }]
以下のようにテーブルに格納されたテキストからテキストを生成することもできる。
テーブル定義
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 ml_generate_text_llm_result from ml.generate_text( model test_dataset.generative_model, (select t.body as prompt), struct(true as flatten_json_output) ) ) as s from test_dataset.text_tbl as t order by t.id asc ;
実行結果
[{ "id": "01", "title": "晴れています。", "s": "今日はとても良い天気ですね! 気持ちの良い青空が広がっています。 \n\nお出かけ日和なので、ぜひ外に出て楽しんでください。 \n\n何か予定はありますか?" }, { "id": "02", "title": "曇りです。", "s": "はい、曇りですね。空はどんよりとしていて、雨が降りそうな雰囲気です。傘を持ってお出かけすることをおすすめします。" }, { "id": "03", "title": "雨が降っています。", "s": "はい、雨が降っていますね。傘をお持ちですか?" }]