限制大语言模型 API 令牌使用

llm-token-limit 策略通过将语言模型令牌的使用限制为指定速率(每分钟数)、指定时间段内或两者中的配额,来防止每个密钥的大规模语言模型(LLM)API 使用率峰值。 超过指定的令牌速率限制后,调用方会收到 429 Too Many Requests 响应状态代码。 超过指定的配额后,调用方会收到 403 Forbidden 响应状态代码。

注释

按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解 如何设置或编辑API Management策略

支持的模型 API

此策略适用于添加到符合以下 API 架构之一的 API 管理的 LLM API:

  • OpenAI 聊天补全或响应 API
  • Anthropic 消息 API (目前在 API 管理 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" />

特性

Attribute Description 必选 违约
counter-key 用于令牌限制策略的密钥。 对于每个键值,单个计数器用于配置策略的所有范围。 允许使用策略表达式。 是的 不适用
token-per-minute 每分钟提示和完成消耗的最大令牌数。 必须指定速率限制(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-minutetoken-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零),使用节中 outbound 的实际报告计数进行更新。 不适用

用法

使用注意事项

  • 每个策略定义可以多次使用此策略。
  • 该策略可选择在通过门户添加LLM API时进行配置。
  • 值或remaining-quota-tokens-variable-name是估计值remaining-quota-tokens-header-name,根据实际令牌消耗量可能大于预期值。 有关详细信息,请参阅 令牌计数和估计注意事项
  • API Management对策略中指定的每个 counter-key 值使用单个计数器。 在策略配置了此键值的所有作用域中,计数器都会更新。 如果要在不同的作用域(例如,特定 API 或产品)配置单独的计数器,请在不同的作用域指定不同的键值。 例如,将标识作用域的字符串追加到表达式的值。
  • 此策略在应用令牌的每个网关上独立跟踪令牌使用情况,包括多区域部署中的工作区网关和区域网关。 它不会在整个实例中聚合令牌计数。

令牌计数和估计的注意事项

策略使用 LLM 终结点返回的实际令牌使用情况数据监视并强制实施令牌限制。 可以选择启用提示令牌估算以减少不必要的后端请求。 以下注意事项适用。

  • 令牌类型:策略当前仅对提示和完成令牌进行计数。
  • 如果没有提示令牌估计estimate-prompt-tokens="false"):策略使用 LLM API 响应部分中的实际令牌使用值 usage 。 即使超出限制,也可能会向后端发送提示;从响应中检测到此情况,之后会阻止后续请求,直到限制重置为止。
  • 使用提示令牌估计estimate-prompt-tokens="true"):策略在发送请求之前会从 API 定义中的提示架构估算提示令牌。 这可以减少超出限制时不必要的后端请求,但可能会降低性能。
  • 流式处理:在 API 请求stream: true()中启用流式处理时,无论设置如何 estimate-prompt-tokens ,始终估计提示令牌。 当响应被流式传输时,将同时估计补全标记。
  • 映像输入:对于接受映像输入的模型,映像令牌通常由后端 LLM 计数,并包含在限制和配额计算中。 但是,启用或 estimate-prompt-tokens 设置为 true流式处理时,策略会将每个映像的计数上限为 1200 个令牌。
  • 并发:由于在从后端接收响应之前,无法确定使用的令牌的确切数量,因此并发或近并发请求可以暂时超过配置的令牌限制。 处理响应并超出限制后,将阻止后续请求,直到限制重置为止。
  • 剩余配额准确性:根据实际令牌消耗, remaining-quota-tokens-variable-name 返回的估计剩余令牌配额或 remaining-quota-tokens-header-name 可能大于预期,并且随着配额的临近而变得更加准确。

例子

令牌速率限制

在以下示例中,令牌速率限制为每分钟 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>

若要详细了解如何使用策略,请参阅: