エージェントループ:「単純なタスク」が 50K トークンになる理由
ファイルを読んで編集してテストを走らせるエージェントは通常 5〜20 ターン LLM を呼びます。各ターンで成長する全履歴が再送信され、トークン請求は二乗で増加します。
詳細な説明
二乗の罠
素朴なエージェントは毎ターン 会話履歴全体 を送ります。システムプロンプト 5,000 トークン、各ターンが 2,000 トークンのツール出力を追加する例:
| ターン | 累計入力トークン | ターンあたりコスト(GPT-4o) |
|---|---|---|
| 1 | 5,000 | $0.0125 |
| 2 | 7,000 | $0.0175 |
| 5 | 13,000 | $0.0325 |
| 10 | 23,000 | $0.0575 |
| 20 | 43,000 | $0.108 |
20ターンのエージェントループの入力トークン分だけで 約 $0.85(全ターンの合計)。出力トークン(約 $0.20)を加えると1タスクあたり $1.05 になります。1日10,000タスクで $10,500/日 — しかもこれはフロンティアモデル中最安の GPT-4o の話です。
素朴なエージェントが二乗になる理由
各ターンで新コンテンツが履歴に追加されます。LLM はコール間でメモリを持たないので履歴全体を再送する必要があります。N ターンで毎回 k トークン追加すると、総送信トークン数は N(N+1)·k/2 = O(N²k) です。
3つの対処法
積極的なキャッシュ:最初の 50K トークン(システムプロンプト + few-shot 例 + ツール定義)を Anthropic キャッシュに乗せれば、ターンあたりの読み込みコストは10分の1になります。エージェントループでのキャッシュヒット率は通常 70〜90% です。
会話の要約:10ターンごとに履歴を 500 トークンの要約に置き換えます。粒度を犠牲にしてトークン数を90%削減できます。
サブエージェントアーキテクチャ:各サブタスクに対して、関連コンテキストだけを持つフレッシュなエージェントを生成します。オーケストレーターの履歴は小さく保たれ、ワーカーエージェントは短命です。
ツール呼び出しのオーバーヘッド
各ツール呼び出しには次が加わります:
- システムプロンプト内のツール定義(ツールあたり 50〜200 トークン)。
- アシスタントメッセージ内の関数呼び出し JSON(50〜100 トークン)。
- 次のユーザーメッセージ内のツール結果(変動。ファイル読み込みでは膨大になる)。
20ツール定義しているのに1タスクで3つしか使わないなら、タスクタイプに応じた遅延ツール読み込みを検討してください。
ユースケース
エージェント製品を設計するとき、動作中のエージェントの想定より高い請求をデバッグするとき、要約やサブエージェント導入の判断をするときに使ってください。