关键词:AI Gateway、LLM Gateway、模型路由、限流、熔断、预算控制、多租户治理、流式转发、可观测性、Kubernetes


一、为什么大模型系统最终都会走向 AI Gateway

很多团队在接入大模型的第一阶段,路径都很直接:

业务服务 -> OpenAI / Claude / 本地模型 API

这个阶段通常能很快跑通 PoC,但一旦业务真正进入生产,问题会迅速从“能不能调用模型”转向“怎么稳定、可控、可审计地调用模型”。

典型症状包括:

问题 生产现象
API Key 分散在各个服务里 泄露难追踪、轮换困难、权限边界模糊
不同业务直接调用不同模型 路由逻辑分裂,无法统一治理
只看请求数,不看 token 消耗 月底才发现成本异常
429 后客户端盲目重试 上游限流放大为系统雪崩
流式响应直接透传 连接占用失控,慢 Provider 拖垮工作池
缺少租户隔离 一个业务组就能把整个平台预算打穿
只做技术接入,不做审计归因 无法回答“谁、在什么场景、调用了哪个模型、花了多少钱”

所以,AI Gateway 的本质不是“给模型 API 再套一层代理”,而是把模型访问从“分散调用”升级为“受控基础设施”。

它解决的是四个彼此冲突的目标:

更高质量  <->  更低成本  <->  更低延迟  <->  更高可用

如果没有一个统一的网关层,业务服务就不得不自己处理:

  • • 模型选择
  • • 配额控制
  • • 限流与重试
  • • 失败降级
  • • token 计费
  • • 审计与归因
  • • 灰度与回滚

这会让每条业务线都重复建设一套“半吊子模型治理逻辑”,最后既不稳定,也不便于扩展。


二、AI Gateway 到底是什么

从架构职责看,AI Gateway 是介于业务入口和模型供给层之间的统一治理平面。它同时承担三类角色:

2.1 北向统一入口

对上,它向业务暴露统一协议,屏蔽底层 Provider 差异。
无论后面接的是 OpenAI、Claude、Azure OpenAI、火山方舟、阿里灵积,还是企业自建 vLLM / Triton / Ollama,业务侧都不应该感知这些差异。

2.2 南向适配层

对下,它负责完成:

  • • 协议转换
  • • 模型名称映射
  • • 认证头注入
  • • 流式协议兼容
  • • 错误码标准化
  • • token 使用量归一

2.3 中间治理层

这才是 AI Gateway 与传统 API Gateway 最大的不同。
它不仅转发请求,还要参与模型调用策略决策:

  • • 按租户、应用、用户做鉴权
  • • 按预算和配额做准入
  • • 按模型能力、延迟、成本做路由
  • • 按 Provider 健康度做熔断、降级、切换
  • • 按场景做缓存、幂等、审计和观测

从工程角度,它更像“模型调用控制面 + 数据面”的组合,而不是单纯的反向代理。


三、为什么传统 API Gateway 思路不够用

很多团队会先问一句:Nginx、Kong、APISIX、Spring Cloud Gateway 能不能直接做?

答案不是不能,而是只能覆盖一部分能力。

传统 API Gateway 擅长:

  • • 统一接入
  • • 路由分发
  • • 认证鉴权
  • • 普通限流
  • • 灰度发布

但 AI Gateway 还要处理一组更特殊的问题:

3.1 限流对象不是单一 QPS,而是 QPS + 并发 + TPM + RPM

模型接口的成本和容量通常由 token 驱动,而不是单纯由“请求次数”驱动。

如果只做 QPS 限流,会出现两个极端:

  • • 一个超长上下文请求与一个短请求被当成同等成本
  • • 低请求数但超大 token 消耗照样能打穿预算

3.2 路由不是静态 URI 路由,而是多目标优化

同一类任务可能有多个候选模型:

  • • 成本最低的
  • • 质量最优的
  • • 延迟最低的
  • • 当前最健康的
  • • 某租户白名单允许的

这意味着路由决策不是:

/chat -> providerA

而是:

根据租户策略 + 模型能力 + 成本预算 + 健康状态 + 实时负载,动态选择 Provider

3.3 流式响应带来长连接占用问题

聊天、推理、代码补全类场景常用 SSE 或 chunked streaming。
网关如果按普通短连接请求处理,很容易出现:

  • • goroutine / 线程长期占用
  • • 客户端断开但上游连接未及时取消
  • • 长时间慢流拖死连接池
  • • backpressure 失控

3.4 失败语义不再简单

模型调用失败通常不是简单的 5xx,而是包含多种业务含义:

  • • 429:配额或容量限制
  • • 400:提示词超长、参数不合法
  • • 401/403:凭证问题或模型权限不足
  • • 408/499:超时、客户端取消
  • • 内容安全拦截
  • • 工具调用链中间失败

如果网关不理解这些错误语义,就无法做出正确的重试、切换和告警决策。


四、设计 AI Gateway 的第一性原理

一个生产级 AI Gateway,核心不是“功能越多越好”,而是先回答清楚几个原则问题。

4.1 策略决策与请求转发必须解耦

网关里最容易失控的一类设计,是把所有逻辑都塞进一次请求处理函数里:

收到请求 -> 查配置 -> 查预算 -> 查限流 -> 选 Provider -> 转发 -> 记账 -> 写日志

这种写法前期快,后期难维护。
一旦要引入灰度、A/B、租户特例、回退策略、模型黑白名单,代码会迅速演化为巨型 if-else。

更合理的做法是拆成两层:

  • • 控制面:管理模型目录、路由规则、预算、配额、租户策略、灰度开关
  • • 数据面:在请求路径上执行快速决策、限流、转发和观测

4.2 快路径必须无状态或近似无状态

AI Gateway 通常处在高并发入口位,横向扩容是常态。
如果把大量强状态放在本地内存里,会带来:

  • • 多实例间状态不一致
  • • 伸缩后数据丢失
  • • 故障迁移复杂

因此请求快路径要遵循:

  • • 节点本地只保留短周期缓存和只读快照
  • • 强一致约束尽量下沉到 Redis / DB / 配额服务
  • • 重计算逻辑前移到控制面离线生成

4.3 决策要用“预算优先级”而不是“模型偏好”

许多团队设计路由时会把“默认使用 GPT-4”写死,这本质上不是架构,是偏好。

生产环境里真正有效的决策顺序通常是:

是否允许调用-> 当前租户剩余预算是否足够-> 当前场景允许哪些模型-> 哪些 Provider 处于健康状态-> 按质量/成本/延迟打分-> 选择最优目标

也就是说,能否调用,优先于调用哪个模型。

4.4 观测与审计不是附属能力,而是主路径能力

如果一条请求没有完整的追踪上下文,后面很多事都没法做:

  • • 成本归因
  • • 异常排查
  • • 配额对账
  • • 效果评估
  • • 安全审计

因此每个请求至少要带上:

  • • request_id
  • • tenant_id
  • • app_id
  • • user_id 或 subject_id
  • • scenario
  • • target_model
  • • provider
  • • input_tokens / output_tokens / total_tokens
  • • latency
  • • result_code

五、推荐架构:控制面 + 数据面 + 观测面

从工程落地看,一个成熟的 AI Gateway 可以拆成下面三层。

5.1 架构总览

+-----------------------+                           |   Admin / Control UI  |                           +-----------+-----------+                                       |                           +-----------v-----------+                           |      Control Plane    |                           |-----------------------|                           | Model Catalog         |                           | Route Policy          |                           | Tenant Quota          |                           | Budget Policy         |                           | Gray Release          |                           | Prompt Governance     |                           +-----------+-----------+                                       |                         config snapshot / rule publish                                       |            +--------------------------v--------------------------+            |                    Data Plane                       |            |----------------------------------------------------|Client ---> | Auth -> Quota -> RateLimit -> Route -> Forward     | ---> Providers            |            |             |         |                |            |            |             |         +-> Retry/Fallback            |            |             +-> Breaker / Concurrency  |            |            +-> Cost Guard                          |            +--------------------------+--------------------------+                                       |                             metrics / logs / traces / audit                                       |                           +-----------v-----------+                           |    Observability      |                           | Prometheus / Loki /   |                           | Tempo / Kafka / OLAP  |                           +-----------------------+

5.2 控制面的职责

控制面不是请求转发路径上的大脑实时思考器,而是规则生产者。
它的职责是把复杂的业务规则,提前编译为数据面可快速执行的配置快照。

控制面一般负责:

  • • 模型元数据管理
  • • Provider 接入配置
  • • 租户与应用管理
  • • 预算和配额配置
  • • 场景到模型组的映射
  • • 灰度实验和流量切分
  • • 密钥托管与轮换
  • • 审计策略和敏感词规则

5.3 数据面的职责

数据面的重点是高吞吐、低延迟、故障隔离。

它必须做到:

  • • 每次请求的决策复杂度可控
  • • 不依赖慢查询
  • • 在上游 Provider 抖动时快速失败
  • • 支持流式透传和快速取消
  • • 支持多实例横向扩展

