大規模言語モデル API トークンの使用を制限する

適用対象: Developer | Basic | Basic v2 | Standard | Standard v2 | Premium | Premium v2

llm-token-limit ポリシーでは、言語モデル トークンの使用量を、指定したレート (1 分あたりの数)、指定した期間のクォータ、またはその両方に制限することで、キーごとに大規模な言語モデル (LLM) API の使用が急増しないようにします。 指定したトークン レート制限を超えると、呼び出し元は 429 Too Many Requests 応答状態コードを受け取ります。 指定したクォータを超えると、呼び出し元は 403 Forbidden 応答状態コードを受け取ります。

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 API Management ポリシーを設定または編集する方法について説明します。

サポートされているモデル API

このポリシーは、次のいずれかの API スキーマに準拠する API Management に追加された LLM API で動作します。

  • OpenAI チャットの完了または応答 API
  • Anthropic Messages API (現在、API Management v2 レベルでサポートされています)

ポリシー ステートメント

<llm-token-limit counter-key="key value"
        tokens-per-minute="number"
        token-quota="number"
        token-quota-period="Hourly | Daily | Weekly | Monthly | Yearly"
        estimate-prompt-tokens="true | false"    
        retry-after-header-name="custom header name, replaces default 'Retry-After'" 
        retry-after-variable-name="policy expression variable name"
        remaining-quota-tokens-header-name="header name"  
        remaining-quota-tokens-variable-name="policy expression variable name"
        remaining-tokens-header-name="header name"  
        remaining-tokens-variable-name="policy expression variable name"
        tokens-consumed-header-name="header name"
        tokens-consumed-variable-name="policy expression variable name" />

属性

属性 説明 必要 既定値
counter-key トークン制限ポリシーに使用するキー。 キー値ごとに、ポリシーが構成されているすべてのスコープに対して 1 つのカウンターが使用されます。 ポリシー式を使用できます。 はい 該当なし
tokens-per-minute 1 分あたりのプロンプトと入力候補によって消費されるトークンの最大数。 レート制限 (tokens-per-minute)、クォータ (token-quotaに対するtoken-quota-period)、またはその両方を指定する必要があります。 該当なし
token-quota token-quota-periodで指定された時間間隔中に許可されるトークンの最大数。 ポリシー式を使用できます。 レート制限 (tokens-per-minute)、クォータ (token-quotaに対するtoken-quota-period)、またはその両方を指定する必要があります。 該当なし
token-quota-period token-quotaがリセットされた後の固定ウィンドウの長さ。 値は、 HourlyDailyWeeklyMonthlyYearlyのいずれかである必要があります。 クォータ期間の開始時刻は、期間に使用された単位 (時間、日など) に切り捨てられた UTC タイムスタンプとして計算されます。 ポリシー式を使用できます。 レート制限 (tokens-per-minute)、クォータ (token-quotaに対するtoken-quota-period)、またはその両方を指定する必要があります。 該当なし
estimate-prompt-tokens プロンプトに必要なトークンの数を見積もるかどうかを決定するブール値。
- true: API のプロンプト スキーマに基づいて、プロンプト トークンを事前に見積もります。
- false: プロンプト トークンを見積もりません。モデルの応答から実際のトークン使用量を使用します。

トークンカウントと推定動作については、 トークン数と推定に関する考慮事項を参照してください。
はい 該当なし
retry-after-header-name 指定した tokens-per-minute または token-quota を超えた後の推奨される再試行間隔を秒単位で指定したカスタム応答ヘッダーの名前。 ポリシー式は使用できません。 いいえ Retry-After
retry-after-variable-name 指定した tokens-per-minute または token-quota を超えた後の推奨される再試行間隔を秒単位で格納する変数の名前。 ポリシー式は使用できません。 いいえ 該当なし
remaining-quota-tokens-header-name 各ポリシーの実行後の値が、token-quotaで許可されるtoken-quota-periodに対応する残りのトークンの推定数である応答ヘッダーの名前。 ポリシー式は使用できません。 いいえ 該当なし
remaining-quota-tokens-variable-name 各ポリシーの実行後に、token-quotaで許可されるtoken-quota-periodに対応する残りのトークンの推定数を格納する変数の名前。 ポリシー式は使用できません。 いいえ 該当なし
remaining-tokens-header-name 各ポリシーの実行後の値が、時間間隔で許可される tokens-per-minute に対応する残りのトークンの数である応答ヘッダーの名前。 ポリシー式は使用できません。 いいえ 該当なし
remaining-tokens-variable-name 各ポリシーの実行後に、時間間隔で許可される tokens-per-minute に対応する残りのトークンの数を格納する変数の名前。 ポリシー式は使用できません。 いいえ 該当なし
tokens-consumed-header-name 値がプロンプトと入力候補の両方で使用されるトークンの数である応答ヘッダーの名前。 ヘッダーは、バックエンドから応答を受信した後にのみ応答に追加されます。 ポリシー式は使用できません。 いいえ 該当なし
tokens-consumed-variable-name backend セクションの推定プロンプト トークン数に初期化された変数の名前 (estimate-prompt-tokensfalseの場合は 0) が、outbound セクションの実際の報告数で更新されます。 いいえ 該当なし

