クエリ一つでGeminiマルチモーダルテキスト生成
本記事は株式会社ココナラ Advent Calendar 2024 8日目の記事です。
はじめに
こんにちは。
株式会社ココナラ データテクノロジー室所属のエンジニア、 Unseo と申します。
趣味はミーアキャット観察です。
みなさん、Gemini [1]のマルチモーダル機能、使ってますか?
すごい可能性を秘めているのですが、導入ってちょっと大変ですよね。API 叩いたり、環境構築したり…。
そこで今回は、BigQuery ML(BQML)[2]と オブジェクトテーブル[3]を組み合わせて、たった一つのクエリで Gemini のマルチモーダルテキスト生成を実現する方法を紹介します!
具体的には、画像に何が写っているかを Gemini で判断し、タグを生成するタスクをクエリだけで完結させちゃいます。
画像のタグがあれば、既存のテキスト検索エンジンで画像検索ができるようになるかもしれません。
まずは、主題となる BQML と オブジェクトテーブルについて簡単に説明し、具体的な手順をご紹介します。
BigQuery MLとは?
BigQuery ML は、BigQuery 内で機械学習モデルをトレーニングおよび利用できる機能です[2:1]。
BigQuery に格納されているデータを利用できるため、データの移動や前処理の手間を大幅に削減できます。
実行環境を用意しなくて良いのも嬉しいポイントですね。
そして、この BigQuery ML で、Gemini も呼び出せてしまうのです。
オブジェクトテーブルとは?
BigQuery のオブジェクトテーブルは、画像や動画、音声などの非構造化データを格納できるテーブルです[3:1]。
これによって、BigQuery 内で直接マルチモーダルデータを扱うことが可能になります。
実体としては、Google Cloud Storage(GCS)に存在するファイルのメタデータが、自動でテーブル化されていると思えば良いかもしれません。
準備
[4]
BQMLでのGemini呼び出し1. リモートコネクションの作成
BigQueryから様々なAPIを呼び出すために、リモートコネクションの作成が必要です。
↓BigQueryコンソールから、「+追加」をクリック
↓「外部データソースへの接続」をクリック
↓「Vertex AIリモートモデル、...」を選択して、必要事項を入力、「接続を作成」で作成完了です。
※ リージョンによっては未対応のモデルもあるので、一旦USがおすすめです
2. コネクションサービスアカウントへのVertex AI接続ロールの付与
↓1.で作成したリモートコネクションの「接続ID」で Big Query リソースを検索すると、コネクションの詳細が閲覧できますので、「サービスアカウントID」を控えてください。
↓IAM コンソールから、「アクセスを許可」をクリック
↓コネクションサービスアカウントに、「Vertex AI ユーザ」ロールを付与します。
3. リモートモデル作成
次のクエリ実行で、BigQueryから呼び出せるGeminiモデルが作成されます。
CREATE MODEL `プロジェクトID.データセット名.gemini_1_5_flash`
REMOTE WITH CONNECTION `プロジェクトID.us.my_remote_connection`
OPTIONS(endpoint = 'gemini-1.5-flash');
4. Gemini呼び出しの実行
SELECT
*
FROM
ML.GENERATE_TEXT(
MODEL `データセット名.gemini_1_5_flash`,
(
SELECT
"hello, " AS prompt
),
STRUCT(0.8 AS temperature)
);
Geminiの推論結果が得られれば成功です!
[5]
オブジェクトテーブルの作成1. Cloud Storageバケットの作成
コンソールや CLI で画像を保存するバケットを作成します。
ロケーションは、モデルのリージョンに合わせて、USか、またはUSに含まれるものが無難でしょう。(例:us-central1
)
gcloud storage buckets create gs://バケット名 --location=ロケーション
2. オブジェクトテーブルの作成
バケットに対応したオブジェクトテーブルを作成します。
オブジェクトテーブルの作成時にもリモートコネクションが必要なので、さきほど BQML モデル作成に使用したものを流用します。
※BQML呼び出し時と別のコネクションを指定しても問題ないので、各社/各自の権限管理の運用ポリシーに沿って実施してください。
CREATE EXTERNAL TABLE `プロジェクト名.データセット名.my_images`
WITH CONNECTION `プロジェクト名.us.my_remote_connection`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ['gs://バケット名/*']
);
3. コネクションサービスアカウントへのGCSオブジェクト閲覧ロールの付与
オブジェクトテーブルは作成しただけでは使用できず、テーブルからバケットへのアクセス権限を付与する必要があります。
付与するロールは、「Storage オブジェクト閲覧者」です。
BQML 呼び出しで行った IAM コンソールからのロール付与と同じ手順なので、画像は割愛します。
4. オブジェクトテーブルの動作確認
私の敬愛するミーアキャット君の写真を、ココナラで依頼してドット絵風アイコンにした画像をgs://バケット名/meerkat.png
に保存して、オブジェクトテーブルに対してクエリを実行すると...
SELECT
*
FROM
`プロジェクト名.データセット名.my_images`
WHERE
content_type = "image/png"
このような結果が得られれば、オブジェクトテーブルの作成は成功です。
uri | generation | content_type | size | md5_hash | updated | metadata.name | metadata.value |
---|---|---|---|---|---|---|---|
gs://バケット名/meerkat.png | 1732... | image/png | 11243 | 22ef... | 2024-11... | null | null |
以上で、準備は完了です。次はいよいよ、Geminiマルチモーダル機能の実行です。
いざ、Geminiで画像タグ生成!
このクエリを実行するだけです。
SELECT
*
FROM
ML.GENERATE_TEXT(
MODEL `データセット名.gemini_1_5_flash`,
(
-- オブジェクトテーブルから対象のファイルをクエリ
SELECT
*
FROM
`プロジェクト名.データセット名.my_images`
WHERE
uri = "gs://バケット名/meerkat.png"
),
STRUCT(
TRUE AS flatten_json_output,
0.8 AS temperature,
"入力された画像の画風、テイスト、色合い、内容について、検索に便利なタグを作り、','区切りで出力しなさい" AS prompt,
)
);
入力画像
gs://バケット名/meerkat.png
出力結果
ml_generate_text_llm_result | ... |
---|---|
pixel art, pixel, 8-bit, video game, cartoon, cute, animal, meerkat, white, black, gray | ... |
※Geminiの出力以外のカラムは省略
所感
出力結果をみると
- 画風やスタイルを表す、"pixel art", "8-bit", "video game"
- キャラクターの特徴を表す、"cute", "animal", "meerkat"
といった具合に、画像の特徴をうまくキーワードで表現できているようにみえます。
まとめ
BigQuery MLとオブジェクトテーブルを活用することで、Geminiのマルチモーダルテキスト生成をたった一つのクエリで実装できました。
API呼び出しや複雑なコードを書く必要がなく、BigQueryに慣れている人なら手軽に利用できるのが大きなメリットです。
他にも、WITH
句で生成結果の後処理をクエリで行える柔軟性や、スケジュールクエリ[6]などに登録することでバッチ処理として実行できるなどの運用面の手軽さも魅力です。
一方で、リモートコネクションという見慣れない仕組みや、権限の割り振りという混乱しそうな準備が必要なところが、ネックになりそうですが、本記事や参考文献を手元においておけばきっと乗り切れるでしょう。
おわりに
明日は@shogo_tkskさんによる"プロジェクトの不確実性を下げる3つのコツ"です。
ココナラでは積極的にエンジニアを採用しています。
採用情報はこちら。
カジュアル面談希望の方はこちら。
Discussion