12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADK で「子供の学びを促進するAI」をテーマにさくっとマルチエージェントシステム開発体験

12
Last updated at Posted at 2025-12-10

0. はじめに

マルチエージェントシステムの開発は、複雑で敷居が高いと思われがちです。しかし、Google の提供する Agent Development Kit (ADK) を使えば、簡単に試すことができます。本記事では、子供の学びを促進するための AI エージェントシステムをマルチエージェント構成で構築する過程を紹介します。

1. Agent Development Kit とは

Agent Development Kit (ADK) は、Google が提供するエージェント開発のためのツールキットです。複数のエージェントを簡単に定義し、それらを連携させることで、複雑なタスクを効率的に処理するシステムを構築できます。

ADK で定義することができるエージェントには以下のようなものがあります。

  • LlmAgent: 基本的なエージェントの定義が可能
  • ParallelAgent: 複数のエージェントを並列に実行させるための定義が可能
  • SequentialAgent: エージェントを順次実行するワークフローの構築定義が可能

2. 作成物のテーマ設定

今回作成するのは、「子供の学びを促進するためのエージェントシステム」です。このシステムでは以下の役割を持つエージェントを構築します。

  1. 専門家エージェント: 「芸術」、「運動」、「科学」、「歴史」の各分野で、子供に適した経験を提案
  2. レコメンダーエージェント: 専門家エージェントの提案を分析し、最適な提案を選定
  3. 教師エージェント: 全体のワークフローを管理し、ユーザーの入力を基にエージェントを連携

image.png

3. 実装部分

adk の実行に際して、以下の2つのファイルを用意します。

Project
├── agent.py   # ルートエージェントおよびエージェント群を定義 
└── prompt.py  # プロンプトテンプレートを定義

3-1. 専門家エージェント

agent.py では、芸術、運動、科学、歴史の各分野の専門家エージェントを定義しています。それぞれのエージェントは、prompt.py に定義されたプロンプトテンプレートを使用します。

プロンプトテンプレート

prompt.py
EXPERT_AGENT_INSTRUCTION_TEMPLATE = """
あなたは{domain}の専門家です。
ユーザーから提供された以下の子供の背景情報を考慮し、この子に知ってほしい、または経験してほしい{domain}の項目を一つだけ提案してください。

# 子供の背景情報
{user_input}

# 出力形式
あなたの回答は、以下のキーを持つ厳密なJSONオブジェクトでなければなりません。
- "name": (文字列) 提案する項目の名前。
- "summary": (文字列) 提案する項目がどのようなものかの概要。
- "reason": (文字列) この子供になぜこの項目を推薦するのかの具体的な理由。
- "related_items": (文字列のリスト) 提案した項目に関連する他のキーワードやアクティビティ。
"""

このテンプレートを用いて、各分野の専門家エージェントを作成していきます。芸術担当エージェントの場合、定義方法は以下のように LlmAgent() を用いて行います。これらの定義を、今回は各専門家ごと計4回行います。

芸術エージェントの定義の例

agent.py
art_expert_agent = LlmAgent(
    name="art_expert_agent",
    model="gemini-2.0-flash",
    instruction=prompt.EXPERT_AGENT_INSTRUCTION_TEMPLATE.replace("{domain}", "芸術"),
    output_key="art_proposal",
    description="芸術分野の専門家エージェント",
)

3-2. 専門家群の並列エージェント

parallel_experts_agent は、複数の専門家エージェントを並列に実行するためのエージェントです。ParallelAgent() を用いて定義し、サブエージェントとして上記で定義したそれぞれの専門家エージェントをリストで指定します。これにより、各分野の提案を効率的に収集できます。こちらのエージェントは後述する教師エージェントが呼び出す際に利用します。

agent.py
parallel_experts_agent = ParallelAgent(
    name="parallel_experts_agent",
    sub_agents=[
        art_expert_agent,
        sports_expert_agent,
        science_expert_agent,
        history_expert_agent,
    ],
    description="各分野の専門家が並行して提案を作成します。",
)

3-3. レコメンダーエージェント

agent.py では、専門家エージェントの提案を分析し、最適な提案を選定するレコメンダーエージェントを定義しています。

プロンプトテンプレート

