你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

适用范围:开发人员 | 基本 | 基本 v2 | 标准 | 标准 v2 | 高级 | 高级 v2

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

通过依赖LLM端点返回的代币使用指标,策略监控并基于实际代币消耗来执行限制。 该策略还允许API管理提前估算提示令牌,最大限度地减少对LLM后端的不必要请求,尤其是当限制已超过时。 然而,由于实际消耗的代币数量取决于提示长度和完成次数(根据请求而异),策略无法提前预测总代币消耗。 这种设计允许在多个请求同时处理时暂时超过令牌限制。

注意

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

支持的模型

将策略与添加到 Azure API 管理的 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" />

属性

属性 说明 需要 默认
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:不要估算提示令牌。

当设置为 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 如果backendestimate-prompt-tokens,则变量在管道的true部分中初始化为估算的令牌数,否则为零。 在outbound部分收到响应时,该变量会随报告的计数一起更新。 空值

使用情况

  • 策略节:入站
  • 策略范围:全局、工作区、产品、API、操作
  • 网关:经典、v2、自承载、工作区

使用注意事项

  • 每个策略定义可以多次使用此策略。
  • 该策略可选择在通过门户添加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 管理对策略中指定的每个 counter-key 值使用单个计数器。 在策略配置了此键值的所有作用域中,计数器都会更新。 如果要在不同的作用域(例如,特定 API 或产品)配置单独的计数器,请在不同的作用域指定不同的键值。 例如,将标识作用域的字符串追加到表达式的值。
  • v2层采用 令牌桶算法进行速率限制,这与经典层级的滑动窗口算法不同。 由于实现差异,当你在多个作用域配置 v2 层的令牌限制时,使用相同的 counter-key,确保 tokens-per-minute 该值在所有策略实例间保持一致。 数值不一致会导致不可预测的行为。
  • 此策略在应用令牌的每个网关上独立跟踪令牌使用情况,包括多区域部署中的工作区网关和区域网关。 它不会在整个实例中聚合令牌计数。

例子

令牌速率限制

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

有关使用策略的详细信息,请参阅: