インプレース LLM の分析情報: 構造化データおよび非構造化データ分析のための BigQuery および Gemini

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: リモート関数の実装

作成するアプリの概要

  • リモートモデルの呼び出し方法では、BigQuery の ML.GENERATE_TEXT 構造で Gemini 1.0 Pro のリモートモデルを呼び出して、インターネット アーカイブの書籍データセット(BigQuery で一般公開されている)のロケーション サマライザーを構築します。

リモートモデルの呼び出しのフロー図

  • リモート関数実装メソッドでは、ベースライン イメージに対してテストイメージを検証するためのイメージ バリデータを作成します。これを行うには、テスト画像のスクリーンショットを含むデータセットを外部テーブルに作成し、Gemini 1.0 Pro Vision にベースライン画像に対して検証するようリクエストします。次に、Gemini Pro Vision 呼び出しを実装する Java Cloud 関数を作成し、BigQuery でリモート関数として呼び出します。

リモート関数の実装のフロー図

注:

BigQuery のリモートモデルとして使用できる Vertex AI 生成 AI モデルが他にもある可能性があります。つまり、BigQuery の ML.GENERATE_TEXT 構造を使用して、これらのモデルにすぐにアクセスできます。ただし、リモートモデルが利用可能な場合でも、Cloud Functions を使用してユースケースの高度なカスタマイズを構築し、BigQuery からリモート関数としてこれらのモデルにアクセスすることもできます。

BigQuery を選択する理由

BigQuery は、運用上のオーバーヘッドを最小限に抑えながらバイトからペタバイトまでスケーリングできるサーバーレスのマルチクラウド データ ウェアハウスです。そのため、ML トレーニング データの保存に最適です。組み込みの BigQuery ML(BQML)と分析機能を使用すると、SQL クエリのみを使用してコードなしで予測を作成できます。また、連携クエリを使用して外部ソースからデータにアクセスできるため、複雑な ETL パイプラインが不要になります。

BigQuery は、ユーザーが構造化データ、半構造化データ、非構造化データを分析するのに役立つ、フルマネージドのクラウド データ ウェアハウスです。

2. 必要なもの

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

3. 始める前に

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。

[Cloud Shell をアクティブにする] ボタンの画像

  1. Cloud Shell に接続したら、次のコマンドを使用して、すでに認証済みであることと、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
  1. Gemini for Google Cloud Marketplace にアクセスして API を有効にします。Cloud Shell ターミナルで次のコマンドを使用することもできます。
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. 次の API が有効になっていることを確認します。
  • BigQuery
  • BigQuery Connection
  • Cloud Functions の関数
  • Cloud Run
  • Vertex AI
  • Cloud Build
  • Cloud Storage API

gcloud コマンドを使用する代わりに、こちらのリンクからコンソールにアクセスすることもできます。

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

4. BigQuery データセットと外部接続を作成する

まず、データセットと Cloud リソース接続を作成します。

BigQuery のデータセットは、アプリケーションのすべてのテーブルとオブジェクトのコンテナです。

データセットを作成する手順は次のとおりです。

  1. Google Cloud コンソールの BigQuery ページに移動します。
  2. [エクスプローラ] パネルで、データセットを作成するプロジェクトを選択します。
  3. [アクション] オプション(縦の省略記号アイコン)を開き、[データセットを作成] をクリックします。

