リモートモデルを使用して BigQuery で映画のポスターを分析する

リモートモデルを使用して BigQuery で映画のポスターを分析する

この Codelab について

subject最終更新: 3月 10, 2025
account_circle作成者: Alicia Williams

1. はじめに

このラボでは、リモートモデル(Gemini モデル)を使用した推論のための BigQuery ML の使い方を学びます。そして、BigQuery データ ウェアハウスで直接映画のポスター画像を分析し、ポスターに基づいて映画の要約を生成します。

3e75cd7cdc8ffcf6.jpeg

上記の画像: 分析する映画ポスター画像のサンプル。

BigQuery は、データから最大限の価値を引き出すのに役立つフルマネージドの AI 対応データ分析プラットフォームであり、マルチエンジン、マルチフォーマット、マルチクラウド向けに設計されています。BigQuery の主な機能の一つが推論のための BigQuery ML です。この機能では、GoogleSQL クエリを使用して ML モデルを作成および実行できます。

Gemini は、Google が開発した生成 AI モデルのファミリーであり、マルチモーダル ユースケース用に設計されています。

GoogleSQL クエリを使用した ML モデルの実行

通常、大規模なデータセットで ML または AI を実行するには、大量のプログラミング作業と ML フレームワークに関する知識が必要になります。このため、ソリューション開発は各企業内の少数の専門家グループに限られ、BigQuery ML による推論では、SQL 実務担当者が既存の SQL ツールやスキルを使用してモデルを構築し、LLM と Cloud AI API から結果を生成できます。

前提条件

学習内容

  • API を使用するように環境とアカウントを構成する方法
  • BigQuery で Cloud リソース接続を作成する方法
  • BigQuery で映画のポスター画像用のデータセットとオブジェクト テーブルを作成する方法
  • BigQuery で Gemini リモートモデルを作成する方法
  • 各ポスターの映画の要約を作成するよう Gemini モデルにプロンプトで指示する方法
  • 各ポスターの映画のテキスト エンベディングを生成する方法
  • BigQuery の VECTOR_SEARCH を使用して、映画のポスター画像をデータセット内の関連性の高い映画と照合する方法

必要なもの

  • 課金が有効になっている Google Cloud アカウントと Google Cloud プロジェクト
  • ウェブブラウザ(Chrome など)

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. はじめに

BigQuery で Gemini モデルを使用するには、API の有効化、Cloud リソース接続の作成、Cloud リソース接続のサービス アカウントへの特定の権限の付与など、いくつかの設定手順があります。これらの手順はプロジェクトごとに 1 回だけ行います。以降のセクションで説明します。

API を有効にする

Cloud Shell で、プロジェクト ID が設定されていることを確認します。

gcloud config set project [YOUR-PROJECT-ID]

環境変数 PROJECT_ID を設定します。

PROJECT_ID=$(gcloud config get-value project)

Vertex AI モデルに使用するデフォルトのリージョンを構成します。Vertex AI で利用可能なロケーションの詳細を確認する。この例では、us-central1 リージョンを使用しています。

gcloud config set compute/region us-central1

環境変数 REGION を設定します。

REGION=$(gcloud config get-value compute/region)

必要なサービスをすべて有効にします。

gcloud services enable bigqueryconnection.googleapis.com \
                       aiplatform
.googleapis.com

上記のコマンドをすべて実行した後の想定される出力は次のとおりです。

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable bigqueryconnection.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. Cloud リソース接続を作成する

このタスクでは、Cloud リソース接続を作成します。これにより、BigQuery は Cloud Storage 内の画像ファイルにアクセスし、Vertex AI を呼び出すことができます。

  1. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー アイコン)で、[BigQuery] をクリックします。

68ddff3628a55957.png

  1. 接続を作成するには、[+ 追加] をクリックし、[外部データソースへの接続] をクリックします。

8b70fdd209f540b6.png

  1. [接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。
  2. [接続 ID] フィールドに接続の名前「gemini_conn」を入力します。
  3. [ロケーション タイプ] で [マルチリージョン] を選択し、プルダウンから、[米国] マルチリージョンを選択します。
  4. 他の設定はデフォルトのままにします。

deb25a1dd65ee9dd.png

  1. [接続を作成] をクリックします。
  2. [接続へ移動] をクリックします。
  3. [接続情報] ペインで、サービス アカウント ID をテキスト ファイルにコピーして、次のタスクで使用できるようにします。また、BigQuery Explorer で、プロジェクトの [外部接続] セクションに接続が追加されていることも確認できます。

5. 接続のサービス アカウントに IAM 権限を付与する

このタスクでは、ロールを通じて Cloud リソース接続のサービス アカウントに IAM 権限を付与し、Vertex AI サービスにアクセスできるようにします。

  1. Google Cloud コンソールのナビゲーション メニューで、[IAM と管理] をクリックします。
  2. [アクセス権を付与] をクリックします。
  3. [新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
  4. [ロールを選択] フィールドで、[Vertex AI]、[Vertex AI ユーザー] ロールの順に選択します。

55ed0ac6cd92aa1e.png

  1. [保存] をクリックします。これにより、サービス アカウント ID に Vertex AI ユーザーロールが含まれるようになります。

6. BigQuery で映画のポスター画像用のデータセットとオブジェクト テーブルを作成する

このタスクでは、プロジェクトのデータセットを作成し、そのデータセット内にポスター画像を格納するためのオブジェクト テーブルを作成します。

このチュートリアルで使用する映画ポスター画像のデータセットは、一般公開の Google Cloud Storage バケット gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters に保存されています。

データセットを作成する

このチュートリアルで使用するテーブルやモデルなどのデータベース オブジェクトを格納するためのデータセットを作成します。

  1. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー アイコン)で、[BigQuery] を選択します。
  2. [エクスプローラ] パネルで、プロジェクト名の横にある [アクションを表示](その他メニュー アイコン)を選択し、[データセットを作成] を選択します。
  3. [データセットを作成] ペインに以下の情報を入力します。
  • データセット ID: gemini_demo
  • ロケーション タイプ: [マルチリージョン] を選択します。
  • マルチリージョン: [US] を選択します。
  1. その他の項目はデフォルトのままにします。

9a787006017d5b47.png

  1. [データセットを作成] をクリックします。

これにより、gemini_demo データセットが作成され、BigQuery エクスプローラのプロジェクトの下に表示されます。

オブジェクト テーブルを作成する

BigQuery は構造化データだけでなく、オブジェクト テーブルを介して非構造化データ(ポスター画像など)にもアクセスできます。

オブジェクト テーブルは、Cloud Storage バケットを参照して作成します。作成されたオブジェクト テーブルには、バケット内のオブジェクトごとに、ストレージ パスとメタデータを含む行が含まれます。

オブジェクト テーブルを作成するには、SQL クエリを使用します。

  1. [+] をクリックして、新しい SQL クエリを作成します。
  2. クエリエディタで、以下のクエリを貼り付けます。
CREATE OR REPLACE EXTERNAL TABLE
  `gemini_demo.movie_posters`
WITH CONNECTION `us.gemini_conn`
OPTIONS (
  object_metadata = 'SIMPLE',
  uris = ['gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters/*']
  );
  1. クエリを実行します。これにより、movie_posters オブジェクト テーブルが gemini_demo データセットに追加され、各映画ポスター画像の URI(Cloud Storage 内)が読み込まれます。
  2. エクスプローラで movie_posters をクリックし、スキーマと詳細を確認します。自由にテーブルをクエリしてレコードを確認してみてください。

7. BigQuery で Gemini リモートモデルを作成する

オブジェクト テーブルが作成されたので、そのテーブルを使った作業を始めましょう。このタスクでは、Gemini 1.5 Flash のリモートモデルを作成し、BigQuery で使用できるようにします。

Gemini 1.5 Flash リモートモデルを作成する

  1. [+] をクリックして、新しい SQL クエリを作成します。
  2. クエリエディタで、以下のクエリを貼り付けて実行します。
CREATE OR REPLACE MODEL `gemini_demo.gemini_1_5_flash`
REMOTE WITH CONNECTION
`us.gemini_conn`
OPTIONS
(endpoint = 'gemini-1.5-flash')

これにより、gemini_1_5_flash モデルが作成され、モデル セクションの gemini_demo データセットに追加されます。

  1. エクスプローラで gemini_1_5_flash モデルをクリックし、詳細を確認します。

8. 各ポスターの映画の要約を作成するよう Gemini モデルにプロンプトで指示する

このタスクでは、作成したばかりの Gemini リモートモデルを使用して映画のポスター画像を分析し、各映画の要約を生成します。

モデルにリクエストを送信するには、ML.GENERATE_TEXT 関数を使用して、パラメータでモデルを参照します。

Gemini 1.5 Flash モデルを使用して画像を分析する

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE TABLE
`gemini_demo.movie_posters_results` AS (
SELECT
    uri,
    ml_generate_text_llm_result
FROM
    ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
    TABLE `gemini_demo.movie_posters`,
    STRUCT( 0.2 AS temperature,
        'For the movie represented by this poster, what is the movie title and year of release? Answer in JSON format with two keys: title, year. title should be string, year should be integer. Do not use JSON decorators.' AS PROMPT,
        TRUE AS FLATTEN_JSON_OUTPUT)));