5.4 观测面的职责

观测面不只是画图表,还承接治理闭环:

  • • 指标监控:QPS、TPM、错误率、p95/p99、预算消耗
  • • 链路追踪:一次请求经过哪些拦截器、路由到哪个 Provider
  • • 审计日志:谁调用、调用什么模型、是否被拒绝
  • • 成本归因:租户 / 应用 / 场景 / Provider / 模型维度聚合
  • • 质量评估:命中缓存率、降级率、回退率、重试成功率

六、核心流程:一条模型请求在网关里经历了什么

一个完整的 AI Gateway 请求处理流程,通常应当是下面这样:

1. 接收请求2. 解析身份与租户上下文3. 标准化模型请求结构4. 做预算/配额准入检查5. 做 QPS / 并发 / TPM 限流6. 选择模型组与候选 Provider7. 排除熔断或不健康目标8. 执行路由打分9. 建立上游请求并透传流式数据10. 统计 token、延迟、错误码11. 异步写审计和成本事件12. 返回客户端

这条链路里最关键的是前三个“前置拦截器”和后两个“后置结算器”:

  • • 前置拦截器负责控制风险
  • • 后置结算器负责形成治理数据

如果只做转发而没有结算,这个网关最终不会有治理价值。


七、模型路由不是 if-else,而是多维打分系统

AI Gateway 最容易被低估的模块,就是路由引擎。

7.1 路由决策的输入维度

一次路由决策,通常至少受以下因素影响:

维度 说明
tenant 不同租户的预算和白名单不同
scenario 客服问答、代码补全、总结摘要,对模型偏好不同
model group 业务用的是“能力组”,不是某个固定模型
budget level 剩余预算不足时需要自动降级
provider health 某个 Provider 当前失败率过高应剔除
latency SLO 某些同步接口对延迟更敏感
compliance 部分数据不能出境,只能走私有模型
prompt size 超长上下文不适合所有模型

7.2 推荐抽象:业务请求不直接指定物理模型

不要让业务直接传:

{  "model": "gpt-4o"}

更可控的方式是传能力组或策略组:

{  "model_group": "customer-service-high-quality"}

然后由网关映射成候选模型集合,例如:

customer-service-high-quality  -> openai/gpt-4o  -> anthropic/claude-sonnet  -> private/qwen-max

这样控制面就可以在不改业务代码的前提下调整底层策略。

7.3 一种可落地的路由打分模型

一个简化但实用的路由分数可以定义为:

route_score= quality_weight  * quality_score+ latency_weight  * latency_score+ cost_weight     * cost_score+ health_weight   * health_score+ affinity_weight * affinity_score

其中:

  • • quality_score:基于离线评测或历史效果分
  • • latency_score:基于实时 p95/p99 指标归一化
  • • cost_score:按预计 token 成本反向归一化
  • • health_score:根据最近窗口成功率和超时率计算
  • • affinity_score:租户或场景偏好

重点不是公式多复杂,而是把“路由规则”从代码里抽离出来。

7.4 避免惊群的软路由

如果所有节点在同一时间都把流量切到单个最优 Provider,很容易形成拥塞放大。
实践里通常会采用“加权随机 + 健康过滤”的软路由,而不是每次都选绝对第一名。

这样做的好处是:

  • • 避免热点集中
  • • 更容易做灰度实验
  • • 可以提前给次优 Provider 预热少量流量

八、限流设计:不要只限请求数,要限真正的资源消耗

AI Gateway 的限流,建议至少拆成四层。

8.1 租户级请求速率限制

防止某个租户短时间内打爆入口:

  • • 每秒请求数 QPS
  • • 每分钟请求数 RPM

适合用:

  • • 令牌桶
  • • 漏桶
  • • 滑动窗口

8.2 租户级 token 速率限制

这是 AI 场景更关键的限制项:

  • • TPM:tokens per minute
  • • TPD:tokens per day

原因很简单:一个 50K 上下文请求的资源占用,和一个 500 token 请求不是一个量级。

8.3 Provider 级并发限制

即使租户没超限,也不能让某个 Provider 被无限并发压垮。
因此每个 Provider 还需要:

  • • 最大连接数
  • • 最大并发请求数
  • • 最大流式会话数

8.4 预算级限流

很多团队只在月底做成本报表,这是不够的。
真正的控制点应该在请求路径前置:

  • • 当前预算是否足够支撑这次调用
  • • 是否允许超预算但降级到更便宜模型
  • • 是否只允许关键租户继续使用高质量模型

