😺

Agent Development Kit (ADK) と Agent2Agent (A2A) を利用しマルチチエージェントを構築しよう

に公開

Google Cloud で Agent Development Kit (ADK) と Agent2Agent (A2A) を利用しマルチエージェントを構築しよう

AI エージェントとは
エージェントとは、人の代わりに特定の目標を達成するために、周囲の環境を認識し、自律的に判断し、行動するエンティティです。このエージェントという考え方自体は新しいものではありませんが、近年の大規模言語モデル(LLM)の驚異的な進化により、その実用性が飛躍的に高まり、注目を集めています。

エージェントは以下の特徴があります:

  • 自律性 (Autonomy): 人間の直接的な指示がなくても、タスクを遂行できます。
  • 目標指向 (Goal-Oriented): 適切なツールの選定や適切なアクションを実行し目的へ向かっていきます
  • 環境認識 (Perception): テキスト、画像、API データソースなどを利用し目的を達成に必要な情報をを収集し実行環境の状況を認識します。
  • 行動 (Action): ツール(API の呼び出し、データベースの検索など)を利用し、目的の達成のため働きかけます。

環境認識、目的達成するために適切なツールと行動の判断のためAIを活用するエージェントはAIエージェントのことです
AI エージェントは基本的に以下のコンポーネントで構成されています(図1)

  • モデル: エージェントの「脳」として機能し、ユーザーの指示を理解し、推論し、計画を立てる役割を担います。通常、Gemini のような大規模言語モデル(LLM)がこの中核を担います。
  • ツール: エージェントが特定のタスクを実行するための「手足」です。Google 検索で最新情報を取得したり、API を呼び出してホテルの予約をしたりと、モデルだけでは不可能な情報収集やアクションの実行を可能にします。
  • オーケストレーション: ユーザーのリクエストに基づき、モデルとツールを適切な順序で連携させる「指揮者」の役割を担います。タスクを小さなステップに分解し、どのツールをいつ使うべきかを判断し、プロセス全体を管理します。このブログで紹介する ADK (Agent Development Kit) はこのコンポーネントに相当します。

図1:AI エージェントの構成

Gemini モデル:エージェントの能力を飛躍させる大規模言語モデル
Gemini モデルは、Google が開発した最先端な生成AIモデルで、テキストだけでなく、画像、音声、動画、コードなど、さまざまな種類の情報を同時に理解し、処理することができる「マルチモーダル」モデルです。Gemini モデルは 200 万トークンまで対応でき、大量のコンテキストを処理しユーザへ適切な回答を返すことができる。Gemini モデルにはエージェント実現に役立つ多数の機能があります(図 2)。

図2:Gemini のエージェント向け主要な機能

  • マルチモーダル
    Gemini はマルチモーダルであるため、テキスト、音声、画像、その他のドキュメント形式など、複数の種類の情報を同時に処理可能で、よりリッチで多様なデータに基づいたエージェントを構築できます。

  • 関数呼び出し
    エージェントが特定のタスクを実行するために、あらかじめ定義されたカスタム関数を呼び出すことができます。これにより、外部のツールや API と連携させ、エージェントの能力を拡張することが可能になります。

  • グーグル検索
    エージェントが必要な情報を得るために、動的に Google 検索を実行する機能です。これにより、常に最新の情報に基づいた応答やアクションが可能になります。

  • Reasoning(推論)
    Gemini の思考モデルがエージェントに与えられた目的や複雑な指示を深く理解し、最適な行動計画を立てることが可能。

  • MCP (Model Context Protocol) 対応
    Gemini の SDK が MCP(Model Context Protocol)にネイティブで対応可能。これにより、より高度で精密なモデルの制御が可能になります。

  • リンク / Youtube 対応
    プロンプトにウェブサイトのリンクや YouTube 動画の URL を含めることで、そのコンテンツを直接コンテキストとして利用できる機能です。これにより、エージェントが外部の情報を参照してタスクを実行できます。

ADK の紹介

ADK (Agent Development Kit) は、開発者がAIエージェントを効率的に構築、テスト、デプロイできるようにGoogleが設計した包括的な OSS (オープン・ソース) ツールキットです。ADK を活用することで、複雑なエージェントのロジックや外部ツールとの連携をシンプルに実装できます。

