見出し画像

BigQuery ML で Gemini リモートモデルを利用して自前データを扱ってみる


TL;DR

先日、グーグルの Gemini at Work - Data for AI - というイベントに参加してきました。

Gemini at Work

なかむらさとる 氏の「生成 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 でも良さそうな気がするけど、特定のカラムに対してなにかをまとめて指示して結果を得るユースケースには向いてそうです。

参考

#BigQuery #GoogleCloud #Gemini #VertexAI

いいなと思ったら応援しよう!