# AIエージェントをソフトウェアに組み込むプラクティス
# Deadline & Budget Cascade|期限・予算のカスケード伝播
🎯 エージェントが再帰的にサブタスクを生成して、気づけばコストが数十ドルに。「請求事故」を構造的に防ぐ方法があります。
全体の予算と期限を末端ノードまで伝播させれば、各ノードが自分で打ち切り判断できます。
🔥 解決する課題
エージェントの呼出ツリーが深くなると、各ノードは自分がどれだけのリソースを消費してよいか分かりません。高コストなLLM呼び出しが再帰的に積み重なり、請求事故が起きます。計画-反省の自己ループでは、改善の見込みが薄くても無限にリトライを繰り返しえます。根本原因は「全体の予算と期限がローカルな判断に伝わっていない」ことです。
💡 提案パターン
Deadline & Budget Cascade(期限・予算のカスケード伝播)は、呼出ツリーのルートでdeadline(期限)とbudget(トークン・コスト・ステップ数の上限)を設定し、子タスクへ委譲するたびに残り枠を差し引いて伝播します。どの末端ノードでも「今の自分に残された時間・コスト」を知っており、枠を使い切る前に縮退・中断・部分結果返却に切り替えられます。deadlineは相対秒でなく絶対時刻で渡し、伝播時のズレを防ぎます。
✅ 選定条件
使うとき:
- エージェントがサブタスクを再帰的に生成、または複数ワーカーに並列委譲する
- 1リクエストのコストが予測困難で、上限を置かないと請求事故が起きうる
- タスク完了にSLAや期待値がある
使わないとき:
- 呼出ツリーが1段で完結し、タイムアウトだけで十分な場合
- バッチジョブなど時間制約がなくコストも固定的な場合
⚠️ 落とし穴
- deadlineは絶対時刻で渡すこと。相対秒を渡すと伝播のたびにズレが蓄積します(gRPCのgrpc-timeoutと同じ原則)
- 子に全予算を渡さず、予備枠(10〜20%)を親に残すこと。子の結果を集約・フォーマットする時間とコストが必要です
- 枯渇時の振る舞い(部分結果返却・人間エスカレーション・縮退モデル切替)を事前に決めておくこと。タイムアウト例外を投げるだけではUXが崩壊します
🔧 実装方針
- BudgetContextデータクラスにdeadline_at(絶対時刻)・max_cost_usd・max_steps・max_tokens・depth・max_depthを持たせ、呼出ツリーのルートで初期値を設定します
- 子タスクへの委譲時にchild_budgetメソッドで残り枠からfractionを掛けて分配し、伝播マージン(概ね2秒)を差し引きます。予備枠としてルート予算の10〜20%を親に残します
- 各ノードはis_exhaustedで残時間・残コスト・残ステップを確認し、枠を使い切る前に縮退・中断・部分結果返却に切り替えます
- 並列子タスクではコストは各子の合算、deadlineは最も遅い子で決まることに注意し、分配比率は子タスクの重要度と予測コストで按分します
- 予算消費率(consumed/limit比)をメトリクスとして観測し、閾値超過時にアラートを発火させる仕組みを組み込みます
#
AIエージェント# #
ソフトウェアアーキテクチャ#