2025年9月18日

データサイエンスエージェントを「考察サブエージェント」で強化してみた!


Content

こんにちは!みっちーです!


これまでの記事で、ADK(Agent Development Kit)を使って、自然言語でBigQueryのデータを抽出し、Pythonで高度な分析と可視化を行い、さらにはBigQuery MLで機械学習モデルを構築できる、強力な「データサイエンスエージェント」についてご紹介しました。


しかし、これまでのエージェントは、あくまでSQLの実行結果やグラフといった「事実」を出力する専門家でした。実務では、その事実から「何が言えるのか?」というビジネスに繋がる「示唆」を得ることが最も重要です。


そこで今回は、このデータサイエンスエージェントをさらに進化させるべく、分析結果を解釈し、ビジネス上の考察を生成する「考察サブエージェント(Insight Agent)」を新たに追加します。この機能拡張により、エージェントは単なる分析ツールから、示唆を与えてくれる分析パートナーへと大きく飛躍します!

前提条件

アーキテクチャの進化

まずは、既存のアーキテクチャを振り返ってみましょう。司令塔であるroot_agentが、ユーザーの指示に応じて各専門家(db_agent, ds_agent, bqml_agent)を呼び出す構成になっています。

ここに、新たに追加するのが「考察サブエージェント(insight_agent)」です。このエージェントは、db_agentds_agentが生成したデータやグラフを受け取り、その内容を解釈して考察を生成する役割を担います。

新しいアーキテクチャは以下のようになります。

重要なのは、各エージェントの実行結果がToolContextstateに保存され、後続のエージェントがそれを参照できる点です。insight_agentは、stateに保存された分析結果を入力として受け取ることで、文脈に沿った的確な考察を生成することが可能になります。

実装手順

それでは、実際に考察サブエージェントを実装していきましょう!

1. 考察サブエージェントの作成

まず、python/agents/data-science/data_science/sub_agents/ディレクトリに、新しいサブエージェントのためのinsightディレクトリを作成します。

mkdir python/agents/data-science/data_science/sub_agents/insight

次に、このディレクトリ内に3つのファイルを作成します。

  • insight/__init__.py: (空のままでOKです)
  • insight/prompts.py: エージェントへの指示を定義します。
  • insight/agent.py: エージェント本体を定義します。


insight/prompts.py の作成

考察を生成するためのプロンプトを定義します。今回は、エージェントに経験豊富なデータアナリストとしての役割を与え、構造化されたアウトプットを要求します。

# python/agents/data-science/data_science/sub_agents/insight/prompts.py

def return_instructions_insight() -> str:
instruction_prompt = """
あなたは経験豊富なデータアナリストです。
提示されたデータ(SQLの実行結果など)やグラフを注意深く分析してください。

## タスク
分析結果から読み取れる、ビジネス上重要だと思われる「傾向」「特徴的な点」「異常値」などを特定し、
以下の3つの観点から、簡潔かつ具体的な考察を日本語で述べてください。

1. **サマリー:** 分析結果の要点を2〜3文でまとめてください。
2. **主要なインサイト:** 最も重要だと思われるビジネス上の発見や気づきを、最大3つの箇条書きで挙げてください。
3. **次のアクション提案:** この分析結果を受けて、次に行うべきデータ分析や、検討すべきビジネス上のアクションを1つ提案してください。

## 制約事項
- 憶測ではなく、提示されたデータやグラフに厳密に基づいた考察を述べてください。
- 専門用語は避け、ビジネス担当者にも分かりやすい言葉で説明してください。
- 全体は必ず日本語で記述してください。
"""
return instruction_prompt


insight/agent.py の作成

次にエージェント本体です。このエージェントは外部ツールを必要とせず、プロンプトとLLMの推論能力だけで機能します。

# python/agents/data-science/data_science/sub_agents/insight/agent.py

import os
from google.adk.agents import Agent
from .prompts import return_instructions_insight

# 環境変数からモデル名を読み込むか、デフォルト値を設定
INSIGHT_AGENT_MODEL = os.getenv("INSIGHT_AGENT_MODEL", "gemini-2.5-pro")

insight_agent = Agent(
model=INSIGHT_AGENT_MODEL,
name="insight_agent",
instruction=return_instructions_insight(),
)


sub_agents/__init__.py の更新

新しいinsight_agentを他のエージェントからインポートできるように、sub_agents/__init__.pyを更新します。

# python/agents/data-science/data_science/sub_agents/__init__.py

from .bqml.agent import root_agent as bqml_agent
from .analytics.agent import root_agent as ds_agent
from .bigquery.agent import database_agent as db_agent
from .insight.agent import insight_agent # この行を追加

__all__ = ["bqml_agent", "ds_agent", "db_agent", "insight_agent"] # "insight_agent" を追加

2. Root Agentへの統合

新しいサブエージェントができたので、司令塔であるroot_agentがそれを認識し、適切に呼び出せるように修正します。


data_science/tools.py の修正

root_agentinsight_agentを呼び出すためのツール、call_insight_agentを追加します。このツールは、これまでのステップでstateに保存された分析結果を収集し、プロンプトとして整形してinsight_agentに渡す重要な役割を担います。

# python/agents/data-science/data_science/tools.py