クエリが実行されると、BigQuery はオブジェクト テーブルの各行について Gemini モデルにプロンプトを送信し、画像と指定された静的プロンプトを組み合わせます。これにより、movie_posters_results テーブルが作成されます。

  1. 結果を見てみましょう。次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
SELECT * FROM `gemini_demo.movie_posters_results`

これにより、各映画ポスターの行が URI(映画ポスター画像の Cloud Storage 内の場所)と JSON の結果(Gemini 1.5 Flash モデルから取得された映画タイトルと公開年を含む)とともに表示されます。

次のクエリを使用すると、これらの結果を人が読みやすい形式で取得できます。このクエリでは、SQL を使用して、これらのレスポンスから映画のタイトルと公開年を新しい列に抽出します。

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE TABLE
 
`gemini_demo.movie_posters_results_formatted` AS (
  SELECT
    uri
,
    JSON_VALUE
(ml_generate_text_llm_result, "$.title") AS title,
    JSON_VALUE
(ml_generate_text_llm_result, "$.year") AS year
  FROM
   
`gemini_demo.movie_posters_results` results )

これにより、movie_posters_result_formatted テーブルが作成されます。

  1. 以下のクエリを使用してテーブルをクエリすると、作成された行を確認できます。
SELECT * FROM `gemini_demo.movie_posters_results_formatted`

URI 列の結果は変わりませんが、JSON が各行の title 列と year 列に変換されます。

映画の要約を作成するよう Gemini 1.5 Flash モデルにプロンプトで指示する

これらの映画の詳細(各映画のテキスト サマリーなど)が必要な場合はどうすればよいですか?このコンテンツ生成のユースケースは、Gemini 1.5 Flash モデルなどの LLM モデルに最適です。

  1. 次のクエリを実行することで、Gemini 1.5 Flash を使用して各ポスターの映画の要約を作成できます。
SELECT
  uri,
  title,
  year,
  prompt,
  ml_generate_text_llm_result
  FROM
 ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
   (
   SELECT
     CONCAT('Provide a short summary of movie titled ',title, ' from the year ',year,'.') AS prompt,
     uri,
     title,
     year
   FROM
     `gemini_demo.movie_posters_results_formatted`
   LIMIT
     20 ),
   STRUCT(0.2 AS temperature,
     TRUE AS FLATTEN_JSON_OUTPUT));    

結果の ml_generate_text_llm_result フィールドに、映画の簡単な概要が含まれています。

9. リモートモデルを使用してテキスト エンベディングを生成する

これで、作成した構造化データをウェアハウス内の他の構造化データと結合できます。BigQuery で利用可能な IMDB 一般公開データセットには、視聴者による評価や、自由形式のユーザー レビューのサンプルなど、映画に関する豊富な情報が含まれています。このデータは、映画ポスターの分析を深め、映画の受け止め方を把握するのに役立ちます。

データを結合するには、キーが必要です。この場合、Gemini モデルによって生成された映画のタイトルが、IMDB データセットのタイトルと完全に一致しないことがあります。

このタスクでは、両方のデータセットから映画のタイトルと公開年のテキスト エンベディングを生成し、これらのエンベディング間の距離を使用して、最も近い IMDb タイトルを新しく作成したデータセットの映画ポスターのタイトルと結合します。

リモートモデルを作成する

テキスト エンベディングを生成するには、text-multilingual-embedding-002 エンドポイントを参照する新しいリモートモデルを作成する必要があります。

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE MODEL `gemini_demo.text_embedding`
REMOTE WITH CONNECTION
`us.gemini_conn`
OPTIONS
(endpoint = 'text-multilingual-embedding-002')

これにより、text_embedding モデルが作成され、エクスプローラの gemini_demo データセットの下に表示されます。

ポスターに対応するタイトルと年のテキスト エンベディングを生成する

このリモートモデルと ML.GENERATE_EMBEDDING 関数を使用して、映画ポスターのタイトルと年ごとにエンベディングを作成します。

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE TABLE
 
`gemini_demo.movie_posters_results_embeddings` AS (
  SELECT
   
*
  FROM
    ML
.GENERATE_EMBEDDING(
    MODEL
`gemini_demo.text_embedding`,
   
(
    SELECT
      CONCAT
('The movie titled ', title, ' from the year ', year,'.') AS content,
      title
,
      year
,
      uri
    FROM
     
`gemini_demo.movie_posters_results_formatted` ),
    STRUCT
(TRUE AS flatten_json_output)));

その結果、gemini_demo.movie_posters_results_formatted テーブルの各行に連結されたテキスト コンテンツのエンベディングを含む movie_poster_results_embeddings テーブルが作成されます。

  1. 次の新しいクエリを使用して、クエリの結果を表示できます。
SELECT * FROM `gemini_demo.movie_posters_results_embeddings`

これにより、モデルによって生成された各映画のエンベディング(数字で表されたベクトル)が表示されます。

IMDb データセットのサブセットのテキスト エンベディングを生成する

公開されている IMDB データセットから、1935 年より前に公開された映画のみを含む新しいビューを作成します(ポスター画像から映画の既知の期間)。

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE VIEW
  `gemini_demo.imdb_movies` AS (
  WITH
    reviews AS (
      SELECT
        reviews.movie_id AS movie_id,
        title.primary_title AS title,
        title.start_year AS year,
        reviews.review AS review
      FROM
        `bigquery-public-data.imdb.reviews` reviews
      LEFT JOIN
        `bigquery-public-data.imdb.title_basics` title
      ON
        reviews.movie_id = title.tconst)
  SELECT
    DISTINCT(movie_id),
    title,
    year
  FROM
    reviews
  WHERE
    year < 1935)

これにより、データセット内の 1935 年より前に公開されたすべての映画について、bigquery-public-data.imdb.reviews テーブルから ID、タイトル、公開年が取得され、そのリストを含む新しいビューが作成されます。

  1. 前のセクションと同様のプロセスを使用して、IMDB の映画のサブセットのエンベディングを作成します。次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
CREATE OR REPLACE TABLE
 
`gemini_demo.imdb_movies_embeddings` AS (
  SELECT
   
*
  FROM
    ML
.GENERATE_EMBEDDING( MODEL `gemini_demo.text_embedding`,
     
(
      SELECT
        CONCAT
('The movie titled ', title, ' from the year ', year,'.') AS content,
        title
,
        year
,
        movie_id
      FROM
       
`gemini_demo.imdb_movies` ),
      STRUCT
(TRUE AS flatten_json_output) )
  WHERE
    ml_generate_embedding_status
= '' );

