跳到正文

AI 网关与流量治理 ​

一句话:AI 网关不是给模型套一层 API 代理,而是把入口、能力、权限、预算拆成可治理的层;三类网关(LLM/MCP/Agent)各自独立授权,四档预算语义逐级递进,只有严格预算硬上限能证明"最多花多少"。

适用:2026 年企业级 Agent 平台与 AI 网关落地实践;产品能力与参数以官方文档为准。

为什么需要 ​

当十几个团队共用一套模型服务时,问题会迅速暴露:谁超支了、调用方是员工还是外部租户、模型故障时怎么切换、一次请求慢是网关排队还是推理超时。没有网关治理,每个团队自己管密钥、自己算成本、自己处理降级,结果是故障扩散、成本失控、安全事件无法追溯。

最常见的错误是把网关当成万能层——网关能准入、转发、记账,但不能替业务判断任务是否成功;也不能因为请求过了网关,就认为调用方有权限操作后面的工具。另一个错误是三类网关(LLM/MCP/Agent)混在一个进程里共享授权上下文,导致"通过了 LLM 网关的请求被认为也有权调用 MCP 工具"。

核心机制 ​

三类网关分离:各自独立授权域 ​

看这张图只抓一件事:三个网关之间没有任何边。同一调用方可以分别进入三个网关,但任何一条路径上通过的身份与授权都不会横向传递给另一条,所以“过了 LLM 网关”不构成调用工具的依据。三个授权域可以共进程部署,隔离的是授权上下文而不是机器。

网关类型管什么权威边界不该由它决定
LLM Gateway模型调用:路由、降级、限额、计量这次请求走哪个模型、花多少 Token任务是否成功、调用方是否有业务权限
MCP Gateway工具接入:发现、鉴权、超时、幂等这个 Agent 能否调用这个工具工具返回结果的业务含义
Agent GatewayAgent 间通信:租户、配额、任务关联谁发起的、属于哪个任务任务内部逻辑是否正确

关键原则:三者可以共用一个进程,但授权域必须独立。通过 LLM 网关 ≠ 有权调用 MCP 工具 ≠ 有权与其他 Agent 通信。

四档预算语义:逐级递进 ​

档位语义实现机制能证明什么局限
A 请求速率限制QPS / 令牌桶入口限流,超限拒绝或排队突发流量可控不管单次请求消耗多少 Token
B Token 时间窗限制每 N 分钟最多消耗 X Token请求前检查 + 结束后累计时间窗内总消耗有上限累计是事后的,并发请求可能同时通过检查
C 余额型配额账户余额,用完即停准入查余额 + 结束后扣减总消耗不超过配额并发扣减可能超卖,需要锁或最终一致
D 严格预算硬上限单次任务最多花多少准入时原子预留 + 幂等结算能证明最大消耗实现最复杂,失败时必须释放预留

只有 D 能证明最大消耗——它要求准入时原子预留(不可分割的锁操作),执行结束后幂等结算(重试不会重复扣减),失败时预留必须释放。A/B/C 都是"尽量控制",D 是"数学上可证明"。

四档不是四个并列开关,而是同一条预算链上逐级补齐缺口:A 看不见单次消耗,B 的累计在并发下可能同时放行,C 的扣减可能超卖——每一档的失效面都由下一档补上。所以档位越高,管控越贴近准入时点的那笔账,实现成本也随之上升。

Token 级成本归因 ​

成本必须按三维统计:部门(谁花钱)、Agent(哪个任务花钱)、模型(钱花在哪)。计量要覆盖请求与返回双向 Token,缓存命中也需计入成本(虽然实际调用成本为零,但业务侧需要知道"这个结果是从缓存取的"以评估数据新鲜度)。

归因维度统计粒度用途
部门 / 租户月度账单、配额分配成本分摊、预算审批
Agent / 任务单次任务 Token 消耗任务级预算控制、ROI 评估
模型各模型调用量与成本路由策略优化、供应商谈判

语义缓存 ​

语义缓存不是通用缓存——它只适用于公开、幂等、低风险请求。缓存键必须包含:租户 + 权限域 + 地区 + 模型 + Prompt 版本 + 知识版本。任何一个维度变化,缓存必须失效。

策略说明风险
TTL缓存条目存活时间,到期自动失效过期前返回陈旧结果
主动失效知识版本更新时清除相关缓存实现复杂,需要版本追踪
回源缓存未命中时调用模型并写入缓存冷启动期间延迟高