[アクション] メニューと [データセットを作成] オプションの画像

  1. [データセットを作成] をクリックします。
  2. [データセット ID] フィールドに「gemini_bq_fn」と入力します。
  3. ロケーション タイプを Multi-region に設定し、デフォルト値(US(multiple regions in United States.)を受け入れます。
  4. [データセットを作成] をクリックします。
  5. データセットが作成され、[エクスプローラ] ペインのプロジェクト ID の下に表示されていることを確認します。

Cloud Functions の関数とやり取りするには、BigQuery 接続が必要です。リモート関数を作成するには、BigQuery 接続を作成する必要があります。この Codelab では、BigLake 接続を使用して、Cloud Functions 経由で BigQuery からモデルにアクセスします。BigLake 接続を使用すると、きめ細かい BigQuery アクセス制御とセキュリティを維持しながら、外部データソース(この場合は Vertex AI Gemini Pro API)に接続できます。

BigLake 接続を作成する手順は次のとおりです。

  1. BigQuery ページの [エクスプローラ] ペインで [追加] をクリックします。

BigQuery コンソールで、外部接続を追加するための [追加] ボタンがハイライト表示されている

  1. [外部データソースへの接続] をクリックします。
  2. [接続タイプ] メニューから、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。
  3. [接続 ID] フィールドに、接続名として「gemini-bq-conn」と入力します。
  4. ロケーション タイプを Multi-region に設定し、デフォルト値(US(multiple regions in United States.)を受け入れます。
  5. [接続を作成] をクリックします。
  6. [接続に移動] をクリックし、[接続情報] ペインでサービス アカウント ID をコピーします。

接続情報のスクリーンショット

  1. [IAM と管理] ページに移動し、[アクセス権を付与] をクリックします。
  2. サービス アカウントの ID を [新しいプリンシパル] フィールドに貼り付けます。
  3. ロールリストから Vertex AI user ロールを選択し、[保存] をクリックします。

サービス アカウントへのアクセス権の付与のスクリーンショット

これで、データセットと BigQuery 接続が正常に作成されました。次に、リモートモデルの呼び出しに必要な手順を完了します。

5. ユースケース 1 リモートモデルの呼び出し: リモートモデルの呼び出しを設定する

データセットと接続を作成したので、Vertex AI Gemini Pro 基盤モデルに基づいて BigQuery でモデルを作成しましょう。この演習を完了すると、SQL クエリのみを使用して LLM アプリケーションを稼働させることができます。

ステップ 1: リモートモデルの入力データを含む BigQuery テーブルを作成する

BigQuery が一般公開用に提供している Internet Archive Books データセットのテーブル bigquery-public-data.gdelt_internetarchivebooks.1905 から約 50 件のレコードを保持できる books という名前のテーブルをデータセットに作成します。

これを行うには、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));

次のような結果が表示されます。

BigQuery での ML.GENERATE_TEXT クエリ結果

おめでとうございます!リモートモデル(gemini-pro モデルに基づく)と ML.GENERATE_TEXT 関数を使用して、BigQuery テーブルのテキストデータを分析する方法を説明しました。

次に、BigQuery リモート関数を使用して別の Vertex AI モデルを試してみましょう。たとえば、BigQuery でモデルをリモートで使用する方法に、より多くのカスタマイズと柔軟性を追加したいとします。サポートされているモデルは、BigQuery のドキュメントに記載されています。

6. ユースケース #2 リモート関数の実装: リモート関数の実装を設定する

この演習では、Gemini 1.0 Pro Vision の基盤モデルを実装する Java Cloud Functions に基づいて、BigQuery で関数を作成します。まず、Gemini 1.0 Pro Vision モデルを使用して画像を比較する Java Cloud Functions を作成してデプロイします。次に、デプロイされた Cloud Functions を呼び出すリモート関数を BigQuery に作成します。BigQuery でリモート関数を実行する場合も、同じ手順で操作できます。

では、始めましょう。

ステップ 1: Java Cloud Functions を作成する

テストイメージをベースライン イメージに対して検証するための Java の第 2 世代 Cloud Functions を構築します。ベースライン画像は、BigQuery の外部テーブルにあるテスト画像のスクリーンショットを含むデータセットに保存されます。Gemini Pro Vision モデル(Java SDK)を使用して画像を検証します。次に、Java Cloud Functions を REST エンドポイントにデプロイします。

手順は次のとおりです。

  1. Cloud Shell エディタを起動する
  2. 以前のエディタを使用している場合は、[新しいエディタを試す] をクリックします。
  3. ステータスバーで [Cloud Code] - [ログイン] をクリックします。
  4. Cloud Shell エディタに Google Cloud API の呼び出しを認可するよう求められたら、[承認] をクリックします。画面の指示に沿って Google アカウントにログインします。これで Google Cloud に接続されました。
  5. Cloud Code のステータスバーにプロジェクトが表示されない場合は、[Cloud Code - Sign In > Select a Google Cloud project] をクリックします。Cloud Functions を作成する Google Cloud プロジェクトを選択します。プロジェクトが読み込まれ、Cloud Shell エディタでアクティブなプロジェクトになります。
  6. Cloud Code のステータスバーで、アクティブなプロジェクト名をクリックします。表示されたクイック選択メニューで、[新しいアプリケーション] を選択します。
  7. [Create New Application] ダイアログで、[Cloud Functions application] を選択します。

[Create New Application] ポップアップ ページ 1

  1. テンプレートの選択を求めるプロンプトが表示されたら、[Java: Hello World] を選択します。

[Create New Application] ポップアップ ページ 2

  1. プロジェクト パスにプロジェクト名として「Gemini-BQ-Function」と入力します。プロジェクト構造が新しい Cloud Shell エディタ ビューに表示されます。

