1. 🏰 Disneyland Data Analytics Hackathon(第 2 回 - 12 月 3 日)🏰
概要 | このハッカソンでは、Google Cloud の AI/ML 機能を利用して、エンドツーエンドのデータ分析パイプラインを構築します。データは、要求の厳しいワークロード向けに最適化された PostgreSQL 互換のフルマネージド データベースである AlloyDB に読み込まれます。次に、サーバーレスの変更データ キャプチャ(CDC)サービスである Datastream を使用して、Google Cloud のサーバーレス データ ウェアハウスである BigQuery に移動します。BigQuery では、BigQuery ML を適用します。これにより、標準 SQL を使用して BigQuery で直接 ML モデルを作成して実行し、レビュー分析と出席予測を行うことができます。最後に、会話型分析とデータ エージェントを使用してすぐに利用できるエージェントを試すか、Agent Development Kit と MCP ツールボックスを使用して、データと自然言語でやり取りするためのカスタム エージェントを作成します。 |
カテゴリ | docType:Codelab、product:Bigquery |
著者 | Rayhane Rezgui、Matt Cornillon |
レイアウト | スクロール |
ロボット | noindex |
2. はじめに
将来のディズニー データ ウィザードの皆様、ようこそ!🪄
退屈な旅行ガイドやフォーラムの延々としたスクロールはもう不要です。データに基づく分析情報を活用して、完璧なディズニーランド旅行を計画することを想像してみてください。どのパークが一番楽しめますか?最も混雑しない時間帯はいつですか?あの長い行列を攻略するのに最適な時間を予測できますか?
このハッカソンでは、究極のディズニーランド計画ツールを作成します。世界中の支店からの訪問者のレビュー、過去の待ち時間、出席者数などのデータがあります。あなたのミッションは?この未加工のデータを実用的な分析情報に変換します。
- データを収集する: さまざまなディズニーランドのレビュー、待ち時間、入場者数を、高性能の PostgreSQL 互換データベースである AlloyDB に読み込みます。
- シームレスな移動: Google Cloud の強力なサーバーレス データ ウェアハウスである BigQuery に、サーバーレスの変更データ キャプチャ サービスである Datastream を使用して、この動的情報を簡単に移動します。
- 魔法を予測する: BigQuery ML を活用して、レビューの感情を分析し、SQL で待ち時間を直接予測します。どの店舗が常に笑顔を提供しているか、最適な来店時間を確認できます。
- データと文字どおり会話する: 杖を振るだけで分析情報を取得できる、事前構築済みのツールを使用します。
- インテリジェントなインタラクション: データベース向け MCP ツールボックスと ADK(Agent Development Kit)を搭載したインテリジェント エージェントで、作品を完成させます。「パリのディズニーランドで宇宙好きにおすすめのアトラクションは?また、待ち行列に並ぶのに最適な時間は?」と質問すると、データに基づいた回答がすぐに返ってきます。
地球上で最も魔法のような場所の秘密を解き明かし、ミッキーが誇りに思うようなデータ分析パイプラインを構築しましょう。


3. タスク 1: 運用から分析へ。Gemini でディズニーランドのレビューを分析する
この初期段階では、AlloyDB 運用データベースからデータを取得し、後続のデータ分析のために BigQuery に読み込みます。
また、将来のエージェントに必要なものを AlloyDB に設定します。
AlloyDB でのデータの読み込み
まず、AlloyDB for PostgreSQL クラスタにデータをインポートしましょう。
ディズニーランドの遊園地の 2 万件のレビューとアトラクションのリストを取り込みます。
必要な手順は次のとおりです。
テーブルの作成:
- 6 つの列(review_id と 評価 は整数、year_month、クチコミ投稿者_location、review_text、ブランチ はテキスト)を含む テーブル disneyland_reviews を作成します。
- 4 つの列(attraction_id(整数)、ブランチ、name、description(テキスト))を含む disneyland_attractions というテーブルを作成します。
選択したツールを使用して、CSV からデータをインポートします。
- レビュー テーブルの
gs://hackathon_data_disneyland_<YOUR_PROJECT_3DIGITS>/reviews.csv - 観光名所テーブルに対する
gs://hackathon_data_disneyland_<YOUR_PROJECT_3DIGITS>/attractions.csv
観光スポットのおすすめを提供するには、観光スポットの説明のエンベディングを作成する必要があります。
- AlloyDB に pgvector 拡張機能をインストールする
- テーブル attraction に「embedding」というベクトル列を追加します。
- AlloyDB と Vertex AI のネイティブ インテグレーションを使用して、説明のエンベディングを生成して入力する
Datastream を使用して運用から分析へ
AlloyDB から BigQuery にデータをストリーミングするには、Google Datastream を使用します。これは、ソーステーブルのすべての変更(変更データ キャプチャを使用)をリッスンして BigQuery に送信する強力なサーバーレス ソリューションです。
Datastream で AlloyDB から変更を複製できるようにするには、Postgres でパブリケーションとレプリケーション スロットを作成する必要があります。
AlloyDB クラスタで次のクエリを実行します(一度に 1 つずつ実行する必要があります)。
CREATE PUBLICATION pub_disney FOR TABLE disneyland_reviews, disneyland_attractions;
ALTER USER postgres WITH REPLICATION;
SELECT PG_CREATE_LOGICAL_REPLICATION_SLOT('slot_disney', 'pgoutput');
パブリケーションとレプリケーション スロットはストリームで使用するため、名前を覚えておいてください。
これでストリームを作成できます。
Datastream で必要な手順は次のとおりです。
- AlloyDB クラスタのソース プロファイルを作成する(パブリック IP アドレスを使用)
- BigQuery の転送先プロファイルを作成する
- AlloyDB から BigQuery へのストリームを作成します。
データは数分以内に BigQuery で利用できるようになります。
BigQuery のデータ検出
BigQuery にデータが取り込まれたので、作業に入る前にインターフェースの新しい機能を確認しましょう。
BigQuery のデータ探索パネルにすでに表示されている 3 つの新しい関数があります。