prompt.py
RECOMMENDER_AGENT_INSTRUCTION = """
あなたは経験豊富な教育コンサルタントです。
4人の専門家から提出された以下の提案リストを分析し、特定の子供にとってどの経験が最も価値があるかを評価してください。

# 子供の背景情報
{user_input}

# 専門家からの提案リスト
- 芸術: {art_proposal}
- 運動: {sports_proposal}
- 科学: {science_proposal}
- 歴史: {history_proposal}

# あなたのタスク
上記の提案を、以下のいずれかの観点から評価し、1位から4位までの優先順位をつけてください。
- 「これまでの経験からの関連性からくるシナジー」
- 「これまでの経験からの乖離からくるチャレンジ」

最終的な回答は、順位、提案名、そしてその順位にした理由を明確にしたリスト形式で提出してください。
"""

レコメンダーエージェントの定義

agent.py
recommender_agent = LlmAgent(
    name="recommender_agent",
    model="gemini-2.0-flash",
    instruction=prompt.RECOMMENDER_AGENT_INSTRUCTION,
    output_key="final_recommendation",
    description="専門家の意見を元に最終的な推薦を行うエージェント",
)

3-4. 教師エージェントの定義

教師エージェントは、全体のワークフローを管理します。SequentialAgent() を使用して、以下の順序でエージェントを実行します。

  1. 専門家エージェントの並列実行: 各分野の提案を収集。
  2. レコメンダーエージェントの実行: 提案を分析し、最適な提案を選定。
agent.py
teacher_agent_workflow = SequentialAgent(
    name="teacher_agent_workflow",
    sub_agents=[
        parallel_experts_agent,   # 専門家たちが並列で提案
        recommender_agent,        # 提案を元にレコメンダーが順位付け
    ],
    description="ユーザーの子供に最適な経験を提案するマルチエージェントシステム",
    before_agent_callback=set_user_input_to_state,
)

また、set_user_input_to_state コールバックを使用して、ユーザーの入力をエージェントの状態に設定します。これにより、ユーザーの背景情報を各エージェントが利用できるようになります。

agent.py
def set_user_input_to_state(callback_context: CallbackContext) -> None:
    """
    ユーザーからの最新のメッセージを session.state['user_input'] に設定するコールバック。
    """
    # 会話履歴 (events) から最後のユーザーメッセージを取得
    last_user_event = next(
        (
            event
            for event in reversed(callback_context._invocation_context.session.events)
            if event.author == "user"
        ),
        None,
    )
    if last_user_event and last_user_event.content.parts:
        # stateに 'user_input' として保存
        callback_context.state["user_input"] = last_user_event.content.parts[0].text

4. ローカルブラウザ上での動作確認結果

ここでは、実際にエージェントを動作させた結果を紹介します。ターミナル上で adk web コマンドを実行し、ブラウザからローカル上に構築されたエージェントシステムへ GUI でアクセスします。

ADK Web では GUI 上のチャット画面で実際に AI エージェントと対話しながらその挙動を確認することができます。試しに、ユーザの入力として「8歳の子供に知ってほしいこと、経験してほしいことを一つ教えて。この子は最近、昆虫の観察に夢中で、外で走り回るのが大好きです。」という文言を入力してみました。
image.png

まず初めにそれぞれの専門家エージェントが候補を挙げてくれています。

image.png
そしてすべての候補が出揃ったのちに、レコメンダーエージェントが2つの視点から候補を順位付けし、ユーザ側に回答を返していることが確認できました。

なお、adk web では実行にかかる時間も確認できます。parallel_experts_agent で定義した4つのエージェントは互いに独立して実行されるため、逐次実行する場合と比べて実行完了までの時間を短縮することが可能です。

image.png

5. まとめ

いかがでしたか?ADK を使えば、複雑なマルチエージェントシステムも簡単に構築できます。

本記事の中では、エージェントの並列実行と直列実行を組み合わせることで、効率的かつ柔軟なワークフローを構築する方法を試してみました。専門家エージェントが提案を作成する複数のプロセスを並列で実行し、後続でこれらのエージェントから得られた提案を分析することで、最適な結果を導き出すプロセスを順序立てて実行しています。

ぜひ、皆さんも ADK を活用して、独自のマルチエージェントシステムを構築してみてください!

参考

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?