2025年9月30日

【ADK+BigQuery】ADK の BigQuery ツールセットを使用してデータ分析エージェントを構築してみた


Content
こんにちは。

本記事では、ADK(Agent Development Kit)の組み込みツールである、BigQuery ツールセットを試してみたいと思います。
ADK とは、Google が提供しているオープンソースの AI エージェント開発のフレームワークです。
ADK の文脈において、ツールとは、AI エージェントに提供される特定の機能のことで、これにより、エージェントはコアとなるテキスト生成および推論能力を超えたアクション(Web検索、データベースへのクエリなど)を実行することが可能になります。
ADK にはいくつかの種類のツールがありますが、組み込みツールは、Google 検索や、今回試してみる BigQuery へのクエリなど、すぐに使える機能を提供してくれます。

今回は、BigQuery の一般公開データセットである「thelook_ecommerce」を使用して、これらデータに対して自然言語での質問に答えるデータ分析エージェントを構築してみようと思います。

【参考】
BigQuery と ADK & MCP: 新しいファーストパーティ ツールセットでエージェント開発を加速

BigQuery のツールセット

ADK では、複数の組み込みツールが提供されています。
今回は、BigQuery のツールセットを使用します。ツールセットには、以下ツールが含まれています。

  • list_dataset_ids: プロジェクト内に存在するデータセット ID を取得する
  • get_dataset_info: データセットに関するメタデータを取得する
  • list_table_ids: データセット内に存在するテーブル ID を取得する
  • get_table_info: テーブルに関するメタデータを取得する
  • execute_sql: SQL を実行し、結果を取得する
  • ask_data_insights: 自然言語を使用して、テーブル内のデータに関する質問に回答する

検証に使用するデータセット

今回は、BigQuery の一般公開データセットである「thelook_ecommerce」を使用します。
「thelook_ecommerce」には、架空のeコマース衣料品サイト(TheLook)に関する、以下テーブルが含まれています。

  • users: 顧客テーブル
  • products: 商品テーブル
  • orders: 注文テーブル
  • order_items: 注文商品テーブル
  • inventory_items: 在庫テーブル
  • distribution_centers: 物流テーブル
  • events: ウェブイベントテーブル
  • thelook_ecommerce-table: 記載なし

ソースコード

フォルダ構成

adk-agent
 └bq-agent-app
  ├__init__.py
  ├.env
  └agent.py

__init__.py

from . import agent

.env

GOOGLE_GENAI_USE_VERTEXAI=1
GOOGLE_CLOUD_PROJECT=your_project
GOOGLE_CLOUD_LOCATION=us-central1

agent.py

from google.adk.agents.llm_agent import Agent
from google.adk.tools.bigquery import BigQueryCredentialsConfig
from google.adk.tools.bigquery import BigQueryToolset
from google.adk.tools.bigquery.config import BigQueryToolConfig
from google.adk.tools.bigquery.config import WriteMode
import google.auth

# エージェントの BigQuery へのアクセス制御を指定
tool_config = BigQueryToolConfig(write_mode=WriteMode.BLOCKED) # BLOCKED: 読み取り専用

# BigQuery への認証(Application Default Credentials を使用)
application_default_credentials, _ = google.auth.default()
credentials_config = BigQueryCredentialsConfig(
credentials=application_default_credentials
)

# BigQuery ジョブを実行するプロジェクトID
PROJECT_ID = "your_project"

# BigQuery ツールセット
bigquery_toolset = BigQueryToolset(
credentials_config=credentials_config, bigquery_tool_config=tool_config
)

# エージェント
root_agent = Agent(
model="gemini-2.0-flash",
name="bigquery_agent",
description=(
"あなたは、SQL を実行して BigQuery のデータに関する質問に答えるエージェントです。"
),
instruction=f"""
あなたは、複数の BigQuery ツールにアクセスできるデータ分析エージェントです。
これらのツールを活用して、ユーザの質問に答えてください。
ユーザからの質問に対しては、プロジェクトID: `bigquery-public-data` 、データセット: `thelook_ecommerce` のみのデータを使用して回答してください。
BigQuery ジョブは、プロジェクトID: `{PROJECT_ID}` で実行してください。"
""",
tools=[bigquery_toolset]
)

実際にエージェントにデータに関する質問をしてみる

「adk-agent」をカレントディレクトリにした状態で、adk web コマンドを使用してエージェントを実行し、実際にエージェントにデータに関する質問をしてみようと思います。
今回は、以下の4つで試してみました。

1.データセット内のテーブルを全て教えてください。
2.それぞれのテーブルの件数を教えてください。
3.今月一番売れている商品は?
4.一緒に注文されることが多い商品はどれですか?

1.データセット内のテーブルを全て教えてください。
ツール: list_table_ids が実行され、結果も合っていました。

2.それぞれのテーブルの件数を教えてください。
ツール:execute_sql が複数回実行され、こちらの結果も合っていました。

3.今月一番売れている商品は?
ツール: execute_sql が実行され、結果も問題なさそうでした。参考までに実行された SQL 載せております。
エージェントからの回答では、「…ordersテーブルとorder_itemsテーブルを結合して、…」とありますが、実際には productsテーブル も結合され、商品名が取得できていました。

【参考】SQL

SELECT
p.name,
COUNT(oi.product_id) AS total_ordered
FROM
bigquery-public-data.thelook_ecommerce.order_items oi
JOIN
bigquery-public-data.thelook_ecommerce.products p
ON
oi.product_id = p.id
JOIN
bigquery-public-data.thelook_ecommerce.orders o
ON
oi.order_id = o.order_id
WHERE
EXTRACT(YEAR FROM o.created_at) = 2025 AND EXTRACT(MONTH FROM o.created_at) = 9
GROUP BY
p.name
ORDER BY
total_ordered DESC
LIMIT 1

4.一緒に注文されることが多い商品はどれですか?
ツール: execute_sql が実行され、結果も概ねは問題なさそうでした。参考までに実行された SQL 載せております。
今回は5件のみ表示しているため、結果からは分からないですが、SQL の仕様上、product_id1 と product_id2 が逆でも一緒に注文される商品の組み合わせとして表示される可能性があるため、若干修正の余地はある印象でした。

【参考】SQL

SELECT
oi1.product_id AS product_id1,
oi2.product_id AS product_id2,
COUNT(*) AS order_count
FROM
bigquery-public-data.thelook_ecommerce.order_items oi1
JOIN
bigquery-public-data.thelook_ecommerce.order_items oi2
ON
oi1.order_id = oi2.order_id
AND oi1.product_id != oi2.product_id
GROUP BY
oi1.product_id,
oi2.product_id
ORDER BY
order_count DESC
LIMIT 5

まとめ

まず、ADK からの BigQuery のツールセットの呼び出しが非常に簡単でした。
BigQuery に対する基本的なアクションを、開発者が独自のカスタムツールを作成することなく簡単に実現できる点は魅力的ですね。今後も各種ツールが追加される予定とのことだったので、期待したいです。

また、実際のツール自体の精度も予想より高くて驚きました。
実務な活用の観点では、やはり精度はかなり重要になるかと思うため、ユーザの質問の意図を整理するエージェントや、エージェントが出力した内容をレビューするエージェントなど、複数エージェントの活用が必須のように感じました。こういったマルチエージェント化の検証も進めていきたいと思います。

最後まで読んでいただき、ありがとうございました。

2025年9月30日 【ADK+BigQuery】ADK の BigQuery ツールセットを使用してデータ分析エージェントを構築してみた

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら