>100 Views
November 13, 26
スライド概要
Azure初心者がAIエージェントの レートリミットに振り回された話 AI エージェント API Management トークン制限
自己紹介 はやと Azure初心者がAIエージェントのレートリミットに振り回された話 Azure 歴 1 年目(まだまだ初心者です) 普段の仕事 インフラエンジニア 最近 子どもが生まれて、パパをしています X @Mip9L 2
きっかけ:社内検証で出てきた「エージェントごとの上限」 議題に上がった要件 よくある構成 エージェント A 1 FAQ 回答 エージェント単位で上限を分けたい 1つの暴走で他のエージェントを止めたくない モデル エージェント B 社内検索 デプロイ 2 上限を超えて使わせたくない コスト・クォータを確実に守りたい エージェント C 長文 + Web検索 3 Foundry 側は変えずに入れたい エージェントの定義や実装には手を入れない C が使いすぎると、A・B も巻き込まれる A zu re初心者がA Iエージェントのレートリミットに振り回された話 3
確認①:デプロイしたモデルで制限する(TPM) 検証:gpt-5.4-nano に TPM 1,000 を設定 10,585 単位 モデルのデプロイ単位。使うエージェント全員で共有 期間 1 分あたり(TPM / RPM) 判定 受付時点の残量で判定。消費は応答後に実績で加算 超過時 超えた“次の”リクエストから 429 で拒否 1 回で消費したトークン(上限の約 10 倍) 1 回目 上限を超えても最後まで回答 2 回目 429 rate_limit_exceeded 課題 エージェント単位にできない / 1 回分の消費は途中で止まらず大きく超える Azure初心者がAIエージェントのレートリミットに振り回された話 4
確認②:Foundry の AI Gateway で制限する Foundry の管理画面 AI Gateway を追加 プロジェクトに制限を設定 管理 > AI ゲートウェイ 裏側は APIM TPM 500 / クォータ 1,000 / 時 検証:クォータ 1,000 / 時 のプロジェクト 検証で分かったこと 6,431 • ポータルから手軽に設定できる(裏側は APIM) 1 回の応答で消費したトークン。クォータを大きく 超えても止まらなかった • 消費は応答後に加算。1 回の応答で上限を超えてしまう A zu re初心者がA Iエージェントのレートリミットに振り回された話 • 設定できる単位はプロジェクト(× モデルのデプロイ)。エ ージェント単位ではない 5
3 つの方法を比べると デプロイの TPM 制限 Foundry AI Gateway APIM カスタムポリシー(今回) モデル(デプロイ) プロジェクト × デプロイ エージェント 1分 1分/時〜年 任意(今回は 1 時間) 超過の防ぎ方 受付時の残量のみ確認 受付時の残量のみ確認 出力上限を残量内に書き換え 検証での超過 上限 1,000 に 10,585 上限 1,000 に 6,431 超過 0(上限内で停止) 導入の手軽さ ◎ ◎ 制限の単位 期間 △ ポリシーを記述 ※ 手軽さと引き換えに、エージェント単位で「1 回でも超えない」厳密さを取りに行ったのが今回の方法 Azure初心者がAIエージェントのレートリミットに振り回された話 6
仕組み:出力上限を「残り − 予測入力」に書き換える リクエスト受信時(APIM) 送信時 モデル 応答時 ① ② ③ ④ ⑤ ⑥ 残りを調べる 入力を予測 不足なら拒否 上限を書き換え 上限で停止 実績で更新 エージェントごとの 残り 前回の実績 × 1.1 モデルに送らず 403 max_output_tokens モデル側が 生成を止める usage を即時記録 出力上限 = 残り − 予測入力 → 入力 + 出力 ≦ 残り プロンプトエージェントを本文の agent_reference.name で識別。判定はすべて APIM の中で完結し、Foundry 側の設定は変えない A zu re初心者がA Iエージェントのレートリミットに振り回された話 7
どこが実績値で、どこが予測値か 実績値 実績値 予測値 出力トークン 消費後の残り 入力トークン モデル側が生成中に数え、 上限に達した時点で止まる 応答の usage で即時に更新 (実際の入力+出力) 前回の実際の入力 × 1.1 で見積もる(初回は設定値) max_output_tokens の働き APIM が後から切っているのではない llm-token-limit の反映遅れもすり抜 けない 入力はモデルが最初にまとめて読むた め途中で止められない ポイント 予測するのは入力だけ。しかも“前回の実績”なので、誤差は入力の差分に限られる Azure初心者がAIエージェントのレートリミットに振り回された話 8
検証①:出力上限ぴったりで生成が止まる test-agent(クォータ 12,000 / 時)に同じ長文の質問を 4 回送信 トークン消費(入力+出力) 1,371 = 1,371 APIM が書き換えた 出力上限 6,171 5,423 モデルの 実際の出力トークン 1 回目(最後まで回答) 出力上限の計算 残り 5,829 − 予測入力 4,458 #1 #2 2 回目(上限で停止) #3 残り #4 status incomplete 200 200 403 403 reason max_output_tokens 成功 上限で停止 拒否 拒否 出力 2,119 出力 1,371 消費 0 消費 0 消費後の残り 406(マイナスにならない) A zu re初心者がA Iエージェントのレートリミットに振り回された話 9
検証②:上限に達したらモデルに送らず拒否
test-agent1(クォータ 200 / 時)に「フランスの首都は?」を 4 回送信
リクエスト #1
リクエスト #2
リクエスト #3
リクエスト #4
200 成功
200 成功
403 拒否
403 拒否
残り 200 → 125
残り 125 → 50
残り 50 のまま
残り 50 のまま
入力 60 + 出力 15
入力 60 + 出力 15
残り 50 < 予測入力 66
以降も拒否が続く
ここがポイント
• 残りが「予測入力 + 最小出力 16」に足りない
時点で拒否
• モデルに届かないので usage なし = 消費 0
• 事後加算の方式では通ってしまう“上限超えの 1
回”を止められる
Azure初心者がAIエージェントのレートリミットに振り回された話
HTTP/1.1 403 Agent Token Quota Reached
x-agent-token-quota: 200
x-remaining-before-tokens: 50
x-predicted-input-tokens: 66
x-tokens-consumed: 0
{"error": {"code": "AgentTokenQuotaReached", ...}}
10
結果:どのエージェントもクォータを超えなかった クォータに対する消費トークン(入力+出力) test-agent 超過 0 件 11,594 3 エージェント・全 12 リクエスト test-agent1 test-agent2 150 50 8,182 消費 未使用 A zu re初心者がA Iエージェントのレートリミットに振り回された話 1,818 test-agent 11,594 / 12,000 test-agent1 150 / 200 test-agent2 8,182 / 10,000 11
制約と注意点 ! 入力の予測ずれ分は超過しうる ! web_search の結果などは実行するまで分からな い。倍率 1.1 を上げれば安全側(ただし早めに止 まる) ! ストリーミングは即時更新なし usage を記録できないため、llm-token-limit 側の 推定値による集計のみになる Azure初心者がAIエージェントのレートリミットに振り回された話 推論トークンも出力上限に含まれる 上限が小さいと推論だけで上限に達し、回答本文 が空になることがある ! カウンターはゲートウェイ単位 複数リージョン・複数ユニットに広げると厳密さ が下がる。同じエージェントの同時実行は 1 件に 制限 12
まとめ 1 エージェント単位で制限できる agent_reference.name で識別し、Foundry 側は変更なし 2 実績値でピッタリ止められる 出力上限を「残り − 予測入力」に書き換え、モデル側が上限で止まる 3 足りなければ送らない 最後の 1 回もモデルに届かず 403、消費 0 使い分け 全体の流量 → デプロイの TPM / プロジェクト単位 → AI Gateway / エージェント単位 → APIM ポリシー A zu re初心者がA Iエージェントのレートリミットに振り回された話 13
ご清聴ありがとうございました