インプレース 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 Functions の関数を作成し、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 を使用します。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(クラウド リソース)] を選択します。
  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 テーブルを作成する

データセットに 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));

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

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 で関数を作成します。まず、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 エンドポイントにデプロイします。

以下の手順に沿って登録してください。

  1. Cloud Shell エディタを起動する
  2. 以前のエディタを使用している場合は、[新しいエディタを試す] をクリックします。
  3. ステータスバーで、[Cloud Code - Sign In] をクリックします。
  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 のステータスバーで、アクティブなプロジェクト名をクリックします。表示されたクイック選択メニューで、[New Application] を選択します。
  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%';  

TEST1TEST2 のオブジェクト ファイルを使用して上記のクエリを試します。次のような結果が表示されます。

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

次の画像を参考にしてください。

ベースライン画像

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

テスト画像

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

どちらの画像も、Duet AI の Cloud コンソール ビューがあるという点で類似していますが、モデルによって 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 リポジトリを示します。この学習内容を活かして、あなたが作成したものについてお知らせください。