两大风险:

  1. 跨租户泄露——缓存键缺少租户维度,A 租户命中 B 租户的缓存
  2. 返回陈旧版本——知识库已更新但缓存未失效,返回旧答案

模型路由与降级 ​

路由策略按四维度决策:任务类型(简单问答走小模型,复杂推理走大模型)、预算(剩余配额不足时降级)、数据边界(涉及敏感数据时路由到合规模型)、负载(目标模型排队过长时切换)。

降级有一个隐蔽的失败模式:协议层正常但多步任务丢失中间约束。比如从 GPT-4 降级到 GPT-3.5,单次请求能正常返回,但多步推理能力下降导致后续步骤全部偏离。因此路由策略必须与完整 Harness 一起做回归测试,不能只测单次请求。

安全四道闸 ​

  1. 多模型调度与故障切换——单模型故障不影响整体服务,但切换时权限和预算要重新校验
  2. Token 用量成本治理——四档预算逐级递进,生产环境至少达到 C 档
  3. 按职责配模型权限——不同 Agent / 租户能调用哪些模型,最小权限原则
  4. 请求与返回敏感信息检测——入站检测 Prompt 注入,出站检测 PII 泄露

实战场景 ​

案例:语义缓存串了权限——相似问题命中同一份答案 ​

现象:内部帮助台 Agent 开启语义缓存后,安全巡检发现普通员工拿到了含管理系统入口和组织编制数的回答,而这条回答产生于 HRBP 会话。两个用户的提问在向量空间高度相似,权限档位却不同。

排查路径:按缓存 id 回放,确认两次会话命中同一条目 → 检查键构成,当时只有模型 + 版本 + 问题向量三个维度,缺租户与权限域 → 用命中日志圈定泄漏面:缓存 TTL 内所有低权限档位的相似问题都返回过高档答案。

修法:缓存键重建为正文的六维度——租户 + 权限域 + 地区 + 模型 + Prompt 版本 + 知识版本,缺任一维度按配置错误拒绝启动。权限档位取角色集合哈希,不是用户 ID:按键含用户 ID 会让命中率塌到缓存名存实亡。写入前置检查请求风险等级,非公开、非幂等、低风险集合之外的请求一律不缓存。涉事条目不直接删除,改写成带审计标记的墓碑记录,保留取证链路。重建后命中率下降约四成(经验值,需校准)——这是正确性的代价,回升手段是分档独立缓存空间,而不是放松键维度。

场景:大促限流预案——配额分层与 fail-closed 判定顺序 ​

设计决定 → 为什么:限流按租户 → 用户 → 模型三层递进,判定顺序固定;配额存储不可用时 fail-closed 返回拒绝——错放的代价是账单击穿加下游雪崩,错杀的代价只是可重试的投诉,两者不对称。

yaml
limits:
  order: [authn, tenant_quota, user_rate, model_budget, content_check]  # 判定顺序固定
  fail_closed: {quota_store_down: deny, quota_check_p99_over_ms: 200}   # 阈值经验值,需校准
  tiers:
    tenant: {daily_budget_tokens: 50000000, on_exceed: hard_reject}
    user:   {rpm: 20, burst: 5, on_exceed: queue_or_429}
    model:  {max_concurrency: 200, on_saturated: fallback_chain}
  fallback_chain: [flagship, workhorse, economy]  # 沿降级阶梯逐档走,不跨档直落兜底

每层超限响应不同:租户级硬拒(账务问题)、用户级 429 带 Retry-After(体验问题)、模型级切降级链(容量问题)——三者混在一个阈值里,一个大客户超支会升级成全平台拒绝。判定顺序上鉴权最先:未认证请求不应消耗配额存储的一次查询;模型预算最后:路由确定目标模型之后才知道查谁的预算。大促前做一次故障演练:切走配额存储主副本,验证网关返回 deny 而不是放行未计数请求。

场景:模型故障切换——错误率还是延迟分位数做判据 ​

现象:主模型网关排队恶化,P99 时延从个位数秒涨到近两分钟,但每个请求最终都成功返回 200——基于错误率的熔断纹丝不动,直到调用方超时预算耗尽、故障向下游扩散。

判据对比(阈值均为经验值,需校准):

判据优点误切风险结论
错误率直接、确定、不易误判看不见“慢死”:又慢但成功的请求不计为错误主判据,必要不充分
延迟分位数能捕捉服务劣化长思考请求和大流量本身推高 P99,单看必误切辅助判据,须与自身正常基线比较

