A2A: Travel Agent サンプル

【 A2A: Travel Agent サンプル 】

このセッションでは、Multi AI Agent プログラミングのサンプルとして、三つのAgentを協調させて、一つのTravel Agent サービスに統合するプログラムを紹介します。

このサンプルは、A2Aプロトコルの採用を決めたMicrosoftが、GoogleのA2A GitHubに、最近、投稿したものです。

このサンプルは、Multi Ai Agent の開発でのA2Aプロトコルの利用の紹介にもなっています。

【 基本的なコンポーネント 】

このMulti AI Agent のプログラムは、基本的には、次の三つのコンポーネントから構成されています。

 ・SemanticKernelTravelManager
 ・CurrencyExchangeAgent
 ・ActivityPlannerAgent

それぞれのコンポーネントの働きをみておきましょう

SemanticKernelTravelManagerは、ユーザーからのリクエストを受け取り、それを分析する中央のコーディネーターとして機能します。コンテキストに基づいて、これらのリクエストを専門のエージェントにインテリジェントにルーティングします。

たとえば、通貨関連のクエリは CurrencyExchangeAgent に直接送信され、観光の予定や旅程関連の要求は ActivityPlannerAgent に転送されます。

CurrencyExchangeAgentは、通貨関連のタスクを処理します。Frankfurter API などの外部 API ツールを統合し、リアルタイムの通貨為替レートを提供します。これらのデータソースを活用することで、エージェントは正確な予算編成と財務計画を実現します。

ActivityPlannerAgent は、ユーザーの好みや予算に応じて、カスタマイズされた旅程の提案、アクティビティ、イベント予約を提供し、パーソナライズされた旅行体験をキュレーションします。

【 タスクのルーティングと委任 】

Multi Agentの協調と統合が、どのように行われているのかを考える上では、次のことが重要だと思います。

それは、エージェントの中に、もっぱら「タスクのルーティングと委任」を行うエージェントが一つ存在するということです。

例えば、このサンプルでは、TravelManager がその役割を果たしています。このエージェントは、ユーザーからのリクエストのテキストから、そのリクエストを処理するのに最適なエージェントを決定して、その専門エージェントにタスクを動的にルーティングします。

言わずもがなの確認ですが、こうしたエージェントの振る舞いは、エージェントの中核にユーザーの意図を理解するAIが存在しているから初めて可能になっています。Multi AI Agent のプログラミングでは、プログラマは「タスクのルーティングと委任」を中心に、AIに対する「指示=instruction」を行います。

【 TravelManagerAgentへのinstructionの例 】

前回もみましたが、TravelManagerAgentへのinstructionは次のようなものです。

「あなたの役割は、旅行者のリクエストを慎重に分析し、問い合わせの詳細に応じて適切なエージェントに転送することです。
金銭の金額、為替レート、通貨換算、為替関連手数料、金融取引、または支払い方法に関するリクエストは、CurrencyExchangeAgent に転送してください。
旅行計画、観光スポットの推薦、食事の提案、イベント予約、旅程作成、または金銭取引を明示的に含まない旅行の体験的な側面に関するリクエストは、ActivityPlannerAgent に転送してください。
あなたの主な目標は、旅行者が正確で専門的な支援を迅速に受けられるよう、正確かつ効率的な業務の割り当てを行うことです。」

【 エージェントの発見と広告 】

Multi Agentの協調と統合を行うために重要なことがもう一つあります。

それは、エージェントの協調と統合を語るためにもその前提として、協調可能なエージェントが存在すること、あるいはそうしたエージェントをを発見する環境が存在することが必要だということです。

A2Aでは、自分がどのようなエージェントであるかをネットワーク上に広く伝えるために ”Agent Card”による「広告」という方法をとります。そのことによって、ある特定の能力を持つエージェントを効率的に発見する環境を保障しようとします。

【 このサンプルでの制御と情報の流れ 】

「100ドルで韓国旅行したいんだけど、観光プラン作って」というユーザのリクエストに対して、このエージェントがどう反応するか、制御と情報の流れをまとめてみました。

登場人物が多いので、次のような略称を使うことにします。

  Client は A2A Client
  Server は A2A Server
  TM は TravelManagerAgent 
  CE は CurrencyExchangeAgent (Plugin)
  AP は ActivityPlannerAgent (Plugin)
  API は Frankfurter API (Plugin)

この時、次のような流れでtaskと情報が流れていきます。AI Agent プログラミングでなくとも、同じような処理になると思います。

Client -> Server:  taskを送る ("100ドルで韓国旅行したい")
Server ->TM:  旅行の計画についての質問を転送する
TMは、リクエストを分析してtaskを他のエージェントに委任する
通貨交換のフロー
    TM -> CE: “$100 USD は韓国ウオンでいくら?”
        CE -> API: get_exchange_rate toolを呼び出す
        API -> CE: 交換レートを返す
        CE -> TM: 変換値を返す
活動計画のフロー
   TM -> AP: 予算 $100 での旅程
        AP -> TM: 推薦する旅程を返す
TM -> Server: 予算と旅程をまとめる
Server -> Client: Streaming: “旅行の計画を処理しています。(tool の呼び出し..)"
Server -> Client: Streaming: ”旅行の計画を組み立てています
Server -> Client: Artifact ...”: 予算の詳細を含んだ旅行計画
Server -> Client: Final status: “Task 終了"

【 サンプル・プログラムの実行について 】

このサンプルを自分のマシン上で実行するためには、実行環境を自分のマシン上に構築する必要があります。その手順は、次の資料を利用してください。

詳しい紹介は、スライドと動画を参照ください。

【 Model への Instruction という「作法」 】

ここで紹介したMulti AI Agentのプログラミングでは、すべてのエージェントに対して、LLMへのinstructionの提示が行われています。

こうしたスタイルは、A2AやMCPのGitHubでのサンプル・プログラムでも広く用いられています。システムの働きを理解する上でもそれは便利です。そのinstructionは、セキュリティー上の配慮からSystem Messageとして送られています。

こうしたプログラミング「作法」は、AIに対する最大の脅威とみなされている「Prompt Injection攻撃」に対して有効でしょうか? 別レポートで考えてみたので参照してください。
−−−−-−−−-−−−−-−−−−−−−−-

blog page
https://maruyama097.blogspot.com/2025/05/a2a-travel-agent.html

マルレク「ソフトウェア開発サイクルの変革と AI Agent の動向 」まとめページ 
https://www.marulabo.net/docs/sdlc/

マルレク「フトウェア開発サイクルの変革と AI Agent の動向 」のショートムービーの再生リスト
https://www.youtube.com/playlist?list=PLQIrJ0f9gMcNu1_67bfQT4URZLzb1k9Wh

ショートムービー「 A2A: Travel Agent サンプル 」のpdf
https://drive.google.com/file/d/1WhGS_6PX2gH8PaibNzDX3C9NLh8xLry9/view?usp=sharing

音声による概説「System Message instruction とセキュリティ」
https://www.marulabo.net/wp-content/uploads/2025/05/AI-Agent-System-Prompt-Security_-A-Critical-Analysis.mp3

ショートムービー「 A2A: Travel Agent サンプル 」
https://youtu.be/_ZCvvcFLBTI?list=PLQIrJ0f9gMcNu1_67bfQT4URZLzb1k9Wh

コメント

このブログの人気の投稿

初めにことばありき

密度行列とは何か?

宇宙の終わりと黒色矮星