- 概要: BigQuery の機能、分析を開始するためのツアーなどに関する情報が含まれています。
- 検索: データアセットに対してセマンティック検索を実行します。
- エージェント: 静かに。これは後ほど説明します 🤫
BigQuery でデータをセマンティック検索する
BigQuery エクスプローラ パネルの [検索] タブに移動し、「アトラクション」や「支店」など、ディズニーに関連する用語を試してみます。
BigQuery でデータを可視化する
BigQuery でデータを可視化して操作できるようになりました。このためには、新しいクエリタブでこのクエリを実行します。
SELECT
*
FROM
[dataset_name].[table_name];
レビュー テーブルにデータ分析情報を生成する
このタスクでは、disney データセット内の disneyland_reviews テーブルに対してデータ インサイトを有効にします。
データ分析情報は、複雑な SQL クエリを書かずにデータを探索して分析情報を獲得したい方向けのツールです。
この処理には数分かかることがあります。
SQL を使用せずに disneyland_reviews テーブルをクエリする
前のセクションで生成した分析情報の準備が整いました。このタスクでは、コードを使用せずに、これらの分析情報から生成されたプロンプトを使用して、disneyland_reviews テーブルをクエリします。
分析情報を選択し、分析情報に関連付けられたクエリを実行します。たとえば、各支店の連続する月の平均評価の差を計算するクエリを見つけます。次のようになります。
WITH
monthly_avg AS (
SELECT
branch,
year_month,
AVG(rating) AS avg_rating
FROM
[dataset_name].[table_name]
WHERE
year_month IS NOT NULL
GROUP BY
1,
2 )
SELECT
branch,
year_month,
avg_rating,
avg_rating - LAG(avg_rating, 1, 0) OVER (PARTITION BY branch ORDER BY year_month) AS rating_difference
FROM
monthly_avg
ORDER BY
branch,
year_month;
BigQuery ナレッジ エンジンを使用してデータをより深く理解する
まず、データセット レベルで [分析情報] タブを見てみましょう。これにより、disney データセットのテーブル間の隠れた関係を把握できます。次の手順を行ってください。
- Gemini を使用してデータセットの説明を生成し、データセットの詳細に追加します。
- テーブル reviews と attractions の説明と、それらのテーブル内の個々の列の説明を生成して保存します。
データのプロファイル スキャンを実行する
このセクションの目的は、データをクリーンアップして準備することです。ただし、各列の値の分布についてはあまり詳しくありません。データに対してどのような変換手順を実行する必要があるかを知るには、データのプロファイリングが必要です。
Google Cloud の Dataplex Universal Catalog は、 プロファイリング スキャンを自動化して、一貫性のあるデータ品質指標を提供します。特定された主な統計情報には、null 数、個別の値、データ範囲、値の分布などがあります。BigQuery インターフェースを使用してプロファイル スキャンを有効にできます。
数分かかることがあります。待っている間に次のセクションをご覧ください。
次の質問に回答してください。
- ディズニーランドの平均評価はどのくらいですか?
- レビューアーが最も多いのはどこですか?
- すべてのレビューは一意ですか?
- Year_Month 列の欠損データの割合はどれくらいですか?
データの品質スキャンを実行する
Dataplex Universal Catalog の自動データ品質を使用すると、BigQuery テーブル内のデータの品質を定義して測定できます。データのスキャンを自動化して、定義済みルールに照らしてデータを検証し、データが品質要件を満たしていない場合はアラートを記録できます。データ品質ルールとデプロイメントをコードとして管理することで、データ プロダクション パイプラインの完全性を向上させることができます。
プロファイル スキャンに基づいて、次の条件を満たす品質スキャン(サンプルサイズとしてデータの 10% 以下)を定義します。
- 「branch」列の null 値を確認します
- 「rating」の有効性チェックを行います。この値は 1、2、3、4、5 のいずれかである必要があります。
- 「review_id」の一意性をチェックします
スキャン結果が BigQuery テーブル quality_scan_results にエクスポートされることを確認します。
データに適用する必要がある可能性のあるすべての変換について検討します。
Gemini のデータ準備を使用してデータを準備する
データ品質スキャンとプロファイリング スキャンを実行したら、分析する前にデータをクリーンアップします。
データ準備は BigQuery リソースであり、Gemini in BigQuery を使用してデータを分析し、データのクリーニング、変換、拡充に関するインテリジェントな提案を提供します。手動によるデータ準備タスクに費やす時間と労力を大幅に削減できます。
このセクションでは、データ準備を使用して disneyland_reviews テーブルに対して次のオペレーションを実行します。
- Branch 列が NULL または空の文字列である行を除外します。
- Year_Month の「missing」を Null に置き換えます。
- 読みやすさを向上させるため、ブランチ列のアンダースコアをスペースに置き換えました
- 変換後のテーブル disneyland_reviews_cleaned にエクスポートする
Gemini でレビューを分析する
データをクリーンアップしたので、BigQuery ML モデルと Gemini モデルを使用して分析を開始できます。次の 2 つの目標があります。
- クチコミからカテゴリを抽出する
- disneyland_reviews の感情分析
BigQuery ML では、GoogleSQL クエリを使用して、ML モデルの作成と実行を行えます。BigQuery ML モデルは、テーブルやビューなどと同様に BigQuery データセットに格納されます。また、BigQuery ML では Vertex AI モデルと Cloud AI API にアクセスして、テキスト生成や機械翻訳などの AI タスクを実行できます。Gemini for Google Cloud は、BigQuery タスクの AI を活用した支援も提供します。
Gemini Pro モデルまたは Flash モデルで ML.GENERATE_TEXT または AI.GENERATE(プレビュー)を使用できます。
ML.GENERATE_TEXT を使用する場合は、次の手順に沿って操作します。
Cloud リソース接続を作成し、IAM ロールを付与する
Gemini Pro モデルと Gemini Flash モデルで作業できるように、BigQuery で Vertex AI モデルへの Cloud リソース接続を作成する必要があります。また、ロールを通じてクラウド リソース接続のサービス アカウントに IAM 権限を付与し、Vertex AI サービスにアクセスできるようにします。
接続のサービス アカウントに Vertex AI ユーザーロールを付与する
Vertex AI ユーザーロールを付与して、接続のサービス アカウントが選択したモデル(gemini-2.5-flash など)を使用できるようにします。権限が反映されるまでに 1 分かかります。
BigQuery で Gemini モデルを作成する
上記の接続を使用してモデルを作成します。たとえば、エンドポイント gemini-2.5-flash. を使用します。
購入者レビューのカテゴリと感情を分析するよう Gemini にプロンプトで指示する
このタスクでは、Gemini モデルを使用して、各購入者レビューのカテゴリと感情(肯定的か否定的か)を分析します。
購入者レビューのカテゴリを分析する
注: 今後の分析では、Gemini の 2 万行の呼び出しに時間がかかる可能性があるため、100 行のみを使用します。
Extract categories by modifying and running the following SQL Query:
CREATE OR REPLACE TABLE
[dataset_name].[results_table_name] AS (
SELECT Review_ID, Rating, Year_Month, Reviewer_Location, Review_Text, Branch, ml_generate_text_llm_result AS categories FROM
ML.GENERATE_TEXT(
MODEL [model_name],
(
SELECT Review_ID, Rating, Year_Month, Reviewer_Location, Review_Text, Branch, CONCAT(
'[WRITE YOUR PROMPT HERE].',
Review_Text) AS prompt
FROM (SELECT * FROM [dataset_name].[table_name] LIMIT 100)
),
STRUCT(
0.2 AS temperature, TRUE AS flatten_json_output)));
このクエリは、disneyland_reviews テーブルから購入者レビューを取得し、gemini モデルが各レビュー内のカテゴリを識別するためのプロンプトを構築します。結果は新しいテーブル reviews_categories に保存する必要があります。
. しばらくお待ちください。モデルによって購入者レビューのレコードが処理され、結果が出力テーブルに表示されるまでに約 30 秒かかります。
結果を表示します。
SELECT * FROM [dataset_name].[results_table_name];
時間を取って、いくつかのカテゴリを読んでみましょう。
購入者レビューの感情(肯定的か否定的か)を分析する
キーワード抽出の SQL クエリに基づいて、「sentiment」という列でレビューを肯定的、否定的、中立に分類するクエリを作成します。
このクエリは、disneyland_reviews テーブルから購入者レビューを取得し、gemini モデルが各レビューの感情を分類するためのプロンプトを構築します。結果は、後でさらに詳しい分析に使用できるよう、新しいテーブル reviews_analysis に保存されます。お待ちください。モデルによって購入者レビューのレコードが処理されるまでに数秒かかります。モデルが完了すると、作成された reviews_analysis テーブルに結果が格納されます。
結果を確認します。
SELECT * FROM [...];
reviews_analysis テーブルには、感情分析を含む Sentiment 列があり、social_media_source、review_text、customer_id、location_id、review_datetime の各列が含まれています。レコードを見てみましょう。結果(肯定的または否定的)の一部が正しくフォーマットされず、ピリオドや余分なスペースなどの不要な文字が含まれている場合があります。これについては、以下のビューを使用してレコードをサニタイズできます。
レコードをサニタイズするためのビューを作成する
次の方法で列の感情の値をサニタイズするビューを作成します。
- LOWER を使用して、すべての値が小文字であることを確認します。
- REPLACE を使用して句読点(.、,、スペース)を削除する
CREATE OR REPLACE VIEW [view_name] AS
SELECT [SANITIZATION_EXPRESSION] AS sentiment,
Review_ID, Rating, Year_Month, Reviewer_Location, Review_Text, Branch,
FROM `disney.reviews_analysis`;
このクエリでは、ビュー cleaned_data_view が作成され、感情分析の結果、レビュー テキスト、Review_ID, Rating, Year_Month, Reviewer_Location, Review_Text and Branch が含まれます。次に、感情の結果(肯定的または否定的)を取得します。その際、すべての文字が小文字に変換され、余分なスペースやピリオドなどの不要な文字が削除されます。結果のビューにより、このラボの後のステップでさらなる分析を行うことが容易になります。
- 以下のクエリを使用してビューをクエリすると、作成された行を確認できます。
SELECT * FROM [view_name];
データ キャンバスで肯定的なレビューと否定的なレビューの件数についてのレポートを作成する
それでは、結果を分析しましょう。まず、BigQuery のデータ キャンバスで直接実行してみましょう。このツールを使用すると、データ(セマンティックまたはキーワード)の検索、テーブルのクエリと結合、グラフの作成、キャンバスのフローの作成による分析情報の取得を行うことができます。
最終的な目標は、肯定的なレビューと否定的なレビューの割合を示すグラフを作成することです。次の例をご覧ください。

カテゴリごとのレビュー数と、カテゴリごとの肯定的なレビューと否定的なレビューの分布を示すグラフを作成する
ヒント: データ キャンバスの [高度な分析] を有効にして使用します。これにより、キャンバス内で Python ノートブックが実行されます。
4. タスク 2: アトラクション パークの画像を分析してディズニーランドの写真を特定し、パークのパンフレットから豆知識を抽出する
BigQuery の画像分析
長年にわたって観光客が撮影した、魅力的なアトラクション パークの刺激的な写真にアクセスできます。次の予定されているトラベルが楽しみですね。しかし、どれがディズニーランドの実際の写真かはわかりません。これらの特定があなたのタスクです。写真は gs://hackathon_data_disneyland_<YOUR_PROJECT_3DIGITS>/attraction_parc_photos/ にあります。

Is_disneyland: False

Is_disneyland: True
この分析を迅速に実行するため。BigQuery のオブジェクト テーブルと Gemini を BigQuery ML(ML.GENERATE_TEXT)で使用する必要があります。
写真を確認して Gemini の出力を検証できますか?
ディズニーランドのパンフレットで BigQuery を使用して独自の RAG システムを作成する
待ち行列に並んでいる間に、待っているアトラクションに関する面白い情報や技術的な詳細を知りたい。
gs://hackathon_data_disneyland_<YOUR_PROJECT_3DIGITS>/disneyland_brochures/, には、世界中のすべてのパークのパンフレットを含む PDF ファイルがあります。
目標: BigQuery 内で検索拡張生成(RAG)システムを完全に作成し、ユーザーが PDF ドキュメントに基づいて公園に関する複雑な質問をできるようにします。
そのためには、次の操作を行います。
- PDF ファイルのオブジェクト テーブルを作成する
- PDF ファイルをチャンク化するための Python UDF を作成します。以下に例を示します。
CREATE OR REPLACE FUNCTION disney.chunk_pdf(src_json STRING, chunk_size INT64, overlap_size INT64)
RETURNS ARRAY<STRING>
LANGUAGE python
WITH CONNECTION `[LOCATION].[CONN_NAME]`
OPTIONS (entry_point='chunk_pdf', runtime_version='python-3.11', packages=['pypdf'])
AS """
import io
import json
from pypdf import PdfReader # type: ignore
from urllib.request import urlopen, Request
def chunk_pdf(src_ref: str, chunk_size: int, overlap_size: int) -> str:
src_json = json.loads(src_ref)
srcUrl = src_json["access_urls"]["read_url"]
req = urlopen(srcUrl)
pdf_file = io.BytesIO(bytearray(req.read()))
reader = PdfReader(pdf_file, strict=False)
# extract and chunk text simultaneously
all_text_chunks = []
curr_chunk = ""
for page in reader.pages:
page_text = page.extract_text()
if page_text:
curr_chunk += page_text
# split the accumulated text into chunks of a specific size with overlaop
# this loop implements a sliding window approach to create chunks
while len(curr_chunk) >= chunk_size:
split_idx = curr_chunk.rfind(" ", 0, chunk_size)
if split_idx == -1:
split_idx = chunk_size
actual_chunk = curr_chunk[:split_idx]
all_text_chunks.append(actual_chunk)
overlap = curr_chunk[split_idx + 1 : split_idx + 1 + overlap_size]
curr_chunk = overlap + curr_chunk[split_idx + 1 + overlap_size :]
if curr_chunk:
all_text_chunks.append(curr_chunk)
return all_text_chunks
""";
- PDF ファイルをチャンクに分割する
- リモートモデルの作成後にエンベディングを生成する
- ベクトル検索を実行して「
Ou manger un repas tex-mex à volonté?」または「where to eat a tex-mex meal buffet-style?」を見つける - 質問「
Ou manger un repas tex-mex à volonté?」または「where to eat a tex-mex meal buffet-style?」のベクトル検索結果で拡張された回答を生成する
5. タスク 3: BigQuery を使用した大規模な ML: 予測、分類、ランキング
待ち時間の予測
写真がとてもかっこいいです。この機会をお見逃しなく。どのアトラクションを選び、どのアトラクションを避けるべきかを知るために、パリとカリフォルニアのいくつかのアトラクションの実際の待ち時間を確認します。タスクは、2025 年の 30 分ごとに、機械学習(Arima Plus または TimesFM)を使用して各アトラクションの待ち時間を予測することです。
使用するデータは、次の CSV ファイルにあります。gs://hackathon_data_disneyland_<YOUR_PROJECT_3DIGITS>/waiting_times.csv
タスクの手順は次のとおりです。
- waiting_times というテーブルの下の BigQuery データセットにファイルを読み込みます。
- データで予測モデルをトレーニングする(Arima_Plus)か、AI.Forecast を使用して直接予測する
- モデルのパフォーマンスを評価するか、予測データを入力データと比較する
ライドを強度別に分類する
友だちとディズニーランドに行く予定です。ディズニーランドは一般的に家族向けですが、一部の乗り物は人によっては激しすぎることがあります。BigQuery マネージド AI 関数を使用して、スリルと強度のレベルでアトラクションを分類してランク付けし、人間のバイアスを排除して、すべての人に対応できるようにします。
AI.CLASSIFYを使用して、説明に基づいて乗車を [easy-peasy、thrilling、extreme] の 3 つの魔法のカテゴリのいずれかに分類します。
スリルレベルでアトラクションをランク付けする
AI.SCOREを使用して、スリルレベルに基づいてアトラクションを比較し、並べ替えます。ランク 10 が最もスリルがあり、ランク 1 が最もスリルがないことを示します。
6. タスク 3 - ボーナス: BigQuery から AlloyDB へのリバース ETL
BigQuery の強力な機能を活用して、大量のデータに関する分析情報を生成しました。これらの分析情報をオペレーション アプリケーション(および AI エージェント)で活用できるようにします。
これには、逆方向に進むことで、AlloyDB for Postgres は、低レイテンシと高速でデータを処理することに優れており、重要なユーザー向けアプリケーションに最適です。では、先ほど生成したデータを逆 ETL してみましょう。
そのため、AlloyDB の「BigQuery ビュー」と呼ばれる、まだ限定公開プレビューの最新機能を使用します。この機能を使用すると、Postgres データベースで BigQuery データを直接クエリできます。
まず、AlloyDB クラスタのサービス アカウントに BigQuery のクエリに必要な権限を付与する必要があります。
gcloud beta alloydb clusters describe <CLUSTER ID> --region=europe-west1
出力には、このクラスタのサービス アカウントである serviceAccountEmail フィールドが含まれます。
Google Cloud コンソールで IAM ページに移動し、このプリンシパルに次の権限を付与します。
- BigQuery データ閲覧者(roles/bigquery.dataViewer)
- BigQuery 読み取りセッション ユーザー(roles/bigquery.readSessionUser)
次に、コンソールの AlloyDB Studio に移動して、「postgres」データベースに接続します。
次のクエリを実行して、新機能をインストールして構成します。
CREATE EXTENSION bigquery_fdw;
CREATE SERVER bq_disney FOREIGN DATA WRAPPER bigquery_fdw;
CREATE USER MAPPING FOR postgres SERVER bq_disney ;
BigQuery の現在のテーブルにマッピングされる「外部テーブル」を作成できるようになりました。タスク 3 で作成したテーブルを使用します。構文の例を次に示します。
CREATE FOREIGN TABLE reviews_analysis ( "Review_ID" int,
"Sentiment" text) SERVER bq_disney OPTIONS (PROJECT 'bqml-hack25par-xxx',
dataset 'disney',
TABLE 'reviews_analysis');
これで準備完了です。テーブルにクエリを実行しましょう。最初の SELECT を実行して AlloyDB と BigQuery 間のリンクを検証し、最後に AlloyDB に新しいテーブルを作成して外部テーブルからデータを取り込みます。
7. タスク 4: すぐに使用できるデータ エージェント
Disneyland Application プロジェクトに貢献したい友人がいます。BigQuery のデータにはアクセスできますが、SQL とデータ エンジニアリングのレベルはさまざまです。UI にすでに統合されているデータ エージェントに関する BigQuery の最近のお知らせを活用して、友人を支援したい。
- データ パイプラインを作成する。
- SQL コードで共同作業します。
- Talk to their Data。
データ パイプラインを自動化するデータ エンジニアリング エージェント
Data Engineering エージェントを使用して、テーブルの待ち時間とアトラクションを結合し、アトラクションごとの平均待ち時間を計算する新しいビュー average_waiting_time を作成します。
BigQuery で会話型分析エージェントを作成する
コーディング、SQL、デプロイを行わずに、BigQuery のインターフェースからデータと対話するエージェントを作成できたら、どんなに便利でしょうか。BigQuery の [エージェント] タブを使用すると、現在でも可能です。