ADK が提供する主なメリットは以下の通りです。

  • マルチエージェント・システム
    特定の役割を持つ複数のエージェントを階層的に組み合わせることで、モジュール性と拡張性に優れたアプリケーションを構築できます。これにより、エージェント間の複雑な連携やタスクの委任が実現します。

  • 豊富なツール・エコシステム
    エージェントに多彩な機能を持たせることが可能です。検索やコード実行といった便利な標準ツールに加え、独自のカスタム関数や、LangChain、CrewAI といったサードパーティ製フレームワークのツールも統合できます。さらに、他のエージェント自体を一つのツールとして利用することもできます。

  • 柔軟なオーケストレーション
    SequentialAgent や LoopAgent などを使い、処理の流れが決まったワークフローを定義できます。その一方で、LLM の判断に基づいて次に実行する処理を動的に切り替える、状況に応じた柔軟な動作も実現可能です。

  • 一貫した開発体験
    強力な CLI と対話的な UI が用意されており、ローカル環境で開発からデバッグまで一貫して行えます。エージェントが実行される各ステップのイベントや状態を詳細に追跡することも可能です。

  • 組み込みの評価機能
    エージェントの最終的な回答の品質だけでなく、そこに至るまでの処理プロセスも、あらかじめ定義したテストケースと照らし合わせて評価できます。これにより、エージェントの性能を体系的に分析・改善することが可能です。

  • デプロイへの対応
    開発したエージェントはコンテナ化できるため、様々な環境にデプロイできます。ローカルでの実行はもちろん、Vertex AI Agent Engine 上でのスケーリングや、Cloud Run、Docker を用いたカスタム環境への統合も柔軟に行えます。

ADKでマルチ エージェントの作成
ここからは、ADK(Agent Development Kit)を用いて、マルチエージェント システムを構築し、Google Cloudにデプロイします。
このシステムは、ユーザーの指示に基づき Imagen 3 で画像を生成し、その結果を別のエージェントが評価します。この「生成と評価」のプロセスを、ユーザーの意図に沿った画像が得られるまで自動で繰り返します。
システムの全体構成は、図 3 に示す通りです。

図3:ADK を利用し作成するエージェントの構成

  1. 環境を準備しましょう
    今回は以下の環境が必要となります

    1. Google Cloud アカウント
    2. Google Cloud の中、Vertex AI API を利用できるようにする
    3. Python 実行環境、Cloud Shell やローカルマシン。ローカルマシンを利用したい場合はターミナルの事前認証が必要となります。
    4. gcloud CLI (Cloud Shell にはデフォルトでインストールされています)
  2. コードをクローンし必要なライブラリをインストールしましょう

#プロジェクトディレクトリを作成
mkdir imagescoring
cd imagescoring
#プロジェクトディレクトリにコードをクローン
git clone https://github.com/haren-bh/multiagenthandson.git

#Pythonの仮想環境の作成
python3 -m venv pythonenv
source pythonenv/bin/activate

# google-adk と a2a sdkのインストール
python3 -m pip install google-adk==1.8.0
python3 -m pip install a2a-sdk==0.2.16
#poetry をインストールしますcd multiagenthandson #アプリケーションディレクトリへ移動
pip install poetry poetry-plugin-export
poetry install --with deployment
#GCSバケットがない場合、バケットを作成gsutil mb gs://YOUR-UNIQUE-BUCKETNAME

  1. パラメータを設定
image_scoringフォルダー配下以下のコンテンツで.envファイル作成(TODOのところ変更)

GOOGLE_GENAI_USE_VERTEXAI=1 

#TODO プロジェクトIDを記載
GOOGLE_CLOUD_PROJECT=YOUR CLOUD PROJECT NAME 

GOOGLE_CLOUD_LOCATION=us-central1

#TODO GCOバケット名を記載
GOOGLE_CLOUD_STORAGE_BUCKET=YOUR BUCKET NAME


SCORE_THRESHOLD=40 
IMAGEN_MODEL="imagen-3.0-generate-002" 
GENAI_MODEL="gemini-2.5-flash"

Image_scoring フォルダー内、agent.py で以下を確認してください。これが ADK でエージェントの基本的な作成方法となります。

image_scoring = LoopAgent(
    name="image_scoring",
    description="Repeatedly runs a sequential process and checks a termination condition.",
    sub_agents=[
        image_generation_scoring_agent,  # First, run your sequential process [1]
        checker_agent_instance,  # Second, check the condition and potentially stop the loop [1]
    ],
    before_agent_callback=set_session,
)
root_agent = image_scoring

  1. ローカルでエージェントを実行
#以下のコマンドをルートフォルダーmultiagenthandsonから実行します
#TODO バケット名を変更してくださいexport GCS_BUCKET_NAME=your gcs bucket name
adk web

実行すると以下の画面が表示されます

  1. ADK エージェントの Google Cloud へデプロイ

