使用基于 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 限流
- Admin API
- ADC
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 小时)重置限制。
services:
- name: AI Rate Limited
routes:
- uris:
- /ai
name: ai-rate-limited
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 小时)重置限制。
将配置同步到 API7 网关:
adc sync -f adc.yaml
超过限制时,网关返回 HTTP 429 和限流请求头:
X-AI-RateLimit-Limit-{name}— 已配置的 Token 限制。X-AI-RateLimit-Remaining-{name}— 当前窗口中剩余的 Token。X-AI-RateLimit-Reset-{name}— 距离窗口重置的秒数。
按实例限流(多模型)
使用 ai-proxy-multi 时,可以按实例设置 Token 预算,对高成本模型实施更严格的限制:
- Admin API
- ADC
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 实例应用限流,并使用其专属的 limit 和 time_window。发往 gpt-4o-mini 的流量不受此限制。
services:
- name: AI Per-Instance Limits
routes:
- uris:
- /ai
name: ai-per-instance-limits
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 实例应用限流,并使用其专属的 limit 和 time_window。发往 gpt-4o-mini 的流量不受此限制。
将配置同步到 API7 网关:
adc sync -f adc.yaml
使用 Redis 扩展
对于多实例网关部署,请使用 Redis 在数据面节点之间共享限流计数器:
- Admin API
- ADC
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 不可用,网关也会继续处理请求,即故障时放行。
services:
- name: AI Rate Redis
routes:
- uris:
- /ai
name: ai-rate-redis
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 不可用,网关也会继续处理请求,即故障时放行。
将配置同步到 API7 网关:
adc sync -f adc.yaml
验证
持续发送请求,直至达到限流阈值:
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
后续步骤
- AI 可观测性和成本跟 踪 — 监控 Token 消耗并构建成本看板。
- 多模型路由和故障转移 — 将限流与多模型路由组合使用。
- 完整配置说明请参阅
ai-rate-limiting。