- disney テーブルに接続するエージェント my_disney_friend を作成します。エージェントの手順を入力すると、エージェントのパフォーマンスを向上させることができます。「肯定的なクチコミと否定的なクチコミの割合は?」「アトラクションの平均待ち時間は?」などの質問をします。
- BigQuery と API にエージェントを公開します(後で使用します)。
8. タスク 5: Gemini-CLI で開発エクスペリエンスを向上させる
AI 時代において、ソフトウェアの構築はかつてないほど身近なものになりました。ディズニーランド アプリケーションには何千ものアイデアがあり、データを最大限に活用したいと考えています。データと対話するだけでなく、行動を起こす必要があります。
その道のりを歩むには、助けが必要です。ご安心ください。
Gemini CLI は、Gemini の機能をターミナルから直接利用できるオープンソースの AI エージェントです。デベロッパーは強力なアプリケーションを構築できます。また、拡張機能により、さまざまな MCP(Model Context Protocol)サーバーとやり取りすることもできます。
その中には、AlloyDB または BigQuery のデータをクエリする拡張機能もあります。
このタスクの目標は次のとおりです。
- Gemini-CLI をインストールする(独自のターミナルまたは Cloud Shell で)
- BigQuery と AlloyDB の Gemini-CLI 拡張機能をインストールする
- Gemini-CLI が BigQuery インスタンスと AlloyDB インスタンスに接続できるようにする環境ファイルを作成する
- Gemini-CLI に、AlloyDB データベースのコンテンツを説明する凝った単一の HTML ページを生成するようリクエストします。
- BigQuery についても同様の手順を行います。
Gemini-CLI とその拡張機能を使用して、1 つ(または複数の)プロンプトで生成できるものの例をいくつかご紹介します。これを実際のアプリケーションで実現できると想像してみてください。

