跳到主要内容
版本:3.9.x

使用基于 Token 的限流控制 AI 成本

本指南介绍如何使用 ai-rate-limiting 插件对大语言模型流量实施基于 Token 的限流,包括按路由和模型实例设置 Token 预算。

概览

传统的基于请求的限流不足以治理大语言模型流量:根据提示词和响应的不同,单个请求可能消耗 10 到 100,000 个 Token。基于 Token 的限流根据实际 Token 消耗分配预算,从而控制成本。

前置条件

  • 安装 Docker

  • 安装 cURL,用于发送请求并验证服务。

  • 拥有一个正在运行的 API7 网关实例。

  • 从控制台获取令牌,并保存到环境变量:

    export API_KEY=your-dashboard-token   # 请替换为你的控制台令牌
  • {gateway_group_id} 替换为网关组 ID。如果正在按照快速入门操作,请使用 default

  • 如果使用 Admin API 示例,请创建或复用一个服务。如果尚无服务,请按照创建或复用服务操作,然后保存其 ID:

    export SERVICE_ID=your-service-id         # 请替换为你的服务 ID

基于 Token 与基于请求的限流对比

方面基于请求基于 Token
单位HTTP 请求数消耗的大语言模型 Token 数
精度粗粒度,所有请求一视同仁细粒度,限制与实际资源消耗相匹配
成本控制较弱,少量长请求即可耗尽预算较强,直接关联服务提供方计费
适用场景传统 API大语言模型流量

配置 Token 限流

curl -k "https://localhost:7443/apisix/admin/routes?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-d '{
"id": "ai-rate-limited",
"service_id": "'"$SERVICE_ID"'",
"paths": ["/ai"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o" }
},
"ai-rate-limiting": {
"limit_strategy": "total_tokens",
"limit": 10000,
"time_window": 3600
}
}
}'

❶ 统计总 Token(提示词 + 补全)。其他选项为 "prompt_tokens""completion_tokens"

❷ 每个时间窗口允许 10,000 个 Token。

❸ 每 3,600 秒(1 小时)重置限制。

超过限制时,网关返回 HTTP 429 和限流请求头:

  • X-AI-RateLimit-Limit-{name} — 已配置的 Token 限制。
  • X-AI-RateLimit-Remaining-{name} — 当前窗口中剩余的 Token。
  • X-AI-RateLimit-Reset-{name} — 距离窗口重置的秒数。

按实例限流(多模型)

使用 ai-proxy-multi 时,可以按实例设置 Token 预算,对高成本模型实施更严格的限制:

curl -k "https://localhost:7443/apisix/admin/routes?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-d '{
"id": "ai-per-instance-limits",
"service_id": "'"$SERVICE_ID"'",
"paths": ["/ai"],
"plugins": {
"ai-proxy-multi": {
"instances": [
{
"name": "gpt-4o-mini",
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o-mini" },
"weight": 1
},
{
"name": "gpt-4o",
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o" },
"weight": 1
}
]
},
"ai-rate-limiting": {
"limit_strategy": "total_tokens",
"instances": [
{
"name": "gpt-4o",
"limit": 5000,
"time_window": 3600
}
]
}
}
}'

❶ 仅对 gpt-4o 实例应用限流,并使用其专属的 limittime_window。发往 gpt-4o-mini 的流量不受此限制。

使用 Redis 扩展

对于多实例网关部署,请使用 Redis 在数据面节点之间共享限流计数器:

curl -k "https://localhost:7443/apisix/admin/routes?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-d '{
"id": "ai-rate-redis",
"service_id": "'"$SERVICE_ID"'",
"paths": ["/ai"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o" }
},
"ai-rate-limiting": {
"limit_strategy": "total_tokens",
"limit": 100000,
"time_window": 3600,
"policy": "redis",
"redis_host": "redis.example.com",
"redis_port": 6379,
"allow_degradation": true
}
}
}'

❶ 将策略设置为 redis 以共享计数器。其他选项为 "redis-cluster""redis-sentinel"

❷ 配置 Redis 连接。

❸ 设置为 true 时,即使 Redis 不可用,网关也会继续处理请求,即故障时放行。

验证

持续发送请求,直至达到限流阈值:

curl "http://127.0.0.1:9080/ai" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "user", "content": "Write a 500-word essay about API gateways." }
]
}'

超过 Token 限制后,网关返回:

HTTP/1.1 429 Too Many Requests

后续步骤