这实际上是一种“成本驱动的准入控制”。


九、生产级限流实现:Redis 滑动窗口 + 本地兜底

对于多实例部署的 Gateway,分布式限流是刚需。
比较常见的实现方式是 Redis + Lua 脚本,保证原子性。

下面给出一个适合 TPM 控制的实现骨架。

package ratelimitimport (    "context"    _ "embed"    "errors"    "time"    "github.com/redis/go-redis/v9")//go:embed tpm_sliding_window.luavar tpmScript stringtype Limiter struct {    redis  redis.UniversalClient    script *redis.Script    local  *FallbackLimiter}type Result struct {    Allowed    bool    Remaining  int64    RetryAfter time.Duration}func NewLimiter(rdb redis.UniversalClient, local *FallbackLimiter) *Limiter {    return &Limiter{        redis:  rdb,        script: redis.NewScript(tpmScript),        local:  local,    }}func (l *Limiter) AllowTPM(    ctx context.Context,    key string,    window time.Duration,    limit int64,    cost int64,) (*Result, error) {    now := time.Now().UnixMilli()    values, err := l.script.Run(ctx, l.redis, []string{key},        now,        window.Milliseconds(),        limit,        cost,    ).Int64Slice()    if err != nil {        if l.local == nil {            return nil, err        }        return l.local.Allow(key, window, limit, cost), nil    }    if len(values) != 3 {        return nil, errors.New("invalid limiter script result")    }    return &Result{        Allowed:    values[0] == 1,        Remaining:  values[1],        RetryAfter: time.Duration(values[2]) * time.Millisecond,    }, nil}

Lua 脚本:

-- KEYS[1]: limiter key-- ARGV[1]: now(ms)-- ARGV[2]: window(ms)-- ARGV[3]: limit-- ARGV[4]: costlocal key = KEYS[1]local now = tonumber(ARGV[1])local window = tonumber(ARGV[2])local limit = tonumber(ARGV[3])local cost = tonumber(ARGV[4])redis.call("ZREMRANGEBYSCORE", key, 0, now - window)local members = redis.call("ZRANGE", key, 0, -1, "WITHSCORES")local used = 0for i = 1, #members, 2 do  local member = members[i]  local token_cost = tonumber(string.match(member, ":(%d+)$")) or 0  used = used + token_costendlocal remaining = limit - usedif remaining < cost then  local first = redis.call("ZRANGE", key, 0, 0, "WITHSCORES")  local retry = 0  if first[2] then    retry = tonumber(first[2]) + window - now  end  if retry < 0 then    retry = 0  end  return {0, math.max(0, remaining), retry}endlocal member = tostring(now) .. ":" .. tostring(cost)redis.call("ZADD", key, now, member)redis.call("PEXPIRE", key, window)return {1, limit - used - cost, 0}

这里有两个生产细节需要注意。

9.1 脚本失败必须有本地兜底

如果 Redis 临时抖动,不能让整个网关因为限流组件不可用而全量放开,或者全量拒绝。
更合理的策略通常是:

  • • Redis 正常:走分布式限流
  • • Redis 异常:走本地保守兜底限流
  • • 告警触发后尽快修复

9.2 key 设计要避免热分片

不要只用:

limiter:tenantA:tpm

更稳妥的 key 通常会包含:

  • • 维度前缀
  • • tenant_id
  • • app_id
  • • provider_group
  • • 时间分片

例如:

limiter:tpm:{tenantA}:{chat-app}:{group1}:202606171530

十、预算与成本治理:没有 FinOps 的 AI Gateway 只是转发层

模型网关如果不治理成本,通常会在业务规模起来后被成本反噬。

10.1 成本控制要区分三个阶段

请求前:预算准入

在请求真正打到模型之前,先判断:

  • • 当前租户是否还有预算
  • • 当前应用是否还有当日额度
  • • 当前场景是否允许使用高价模型
请求中:动态降级

如果预算逼近阈值,不一定直接拒绝,也可以降级:

  • • 从高成本模型切到中成本模型
  • • 缩短最大输出 token
  • • 关闭某些昂贵功能,例如 tool calling / reasoning mode
请求后:成本结算

响应回来后,按 Provider 真实 usage 做结算,并异步归档。

10.2 为什么“预估成本”只能做准入,不能做最终计费

因为在请求发出前,你通常只能估算:

  • • 输入 token 大约多少
  • • 输出 token 最大可能多少

但真正的消耗最终取决于:

  • • Provider 返回的 usage
  • • 流式生成是否提前中断
  • • 工具调用是否追加轮次

