该 llm-token-limit 策略通过将语言模型令牌的使用限制为指定速率(每分钟数)、指定时间段内或两者中的配额,来防止每个密钥的大规模语言模型(LLM)API 使用率峰值。 超过指定的令牌速率限制后,调用方会收到 429 Too Many Requests 响应状态代码。 超过指定的配额后,调用方会收到 403 Forbidden 响应状态代码。
通过依赖LLM端点返回的代币使用指标,策略监控并基于实际代币消耗来执行限制。 该策略还通过API Management提前启用对提示令牌的估计,在超出限制时将不必要的请求降到 LLM 后端。 然而,由于实际消耗的代币数量取决于提示长度和完成次数(根据请求而异),策略无法提前预测总代币消耗。 这种设计允许在多个请求同时处理时暂时超过令牌限制。
注释
按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解 如何设置或编辑API Management策略。
支持的模型
将策略与添加到Azure API Management的 LLM API 配合使用,这些 API 可通过 Azure AI 模型推理 API 或使用通过第三方推理提供程序提供的 OpenAI 兼容模型。
政策声明
<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 的长度。 该值必须是下列值之一:Hourly、Daily、Weekly、MonthlyYearly。 配额周期的开始时间计算为截断到该时间段所用的单位(小时、天等)的 UTC 时间戳。 |
必须指定速率限制(tokens-per-minute)、配额(token-quota 超过一个 token-quota-period)或两者。 |
不适用 |
| estimate-prompt-tokens | 确定是否估算提示所需的令牌数的布尔值: - true:根据 API 中的提示架构估算令牌数;可能会降低性能。 - false:不要估算提示令牌。 当设置为 false 时,每个 counter-key 的剩余令牌将根据模型响应中的实际令牌使用情况来计算。 这可能导致向模型发送超出令牌限制的提示。 在这种情况下,响应中会检测到这一点,所有后续请求都会被策略阻挡,直到令牌限制重置。 |
是的 | 不适用 |
| 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-tokens,则变量在管道的true部分中初始化为估算的令牌数,否则为零。 在outbound部分收到响应时,该变量会随报告的计数一起更新。 |
否 | 不适用 |
用法
使用注意事项
- 每个策略定义可以多次使用此策略。
- 该策略可选择在通过门户添加LLM API时进行配置。
- 如果可以将
estimate-prompt-tokens设置为false,则使用来自 LLM API 的响应的使用情况部分中的值来确定令牌使用情况。 - 当多个请求同时发送或略有延迟时,策略可能允许代币消耗超过配置限制。 这是因为策略无法确定具体消耗了多少令牌,直到后端收到响应。 一旦响应处理完毕且令牌限制超过,后续请求会被阻止,直到限制重置。
- 某些 LLM 终结点支持流式传输响应。 如果在 API 请求中将
stream设为true来启用流式处理,则无论estimate-prompt-tokens属性的值如何,都始终会估算提示令牌。 - 根据实际令牌消耗量,或为信息用途的估计值
remaining-quota-tokens-variable-nameremaining-quota-tokens-header-name,但可能大于预期值。 当接近配额时,该值更准确。 - 对于接受图像输入的模型,映像令牌通常由后端语言模型计数,并包含在限制和配额计算中。 但是,使用或
estimate-prompt-tokens设置为true流式处理时,策略当前会将每个图像的计数过度,最大计数为 1200 个令牌。 - API Management对策略中指定的每个
counter-key值使用单个计数器。 在策略配置了此键值的所有作用域中,计数器都会更新。 如果要在不同的作用域(例如,特定 API 或产品)配置单独的计数器,请在不同的作用域指定不同的键值。 例如,将标识作用域的字符串追加到表达式的值。 - 此策略在应用令牌的每个网关上独立跟踪令牌使用情况,包括多区域部署中的工作区网关和区域网关。 它不会在整个实例中聚合令牌计数。
例子
令牌速率限制
在以下示例中,令牌速率限制为每分钟 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>
相关策略
相关内容
若要详细了解如何使用策略,请参阅:
- 教程:转换和保护 API
- 策略参考,其中提供了策略语句及其设置的完整列表
- 策略表达式
- 设置或编辑策略
- 重复使用策略配置
- Policy 代码片段存储库
- Policy playground 存储库
- Azure API Management策略工具包