このクエリの結果は、gemini_demo.imdb_movies テーブルのテキスト コンテンツのエンベディングを含むテーブルです。

これで、VECTOR_SEARCH 関数を使用して 2 つのテーブルを結合できます。

  1. 次の SQL ステートメントを使用して新しいクエリを作成し、実行します。
SELECT
  query.uri AS poster_uri,
  query.title AS poster_title,
  query.year AS poster_year,
  base.title AS imdb_title,
  base.year AS imdb_year,
  base.movie_id AS imdb_movie_id,
  distance
FROM
 VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
   'ml_generate_embedding_result',
   TABLE `gemini_demo.movie_posters_results_embeddings`,
   'ml_generate_embedding_result',
   top_k => 1,
   distance_type => 'COSINE');

このクエリでは、VECTOR_SEARCH 関数を使用して、gemini_demo.movie_posters_results_embeddings テーブルの各行について、gemini_demo.imdb_movies_embeddings テーブル内の最近傍を見つけます。最近傍は、2 つのエンベディングがどの程度類似しているかを示すコサイン距離指標を使用して検出されます。

このクエリを使用すると、映画ポスターで Gemini 1.5 Flash によって識別された各映画をもとに、最も類似する映画を IMDb データセット内で見つけることができます。たとえば、このクエリを使用して、映画『Au Secours!』(映画ポスターの 1 つで Gemini Pro Vision によって識別されたもの)に最も近い映画を IMDb 公開データセット内で見つけることができます。IMDb 公開データセットでは、同映画の英語タイトル『Help!』が使用されています。

  1. 新しいクエリを作成して実行し、IMDb 公開データセットで提供されている映画の評価に関する追加情報を結合します。
SELECT
  query.uri AS poster_uri,
  query.title AS poster_title,
  query.year AS poster_year,
  base.title AS imdb_title,
  base.year AS imdb_year,
  base.movie_id AS imdb_movie_id,
  distance,
  imdb.average_rating,
  imdb.num_votes
FROM
  VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
    'ml_generate_embedding_result',
    TABLE `gemini_demo.movie_posters_results_embeddings`,
    'ml_generate_embedding_result',
    top_k => 1,
    distance_type => 'COSINE') DATA
LEFT JOIN
  `bigquery-public-data.imdb.title_ratings` imdb
ON
  base.movie_id = imdb.tconst
ORDER BY
  imdb.average_rating DESC

このクエリは前のクエリに似ています。ベクトル エンベディングという特別な数値表現を使用して、指定された映画ポスターに類似する映画を見つける点は変わりませんが、IMDb 公開データセットの別のテーブルから、最近傍として検出された各映画の平均評価と投票数を結合しています。

10. 完了

以上で、この Codelab は完了です。BigQuery でポスター画像のオブジェクト テーブルを正常に作成し、リモート Gemini モデルを作成しました。このモデルを使用して、Gemini モデルに画像の分析を促し、映画の概要を提供しました。また、映画のタイトルのテキスト エンベディングを生成し、これらのエンベディングを使用して、映画ポスター画像を IMDB データセット内の関連する映画のタイトルと照合しました。

学習した内容

  • API を使用するように環境とアカウントを構成する方法
  • BigQuery で Cloud リソース接続を作成する方法
  • BigQuery で映画のポスター画像用のデータセットとオブジェクト テーブルを作成する方法
  • BigQuery で Gemini リモートモデルを作成する方法
  • 各ポスターの映画の要約を作成するよう Gemini モデルにプロンプトで指示する方法
  • 各ポスターの映画のテキスト エンベディングを生成する方法
  • BigQuery の VECTOR_SEARCH を使用して、映画のポスター画像をデータセット内の関連性の高い映画と照合する方法

次のステップと詳細情報

11. アンケート

このチュートリアルの利用方法をお選びください。