因此更合理的做法是:

  • • 请求前:按估算值判断是否允许进入
  • • 请求后:按真实值结算
  • • 偏差超过阈值时做审计和调账

10.3 一个生产可用的预算控制骨架

package budgetimport (    "context"    "fmt"    "time")type Guard interface {    Check(ctx context.Context, tenantID, appID string, estimatedCost float64) error    Settle(ctx context.Context, record UsageRecord) error}type UsageRecord struct {    RequestID     string    TenantID      string    AppID         string    Provider      string    Model         string    InputTokens   int    OutputTokens  int    TotalTokens   int    EstimatedCost float64    ActualCost    float64    OccurredAt    time.Time}type Service struct {    repo      Repository    publisher EventPublisher}func (s *Service) Check(ctx context.Context, tenantID, appID string, estimatedCost float64) error {    quota, err := s.repo.LoadQuota(ctx, tenantID, appID)    if err != nil {        return fmt.Errorf("load quota: %w", err)    }    if quota.RemainingBudget < estimatedCost {        if quota.DowngradeModelGroup != "" {            return ErrNeedDowngrade        }        return ErrBudgetExceeded    }    return nil}func (s *Service) Settle(ctx context.Context, record UsageRecord) error {    if err := s.repo.DeductActualCost(ctx, record); err != nil {        return fmt.Errorf("deduct actual cost: %w", err)    }    return s.publisher.PublishUsage(ctx, record)}

这段代码背后的关键点不是“扣钱”本身,而是把预算校验与真实结算拆成两个阶段。


十一、多租户隔离:不是只有 API Key 就叫隔离

许多团队把“给每个应用一个 token”当作多租户设计,这远远不够。

一个真正可运营的多租户 AI Gateway,至少要隔离下面几类资源:

11.1 身份隔离

  • • tenant_id
  • • app_id
  • • environment
  • • operator / end_user

11.2 配额隔离

  • • 每租户请求速率
  • • 每租户 token 配额
  • • 每应用预算
  • • 每场景模型白名单

11.3 安全隔离

  • • 部分租户只能用私有模型
  • • 部分数据不能出公网
  • • 敏感 prompt / response 必须脱敏或审计

11.4 可观测隔离

不能所有日志都打在一起。
至少在日志、指标、账单明细中要能按租户维度查询。

如果这层做不到,后面不管是审计、对账、责任划分还是灰度治理,都会变得很困难。


十二、流式响应是 AI Gateway 的高风险点

很多“看起来能跑”的网关,问题都出在流式处理上。

12.1 为什么流式转发更难

因为它不是普通 HTTP 请求的“收齐响应再返回”,而是一个持续中的上游-下游数据通道。

这意味着网关必须处理:

  • • 客户端取消时如何立即取消上游
  • • 下游消费慢时如何做 backpressure
  • • Provider 长时间不出 chunk 时如何超时
  • • chunk 到达后如何实时刷出
  • • 最终 usage 信息在尾包里时如何收尾结算

12.2 一个更接近生产的 SSE 透传骨架

package streamproxyimport (    "bufio"    "context"    "errors"    "io"    "net/http"    "time")type Proxy struct {    client *http.Client}func (p *Proxy) ForwardSSE(w http.ResponseWriter, req *http.Request, upstream *http.Request) error {    ctx := req.Context()    resp, err := p.client.Do(upstream.WithContext(ctx))    if err != nil {        return err    }    defer resp.Body.Close()    if resp.StatusCode >= 400 {        body, _ := io.ReadAll(io.LimitReader(resp.Body, 64*1024))        http.Error(w, string(body), resp.StatusCode)        return nil    }    flusher, ok := w.(http.Flusher)    if !ok {        return errors.New("response writer does not support flushing")    }    header := w.Header()    header.Set("Content-Type", "text/event-stream")    header.Set("Cache-Control", "no-cache")    header.Set("Connection", "keep-alive")    reader := bufio.NewReaderSize(resp.Body, 32*1024)    buffer := make([]byte, 0, 32*1024)    idleTimer := time.NewTimer(45 * time.Second)    defer idleTimer.Stop()    for {        select {        case <-ctx.Done():            return ctx.Err()        case <-idleTimer.C:            return context.DeadlineExceeded        default:        }        line, err := reader.ReadBytes('\n')        if len(line) > 0 {            buffer = append(buffer[:0], line...)            if _, writeErr := w.Write(buffer); writeErr != nil {                return writeErr            }            flusher.Flush()            if !idleTimer.Stop() {                select {                case <-idleTimer.C:                default:                }            }            idleTimer.Reset(45 * time.Second)        }        if err != nil {            if errors.Is(err, io.EOF) {                return nil            }            return err        }    }}

