文章

LLM Gateway 生产实战:用策略引擎治理多租户、预算与模型访问边界

从 LLM Gateway 策略引擎切入,系统梳理多租户模型访问控制、预算限额、速率限制、审计日志和灰度发布的落地方法,帮助团队把分散的大模型调用治理成可控、可观测、可审计的统一入口。

背景问题:大模型调用正在从”接 API”变成”治理入口”

很多团队最初接入大模型时,通常只是把 OpenAI、Anthropic、Google、本地模型或云厂商模型的 API Key 放进应用配置里。这个阶段看起来简单,但当业务从单一 Demo 进入生产系统后,问题会快速暴露:

  • 不同团队、不同租户、不同应用共用同一组 Key,难以追踪成本。
  • 某个测试脚本或异常用户可能突然消耗大量 Token。
  • 免费用户、付费用户、内部员工、Agent 自动任务使用的是同一套模型权限。
  • 模型升级、Prompt 版本变更、Provider 切换缺少灰度和回滚机制。
  • 线上问题发生后,只能看到应用日志,看不到请求级 Token、模型、成本、错误码和重试链路。

这类问题不是靠”多写几个 if 判断”就能长期解决的。随着大模型调用成为基础设施能力,团队需要一个统一入口,也就是 LLM Gateway

LLM Gateway 的价值不是简单转发请求,而是把模型调用变成可治理、可观测、可限额、可审计、可发布的生产流量。

核心原理:LLM Gateway 是模型调用的策略执行点

一个生产级 LLM Gateway 至少要解决五类问题:

  1. 身份识别:当前请求属于哪个租户、用户、应用、环境和业务场景。
  2. 访问控制:这个身份是否允许调用指定模型、指定工具、指定上下文长度或指定输出模式。
  3. 预算与限流:是否超过 RPM、TPM、并发数、日预算、月预算或项目预算。
  4. 请求治理:是否需要重试、降级、缓存、Provider fallback、模型别名映射或灰度发布。
  5. 审计与观测:记录请求、Token、成本、延迟、错误、策略命中和版本信息。

Cloudflare AI Gateway 将其定位为”观察和控制 AI 应用”的入口,功能覆盖 analytics、logging、caching、rate limiting、request retry 和 model fallback。LiteLLM Proxy 通过 virtual keys 追踪 spend 并控制 model access,同时支持 user、team、key 级别的预算、RPM、TPM 和多窗口预算。Kong AI Gateway 强调 provider-agnostic API、集中管理 credentials、access tiers、usage analytics、rate limiting、semantic cache、guardrails 和 prompt engineering 等能力。OpenAI 官方 rate limit 文档也说明,生产 API 限制不仅有 RPM,还包括 RPD、TPM、TPD 以及组织和项目维度的限制。

从这些产品和文档可以看出,LLM Gateway 的核心不是”统一 URL”,而是统一策略边界

推荐架构:控制面、数据面和策略面分离

生产环境中,不建议把所有逻辑塞进一个反向代理。更稳妥的架构是三层拆分:

数据面:低延迟转发与基础保护

数据面负责处理实时请求:

  • 解析 API Key、JWT、租户 Header。
  • 标准化 OpenAI-compatible 请求格式。
  • 执行基础限流、超时、重试和熔断。
  • 调用策略服务做准入判断。
  • 转发到目标模型 Provider 或内部推理服务。
  • 写入请求日志、Token 估算、响应摘要和错误信息。

数据面必须稳定、低延迟、可水平扩展。它不应该承担复杂审批流,也不应该动态加载过多业务规则。

控制面:配置、版本、发布和回滚

控制面负责管理配置:

  • 租户、应用、用户组、环境和 API Key。
  • 模型白名单、模型别名、默认模型和降级模型。
  • 预算、限流、并发数、上下文长度和最大输出 Token。
  • Prompt 模板版本、灰度比例、发布状态和回滚记录。
  • 审计查询、成本报表和异常告警。

控制面输出的是可发布的策略快照,而不是让数据面每次请求都查一堆业务表。

策略面:独立的决策引擎

策略面负责回答一个明确问题:当前请求在当前上下文下是否允许执行?如果允许,应该用什么模型、什么预算窗口、什么降级规则和什么审计标签?

策略面可以自己实现,也可以参考 OPA / Envoy external authorization 的思路。OPA-Envoy 文档说明,Envoy 可以把请求上下文交给外部授权服务,由授权服务做上下文感知的访问控制;OPA 还支持 dry-run,用于策略重构或初始接入时观察”本来会被拦截什么”。这一点对 LLM Gateway 很有启发:新策略不要直接硬切生产流量,而应先 shadow / dry-run,再逐步 enforce。

策略模型:不要只做 Key,要做”租户 + 场景 + 模型 + 成本”

很多团队会把 LLM Gateway 简化为 API Key 管理,这是不够的。建议至少建立以下策略维度。

租户维度