# ... (既存のimport文) ...
from .sub_agents import ds_agent, db_agent, insight_agent # insight_agent をインポート

# ... (call_db_agent, call_ds_agent はそのまま) ...

async def call_insight_agent(
question: str,
tool_context: ToolContext,
) -> str:
"""
Tool to call the insight agent.
This tool gathers previous analysis results from the state (SQL results, etc.)
and asks the insight_agent to generate business insights based on them.
"""
# stateから過去の分析結果を収集
db_output = tool_context.state.get("db_agent_output", "N/A")
ds_output = tool_context.state.get("ds_agent_output", "N/A")
sql_query = tool_context.state.get("sql_query", "N/A")

# 考察エージェントへの入力を整形
insight_prompt = f"""
以下の分析結果に基づいて考察を生成してください。

ユーザーの元の質問: {question}

実行されたSQLクエリ:
{sql_query}

SQLの実行結果(データ):
{db_output}

データ分析エージェントの出力(グラフの説明など):
{ds_output}
"""

agent_tool = AgentTool(agent=insight_agent)
insight_agent_output = await agent_tool.run_async(
args={"request": insight_prompt}, tool_context=tool_context
)

# 最終的な応答に考察を追加する
final_response = f"""
{ds_output or db_output}

---
### 考察
{insight_agent_output}
"""
return final_response

data_science/agent.py の修正

root_agentの定義に、新しいツールcall_insight_agentを追加します。

# python/agents/data-science/data_science/agent.py

# ... (既存のimport文) ...
from .tools import call_db_agent, call_ds_agent, call_insight_agent # call_insight_agent をインポート

# ... (setup_before_agent_call はそのまま) ...

root_agent = Agent(
# ... (既存のパラメータ) ...
tools=[
call_db_agent,
call_ds_agent,
call_insight_agent, # この行を追加
load_artifacts,
],
# ... (既存のパラメータ) ...
)

data_science/prompts.py の修正

最後に、root_agentのプロンプトを更新し、新しいツールの使い方を教えます。既存のワークフローでは、4a. **BigQuery ML Tool…** となっているステップの前に、考察を生成するための新しいステップを挿入します。これにより、以降のステップ番号がずれます。

具体的には、# **Workflow:**セクションを以下のように修正してください。

# python/agents/data-science/data_science/prompts.py

def return_instructions_root() -> str:

instruction_prompt_root_v2 = """
(前半は省略)
# **Workflow:**

# 1. **Understand Intent**

# 2. **Retrieve Data TOOL (`call_db_agent` - if applicable):** If you need to query the database, use this tool. Make sure to provide a proper query to it to fulfill the task.

# 3. **Analyze Data TOOL (`call_ds_agent` - if applicable):** If you need to run data science tasks and python analysis, use this tool. Make sure to provide a proper query to it to fulfill the task.

# 4. **Generate Insight TOOL (`call_insight_agent` - if applicable):** If the user asks for insights, interpretation, or "what this means", use this tool AFTER retrieving and/or analyzing data.

# 5. **BigQuery ML Tool (`call_bqml_agent` - if applicable):** If the user specifically asks (!) for BigQuery ML, use this tool. Make sure to provide a proper query to it to fulfill the task, along with the dataset and project ID, and context.

# 6. **Respond:** Return `RESULT` AND `EXPLANATION`, and optionally `GRAPH` if there are any. Please USE the MARKDOWN format (not JSON) with the following sections:
(以降は省略)
"""
return instruction_prompt_root_v2

これで、すべての実装が完了しました!

動作確認

それでは、新しくなったデータサイエンスエージェントの実力を試してみましょう。ADKのWeb UIを起動し、以下のようなプロンプトを入力します。

trainテーブルの国ごとの売上合計を計算し、結果を棒グラフで可視化してください。そして、その結果から何がわかりますか?

このプロンプトにより、エージェントは以下のように動作するはずです。

    (call_db_agent): まず、db_agentを呼び出して、国ごとの売上合計を計算するSQLを生成・実行します。

    (call_ds_agent): 次に、SQLの実行結果をds_agentに渡し、棒グラフを生成させます。

    (call_insight_agent): 最後に、「何がわかりますか?」という要求に応えるため、insight_agentを呼び出します。これまでのSQL実行結果とグラフの情報がインプットとして渡されます。

    (Final Response): insight_agentが生成した考察を含む、最終的な応答がユーザーに返されます。

最終的なアウトプットには、以下のような考察が表示されるはずです!

まとめ

今回は、既存のデータサイエンスエージェントに「考察サブエージェント」を追加することで、単なるデータ処理の自動化から一歩進んで、分析結果からビジネス上の示唆を自動生成する機能を実現しました。

このように、ADKを使えば、特定の役割を持ったサブエージェントをレゴブロックのように組み合わせることで、より高度で知的なエージェントシステムを段階的に構築していくことが可能です!

今後の展望としては、今回のアクション提案を受けて、自動で深掘り分析を実行する「深堀分析エージェント」や、具体的なマーケティング施策を立案する「施策提案エージェント」などを追加していくことも考えられます。皆さんもぜひ、自分だけのAIエージェントチームを作り上げてみてください!

2025年9月18日 データサイエンスエージェントを「考察サブエージェント」で強化してみた!

Category Google Cloud

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

お問い合わせはこちら