BigQuery ML で Gemini リモートモデルを利用して自前データを扱ってみる
TL;DR
先日、グーグルの Gemini at Work - Data for AI - というイベントに参加してきました。
なかむらさとる 氏の「生成 AI 時代の BigQuery 活用術 - BigQuery ユーザー コミュニティ「BQ_sushi」が解説 -」というセッションを拝聴して、リモートモデルの存在を知りました。へぇ〜 BQ から Gemini って呼び出せるのかーって感じでデモを見てました。で、実際に自分で試してみたので記録として残そうと思います。
外部接続の作成
Vertex AI リモートモデルの外部接続を次のように作成します。
一番下のサービスアカウントをコピーし IAM で「Vertex AI ユーザー」の権限を付与します。これを忘れると、リモートモデルを作るときにエラーになります。
データセットとリモートモデルの作成
データセットは外部接続と同じリージョンで作成します。データセットを作成したら Gemini リモートモデルを次の SQL を実行して作成します。{} の部分は自分の環境で置き換えてください。
CREATE OR REPLACE MODEL `{Dataset Name}.{Model Name}`
REMOTE WITH CONNECTION `{外部接続のリージョン}.{外部接続の名前}`
OPTIONS(
ENDPOINT = 'gemini-1.5-pro'
)
今回は Gemini 1.5 Pro と 1.5 Flash の 2 つを作成しました。
リモートモデルを試してみる
ケース1
作成したリモートモデルが正しく動作するか、プロンプトを与えて確認する。{} の部分は自分の環境で置き換えてください。
SELECT
STRING(_ml_generate_text_result_candidates.content.parts[0].text) AS content_text,
ml_generate_text_result.usage_metadata.candidates_token_count AS candidates_token_count,
ml_generate_text_result.usage_metadata.prompt_token_count AS prompt_token_count,
ml_generate_text_result.usage_metadata.total_token_count AS total_token_count
FROM
ML.GENERATE_TEXT(
MODEL `{Dataset Name}.{Model Name}`,
(
SELECT "野良猫と飼い猫で異る点を5つ挙げてください。出力は箇条書きのプレーンテキスト形式でお願いします。" AS prompt
),
STRUCT(
5000 AS max_output_tokens
)
)
LEFT JOIN
UNNEST(JSON_EXTRACT_ARRAY(ml_generate_text_result.candidates)) AS _ml_generate_text_result_candidates
上記の SQL を実行した結果は次のとおり。別にわざわざ SQL を実行して得るまでもない結果ですが、ここでは SQL を実行して Gemini が呼び出せることを確認しておきます。
ケース2
次に自前のデータを利用して Gemini から結果をもらう例です。デモで提示できるような手持ちのデータがないため、今回は得意先マスタのサンプルデータ(架空データです)を使うことにします。
得意先マスタでは大した事はできないですが、「住所から都道府県を抜き出す」という作業を Gemini にやってもらうユースケースにしました。
次のように書いた SQL を実行してみる。{} の部分は自分の環境で置き換えてください。
この得意先マスタは 10,000 件あるので、課金が怖いのと制限やクォータに引っかからないよう 100 件に絞りました。
SELECT
STRING(_ml_generate_text_result_candidates.content.parts[0].text) AS content_text,
address
FROM
ML.GENERATE_TEXT(
MODEL `{Dataset Name}.{Model Name}`,
(
SELECT
CONCAT('次の住所から都道府県を抜き出してください。出力は都道府県のみとしてください。',
address
) AS prompt,
address
FROM
(
SELECT
address
FROM
`sample.customer`
LIMIT 100
)
)
)
LEFT JOIN
UNNEST(JSON_EXTRACT_ARRAY(ml_generate_text_result.candidates)) AS _ml_generate_text_result_candidates
実行結果は以下のとおり。プロンプトで「出力は都道府県のみ・・・」と指示しないと結果に「東京都です」とかなるので、期待どおりの結果が得られるように調整します。
結果を見るとうまく都道府県を抽出できているが、出力時の上限など課題は残る…
ケース3
最後に BQ オブジェクトテーブルで画像に写っているものを Gemini に検出してもらう事を試してみました。オブジェクトテーブルについては本題からズレるので割愛しますが、テーブルの中身は次のようになっています。
次のように書いた SQL を実行してみます。{} の部分は自分の環境で置き換えてください。
SELECT
signed_url AS file,
STRING(_ml_generate_text_result_candidates.content.parts[0].text) AS content_text
FROM
ML.GENERATE_TEXT(
MODEL `{Dataset Name}.{Model Name}`,
(
SELECT
CONCAT('画像に写っている物を答えてください。出力は単語のみとしてください。',
signed_url
) AS prompt,
signed_url
FROM
(
SELECT
signed_url
FROM
EXTERNAL_OBJECT_TRANSFORM(TABLE `objtbl.demo`, ['SIGNED_URL'])
)
),
STRUCT(
1000 AS max_output_tokens
)
)
LEFT JOIN
UNNEST(JSON_EXTRACT_ARRAY(ml_generate_text_result.candidates)) AS _ml_generate_text_result_candidates
実行結果は以下のとおり。
もう少しプロンプトを調整する必要がありそうですが、正確に識別できているように思えます。
クォータと制限
使用するモデルによって異るようです。Gemini 1.5 pro の場合は次のような制限・クォータになります。
1 分あたりのリクエスト数: 60
ジョブあたりの行数: 21,600
同時実行ジョブ数: 5
所感
イベントに参加して聞いてるだけじゃ何も身に付かないので、興味があるならまずは自分でやってみることが大切かなぁーと思います。
実際リモートモデルを試してみて SQL から AI にアクセスできる事はデータ分析する点では便利かなと思います。
BQ のデータを使ってチャットアプリなどを作るなら Agent Builder でも良さそうな気がするけど、特定のカラムに対してなにかをまとめて指示して結果を得るユースケースには向いてそうです。