🤖

A2Aでとりあえず抑えとくべき基本

に公開

A2Aについて使う機会があったので自分の理解をまとめます。

A2Aプロトコルとは?

AIエージェントがますます高度化し、専門化する中で、異なるベンダーやフレームワークで開発されたエージェント同士が連携する必要性が高まっています。しかし、それぞれのエージェントが独自のAPIやデータ形式を持つ場合、その連携は容易ではありません。

この課題を解決するために登場したのが、オープンスタンダードな「A2A (Agent-to-Agent) Protocol」です。

A2Aプロトコルは、AIエージェントが使用するフレームワークに関わらず、エージェント間のシームレスなコミュニケーションとコラボレーションを促進するために設計されたエージェント同士のやり取りのためのプロトコルです。

特定のタスクに特化した複数のエージェントを協調させることで、より複雑な問題を解決しようとするアプローチが注目されています。
しかし、各エージェントが独自の仕様で開発されていると、連携させるためのカスタムインテグレーションが必要になり、スケーラビリティやセキュリティの面で課題が生じます。

A2Aプロトコルは、エージェント間のやり取りを標準化することでこれらの課題を解決します。設計原則として、シンプルさ、エンタープライズ対応、モダリティの独立性(テキスト、画像、音声など様々な形式のデータを扱えること)が重視されています。

以下利用イメージです。なお、A2AはすべてHTTP(S)経由で通信され、サポートされるトランスポートプロトコルはJSON-RPC、gRPC、RESTになります。
旅行コンシェルジュエージェントは、例えばADKで実装する場合RemoteA2aAgentを利用して実現することができます。

Agent Cardで自己紹介

人間が名刺交換をするように、A2AプロトコルではエージェントがAgent Cardを使って自己紹介をします。Agent Cardは、エージェントが自分自身を説明するためのデジタルな名刺のようなものです。

これには、エージェントの名前、説明、サポートしているプロトコルのバージョン、エンドポイントやスキルなどといった情報が含まれます。Client Agentは、このAgent Cardを見ることで、Remote Agentが何者で、どのようにコミュニケーションすればよいかを理解できます。

TaskとMessageによるコミュニケーション

A2Aプロトコルにおけるエージェント間のやり取りは、主にTaskMessageという2つの要素で構成されます。

  • Message: ステートレスな単一のインタラクションです。例えば、簡単な挨拶や一度きりの情報要求などに使われます。
  • Task: 状態を持つステートフルなインタラクションです。開始から完了までライフサイクルを持ち、長期にわたる複雑な処理を表現します。

単純なやり取りはMessageで、状態管理が必要な一連の処理はTaskで表現する、と覚えておくと良いでしょう。

Taskのライフサイクル

Client からの最初のリクエストは Message になります。A2Aサーバー側はこのリクエストを受け取って、Taskを生成し処理の進行に合わせて状態が変化していきます。Task はstatusを持ち、submittedworkingcompletedfailedなどの状態を持ちます。最終的にはエージェントが生成した最終結果とともにstetus=completedの Task を返します。

タスクは一度完了やエラーなどの終端状態になると、その状態は不変(immutable)になります。もし後続の処理や修正が必要な場合は、同じcontextIdを持つ新しいタスクを生成することになります。このcontextIdにより、関連する一連のタスクをグループとして管理できます。

例えば以下で説明されている例だと、
最初のTask でヨットの画像を生成させて、Task はcompletedになっていますが、その後ヨットの色を変えたいということで別のMessageを送っています。ただし、前のTask と関連がある内容なので同じcontextIdを渡すことで、続きの内容であることをエージェント側に認識させています。
https://a2a-protocol.org/latest/topics/life-of-a-task/#example-follow-up-scenario

A2Aサーバー側はこのcontextIdを意識した実装にしなければならなかったりします。
もちろんA2Aサーバーがホストしているエージェント側もこれを意識して実装する必要があります。

A2AとMCPの違い

A2Aプロトコルと似たコンセプトを持つものに「MCP (Model Context Protocol)」があります。最後に両者の違いを簡単に説明します。

  • A2A: エージェントとエージェントの対話を定義します。
  • MCP: エージェントとツール(データベース、APIなど)の対話を定義します。

公式ドキュメントでは自動車修理工場の例えが載っていたりします。顧客と「店長」エージェントが対話するのがA2A、「店長」エージェントがA2Aを使って「整備士」エージェントに依頼します。「整備士」エージェントが診断スキャナーや修理マニュアルといったツールを使う(と対話する)のがMCP、と考えると良いでしょう。
https://a2a-protocol.org/latest/topics/a2a-and-mcp/#a2a-mcp-complementary-protocols-for-agentic-systems

まとめ

本記事では、A2Aプロトコルの基本的な概念について解説しました。

  • A2Aは、異なるAIエージェント間の連携を標準化するプロトコルである。
  • エージェント側はA2Aサーバーを実装する必要がある。
  • コミュニケーションの核となるのは、ステートレスなMessageとステートフルなTaskである。
  • Taskはライフサイクルを持ち、複雑なインタラクションを管理できる。

今後、例えば自作のエージェントを公開するときに、何かしらのプラットフォームにのることなく、A2Aサーバーを実装して公開すれば、いろんな人に自作のエージェントを使ってもらう、みたいなユースケースが考えられます。

どこかのタイミングで実際の実装も見ていきたいと思います。
特にA2Aサーバーの実装はいろいろ考えることが多かったりします。

参考資料

http://a2a-protocol.org/latest/

Discussion