这类代码里容易漏掉三件事:

  • • 客户端断开时取消上游 context
  • • 读取超时和空闲超时分开处理
  • • 尾包里的 usage 需要被正确抽取并结算

十三、熔断、重试与降级:防止上游抖动放大为系统故障

AI Gateway 处于流量中枢位置,一旦错误处理策略不当,很容易把上游局部故障放大为平台级故障。

13.1 哪些错误适合重试

适合有限重试的场景:

  • • 建连失败
  • • 短暂 5xx
  • • 部分网络超时
  • • 上游返回可重试的容量不足

不适合盲目重试的场景:

  • • 提示词不合法
  • • 模型权限不足
  • • 内容安全拒绝
  • • 已经超出预算或配额

13.2 重试必须满足幂等边界

对聊天类请求来说,“重试”并不总是无害的。
如果请求已经被上游处理但响应中途断开,盲目重试可能导致:

  • • 重复计费
  • • 重复生成
  • • 工具调用重复执行

因此生产实践里常见的做法是:

  • • 生成 request_id 并透传给 Provider 或内部账单链路
  • • 对非幂等操作仅允许一次内部重试
  • • 对流式请求优先降级切换,而不是多次重放

13.3 熔断不要只按错误率判断

只看错误率会遗漏大量慢故障。
更稳妥的熔断输入建议包括:

  • • 最近窗口失败率
  • • p95 / p99 延迟
  • • 超时率
  • • 连接池耗尽率
  • • 空闲超时比例

本质上,AI Gateway 的熔断判断应该回答的是:

这个 Provider 现在还能不能继续承接流量

而不只是:

它是不是返回了很多 5xx

十四、Provider 适配层设计:把差异封装在南向,不把混乱暴露到北向

不同模型供应商在这些方面经常存在差异:

  • • URL 结构
  • • 身份认证方式
  • • 是否兼容 OpenAI 格式
  • • 流式 chunk 格式
  • • tool calling 协议
  • • usage 返回位置
  • • 错误码语义

因此 Provider 适配层应当提供统一接口,而不是让业务或路由层直接感知每个 SDK 的差异。

一个常见的接口抽象如下:

package providerimport "context"type ChatRequest struct {    RequestID   string    Model       string    Messages    []Message    Temperature float64    MaxTokens   int    Stream      bool    Tools       []ToolDefinition    Metadata    map[string]string}type ChatResponse struct {    Provider     string    Model        string    Content      string    InputTokens  int    OutputTokens int    TotalTokens  int    FinishReason string}type Client interface {    Name() string    Supports(model string) bool    Chat(ctx context.Context, req *ChatRequest) (*ChatResponse, error)    Stream(ctx context.Context, req *ChatRequest) (StreamSession, error)}

这一层的设计原则是:

  • • 北向统一
  • • 南向兼容
  • • 错误标准化
  • • usage 归一化

这样后续新增 Provider 时,不需要改动路由和预算模块。


十五、配置中心与灰度发布:把策略变化从代码发布中解放出来

AI Gateway 的很多策略变化都不应该依赖发版,例如:

  • • 新增模型白名单
  • • 调整租户配额
  • • 某个 Provider 临时摘流
  • • 把一个场景切到更便宜的模型组
  • • 对 5% 请求开启新模型灰度

所以路由、预算、配额这类配置,建议统一交给配置中心或控制面发布。

15.1 配置快照优于每次请求实时查库

请求路径上如果每次都查 DB,会直接拉高尾延迟。
更推荐:

  • • 控制面生成版本化规则快照
  • • 数据面长轮询或订阅更新
  • • 本地原子替换只读快照

15.2 灰度切流建议按能力组做,而不是按物理模型做

比如不要直接说:

把 10% 流量切到 gpt-4.1

而是定义:

customer-service-high-quality  stable: gpt-4o  canary: gpt-4.1  ratio: 90 / 10

这样回滚时只需回退能力组配置,不需要修改业务调用协议。


十六、工程化案例:一个企业内部 AI 平台是怎么用 Gateway 托住多业务线的

下面给一个更真实的案例场景。

16.1 业务背景

某企业内部已经有三类 AI 场景:

  • • 客服问答:对延迟敏感,优先稳定性
  • • 研发 Copilot:对质量敏感,允许更高成本
  • • 内容生成:对成本敏感,允许批量异步

