# ADK 2.0の便利だけど知られていない機能
🌍 エージェントのツール実行が遅いと感じたことはありませんか?並列実行で劇的に高速化できるかもしれません。
ADK 2.0(v1.10.0以降)では、複数のファンクションツールを並列に実行する仕組みが提供されています。async関数の活用、CPU集約処理のオフロード、プロンプト最適化を組み合わせることで、ツール実行のパフォーマンスを大幅に向上させられます。
📌 タイトル:ツールパフォーマンス最適化
🔗 URL:
🧩 概要
ADK 2.0のパフォーマンス最適化は、ファンクションツールの並列実行を中心とした機能です。v1.10.0以降で利用可能で、ツール関数を `async def` で定義することが前提となります。長時間ループ内では `asyncio.sleep(0)` でyieldし、CPU集約的な処理には `ThreadPoolExecutor` を使用します。さらに、プロンプトに「常に関数を並列で呼び出すこと」と指示を加えることで、LLMが積極的に並列呼び出しを行うよう誘導できます。
🛠 使い方
ツール関数は `async def` で定義し、I/O待ちの処理を並列化します。
```python
import asyncio
from concurrent.futures import ThreadPoolExecutor
async def fetch_data(url: str) -> str:
"""データを取得する(並列実行対応)"""
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
# CPU集約処理はThreadPoolExecutorにオフロード
executor = ThreadPoolExecutor(max_workers=4)
async def heavy_computation(data: str) -> str:
loop = asyncio.get_event_loop()
result = await process_data, data)
return result
```
長時間ループでは `asyncio.sleep(0)` を挟んでイベントループに制御を返します。また、大量データはチャンクに分割して処理します。エージェントのプロンプトにも「always call functions in parallel」と明示し、ツールのdescriptionに並列実行のヒントを含めると効果的です。
🏗 本番システムへの組み込み方
・すべてのツール関数を `async def` で定義し、同期的なブロッキング呼び出しを排除する
・CPU集約処理は `ThreadPoolExecutor` で別スレッドにオフロードし、イベントループをブロックしない
・大量データ処理はチャンク分割して段階的に処理する
・エージェントのシステムプロンプトに並列呼び出しの指示を含め、ツールのdescriptionにも並列実行可能である旨を記載する
💡 ユースケース
🔍 複数のAPIエンドポイントに同時リクエストして結果を集約する
📊 大量のデータセットをチャンク分割して並列に分析する
🌐 複数言語への翻訳を同時に実行する
📁 複数ファイルの読み込みと前処理を並列化する
⚠️ 注意点
並列実行にはツール関数を `async def` で定義することが必須です。同期関数では並列化の恩恵を受けられません。また、`ThreadPoolExecutor` のワーカー数はリソースに応じて適切に設定し、過剰な並列度によるメモリ枯渇やレートリミット超過に注意してください。プロンプトによる並列呼び出しの誘導はLLMの判断に依存するため、必ず並列化される保証はありません。
✨ async関数とプロンプト最適化の組み合わせにより、エージェントのツール実行速度を劇的に改善できます。I/O待ちが多いワークフローでは特に効果を発揮します。
#
ADK# #
AIAgent#