8月7日、Vinod Chuganiが「Identifying Token Costs Hiding in Your Agentic Loop」と題した記事を公開した。この記事では、AIエージェントのループ処理で発生するトークンコストの増大パターンと、その対策となるアーキテクチャ手法について詳しく紹介されている。
LLMのAPIコールは1回あたりのコストが小さく見える。しかし、エージェントが自律的にツールを呼び出し、結果を読み取り、次のアクションを決定する「エージェントループ」では、トークンコストは線形には増加しない。複利的に膨れ上がる。 単純な実装ミスで、0.05ドルで済むはずのタスクが5.00ドルの無限ループに化けることがある。
その根本原因は、「状態(State)」と「コンテキスト(Context)」を混同することだ。Stateはタスクを前進させるために必要な最小限の情報、Contextはこれまでのすべてのやり取りの完全な記録である。多くのエージェントフレームワークはデフォルトでこの2つを区別せず、あらゆるメッセージを単一の配列に追記し続ける。
本記事はこの問題を「5つのコストトラップ」として整理している。
トラップ1:コンテキストの累積蓄積
最も影響が大きく、最初に潰すべき問題がこれだ。
20ステップのワークフローがある場合、ステップ20のLLMコールにはステップ1〜19の全履歴が含まれる。Transformerの注意機構(アテンション)はシーケンス長に対して二乗的にスケールするアーキテクチャ上の特性を持つため、会話履歴をそのまま積み上げ続けるとコストが急増する。これはモデルが過去のトークンを何度も「読み直す」構造に起因する必然だ。
対策はコンテキスト圧縮(Context Compaction)だ。過去のターンを密なローリングサマリーに集約するか、KVキャッシュ(プロンプトキャッシング)を使って前半のプレフィックスを固定し、差分トークンだけに課金される状態を作る。
ただし圧縮しすぎると「コンテキスト健忘」が起きる。ステップ2で取得した重要なパラメータをエージェントが忘れ、ステップ8でハルシネーションした値で穴埋めし、下流のツール呼び出しが連鎖的に失敗する。5ターンを超えるワークフロー、または高レイテンシなAPIと連携するケースには必ず適用すべき対策だ。
トラップ2:失敗状態を引きずるリトライループ
ツール呼び出しが失敗したとき(例:400 Bad Request)、標準的なReActループはエラートレースをコンテキストに追記してモデルに修正を依頼する。エージェントがスタックすると、リトライのたびに過去の失敗履歴すべてが送信される。
対策はオーケストレータ層へのサーキットブレーカーの実装だ。失敗した軌跡をStateから剥ぎ取り、「ToolXがパラメータYの欠落で失敗した」という決定論的な「失敗ヒューリスティック」だけを注入して再提示する。生のスタックトレースをそのまま渡してはいけない。
トラップ3:フィルタされていないツールペイロード
エージェントがDBや外部APIをクエリした結果の巨大なJSONをそのままコンテキストに投げ込む実装は多い。メタデータ、nullフィールド、ボイラープレートが大量のトークンを消費する。
対策は決定論的な抽出レイヤー(jq、正規表現フィルタ、専用パーサー)を経由させることだ。コンテキストに入れるのは、エージェントが次のステップで実際に必要とするスキーマ検証済みのキーバリューペアのみに絞る。
※編集部の考察:抽出レイヤーが必要なフィールドを誤って削除すると、エージェントはその値をハルシネーションで補完し、その値がDBに書き込まれるリスクがある。フィルタリングロジックのテストは慎重に行う必要がある。
トラップ4:モノリシックなモデルルーティング
すべてのステップで最高性能(=最高価格)のモデルを使うのは無駄だ。エージェントワークフローはタスクの複雑さが異なるノードの集合体であり、JSONフォーマットやインテント分類のような単純タスクには、LlamaやGPT-4o-miniなどの小型モデルを動的にルーティングすることでコストを大幅に削減できる。
ただし、モデルの切り替えはVRAMへのロードや新しいプロバイダー接続のオーバーヘッドを伴うため、レイテンシが節約コストを上回るケースもある。高スループットのマルチエージェントシステムで、決定論的なデータ変換ノードが明確に分離されている場合に効果が出る。
トラップ5:静的なシステムプロンプトの重複
5,000トークンの巨大なシステムプロンプト(20個のツール定義を含む)を、関係のないステップのAPIコールにも毎回注入するのは典型的な無駄だ。
対策は動的プロンプト構築だ。オーケストレータがベクターインデックスか軽量ルールエンジンで利用可能なツールを管理し、現在のステップに必要なツール定義と制約だけを実行時に注入する。
※編集部の考察:ルックアップクエリが信頼できないユーザー入力の影響を受ける場合、プロンプトインジェクション攻撃のリスクがある。ツール定義が改ざんされて実行される可能性を考慮した設計が必要だ。
本番運用での追加コスト
5つのトラップを潰した後にも、長期運用での落とし穴がある。本番100日目には、エージェントの軌跡データをObservabilityやクラッシュリカバリ目的で保存するストレージコストが膨らみ、クエリレイテンシも劣化する。セッション状態への積極的なTTL設定と、長期監査ログのコールドストレージアーカイブを組み合わせて、運用DBにはアクティブな高優先度の状態のみを保持する設計が必要だ。
「コンテキストを無制限のリソースとして扱うこと」が5つのトラップに共通する根本原因だ。APIプロバイダーの値下げを待つのではなく、オーケストレーション層の設計段階からコンテキストを制約のある揮発性リソースとして扱う必要がある。
詳細はIdentifying Token Costs Hiding in Your Agentic Loopを参照していただきたい。