底层模型来源包括:

  • • 公有云高质量模型
  • • 公有云中成本模型
  • • 私有化部署的开源模型

16.2 如果没有统一 Gateway,会发生什么

  • • 客服系统直接调 A 模型
  • • Copilot 直接调 B 模型
  • • 内容平台直接调私有模型
  • • 每条业务线自己处理 429、超时、重试和日志
  • • 财务只能月底看总账,无法拆到租户和应用

16.3 引入 Gateway 后的能力拆分

客服问答场景策略:

  • • 默认走低延迟模型组
  • • Provider 超时率过高时切换次优 Provider
  • • 高峰期限制最大输出 token

研发 Copilot 场景策略:

  • • 对核心研发团队开放高质量模型
  • • 对普通团队默认走中成本模型
  • • 大 Prompt 自动识别并走大上下文模型

内容生成场景策略:

  • • 日预算触发阈值后自动切换低成本模型
  • • 批量任务异步排队,避免同步入口打满
  • • 晚间离峰时恢复高质量模型组

这时候 AI Gateway 不再只是“入口”,而是整个企业模型消费的调度层和治理层。


十七、Kubernetes 部署要点:网关能扩容,不代表就能抗压

AI Gateway 通常运行在 Kubernetes 上,但能不能抗高并发,取决于部署细节,而不是是否上了 K8s。

17.1 Deployment 关注点

  • • Pod 无状态化
  • • 就绪探针与存活探针分离
  • • 优雅下线等待流式请求完成
  • • HPA 指标不能只看 CPU

一个更实用的部署骨架如下:

apiVersion: apps/v1kind: Deploymentmetadata:  name: ai-gatewayspec:  replicas: 4  strategy:    type: RollingUpdate    rollingUpdate:      maxSurge: 1      maxUnavailable: 0  selector:    matchLabels:      app: ai-gateway  template:    metadata:      labels:        app: ai-gateway    spec:      terminationGracePeriodSeconds: 60      containers:        - name: gateway          image: registry.example.com/ai-gateway:1.0.0          ports:            - containerPort: 8080          env:            - name: CONFIG_CENTER_ADDR              value: "nacos-headless.svc.cluster.local:8848"            - name: REDIS_ADDR              valueFrom:                secretKeyRef:                  name: ai-gateway-secret                  key: redis_addr          resources:            requests:              cpu: "1"              memory: "1Gi"            limits:              cpu: "4"              memory: "4Gi"          readinessProbe:            httpGet:              path: /readyz              port: 8080            periodSeconds: 5          livenessProbe:            httpGet:              path: /healthz              port: 8080            initialDelaySeconds: 10            periodSeconds: 10---apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:  name: ai-gatewayspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: ai-gateway  minReplicas: 4  maxReplicas: 40  metrics:    - type: Resource      resource:        name: cpu        target:          type: Utilization          averageUtilization: 65    - type: Pods      pods:        metric:          name: gateway_inflight_requests        target:          type: AverageValue          averageValue: "200"

17.2 为什么 HPA 不能只看 CPU

流式网关的瓶颈往往不是 CPU,而是:

  • • inflight 请求数
  • • 上游连接数
  • • goroutine 数
  • • 下游写阻塞

因此更合理的是把自定义指标一起纳入扩容依据。


十八、可观测性设计:至少回答这五个问题

如果一个 AI Gateway 上线后,团队无法快速回答下面五个问题,那说明观测设计还不够:

    1. 过去 5 分钟哪个租户的失败率最高?
    1. 哪个 Provider 的 p99 延迟正在恶化?
    1. 哪个模型组的成本在异常增长?
    1. 预算触顶后,哪些请求被降级了?
    1. 某个投诉请求当时到底路由到了哪里?

18.1 建议的核心指标

  • gateway_requests_total
  • gateway_request_duration_ms
  • gateway_stream_sessions_inflight
  • gateway_ratelimit_rejected_total
  • gateway_budget_rejected_total
  • gateway_route_selected_total
  • gateway_provider_error_total
  • gateway_provider_timeout_total
  • gateway_tokens_total
  • gateway_cost_usd_total

18.2 日志建议结构化

{  "ts": "2026-06-17T10:00:00+08:00",  "request_id": "req_01",  "tenant_id": "tenant_a",  "app_id": "copilot",  "scenario": "code_assistant",  "provider": "openai",  "model": "gpt-4o",  "stream": true,  "latency_ms": 1850,  "input_tokens": 1320,  "output_tokens": 880,  "result": "success"}