使用法

使用上の注意

  • このポリシーは、ポリシー定義ごとに複数回使用できます。
  • このポリシーは、ポータルを使ってLLM APIを追加する際にオプションで設定できます。
  • remaining-quota-tokens-variable-nameまたはremaining-quota-tokens-header-nameの値は見積もりであり、実際のトークン消費量に基づいて予想よりも大きくなる可能性があります。 詳細については、「 トークン数と推定に関する考慮事項」を参照してください。
  • API Management では、ポリシーで指定した counter-key 値ごとに 1 つのカウンターが使用されます。 このカウンターは、ポリシーがそのキー値で構成されているすべてのスコープで更新されます。 異なるスコープ (特定の API や製品など) で個別のカウンターを構成する場合は、異なるスコープで異なるキー値を指定します。 たとえば、式の値にスコープを識別する文字列を追加します。
  • v2 レベルでは、レート制限に トークン バケット アルゴリズム が使用されます。これは、従来のレベルの スライディング ウィンドウ アルゴリズム とは異なります。 この実装の違いから、同じ counter-keyを使って複数のスコープでv2ティアのトークン制限を設定する際は、すべてのポリシーインスタンスで tokens-per-minute 値が一貫していることを確認しましょう。 不安定な値は予測不能な挙動を引き起こすことがあります。 詳細については、「 Azure API Management
  • このポリシーは、複数リージョンデプロイのワークスペース ゲートウェイやリージョン ゲートウェイなど、適用される各ゲートウェイでトークンの使用状況を個別に追跡します。 インスタンス全体のトークン数は集計されません。

トークン数と推定に関する考慮事項

このポリシーは、LLM エンドポイントから返された実際のトークン使用状況データを使用してトークン制限を監視し、適用します。 必要に応じて、プロンプト トークンの見積もりを有効にして、不要なバックエンド要求を減らすことができます。 次の考慮事項が適用されます。

  • トークンの種類: 現在、ポリシーはプロンプト トークンと完了トークンのみをカウントします。
  • プロンプト トークン推定なし (estimate-prompt-tokens="false"): このポリシーでは、LLM API 応答の usage セクションの実際のトークン使用量の値が使用されます。 制限を超えた場合でも、バックエンドにプロンプトが送信される場合があります。これは応答から検出され、その後、制限がリセットされるまで後続の要求がブロックされます。
  • プロンプト トークン推定 (estimate-prompt-tokens="true"): ポリシーは、要求を送信する前に、API 定義のプロンプト スキーマからプロンプト トークンを見積もります。 これにより、制限を既に超えた場合に不要なバックエンド要求を減らすことができますが、パフォーマンスが低下する可能性があります。
  • ストリーミング: API 要求 (stream: true) でストリーミングが有効になっている場合、プロンプト トークンは、 estimate-prompt-tokens 設定に関係なく常に推定されます。 応答がストリーミングされる場合、完了トークンも推定されます。
  • 画像入力: 画像入力を受け入れるモデルの場合、イメージ トークンは通常、バックエンド LLM によってカウントされ、制限とクォータの計算に含まれます。 ただし、ストリーミングが有効になっているか、 estimate-prompt-tokenstrueに設定されている場合、ポリシーは各イメージを最大 1200 トークンとして超過します。
  • コンカレンシー: 使用されるトークンの正確な数はバックエンドから応答を受信するまで決定できないため、同時またはほぼ同時の要求が構成されたトークンの制限を一時的に超える可能性があります。 応答が処理され、制限を超えると、制限がリセットされるまで後続の要求はブロックされます。
  • 残りのクォータの精度: remaining-quota-tokens-variable-name または remaining-quota-tokens-header-name で返される推定残りのトークン クォータは、実際のトークン使用量に基づいて予想よりも大きくなる可能性があり、クォータに近づくにつれてより正確になります。

例示

トークン レートの制限

次の例では、1 分あたり 5000 のトークン レート制限が呼び出し元の IP アドレスによってキー設定されます。 このポリシーでは、プロンプトに必要なトークンの数は見積もられません。 各ポリシーの実行後、その期間中にその呼び出し元 IP アドレスに対して許可されている残りのトークンが remainingTokens 変数に格納されます。

<policies>
    <inbound>
        <base />
        <llm-token-limit
            counter-key="@(context.Request.IpAddress)"
            tokens-per-minute="5000" estimate-prompt-tokens="false" remaining-tokens-variable-name="remainingTokens" />
    </inbound>
    <outbound>
        <base />
    </outbound>
</policies>

トークン クォータ

次の例では、10000 のトークン クォータがサブスクリプション ID によってキー設定され、毎月リセットされます。 各ポリシーの実行後、期間内にそのサブスクリプション ID に対して許可される残りのトークンの数は、変数 remainingQuotaTokensに格納されます。

<policies>
    <inbound>
        <base />
        <llm-token-limit
            counter-key="@(context.Subscription.Id)"
            token-quota="100000" token-quota-period="Monthly" remaining-quota-tokens-variable-name="remainingQuotaTokens" />
    </inbound>
    <outbound>
        <base />
    </outbound>
</policies>

ポリシーに対する処理の詳細については、次のトピックを参照してください。