AI Gateway 从零到生产:大模型网关的架构设计、高并发治理与成本控制实战
关键词: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 上线后,团队无法快速回答下面五个问题,那说明观测设计还不够:
-
- 过去 5 分钟哪个租户的失败率最高?
-
- 哪个 Provider 的 p99 延迟正在恶化?
-
- 哪个模型组的成本在异常增长?
-
- 预算触顶后,哪些请求被降级了?
-
- 某个投诉请求当时到底路由到了哪里?
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%免费】

更多推荐



所有评论(0)