1. はじめに
膨大なデータセットには貴重な分析情報が格納されていますが、意味のある理解を抽出することは大変な作業です。従来の分析ツールでは、多くの場合、データ内のストーリーを真に把握するための人間のような微妙な説明を提供できません。データ ウェアハウスに格納される非構造化データは増加の一途をたどっていますが、分析情報を得るためにそのデータにアクセスできるとは限りません。非構造化テキスト、画像、動画には、ビジネスを進化させるための貴重な情報が含まれています。LLM は、説明、感情分析、オブジェクト検出などを提供して、データを理解するための新しい優れた方法を提供します。マルチモーダル モデルの登場(およびオブジェクト テーブルを介して画像や動画などのオブジェクト データを BigQuery に保存する機能)により、Gemini 1.0 Pro(テキストベースの分析用)や Gemini 1.0 Pro Vision(テキストおよび画像/動画分析用)などの強力な LLM を BigQuery と統合することで、データの分析方法を変革できます。
この Codelab では、企業データから LLM の分析情報を引き出し、その分析情報を BigQuery 内の数千行にスケーリングする次の 2 つの方法について説明します。
方法 1: リモートモデルの呼び出し
SELECT
クエリでML.GENERATE_TEXT
を使用して、BigQuery 内から Gemini 1.0 Pro を呼び出します。- この方法は、モデルが BigQuery でリモートモデルとしてすでに利用可能で、そのまま使用したい場合に使用してください。BigQuery のドキュメントで、使用するモデルのステータスを確認します。
方法 2: リモート関数の実装
- Gemini 1.0 Pro Vision 呼び出しを実装する Cloud Functions の関数を呼び出し、BigQuery のリモート関数として公開します。
- この方法は、使用したいモデルがリモートモデルとしてそのままでは利用できない場合や、ユースケースにより柔軟性とカスタマイズ性を高めたい場合に使用します。
作成するアプリの概要
- リモートモデル呼び出しメソッドでは、BigQuery の ML.GENERATE_TEXT コンストラクトで Gemini 1.0 Pro のリモートモデルを呼び出して、インターネット アーカイブ書籍データセット(BigQuery で一般公開されている)の場所サマライザーを構築します。
- リモート関数の実装メソッドでは、テスト画像をベースライン画像と照らし合わせて検証するための画像検証ツールを作成します。そのためには、テスト画像のスクリーンショットを含むデータセットを外部テーブルで作成し、Gemini 1.0 Pro Vision にベースライン画像と照らし合わせて検証するように指示します。次に、Gemini Pro Vision 呼び出しを実装する Java Cloud Functions の関数を作成し、BigQuery でリモート関数として呼び出します。
注:
BigQuery で、リモートモデルとして利用可能な Vertex AI 生成 AI モデルがさらに増える可能性があります。つまり、BigQuery の ML.GENERATE_TEXT
コンストラクトを使用して、これらのモデルにすぐにアクセスできます。ただし、モデルがリモートで利用できる場合でも、Cloud Functions でユースケースに合わせて高度なカスタマイズを構築し、BigQuery からリモート関数としてこれらのモデルにアクセスするという選択肢が常にあります。
BigQuery を選択する理由
BigQuery はサーバーレスのマルチクラウド データ ウェアハウスで、最小限の運用オーバーヘッドでバイトからペタバイトまでスケーリングできるため、ML トレーニング データの保存に最適です。組み込みの BigQuery ML(BQML)と分析機能を使用して、SQL クエリのみを使用してコード不要の予測を作成できます。さらに、連携クエリを使用して外部ソースのデータにアクセスできるため、複雑な ETL パイプラインが不要になります。
BigQuery は、構造化データ、半構造化データ、非構造化データの分析に役立つフルマネージドのクラウド データ ウェアハウスです。
2. 必要なもの
3. 始める前に
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Cloud Shell を使用します。Cloud Shell は Google Cloud で動作するコマンドライン環境で、bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。
- Cloud Shell に接続したら、次のコマンドを使用して、すでに認証されていることと、プロジェクトが自分のプロジェクト ID に設定されていることを確認します。
gcloud auth list
- Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
- プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
- Gemini for Google Cloud Marketplace に移動して API を有効にします。Cloud Shell ターミナルで次のコマンドを使用することもできます。
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- 次の API が有効になっていることを確認してください。
- BigQuery
- BigQuery Connection
- Cloud Functions の関数
- Cloud Run
- Vertex AI
- Cloud Build
- Cloud Storage API
gcloud コマンドの代わりに、こちらのリンクからコンソールからアクセスすることもできます。
gcloud コマンドとその使用方法については、ドキュメントをご覧ください。
4. BigQuery データセットと外部接続を作成する
まず、データセットと Cloud リソース接続を作成します。
BigQuery のデータセットは、アプリケーションのすべてのテーブルとオブジェクトを格納するコンテナです。
データセットを作成する手順は次のとおりです。
- Google Cloud コンソールで BigQuery ページに移動します。
- [Explorer] パネルで、データセットを作成するプロジェクトを選択します。
- [アクション] オプション(その他アイコン)を開き、[データセットを作成] をクリックします。
- [データセットを作成] をクリックします。
- [データセット ID] フィールドに「
gemini_bq_fn
」と入力します。 - ロケーション タイプを
Multi-region
に設定し、デフォルト値(US(multiple regions in United States.
)を受け入れます。 - [データセットを作成] をクリックします。
- データセットが作成され、[Explorer] ペインのプロジェクト ID の下に表示されていることを確認します。
Cloud Functions の関数とやり取りするには、BigQuery の接続が必要です。リモート関数を作成するには、BigQuery 接続を作成する必要があります。この Codelab では、BigLake 接続を使用して、Cloud Functions の関数を介して BigQuery からモデルにアクセスします。BigLake 接続は、きめ細かい BigQuery アクセス制御とセキュリティを維持しながら、外部データソース(この場合は Vertex AI Gemini Pro API)に接続するのに役立ちます。
BigLake 接続を作成する手順は次のとおりです。
- BigQuery ページの [エクスプローラ] ペインで [追加] をクリックします。
- [外部データソースへの接続] をクリックします。
- [接続タイプ] メニューから、[Vertex AI リモートモデル、リモート関数、BigLake(クラウド リソース)] を選択します。
- [接続 ID] フィールドに、接続名として「
gemini-bq-conn
」を入力します。 - ロケーション タイプを
Multi-region
に設定し、デフォルト値(US(multiple regions in United States.
)を受け入れます。 - [接続を作成] をクリックします。
- [接続に移動] をクリックし、[接続情報] ペインでサービス アカウント ID をコピーします。
- [IAM &管理者] ページを開き、[アクセス権を付与] をクリックします。
- サービス アカウント ID を [新しいプリンシパル] フィールドに貼り付けます。
- ロールリストから
Vertex AI user
ロールを選択し、[保存] をクリックします。
これで、データセットと BigQuery 接続が正常に作成されました。次に、リモートモデルの呼び出しに必要な手順を完了します。
5. ユースケース 1 リモートモデル呼び出し: リモートモデル呼び出しを設定する
これでデータセットと接続が作成されました。では、Vertex AI Gemini Pro の基盤モデルに基づくモデルを BigQuery で作成してみましょう。この演習を終えると、SQL クエリのみを使用して LLM アプリケーションを起動し、実行できます。
ステップ 1: リモートモデルの入力データを含む BigQuery テーブルを作成する
データセットに books
という名前のテーブルを作成します。このテーブルには、BigQuery で一般公開される Internet Archive Books データセットのテーブル bigquery-public-data.gdelt_internetarchivebooks.1905
から約 50 件のレコードを保持できます。
これを行うには、BigQuery SQL エディタペインから次の DDL(データ定義言語)ステートメントを実行します。
create or replace table gemini_bq_fn.books as (
select *
from
bigquery-public-data.gdelt_internetarchivebooks.1905 limit 50)
ステップ 2 : BigQuery モデルを作成する
データセットにモデルを作成します。これを行うには、BigQuery SQL エディタペインから次の DDL を実行します。
CREATE MODEL `gemini_bq_fn.gemini_remote_model`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS(ENDPOINT = 'gemini-pro');
モデルを表示するオプション付きでモデルが作成されたことを確認します。
ステップ 3 : 新しい生成 AI アプリケーションをテストする
SELECT
クエリで ML.GENERATE_TEXT
関数を使用して、リモートモデルにリクエストを送信します。
SELECT ml_generate_text_llm_result as Gemini_Response, prompt as Prompt
FROM ML.GENERATE_TEXT(MODEL `gemini_bq_fn.gemini_remote_model`,
(select 'You are a text summarizer and standardizer. From the following text that contains address locations, standardize and print one standardized, consolidated address. You cannot return empty because you know how to pick up sensible data from the text in this field: ' ||
substring(locations, 0, 200) as prompt
from `gemini_bq_fn.books`),
STRUCT(
TRUE AS flatten_json_output));
次のような結果が表示されます。
これで、ここでは、リモートモデル(gemini-pro
モデルに基づく)と ML.GENERATE_TEXT
関数を使用して、BigQuery テーブルのテキストデータを分析する方法を確認しました。
BigQuery リモート関数を使用して、別の Vertex AI モデルを試してみましょう。たとえば、BigQuery でモデルをリモートで使用できるように、よりカスタマイズ性と柔軟性を高めたいとします。サポートされているモデルは、BigQuery のドキュメントに記載されています。
6. ユースケース 2 リモート関数の実装: リモート関数の実装を設定する
この演習では、Gemini 1.0 Pro Vision の基盤モデルを実装する Java の Cloud Functions の関数に基づいて、BigQuery で関数を作成します。まず、Java の Cloud Functions の関数を作成してデプロイし、Gemini 1.0 Pro Vision モデルを使用して画像を比較します。次に、デプロイされた Cloud Functions の関数を呼び出すリモート関数を BigQuery に作成します。BigQuery でのリモート関数実行にも同じ手順を使用できます。
それでは始めましょう。
ステップ 1: Java で Cloud Functions の関数を作成する
Java で第 2 世代の Cloud Functions の関数を構築し、テスト画像をベースライン イメージに照らして検証します。ベースライン画像は、BigQuery の外部テーブルにある、テスト画像のスクリーンショットを含むデータセットに保存されます。Gemini Pro Vision モデル(Java SDK)を使用して画像を検証します。その後、Java で Cloud Functions の関数を REST エンドポイントにデプロイします。
手順は次のとおりです。
- Cloud Shell エディタを起動する
- 以前のエディタを使用している場合は、[新しいエディタを試す] をクリックします。
- ステータスバーで、[Cloud Code - Sign In] をクリックします。
- Cloud Shell エディタに Google Cloud API の呼び出しを承認するように求められたら、[承認] をクリックします。画面の指示に沿って Google アカウントにログインします。これで Google Cloud に接続されました。
- Cloud Code のステータスバーにプロジェクトが表示されない場合は、[Cloud Code - ログイン] >Google Cloud プロジェクトを選択します。Cloud Functions を作成する Google Cloud プロジェクトを選択します。プロジェクトが読み込まれ、Cloud Shell エディタでアクティブなプロジェクトになります。
- Cloud Code のステータスバーで、アクティブなプロジェクト名をクリックします。表示されたクイック選択メニューで、[New Application] を選択します。
- [Create New Application] ダイアログで、[Cloud Functions application] を選択します。
- テンプレートを選択するように求められたら、[Java: Hello World] を選択します。
- プロジェクト パスに、プロジェクト名として「
Gemini-BQ-Function
」と入力します。プロジェクト構造が Cloud Shell エディタの新しいビューに表示されます。
- 必要な依存関係を
<dependencies>... </dependencies>
タグ内に追加するか、サンプルの pom.xml ファイルから依存関係をコピーします。 - クラスの名前を「
HelloWorld.java
」からわかりやすい名前に変更します。たとえば、GeminiBigQueryFunction.java
とします。パッケージ名を適宜変更します。 - GeminiBigQueryFunction.Java ファイル内のプレースホルダ コードを、GitHub リポジトリにあるサンプルコードに置き換えます。変数 <YOUR_PROJECT_ID>サンプルコードのプロジェクト ID に置き換えます。
- Cloud Shell ターミナルに移動します。プロジェクト ディレクトリ内にいることを確認します。表示されていない場合は、次のコマンドを実行してプロジェクト ディレクトリに移動します。
cd Gemini-BQ-Function
- 次のステートメントを実行して、Cloud Functions の関数をビルドしてデプロイします。
gcloud functions deploy gemini-bq-fn --gen2 --runtime java17 --trigger-http --entry-point cloudcode.helloworld.GeminiBigQueryFunction --allow-unauthenticated --source .
コマンドのエントリ ポイントは、関数のエントリ ポイントに置き換えます。出力は、次の形式の REST URL です。
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-bq-fn
- ターミナルから次のコマンドを実行して、この Cloud Functions の関数をテストします。
gcloud functions call gemini-bq-fn --region=us-central1 --gen2 --data '{"calls":[["https://storage.googleapis.com/img_public_test/image_validator/baseline/1.JPG", "https://storage.googleapis.com/img_public_test/image_validator/test/2.JPG", "PROMPT_ABOUT_THE_IMAGES_TO_GEMINI"]]}'
ランダムなサンプル プロンプトに対するレスポンス:
問題ないようです。Gemini Pro Vision モデル用の一般的な Cloud Functions の関数を実装できるようになりました。BigQuery リモート関数内から BigQuery データに対して、このエンドポイントを直接使用しましょう。
ステップ 2: BigQuery オブジェクト テーブルとリモート関数を作成する
要件
演習のこのパートでは、Cloud Storage バケットが必要です。Cloud Storage バケットを作成する手順は次のとおりです。
- バケットを作成するには、Cloud Storage コンソールに移動して [作成] をクリックします。
- バケット名として「
demo-bq-gemini-public-image
」と入力し、[作成] をクリックします。 Enforce public access prevention on this bucket
オプションのチェックボックスをオフにします。この演習では公開アクセス用にこのバケットを作成しますが、企業のユースケースでは、公開アクセスを防止し、特定のサービス アカウントに権限を付与することをおすすめします。- バケットが作成されたら、[権限] タブに移動して権限を表示および変更します。
- プリンシパルを追加するには、[アクセス権を付与] をクリックします。サービス アカウント ID を指定して特定のアカウントに権限を付与するか、
allUsers
を指定してバケットへの公開アクセス権を付与します。 Storage Object Viewer
ロールを選択し、[保存] をクリックします。プロンプトが表示されたら、公開アクセスを許可することを選択します。- [オブジェクト] タブに移動し、ベースライン画像とテスト画像をアップロードして比較します。この Codelab では、一般公開されているオブジェクト(baseline.JPG、TEST1.JPG、TEST2.JPG)をアップロードできます。
BigQuery オブジェクト テーブルを作成する
BigQuery から、前に作成した接続とデータセットを使用してバケット内の非構造化データにアクセスするための外部オブジェクト テーブルを作成します。これを行うには、BigQuery のクエリエディタペインから次の DDL(データ定義言語)ステートメントを実行します。
CREATE OR REPLACE EXTERNAL TABLE `gemini_bq_fn.image_validation`
WITH CONNECTION `us.gemini-bq-conn`
OPTIONS(object_metadata="SIMPLE", uris=["gs://demo-bq-gemini-public-image/*.JPG"]);
データセット内に image_validation という新しいオブジェクト テーブルが作成されたことを確認します。
BigQuery リモート関数を作成する
BigQuery で、Gemini Pro Vision モデルを実装する Java Cloud Functions の関数を呼び出すリモート関数を作成します。同じデータセット内に作成します。これを行うには、BigQuery コンソールの SQL エディタペインから次の DDL を実行します。
CREATE OR REPLACE FUNCTION `gemini_bq_fn.FN_IMAGE_VALIDATE` (baseline STRING, test STRING, prompt STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (
endpoint = 'https://us-central1-<your project id>.cloudfunctions.net/gemini-bq-fn',
max_batching_rows = 1
);
エンドポイント URL は、この演習で前に返された REST URL です。これにより、BigQuery にリモート関数が作成されます。上記の DDL には 3 つのパラメータがあります。最初の 2 つのパラメータは、前のステップで作成したオブジェクト テーブルに保存されている画像の URL です。最後のパラメータは、モデル(Gemini Pro Vision)へのプロンプトです。このシグネチャの解析に使用される Java Cloud Functions コードを参照できます。
Gson().fromJson(request.getReader(), JsonObject.class);
JsonArray calls_array = requestJson.getAsJsonArray("calls");
JsonArray calls = (JsonArray) calls_array.get(0);
String baseline_url = calls.get(0).toString().replace("\"", "");
String test_url = calls.get(1).toString().replace("\"", "");
String prompt_string = calls.get(2).toString();
BigQuery から Gemini を呼び出す
SELECT
クエリでリモート関数を使用して、プロンプトに対して画像を検証する関数をテストします。
select gemini_bq_fn.FN_IMAGE_VALIDATE(
'https://storage.googleapis.com/demo-bq-gemini-public-image/Baseline.JPG',
REPLACE(uri, 'gs://', 'https://storage.googleapis.com/') ,
'You are an expert image validator who can respond with JSON result. Find 2 images here. The first one is the reference image. The second image is the test image. Compare the second image to see if the second image is similar to the first in terms of the text present in the image. Respond ONLY in JSON Format with 3 attributes namely SIMILARITY which is a \"YES\" or \"NO\", SIMILARITY_SCORE which is a percentage and DIFFERENCE_COMMENT which is a string.' ) as IMAGE_VALIDATION_RESULT
from `gemini_bq_fn.image_validation`
where uri like '%TEST1%';
TEST1 と TEST2 のオブジェクト ファイルを使用して上記のクエリを試します。次のような結果が表示されます。
次の画像を参考にしてください。
ベースライン画像
テスト画像
どちらの画像も、Duet AI の Cloud コンソール ビューがあるという点で類似していますが、モデルによって JSON 形式で取得されたテキストが異なります。
これで、リモート関数の実装を正常にテストできました。
7. メリットとユースケース
それでは、BigQuery と Gemini を統合して構造化データと非構造化データの分析を行うメリットを見ていきましょう。
- 生成 AI をデータに活用: データの移動、重複、複雑さの増大はもうありません。同じ BigQuery 環境内でデータを分析し、インサイトを生成できます。
- 分析の強化: Gemini の自然言語による説明によって、データへの新しい理解が加わり、SQL クエリを使用してこれを実現できます。
- スケーラビリティ: このソリューションは、大規模なデータセットや複雑な分析を簡単に、ローコードの作業で処理します。
そのための用途はさまざまです。金融(市場トレンド分析)、小売(顧客センチメント)、ヘルスケア(医療報告書の要約)などのシナリオについて考えてみましょう。分析チームとビジネスチームが比較的少ない労力、リソース、使い慣れた言語とツールでこれらを実装できます。
8. クリーンアップ
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
- プロジェクトを残しておく場合は、上記の手順をスキップして、Cloud Functions に移動して Cloud Functions の関数を削除します。関数のリストで、削除する関数をオンにして [削除] をクリックします。
9. 完了
これで操作は完了です。Gemini モデルを BigQuery に統合すれば、データを分析するだけでなく、データ ストーリーテラーとして活躍できます。データセット内に隠されたストーリーを生成し、インサイトの理解方法を変革できます。テストを開始するこの手法を独自のデータセットに適用し、データから読み取れるストーリーを見つけます。BigQuery ではオブジェクト テーブル(外部テーブル)の非構造化データがサポートされているため、Gemini Pro Vision を使用して画像データに関する生成的な分析情報を作成してみてください。詳細なガイダンスについては、Vertex AI、BigQuery リモート関数、Cloud Functions のドキュメントをご覧ください。以下に、このプロジェクトの GitHub リポジトリを示します。この学習内容を活かして、あなたが開発した機能をお聞かせください。