次に、エージェントを Vertex AI Agent Engine にデプロイします。Vertex AI Agent Engine は、Google Cloud にエージェントをデプロイするためのフルマネージド サービスです。Vertex AI Agent Engine は ADK と互換性があるため、ADK で構築されたエージェントを Vertex AI Agent Engine にデプロイできます。Vertex AI Agent Engine へデプロイするには以下の手順に従っていきます。(TODO のところ自分の環境に合わせて変更してください)

export GOOGLE_CLOUD_LOCATION='us-central1'#TODO プロジェクトIDを変更してください
export GOOGLE_CLOUD_PROJECT='your project id'
# TODO pyproject.toml のあるmultiagenthandsonへ移動してから以下を実行してください
pip install poetry-plugin-export

#Create requirements.txt file
poetry export -f requirements.txt --output requirements.txt --without-hashes
poetry build

dist フォルダ内、.whl ファイルが作成されていることを確認してください。

Image-scoring フォルダ内にある deploy.py ファイルを以下のように編集してください (TODO のところ注目)


import vertexai
from .agent import root_agent
import os
import glob # To easily find the wheel file

#TODO プロジェクトIDを自分のGoogle CloudプロジェクトIDに変更
PROJECT_ID = "YOUR PROJECT ID" #change this your project
LOCATION = "us-central1" #change this
#TODO 自分のGCSバケットに変更
STAGING_BUCKET = "gs://YOUR BUCKET " #change this to your bucket

from vertexai import agent_engines

vertexai.init(
   project=PROJECT_ID,
   location=LOCATION,
   staging_bucket=STAGING_BUCKET,
)

remote_app = agent_engines.create(
   agent_engine=root_agent,
   requirements=open(os.path.join(os.getcwd(), 
"requirements.txt")).readlines()+["./dist/image_scoring-0.1.0-py3-none-any.whl"],#TODO change this to your local location
   extra_packages=[
       "./dist/image_scoring-0.1.0-py3-none-any.whl", # TODO change this to your location
   ]
)

print(remote_app.resource_name)

ファイル変更終わりましたら保存し以下のコマンドを実行

python3 -m image_scoring.deploy

ここで表示された、最後の行、projects/xxxx/locations/us-central1/reasoningEngines/xxxx はagent engine IDです、agent engine IDをメモします

Google Cloud コンソールの Vertex AI 画面にある Vertex AI Agent Engine にアクセスしデプロイされたAgent Engineの確認や削除が可能です。

  1. デプロイされたエージェントをテストしましょう

    testclient フォルダに移動し**、remote_test.py** ファイルを開いて、以下のように編集します(TODO を確認)。

#TODO
PROJECT_ID = "" #change this
#TODO
LOCATION = "" #change this
TODO
STAGING_BUCKET = "" #change this

#TODO, 上記メモしたreplace the id with your own.
reasoning_engine_id="your agent engine id"

#自分のプロンプトに変更可能
image_prompt="A cat riding a bicycle"
python3 remote_test.py

A2A エージェントサーバを立ち上げる

Agent2Agent(A2A)は、グーグルが開発したオープンマルチエージェントプロトコルです。A2A は異なるフレームワーク、ベンダー、ドメインで開発された自律型 AI エージェント同士が、シームレスかつ安全に通信・連携できるように設計されています。

A2A の主な特徴

  • 普遍的な相互運用性
    A2A は、エージェント フレームワークやプラットフォームに依存せず、エージェント間の連携を可能にします。これにより、異なる企業が別々のプラットフォームで構築したエージェント同士でも、円滑に通信し、協力し合える真のマルチエージェント エコシステムが実現します。

  • 機能の発見
    各エージェントは、自身のID、対応する A2A の機能、スキル、認証要件などを記述した「エージェントカード」(JSON 形式のドキュメント)を公開できます。これにより、他のエージェントは、特定のタスクに最も適したエージェントを効率的に見つけ出し、選択することが可能になります。

  • デフォルトで安全な設計 (セキュア・バイ・デフォルト)
    セキュリティは A2A の中核をなす原則です。HTTPS/TLS、JWT、OIDC、API キーといった標準技術を利用し、機密データを保護するためのエンタープライズレベルの認証・認可メカニズムが組み込まれており、安全な通信を保証します。

  • 多様な通信手段 (モダリティ非依存)
    テキスト、音声、動画のストリーミング、インタラクティブなフォーム、埋め込み iframe など、様々な形式の通信をサポートします。この柔軟性により、エージェントはタスクやユーザーにとって最適な手段で情報を交換できます。

  • 構造化されたタスク管理
    タスクの委任、進捗監視、完了に関する明確な手順を定めています。関連するタスクはグループ化され、一意のタスクIDによって複数のエージェント間で管理されます。タスクは「送信済み」「処理中」「完了」といった定義済みのライフサイクルに沿って状態が遷移します。

  • 実行プロセスの非公開性 (ブラックボックス実行)
    重要な特徴として、エージェントは自身の内部的な思考プロセス、メモリ、使用する特定ツールを他のエージェントに開示する必要がありません。呼び出し可能なサービスのみを公開することで、モジュール性とプライバシーを確保します。

  • 既存の標準技術を基盤
    HTTP、リアルタイム通信のための SSE(Server-Sent Events)、構造化データ交換のためのJSON-RPC など、広く普及しているWeb技術を基盤としています。そのため、既存の IT インフラへの統合が容易です。

  • 非同期通信
    A2A は非同期通信を前提に設計されており、柔軟なタスク処理を促進します。これにより、常時接続が維持されていない状況でも、プッシュ通知による状況更新などが可能です。