每个请求必须归属到一个稳定的 tenant_id。不要只依赖用户邮箱或应用名,因为这些字段很容易变化。

tenant:
  id: tenant_enterprise_a
  plan: enterprise
  environments: [prod, staging]
  monthly_budget_usd: 5000
  default_model_group: premium-chat

应用维度

同一个租户下,客服 Agent、数据分析助手、代码助手、后台批处理的风险和预算完全不同。

application:
  id: support_agent
  tenant_id: tenant_enterprise_a
  allowed_models: [gpt-5-mini, claude-sonnet, internal-qwen]
  max_context_tokens: 64000
  max_output_tokens: 4096
  allow_streaming: true

场景维度

同一个应用也需要区分场景。例如”用户在线问答”和”夜间批量总结”不应该共用同一套 SLO 和预算。

scenario:
  id: realtime_support_reply
  rpm_limit: 120
  tpm_limit: 600000
  max_parallel_requests: 40
  retry_budget: 1
  fallback_model_group: standard-chat

模型访问维度

模型权限不应只写在客户端,网关需要统一判断:

  • 这个租户能否使用高价模型?
  • 是否允许长上下文?
  • 是否允许多模态输入?
  • 是否允许推理模型或工具调用?
  • 是否允许访问某个私有部署模型?

这类判断放在客户端没有安全意义,必须在服务端强制执行。

一个可落地的请求决策流程

一次 LLM Gateway 请求可以按下面流程执行:

Request -> Authenticate identity -> Normalize provider-compatible payload
-> Resolve tenant/application/scenario -> Load policy snapshot -> Check
model access -> Check RPM/TPM/concurrency/budget -> Apply prompt/model
version -> Route to provider or internal serving -> Record usage, cost,
latency, policy decision -> Return response

其中最关键的环节是 policy snapshot。不要在每次请求时临时拼规则,否则很难复现线上行为。每次策略发布都应生成不可变版本:

policy_snapshot:
  version: gateway-policy-2026-07-01-001
  status: active
  created_by: platform-team
  effective_at: 2026-07-01T10:00:00Z
  rules:
    - id: enterprise-premium-model-access
    - id: free-tier-token-budget
    - id: batch-job-night-window

请求日志中必须记录 snapshot version,否则当用户反馈”昨天还能用,今天不能用”时,平台团队无法判断是模型变更、预算耗尽、限流触发,还是策略发布导致。

工程落地:从三类规则开始,不要一口吃成大平台

LLM Gateway 很容易做成庞大的治理平台。更现实的做法是先落三类规则。

第一类:访问规则

访问规则回答”能不能用”。典型字段包括:

字段说明
tenant_id租户标识
app_id应用标识
environment环境(prod/staging/dev)
allowed_models允许的模型列表
denied_models禁止的模型列表
max_context_tokens最大上下文长度
max_output_tokens最大输出长度
allow_tools是否允许工具调用
allow_multimodal是否允许多模态输入

示例规则(OPA 风格):

package llm.gateway.authz

default allow := false

allow if {
    input.tenant.plan == "enterprise"
    input.request.model in input.policy.allowed_models
    input.request.context_tokens <= input.policy.max_context_tokens
}

这类规则要尽量确定性,不要依赖模型再判断模型调用是否允许。访问控制必须是可解释、可复现的。

第二类:预算规则

预算规则回答”还能不能花”。至少要有四层:

层级目的示例
Key 级预算防止单个 Key 泄漏或滥用日预算 $50
User 级预算防止某个用户异常消耗日预算 $10
Team / Tenant 级预算防止整个客户或团队超支月预算 $5000
Model 级预算防止高价模型被低价值场景误用日预算 $200

LiteLLM 文档中的多窗口 budget_limits 很值得参考:同一个 Key 可以同时设日预算和月预算。生产中建议加一个小时级软阈值,用于提前告警,而不是等月预算烧完才拦截。

第三类:速率与并发规则

速率规则回答”现在能不能进”。不要只配置 RPM,LLM 请求的成本与 Token 数、上下文长度和输出长度高度相关。更合理的限流应组合以下维度:

  • RPM(Requests Per Minute):请求数限制。
  • TPM(Tokens Per Minute):Token 吞吐限制。
  • max_parallel_requests:并发请求限制。
  • max_queued_requests:排队上限。
  • max_estimated_cost:单请求预估成本上限。

OpenAI 官方文档提到 rate limits 使用 RPM、RPD、TPM、TPD 等指标,并且任何一个维度先触达都可能触发限制。对于自建 Gateway,也应采用多维限流,而不是只做请求数限流。

发布治理:策略必须支持 dry-run、灰度和回滚

LLM Gateway 的策略改动属于生产风险。一个错误规则可能导致:

  • 大量用户被误拦截。
  • 免费用户访问高价模型。
  • 批处理任务绕过预算。
  • 某个租户突然无法调用核心能力。
  • Prompt 版本错误导致输出质量下降。