18.3 审计日志与业务日志要分流

业务日志追求排障效率,审计日志追求完整性和可追责性。
两者不要混在一起,否则后面保留周期、脱敏规则、查询权限都会很麻烦。


十九、常见失败案例与改进思路

19.1 失败案例一:把限流只做在入口层

问题在于入口只知道请求数,不知道各 Provider 当前容量和 token 消耗。
结果是总入口没超,但某个贵模型已经被打满。

改进思路:

  • • 入口限总量
  • • Provider 限局部容量
  • • 预算限总成本

19.2 失败案例二:每次请求实时查数据库拿路由规则

请求量一上来,数据库先成为瓶颈。
而且规则更新越频繁,越容易出现缓存不一致和尾延迟飙升。

改进思路:

  • • 路由规则快照本地缓存
  • • 配置变更走版本化推送
  • • 请求只查只读快照

19.3 失败案例三:统一重试策略导致重复计费

把所有错误都自动重试,会导致:

  • • 同一请求多次打到上游
  • • 账单重复
  • • 工具调用副作用重复

改进思路:

  • • 区分可重试错误和不可重试错误
  • • 流式请求限制重试次数
  • • request_id 全链路透传

19.4 失败案例四:日志很多,但没有成本归因

只记“调用成功/失败”远远不够。
如果没有 token 和 cost 维度,团队永远是在月底被动看账单。

改进思路:

  • • 所有成功响应都采 usage
  • • 对缺少 usage 的 Provider 做本地估算和偏差监控
  • • 成本事件异步写入明细和聚合表

二十、从 0 到 1 的演进路径

AI Gateway 不需要一步做到完美,但演进顺序很关键。

Phase 1:统一接入层

目标:

  • • 统一认证
  • • 统一 Provider 适配
  • • 统一日志和 request_id

适合阶段:

  • • 业务刚开始接入多个模型
  • • 日调用量不高

Phase 2:治理增强层

目标:

  • • 路由规则中心化
  • • QPS / TPM / 并发限流
  • • 预算与配额准入
  • • 基础熔断与降级

适合阶段:

  • • 开始多租户共享网关
  • • 成本和稳定性成为核心矛盾

Phase 3:平台化运营层

目标:

  • • 控制面与数据面分离
  • • 灰度实验
  • • 成本归因与 FinOps
  • • 多 Region 容灾
  • • 审计闭环

适合阶段:

  • • AI 成为企业级基础能力
  • • 多部门、多应用、多模型并存

这个演进路径背后的核心思想是:
先统一入口,再统一治理,最后统一运营。


二十一、落地清单:生产环境上线前至少检查这些项

接入层

  • • 是否统一了北向协议
  • • 是否有 request_id 全链路透传
  • • 是否支持同步与流式两种模式

路由层

  • • 是否使用能力组而不是写死物理模型
  • • 是否有健康检查和熔断剔除
  • • 是否支持灰度和回滚

限流层

  • • 是否同时限制 QPS / TPM / 并发
  • • 是否有 Redis 故障下的本地兜底
  • • 是否避免了热 key

成本层

  • • 是否做了请求前预算准入
  • • 是否按真实 usage 结算
  • • 是否支持租户 / 应用 / 场景维度归因

流式处理

  • • 客户端断开是否会取消上游
  • • 是否配置了空闲超时
  • • 是否能在流结束后正确结算 usage

可观测性

  • • 是否有结构化日志
  • • 是否有 Provider、模型、租户维度指标
  • • 是否能快速定位异常请求

运维层

  • • 是否支持优雅下线
  • • HPA 是否使用了自定义指标
  • • 配置变更是否无需发版

二十二、总结:AI Gateway 的本质是模型调用治理基础设施

从工程视角看,AI Gateway 的核心价值从来不是“统一一个调用地址”,而是把原本分散在每条业务线里的模型调用逻辑,沉淀成一层可治理、可扩展、可审计的基础设施。

真正的难点不在于把请求转发出去,而在于同时处理好这些矛盾:

  • • 质量与成本之间的平衡
  • • 延迟与可用性之间的平衡
  • • 租户自治与平台治理之间的平衡
  • • 灵活路由与稳定运行之间的平衡

如果只做 Provider 适配,得到的只是一个代理层。
如果进一步做了限流、预算、路由、熔断、审计和可观测,才真正进入 AI Gateway 的生产级形态。

对大多数企业来说,建设 AI Gateway 的意义,不是“把模型接进来”,而是让模型能力能够长期、低风险、可持续地被组织消费。

这才是它作为基础设施的真正边界。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