はじめに

ADK(Agent Development Kit)を使った、ルートエージェントと複数のサブエージェントで構成されるマルチエージェントを構築中に、サブエージェントから異なる種類のツールを使用すると、「400 INVALID_ARGUMENT」エラーが発生しました。
その対処方法と、Sub AgentAgentTool の違いを整理したいと思います。

具体的な事象

上記構成の中で、あるサブエージェントにツールとして”VertexAiSearchTool”を使用した場合に、「400 INVALID_ARGUMENT」エラーが発生しました。
https://github.com/google/adk-python/issues/899 と同じ事象)

その際、以下のようなエラーログが出力されました。

{‘error’: {‘code’: 400, ‘message’: ‘Multiple tools are supported only when they are all search tools.’, ‘status’: ‘INVALID_ARGUMENT’}}

SDKの制限として、組み込みツール(Built-in tools:Google SearchVertex AI Searchなど)とカスタム関数(FunctionDeclaration tools)が共存できない問題があるということでした。

対処方法

“VertexAiSearchTool”を使ったサブエージェントを”AgentTool()”関数を使ってTool化することで、問題が解決しました。
ただし弊害として、AgentTool化することにより ADK Webを使った Event 情報の確認ができなくなります。(こちらはプロンプトの出力の調整で、一部は確認できるようになります)

ADK における Sub AgentAgentTool の違い

Sub AgentAgentTool は、どちらも「あるエージェントが別のエージェントに仕事を依頼する」仕組みであり、メインのエージェントが解決できないタスクを別のエージェントに委譲し、解決するために使います。
一方、「連携の深さ」と「コンテキスト(文脈)の共有」に違いがあります。
特徴について、簡単にまとめます。

特徴 Sub Agent AgentTool
役割のイメージ チームメンバー、部下 外部の専門家(外部ツール)
コンテキスト 親エージェントと履歴や状態を共有する 独立したセッションで実行される(渡された情報だけで動く)
ステート ステートフル ステートレス
結合度 密結合 疎結合
主な用途 複雑な会話、一連の推論が必要なタスク 明確なタスク実行、単発の計算、検索

使い分けのポイント

ざっくりとですが、使い分けのポイントをまとめます。

Sub Agent

  • 「会話の続き」として処理したい
    ユーザーとの対話の文脈(以前の発言内容など)を知っている必要がある場合。
  • 複雑な手順を丸投げしたい
    単なる入出力だけでなく、そのエージェント自身がさらにユーザーに質問を返したり、思考プロセスを回したりする必要がある場合

AgentTool

  • 機能としてカプセル化したい
    「入力」さえあれば、誰から呼ばれても同じ仕事ができる場合。
  • 副作用を閉じ込めたい
    親エージェントの会話履歴への影響を与えず、結果だけが欲しい場合。
  • 他のツールと同じように扱いたい
    LLMに「道具」として選ばせたい場合。

さいごに

今回は AgentTool で目的の機能を作ることができましたが、ユースケースによっては難しい課題かもしれません。ただし、今回発生したエラー事象は、将来的には改修される可能性はありますので、最新情報をご確認いただければと思います。