大模型应用如何做限流和配额?
简化版
大模型不能只按 QPS 限流,因为 100 Token 分类和 20K Token 生成成本差异巨大。应同时控制请求速率、输入/输出 Token、并发、KV 占用、工具调用和日/月预算,并按租户、模型、场景分层。
限流保护瞬时容量,配额约束一段时间的资源权益。常用令牌桶允许短突发,运行时再用最大输出、步骤和 Deadline 防止单请求失控;超限时明确返回 Retry-After、排队、降级或拒绝。
详细版
request -> identity -> quota check -> cost estimate -> admission
-> runtime budget -> usage settlement
| 维度 | 防护目标 |
|---|---|
| RPM/QPS | 请求洪峰 |
| TPM | Token 成本差异 |
| 并发/KV | 在线显存容量 |
| 工具预算 | 外部费用与副作用 |
| 日/月金额 | 商业预算 |
配额身份必须可信,分布式扣减要幂等;拒绝按客户超额与平台过载区分。监控使用率、拒绝原因、预测误差、借用份额和 SLO,避免限流器自身成为单点。
完整版教学
1. 限流与配额的区别
限流关注秒/分钟级到达速度,配额关注日/月累计权益。前者防过载,后者做公平与成本治理。
两者同时存在:月额度充足的租户也不能瞬间把集群打满。
2. 为什么 QPS 不够
LLM 资源与输入、输出长度和模型相关。相同请求数可能对应几十倍 Token 与 KV。
estimated_units = a × input_tokens + b × output_budget + tool_units
系数用真实 Profile 校准。
3. 令牌桶如何工作
桶以固定速率补充 Token,请求按估算成本扣减;桶容量决定允许的短时突发。
扣减失败时排队或拒绝,不能让余额无限为负。输出结束后可按实际用量结算预测差额。
4. 配额层级如何组织
平台、租户、应用、用户和 API Key 可分别有上限。子级使用不能突破父级,多个 Key 不能绕过租户总额。
| 层级 | 典型限制 |
|---|---|
| 平台 | 总 GPU/供应商预算 |
| 租户 | TPM、并发、月费用 |
| 应用 | 模型与工具范围 |
| 用户 | 防滥用与公平 |
规则需明确继承与优先级。
5. 输出未知怎么预留
准入时已知输入,只能用 max tokens、历史分位或任务模型预测输出。先预留,再按实际返还。
高风险容量用保守高分位;低风险任务可降低输出上限并在接近预算时安全收尾。
6. 并发与 KV 为什么单独限制
Token 速率相同,长连接与慢客户端仍可能长期占用 KV。设置活跃序列、缓存 Token 和暂停请求上限。
达到显存高水位时停止普通准入,降到低水位再恢复,避免临界点抖动。
7. Agent 和工具如何计费
限制最大步骤、模型调用、工具次数、外部金额和总 Deadline。子调用共享根预算,不能每层重新获得满额度。
写工具达到预算时安全停止并报告状态,不可在副作用未知时盲目重试。
8. 分布式一致性怎么做
全局强一致计数准确但延迟高;本地批量租约性能好但会有有限超卖。按风险选择,并定义最大误差。
扣减使用幂等 request_id,重试不能重复计费。控制面失败时采用本地保守上限。
9. 超限后如何处置
客户超合同配额返回明确 429 与 Retry-After;短时平台过载可有界排队、路由或降级;高风险任务不能静默换弱模型。
响应区分 quota_exceeded、rate_limited 和 capacity_overload,便于客户端正确处理。
10. 空闲份额能否借用
允许租户借用未使用容量提高利用率,但合同保底流量回来时要停止新借用并平滑收回。
等待老化和最低份额防止小租户饥饿;借用量不能被误计为永久额度。
收回时优先限制借用方的新请求,让在途请求按预算完成,避免强制抢占造成重算和用户失败。借用、收回和保底违约都应形成可观测事件。
11. 如何防绕过
限额绑定认证后的主体,而非可修改 Header;检测多 Key、重试风暴和并发连接滥用。
缓存命中可少扣计算单位,但请求和安全检查仍需速率保护,防止缓存层遭攻击。
对批量 API 还要展开内部子任务计量,避免一个 HTTP 请求包装上万条任务绕过 QPS;不同入口最终汇聚到同一主体账本,不能各自拥有互不相知的额度。
12. 如何监控与验收
记录限额使用率、拒绝原因、余额、预测/实际差、排队、SLO 和单位成本。按租户和规则版本切片。
压测持续流量、突发、长输出、重复重试和计数服务故障,验证不会超卖到 OOM,也不会错误阻断保底份额。
限流与配额的目标,是把共享资源变成可兑现、可解释且不会被单个请求突破的契约。
13. 常见误区与追问
- 误区:按 QPS 限流就够了。 Token、KV 和工具成本差异很大。
- 误区:月额度未用完就应全部接收。 瞬时容量仍有边界。
- 误区:客户端声明租户即可。 身份必须来自认证层。
- 误区:每层各自重试不会影响配额。 子调用必须共享根预算。
- 误区:分布式计数必须绝对强一致。 可按风险选择有限超卖租约。
- 追问:输出长度未知怎么办? 预留高分位预算,结束后按实际结算。
- 追问:限流器挂了怎么办? 使用缓存的保守本地上限,避免无限放行。
14. 加强记忆
- 先分概念:限流管速率,配额管累计权益。
- 再分资源:请求、Token、并发、KV、工具和金额。
- 再做层级:平台、租户、应用、用户。
- 再做预算:预留输出,实际结算,子调用共享。
- 再做处置:排队、降级、路由、Retry-After。
- 再防绕过:可信身份、幂等扣减和重试治理。
- 最后验收:高峰不 OOM,保底不饥饿,账单可解释。