これまでADKで作成したエージェントを A2Aプロトコル を利用し公開します。A2A プロトコルの重要な要素が Agent Card となります。Agent Card にはエージェントの詳細とアクセス方法などが記載されています。A2Aで公開されたエージェントを利用するには、 Agent Card を以下のURLからアクセス可能です。

agent-domain/.well-known/agent-card.json

ソースコードの image_scoring_adk_a2a_server 内の remote_a2a/image_scoring フォルダに、次の内容の agents.json があります。これが今回作成するA2Aエージェントの agent-card となります。

{
  "name": "image_scoring",
  "description": "Agent that generates images based on user prompts and scores their adherence to the prompt.",
  "url": "http://localhost:8001/a2a/image_scoring",
  "version": "1.0.0",
  "defaultInputModes": ["text/plain"],
  "defaultOutputModes": ["image/png", "text/plain"],
  "capabilities": {
    "streaming": true,
    "functions": true
  },
  "skills": [
    {
      "id": "generate_and_score_image",
      "name": "Generate and Score Image",
      "description": "Generates an image from a given text prompt and then evaluates how well the generated image adheres to the original prompt, providing a score.",
      "tags": ["image generation", "image scoring", "evaluation", "AI art"],
      "examples": [
        "Generate an image of a futuristic city at sunset",
        "Create an image of a cat playing a piano",
        "Show me an image of a serene forest with a hidden waterfall"
      ]
    }
  ]
}

今回は ADK の A2A サーバ機能を利用し A2A サーバを立ち上げます。A2A サーバを立ち上げるには、トップフォルダ image_scoring_adk_a2a_server から次のコマンドを実行します(TODO のところ自分の環境に合わせて変更してください)。

#set some environmental variables
#TODO
export GOOGLE_CLOUD_PROJECT=YOUR PROJECT
#TODO
export GOOGLE_CLOUD_LOCATION=YOUR PROJECT LOCATION eg. us-central1
#TODO
export GCS_BUCKET_NAME=YOUR BUCKET

#following command runs the ADK agent as a2a agent
adk api_server --a2a --port 8001 remote_a2a

上記のコマンドを実行すると http://localhost:8001 に A2A サーバが立ち上がります。このサーバを通じてこれまで作成された image-scoring ルートエージェントにアクセスすることができます。

これから agent card にアクセスしてみましょう。agent card へアクセスするには以下の curl コマンドを実行します。

curl http://localhost:8001/a2a/image_scoring/.well-known/agent.json

A2A エージェントはネットワーク経由アクセスできるようになっており、以下の curl コマンド実行しアクセスします。

curl -X POST   http://localhost:8001/a2a/image_scoring   -H 'Content-Type: application/json'   -d '{
    "id": "uuid-123",
    "params": {
      "message": {
        "messageId": "msg-456",
        "parts": [{"text": "Create an image of a cat"}],
        "role": "user"
      }
    }
  }'

これで、簡単な A2A サーバを立ち上げることができました。

まとめ
本ブログ記事では、Google Cloud、ADK、A2A を活用したマルチエージェントの構築について解説しました。主な学習内容は以下の通りです。

  • ADK の基本と、それを用いたマルチエージェント システムの作成方法
  • Google Cloud を利用したエージェントの簡単なデプロイ方法
  • A2A プロトコルの基本
  • A2A プロトコルとADKを組み合わせたオープン エージェントの作成

今回の記事では、A2A を利用したマルチエージェントの作成や Google Cloud へのデプロイまでは詳しく触れられませんでした。次回のブログでは、この A2A を中心に解説していく予定です。

Discussion