AIエージェントの開発において、「複数の視点から同時に情報を集め、それをスマートにまとめたい」と考えたことはありませんか?

Google ADK(Agent Development Kit)を使えば、複雑な並列処理も驚くほどシンプルに、かつ強力に実装できます。

今回は、私が実際に手がけたインシデント分析AIシステムの事例をもとに、ParallelAgentSequentialAgent、そしてAgentToolを組み合わせた「並列検索パターン」の実装方法を徹底解説します。

開発システムの概要:多角的なインシデント分析

今回構築したのは、企業向けのインシデント分析AIシステムです。ユーザーから報告されたトラブルに対し、複数のエージェントが連携して根本原因を分析し、再発防止策を提案します。

特に重要だったのが原因分析フェーズです。社内に蓄積された膨大なナレッジをRAG(Retrieval-Augmented Generation)で検索するにあたり、より多角的な知識を引き出すため、設計上の判断として観点ごとにエージェントを分ける構成を採用しました。

設計上の判断:観点ごとにエージェントを分ける

LLMは、1つのエージェントに「このナレッジを調べて」と指示しても、最初に目についた情報に引きずられやすく、異なる切り口の知識を均等に引き出すのが苦手です。そこで、観点ごとにエージェントを独立させる設計を採用しました。

エージェント 担当する観点 検索キーワード例
search_agent1 観点A 認知エラー、スリップ、バイアスなど
search_agent2 観点B 作業環境設計、配置基準など
search_agent3 観点C 組織風土、コミュニケーション不全など

これら3つのエージェントは独立して動作できるため、ParallelAgentによる並列実行が最適です。

これにより、精度向上だけでなく、処理時間の短縮も実現しました。

全体構成図

システムの全体像は以下の通りです。並列検索の完了を待ってから要約を行うため、エージェントを入れ子構造にするのがポイントです。

  1. ParallelAgent: 3つの検索エージェントを同時に走らせる。
  2. summary_agent: 検索結果を統合し、session.stateに保存。
  3. SequentialAgent: 上記1と2を「順番に実行」するよう制御。
  4. AgentTool: 全体をラップし、メインエージェントからは「1つのツール」として見せる。

実装ステップ

それでは、具体的なコード構成を見ていきましょう。

1. 観点ごとの検索エージェントを定義

同じ検索ツール(search_knowledge_datastore)を使いつつ、instructionで個性を出します。

Python

  1. # sub_agents.py
  2. from google.adk.agents import Agent
  3. # 観点Aのインストラクション例
  4. SEARCH_AGENT1_INSTRUCTION = “””
  5.   ユーザーのインシデントに関係がありそうな単語を利用し、 根本原因に関係しそうな情報を社内ナレッジから検索してください。
  6.   【観点A】に関わるキーワードを優先してください。
  7.   検索は最大2回まで実行可能です。
  8.     – 1回目: 広い観点でのキーワード検索
  9.     – 2回目: 結果を踏まえた深掘り検索 ユーザーに直接回答せず、検索結果のみを返してください。
  10. “””
  11. search_agent1 = Agent(
  12.   name=”search_agent1″,
  13.   model=os.getenv(“MODEL_NAME”),
  14.   description=”観点Aで調査するエージェントです。“,
  15.   instruction=SEARCH_AGENT1_INSTRUCTION,
  16.   tools=[search_knowledge_datastore],
  17. ) # search_agent2, 3 も同様に定義

 

2. ParallelAgent による並列化

Python

  1. # sub_agents.py
  2. from google.adk.agents.parallel_agent import ParallelAgent
  3. parallel_search_agents = ParallelAgent(
  4.   name=”parallel_search_agents”,
  5.   description=”社内ナレッジを多角的に検索するための並列エージェントです。”,
  6.   sub_agents=[search_agent1, search_agent2, search_agent3],
  7. )

3. 要約エージェントと順序制御

並列検索が終わった後に実行されるエージェントを作成します。

Python

  1. # sub_agents.py
  2. from google.adk.agents.sequential_agent import SequentialAgent
  3. summary_agent = Agent(
  4.   name=”summary_agent”,
  5.   model=os.getenv(“MODEL_NAME”),
  6.   instruction=”””3つの検索結果を統合し、save_to_stateツールで’theoretical_framework’というキーで保存してください。”””,
  7.   tools=[save_to_state],
  8. )
  9. # 「並列検索」→「要約」の順序を保証
  10. sequential_search_agents = SequentialAgent(
  11.   name=”sequential_search_agents”,
  12.   sub_agents=[parallel_search_agents, summary_agent],
  13. )

 

4. AgentTool でのカプセル化

ここが最大のテクニックです。複雑な工程を1つの「ツール」にしてしまいます。

Python

  1. # sub_agents.py
  2. from google.adk.tools.agent_tool import AgentTool
  3. # 全体を1つのツールとしてラップ
  4. sequential_search_tool = AgentTool(agent=sequential_search_agents)
  5. # メインの分析エージェントに渡す
  6. analysis_agent = Agent(
  7.   name=”analysis_agent”,
  8.   model=os.getenv(“MODEL_NAME”),
  9.   instruction=ANALYSIS_AGENT_INSTRUCTION,
  10.   tools=[
  11.     sequential_search_tool, # これ1つで並列検索と要約が走る
  12.     search_incident_datastore,
  13.     save_to_state,
  14.     load_artifacts,
  15.   ],
  16. )

まとめ:このパターンのメリット

  1. 多角的な情報収集: 観点ごとにエージェントを分けることで、情報の抜け漏れを防ぎ、精度の高いRAGを実現できます。
  2. 高速なレスポンス: ParallelAgentを活用すれば、エージェントが何人増えても待ち時間は「最も遅い1人の処理時間」で済みます。
  3. 完璧な実行順序: SequentialAgentを組み合わせることで、「全員の検索が終わってからまとめる」というロジックを確実に実行できます。
  4. シンプルなメインロジック: AgentToolでラップすることで、呼び出し元は内部の複雑さを気にせず、スマートにツールを呼び出すだけでOKです。

Google ADKを活用すれば、こうした高度なエージェント・オーケストレーションが標準機能だけで実装可能です。ぜひ皆さんのシステムにも取り入れてみてください!


最後まで読んでいただきありがとうございました。この記事が、あなたのAIエージェント開発のヒントになれば幸いです。もし役に立ったと思ったら、ぜひシェアをお願いします!