9. タスク 6: データとやり取りする AI エージェントを作成する
ディズニーランドの来場者にまったく新しいユーザー エクスペリエンスを提供するために、旅行中に来場者をサポートできるアシスタントを作成します。エージェントは次の操作を行えます。
- 公園内のすべての観光スポットを一覧表示する
- 期待値に基づいてアトラクションをおすすめする
- 観光スポットのクチコミを追加する
- 今後数時間の各アトラクションの待ち時間を推定して提供する
- 特定のアトラクションのクチコミの概要を提供する
アシスタントがディズニーランドに関連する質問にのみ回答し、ユーザーに対して友好的なトーンを維持するようにします。エージェントがユーザーのニーズに合った適切なツールを選択できるように、エージェントのプロンプトを調整します。
必要な手順は次のとおりです。
- AlloyDB と BigQuery をソースとして使用するデータベース向け MCP ツールボックス サーバーをデプロイする
- AlloyDB と BigQuery をクエリし、前述のエージェント アクションをマッピングする MCP サーバー用の 5 つの異なるツールを宣言します。
- MCP ツールボックス UI を使用して各ツールを検証する
- MCP ツールボックス サーバーで公開されているツールを使用できる Agent Development Kit を使用してエージェントをデプロイする
- ADK ウェブ インターフェースに接続し、利用可能なすべてのツールを含むアシスタントとの完全な会話を表示する
早く終わった場合のボーナス ステップ:
エージェントの準備はできましたか?Agent Engine にデプロイしましょう。