🤖

Agent Development Kit 1.10.0 で追加された ツールの並列実行

に公開

こんにちは、サントリーこと大橋です。

2025/08/08にAgent Development Kit(以降ADK) 1.10.0がリリースされました。

https://github.com/google/adk-python/releases/tag/v1.10.0

最近は毎週金曜日にリリースされていますね。
今回のリリースで追加された主な機能は以下です。

  • ライブセッション(Live Session)の復帰
  • 並列ツール実行

他にもバグフィックスや細々した機能追加やドキュメントの改善が行われています。
今回はこの中でパフォーマンスに関わる「並列ツール実行」について書いていきたいと思います。

課題: 従来のツール実行処理

これまでのADKのAgentがFunction Calling(ツールの呼び出し)を行う場合、ツール内部で並列化していない限り、ツールの呼び出しは順次処理で行われていました。

例えば「天気の取得ツール(def get_weather(city: str) -> str)」を使えるAgentがあり、そのAgentに「東京とLAとパリの天気を取得して」と依頼した場合、Agentは天気ツールを順次処理で3回呼び出しており、例えば、天気ツールの呼び出しに1回2秒かかると仮定すると、合計で 2秒 × 3回 = 6秒 の処理時間が必要でした。

例: 天気と現在時刻の取得Agent
ADK 1.9.0で以下のコードを試してみます。

❯ uv run adk --version
adk, version 1.9.0
import asyncio
import datetime
import time

from google.adk.agents.llm_agent import Agent
from google.adk.tools import ToolContext

async def get_current_time() -> str:
    await asyncio.sleep(2)
    return datetime.datetime.now().isoformat()


async def get_weather(city: str, tool_context: ToolContext) -> dict:
    """Get the current weather for a city.

    Args:
      city: The name of the city to get weather for. It should be alphanumeric words like New York, London, Tokyo, San Francisco, Paris, Sydney.


    Returns:
      A dictionary with weather information.
    """
    # Simulate some async processing time (non-blocking)
    await asyncio.sleep(2)

    # Mock weather data
    weather_data = {
        'New York': {'temp': 72, 'condition': 'sunny', 'humidity': 45},
        'London': {'temp': 60, 'condition': 'cloudy', 'humidity': 80},
        'Tokyo': {'temp': 68, 'condition': 'rainy', 'humidity': 90},
        'San Francisco': {'temp': 65, 'condition': 'foggy', 'humidity': 85},
        'Paris': {'temp': 58, 'condition': 'overcast', 'humidity': 70},
        'Sydney': {'temp': 75, 'condition': 'sunny', 'humidity': 60},
    }

    result = weather_data.get(
        city,
        {
            'temp': 70,
            'condition': 'unknown',
            'humidity': 50,
            'note': (
                f'Weather data not available for {city}, showing default values'
            ),
        },
    )

    # Store in context for testing thread safety
    if 'weather_requests' not in tool_context.state:
        tool_context.state['weather_requests'] = []
    tool_context.state['weather_requests'].append(
        {'city': city, 'timestamp': time.time(), 'result': result}
    )

    return {
        'city': city,
        'temperature': result['temp'],
        'condition': result['condition'],
        'humidity': result['humidity'],
        **({'note': result['note']} if 'note' in result else {}),
    }

root_agent = Agent(
    model='gemini-2.5-flash',
    name='root_agent',
    description='A helpful assistant for user questions.',
    instruction="""
    あなたは有能なAIエージェントです。ユーザーの質問に答えてください。
    
    ユーザーが天気に関する質問をしたら get_weather ツールを用いて返答してください。
    ユーザーが時間に関する質問をしたら get_current_time ツールを用いて返答してください。
    """,
    tools=[get_weather, get_current_time],
)

実行結果:

上記のように、Agentに複数の処理を一度に依頼しても、get_current_timeget_weatherを順次呼び出しており、処理に時間がかかっています。

天気の取得に関してはLLMからのレスポンスを見ると、1つのレスポンスで東京とパリのツール呼び出しを行うように返却していますが、ADK 1.9.0ではこの形式に対応していなかったため、結果的にツールを一つずつ順次呼び出していました。

並列ツール実行

今回のリリースではこの問題を解決するために、Agentが複数のツールを同時に並列実行できるようになりました。
上記のAgentを、コードは修正せずにADK 1.10.0で動かしてみましょう。

❯ uv run adk --version
adk, version 1.10.0
❯ uv run adk web --reload_agents .

実行結果:

実行ログのTraceから、ツールの呼び出し方が並列処理に変わったことが分かります。
これにより、処理時間が大幅に短縮されました。

注意点

注意点1: ツールは async 関数で作成する

本機能を利用するためにはツール関数をasync関数にする必要があります。
例えば、現在時刻を取得するような単純なツールは、つい同期(sync)関数で実装してしまいがちです。本機能の恩恵を受けるには、並列実行したいツールを非同期(async)で定義することを忘れないようにしましょう。

注意点2: プロンプトで並列実行を促す

今回1.9.0と1.10.0でプロンプトを変更せずに実行しましたが、
LLMがツールを並列実行するかどうかは、プロンプトに依存します。
実際にADK 1.10.0に更新したとしても、プロンプトがそのままの場合は並列実行されない(LLMがツールの同時実行を指定してこない)場合があります。

本リリースに伴うADKのサンプルコードでは、Agentに対して並列実行するようにプロンプトを調整しているため、ツールの並列実行を最大限に活用するには、プロンプトでその旨を明確に指示することをお勧めします。

https://github.com/google/adk-python/commit/90b9193a20499b8dd7f57d119cda4c534fcfda10#diff-7c095dad919645353464939cfc7df13277bc2015ef8c144f80dd2dc940bf93a5R225-R238

まとめ

今回は ADK 1.10.0でサポートされた「ツールの並列実行」について解説しました。
Agentを開発する上で、LLMの呼び出しはボトルネックになりがちです。LLMの呼び出し回数の削減や、今回のようなツール実行の高速化は、ユーザーエクスペリエンス(UX)の向上に大きく貢献します。

せっかく良いAgentを作っても、めっちゃ待つAgentは使いづらいですよね。
今回のアップデートは、このような応答速度の課題に対して非常に有効です。
プロンプトの書き方にも依存してくるので、意識してプロンプトを作成していくと良いと思います。


お知らせ/宣伝

先日、ADKユーザー向けのイベント「ADK UG #0」が開催され、ADK開発者が集う日本語のDiscordコミュニティが誕生しました。ADKに関する情報交換や議論に興味がある方は、ぜひご参加ください!

https://discord.gg/BKpGRzjtqZ

また、ADKの最新のコミットログやリリースノートを分かりやすく解説するPodcastを、月・水・金に配信しています。ADKの動向を追いかけたい方は、ぜひ聴いてみてください。

https://www.youtube.com/playlist?list=PL0Zc2RFDZsM_MkHOzWNJpaT4EH5fQxA8n

Discussion