落地做法:双窗口双判据——快窗 30 秒、慢窗 120 秒,错误率越限,或 P95 时延连续两个周期超过正常基线的三倍数且绝对值越下限,才触发切换;恢复必须经 1% 探测流量灰度数分钟再回切,防止在临界点反复抖动。切换不是只换个上游:到备用模型的请求要重新过模型权限和预算校验(安全四道闸的第一、二道),多步任务的中间约束不跨模型续写 function calling 上下文——这正是“协议层正常但多步任务丢失中间约束”在切换路径上的第二次踩坑,所以切换预案必须连同完整 Harness 回归,而不是只测单请求连通。

最小上手 ​

yaml
gateway_config:
  llm_gateway:
    rate_limit: { qps: 100, burst: 20 }
    token_budget: { window_minutes: 60, max_tokens: 500000 }
    routing:
      - task_type: simple_qa
        model: gpt-3.5-turbo
        fallback: claude-3-haiku
      - task_type: complex_reasoning
        model: gpt-4o
        fallback: claude-3-sonnet
    cache:
      enabled: true
      key_dimensions: [tenant, permission_domain, region, model, prompt_version, knowledge_version]
      ttl_seconds: 300
      risk_level: public_idempotent_only  # 非公开/非幂等请求不缓存

  mcp_gateway:
    auth: oauth2_token_exchange
    tool_registry:
      - tool: file_read
        allowed_agents: [coding_agent, review_agent]
        timeout_ms: 5000
        idempotent: true
      - tool: db_write
        allowed_agents: [coding_agent]
        timeout_ms: 10000
        idempotent: false
        requires_approval: true

  agent_gateway:
    tenant_quota:
      - tenant: dept_a
        max_concurrent_tasks: 50
        daily_budget_usd: 1000
    task_tracking: { enabled: true, audit_log: true }

验收标准:

  • 三类网关授权域独立,通过 LLM 网关的请求不能自动调用 MCP 工具
  • 预算语义至少达到 C 档(余额配额),关键任务达到 D 档(严格预算)
  • 缓存键包含全部六个维度,缺少任一维度视为配置错误
  • 降级后多步任务回归测试通过

生产动作 ​

  • [ ] 三类网关分离部署或至少分离授权域
  • [ ] 预算语义评估:生产环境至少 C 档,关键路径 D 档
  • [ ] 成本归因三维统计上线:部门 / Agent / 模型
  • [ ] 语义缓存审查:缓存键六维度完整,仅公开幂等请求启用
  • [ ] 模型路由策略与完整 Harness 一起做回归测试
  • [ ] 安全四道闸逐项检查,特别是出站 PII 检测
  • [ ] 降级阶梯 L0–L6 统一口径,不再保留粗粒度分级

边界与误区 ​

适用场景不适用场景
多团队共用模型服务的企业环境单团队单模型的实验项目
需要成本分摊和预算控制的生产环境不需要计量的内部工具
需要故障切换和降级的高可用场景对延迟极度敏感且不接受降级损失的实时系统

常见误区:

  1. "网关是万能层" —— 网关能准入、转发、记账,但不能替业务判断任务是否成功
  2. "三类网关可以共享授权" —— 通过 LLM 网关 ≠ 有权调用 MCP 工具,授权域必须独立
  3. "缓存命中不计成本" —— 缓存命中实际调用成本为零,但业务侧需要知道数据新鲜度
  4. "降级只是换模型" —— 协议层正常但多步任务可能丢失中间约束,必须完整回归
  5. "A 档预算就够了" —— A/B 档是"尽量控制",只有 D 档能证明"最多花多少"

讲清楚 ​

AI 网关治理的核心是三类网关分离(LLM 网关管模型调用、MCP 网关管工具接入、Agent 网关管通信管控),各自独立授权域不可混用。预算语义分四档递进(速率限制 → 时间窗 Token → 余额配额 → 严格预算硬上限),只有 D 档通过原子预留和幂等结算能证明最大消耗。Token 成本按部门/Agent/模型三维归因,语义缓存仅用于公开幂等请求且缓存键必须包含六维度。模型路由按任务类型/预算/数据边界/负载决策,降级必须与完整 Harness 做回归测试。安全四道闸覆盖调度、成本、权限、内容检测。

适用:2026 年企业 AI 网关与预算治理;档位阈值与缓存维度需按业务校准 | 初稿 2026-10

把 AI 工程讲到既懂也会用