新しい Java Cloud Functions アプリケーション プロジェクトの構造

  1. <dependencies>... </dependencies> タグ内に必要な依存関係を追加するか、サンプル pom.xmlから依存関係をコピーします。
  2. クラスの名前を HelloWorld.java からわかりやすい名前に変更します。GeminiBigQueryFunction.java とします。パッケージ名を適宜変更します。
  3. ファイル GeminiBigQueryFunction.Java のプレースホルダ コードを、GitHub リポジトリで提供されているサンプルコードに置き換えます。サンプルコードでは、変数 <YOUR_PROJECT_ID> を実際のプロジェクト ID に置き換えてください。
  4. Cloud Shell ターミナルに移動します。プロジェクト ディレクトリにいることを確認します。そうでない場合は、次のコマンドを実行してプロジェクト ディレクトリに移動します。
cd Gemini-BQ-Function
  1. 次のステートメントを実行して、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
  1. 次のコマンドをターミナルから実行して、この 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"]]}'

ランダム サンプル プロンプトのレスポンス:

Cloud Functions からの JSON レスポンス文字列

ところ、Gemini Pro Vision モデル実装用の汎用 Cloud Functions が準備できました。このエンドポイントを BigQuery リモート関数内から BigQuery データで直接使用してみましょう。

ステップ 2: BigQuery オブジェクト テーブルとリモート関数を作成する

要件

この演習では、Cloud Storage バケットが必要です。Cloud Storage バケットを作成する手順は次のとおりです。

  1. バケットを作成するには、Cloud Storage のコンソールに移動して、[作成] をクリックします。
  2. バケット名として「demo-bq-gemini-public-image」と入力し、[作成] をクリックします。
  3. Enforce public access prevention on this bucket オプションをオフにします。この演習では公開アクセス用にバケットを作成しますが、エンタープライズ ユースケースでは、公開アクセスを禁止し、必要に応じて特定のサービス アカウントに権限を付与することをおすすめします。
  4. バケットの作成後、[権限] タブに移動して、権限を表示および変更します。
  5. プリンシパルを追加するには、[アクセス権を付与] をクリックします。サービス アカウント ID を指定して特定のアカウントに権限を付与するか、allUsers を指定してバケットへの一般公開アクセスを許可します。
  6. Storage Object Viewer ロールを選択し、[保存] をクリックします。プロンプトが表示されたら、公開アクセスを許可します。
  7. [オブジェクト] タブに移動し、比較するベースライン画像とテスト画像をアップロードします。この Codelab では、一般公開されている次のオブジェクト(baseline.JPGTEST1.JPGTEST2.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 オブジェクト ファイルで試してください。次のような結果が表示されます。

BigQuery リモート関数の結果のスクリーンショット

参考までに、画像を以下に示します。

ベースライン画像

テストケースのベースライン参照画像

テスト画像

テストケースのテスト画像 1

どちらの画像も Duet AI クラウド コンソール ビューであるという点で似ていますが、両方のテキストは JSON 形式のモデルによって異なることに注意してください。

これで、リモート関数の実装を正常にテストできました。

7. メリットとユースケース

構造化データと非構造化データの分析に BigQuery と Gemini を統合するメリットを見てみましょう。

  • データに生成 AI を導入する: データの移動、重複、複雑さの増大を回避できます。同じ BigQuery 環境内でデータを分析し、分析情報を生成できます。
  • 分析の強化: Gemini の自然言語による説明により、データに新たな理解のレイヤが追加されます。これは SQL クエリを使用して実現できます。
  • スケーラビリティ: このソリューションは、大規模なデータセットと複雑な分析を簡単に処理でき、ローコードで実現できます。

この技術の応用範囲は多岐にわたります。金融(市場動向分析)、小売(顧客感情)、医療(医療レポートの要約)などのシナリオを検討します。これらのシナリオでは、分析チームとビジネスチームが比較的少ない労力とリソースで、使い慣れた言語とツールを使用して実装できます。

8. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. プロジェクトを保持する場合は、上記の手順をスキップして、Cloud Functions に移動し、関数のリストから削除する関数をオンにして [削除] をクリックして、Cloud Functions を削除します。

9. 完了

これで操作は完了です。Gemini モデルが BigQuery に統合されたことで、データ分析だけでなく、データ ストーリーテラーとしての役割も担うことができます。データセット内の隠れたナラティブを生成し、分析情報の理解方法を変えることができます。試験運用版を始めましょう。この手法を独自のデータセットに適用して、データ内のストーリーを見つけてください。BigQuery がオブジェクト テーブル(外部テーブル)で非構造化データをサポートしているため、Gemini Pro Vision を使用して画像データの生成型分析情報を作成してみてください。詳細なガイダンスについては、Vertex AIBigQuery リモート関数Cloud Functions のドキュメントをご覧ください。このプロジェクトの github リポジトリはこちらです。この学習で構築したものをぜひお知らせください。