建议每次策略发布包含四个阶段:

  1. lint:检查字段、模型名、预算单位、时间窗口和引用关系。
  2. dry-run:只记录 would_allow / would_deny,不实际拦截。
  3. canary:对少量租户、少量应用或固定测试 Key 生效。
  4. enforce:全量执行,并保留一键回滚。

OPA-Envoy 的 dry-run 设计对这里很有参考价值:新策略先观察决策日志,再决定是否强制执行。LLM Gateway 也应该记录 policy_decisionreason_codematched_rule_id

示例审计日志:

{
  "request_id": "req_20260701_001",
  "tenant_id": "tenant_enterprise_a",
  "app_id": "support_agent",
  "model": "gpt-5-mini",
  "policy_snapshot": "gateway-policy-2026-07-01-001",
  "decision": "allow",
  "matched_rules": ["enterprise-premium-model-access"],
  "estimated_input_tokens": 1830,
  "estimated_output_tokens": 512,
  "cost_center": "customer-support",
  "latency_ms": 1320
}

常见误区

误区一:把 Gateway 当成 Provider SDK 封装层

SDK 封装只能降低接入成本,不能天然解决预算、访问控制、审计和发布治理。Gateway 必须是服务端强制执行点。

误区二:只做模型路由,不做权限边界

模型路由可以优化成本和可用性,但如果没有租户权限、预算和审计,路由越灵活,风险越大。

误区三:预算只按月统计

月预算适合财务管理,不适合阻止事故。生产中至少要有分钟级、小时级、日级和月级窗口。

误区四:策略变更没有版本号

没有版本号就无法复盘。每次请求必须记录策略版本、模型版本、Prompt 版本和关键限流结果。

误区五:把所有规则写进业务代码

业务代码可以判断业务语义,但平台级模型访问、预算和审计应该集中治理。否则多个服务会出现规则漂移。

上线检查清单

身份与租户

  • 是否每个请求都能映射到 tenant_idapp_idenvironment
  • 是否禁止匿名请求直接访问模型 Provider?
  • API Key 泄漏后是否能快速禁用并追溯历史调用?

策略与发布

  • 策略是否有版本号和状态机?
  • 是否支持 dry-run、canary、enforce、rollback?
  • 是否有策略 lint 和冲突检查?
  • 是否记录 matched_rule_idreason_code

预算与限流

  • 是否同时支持 RPM、TPM、并发数和预算窗口?
  • 是否区分 key、user、team、tenant、model 级预算?
  • 是否有 runaway usage 告警?
  • 失败重试是否也纳入限流与预算统计?

观测与审计

  • 是否记录模型、Provider、Token、成本、延迟、错误码?
  • 是否能按租户、应用、场景和模型聚合成本?
  • 是否能定位某次请求使用的 Prompt 版本和策略版本?
  • 是否能导出审计日志给安全和财务团队?

可靠性

  • Provider 超时后是否有 fallback?
  • 降级模型是否仍满足业务合规要求?
  • Gateway 自身是否有熔断和限流?
  • 策略服务不可用时是 fail-open 还是 fail-closed?是否按场景区分?

适用场景

LLM Gateway 特别适合以下场景:

  • 多个业务团队共用模型资源。
  • 多租户 SaaS 产品需要按客户计费或限额。
  • 同时使用多个模型 Provider。
  • 有免费版、专业版、企业版等不同权限层级。
  • 有 Agent、批处理、在线客服、内部助手等混合流量。
  • 需要把模型成本分摊到部门、客户或项目。
  • 需要对 Prompt、模型和策略发布做灰度治理。

如果只是单个内部脚本偶尔调用模型,不一定需要完整 Gateway。但一旦进入生产、多团队、多租户、多模型、多预算边界,Gateway 就会变成基础设施。

参考资料

  1. LiteLLM Virtual Keys 文档
  2. LiteLLM Budgets and Rate Limits 文档
  3. Cloudflare AI Gateway 文档
  4. Cloudflare AI Gateway Rate Limiting 文档
  5. Kong AI Gateway 文档
  6. OpenAI Rate Limits 文档
  7. OPA-Envoy Plugin 文档

常见问题

LLM Gateway 和普通 API Gateway 有什么不同?
普通 API Gateway 主要治理 HTTP 请求,如认证、路由、限流和日志。LLM Gateway 还需要理解模型名、Provider 差异、Token、上下文长度、预算窗口、Prompt 版本和模型降级,面向的是高成本、不可完全确定、容易跨边界的模型调用。
策略引擎应该放在应用内还是网关层?
建议分层:业务语义策略可在应用内定义,但模型访问、预算、速率限制、审计日志和 Provider fallback 更适合在 Gateway 层统一强制执行,避免多服务规则漂移。
LLM Gateway 是否一定要自己研发?
不一定。小团队可直接使用 Cloudflare AI Gateway、LiteLLM Proxy、Kong AI Gateway 等现成产品。当租户模型、预算合规、私有部署、审计和发布流程高度定制时,才需要自研完整 Gateway。