
1. 引言
随着大语言模型(LLM)在业务中的深度落地,企业往往需要同时对接多家模型供应商------OpenAI、Claude、通义千问、文心一言、DeepSeek 等。每家的接口协议、鉴权方式、计费规则、限流策略各不相同,直接让业务代码逐家适配,不仅开发成本高,后期切换模型更是牵一发动全身。
更现实的情况是:一个中等规模的 AI 应用,往往同时存在「在线对话」「文档摘要」「代码补全」「内容审核」等多条链路,每条链路对模型的能力、延迟、成本要求都不一样。如果每条链路都自己维护一套供应商 SDK、密钥和重试逻辑,代码会迅速膨胀成难以维护的「适配泥潭」。
AI 网关正是为解决这一痛点而生。它位于应用与大模型之间,充当统一的接入层,把「模型供应商的差异」与「业务方的调用需求」解耦开来。本文将从 AI 网关的定位、核心能力、典型架构、开源方案选型到落地实践,带你系统认识这一大模型时代的「基础设施」,并给出可直接参考的代码与配置示例。
2. 什么是 AI 网关
AI 网关(AI Gateway / LLM Gateway)是一个专门面向大模型 API 的代理层,负责统一接收业务侧的大模型调用请求,再按策略转发到后端的某个模型供应商,并把响应返回给调用方。
从数据流向上看,它至少承担三件事:协议归一化 (把各家不同的请求/响应格式统一成一套)、策略决策 (选哪个模型、走哪条链路、是否限流)、旁路治理(日志、计量、审计、安全过滤)。这三件事对业务方是透明的,业务方看到的永远只是「一个兼容 OpenAI 的接口」。
2.1 一句话定位
如果要用一句话概括:AI 网关是「模型时代的 API 网关」,它把大模型接入这件事从「点对点硬编码」升级为「平台化统一治理」。它不生产模型能力,而是让模型能力「可被稳定、可控、可计量地使用」。
这个定位包含三层含义,值得拆开理解:
- 它是代理,不是模型:网关本身不做推理,只负责把请求安全、准确地送到合适的模型,再把结果原样(或按需加工后)返回。因此它的性能瓶颈通常在转发与流式处理,而不在算力。
- 它是控制面,也是数据面:控制面负责配置------有哪些供应商、哪些别名、哪些限流规则;数据面负责每一次真实请求的转发与统计。两者分离,才能做到「改配置不动业务代码」。
- 它是治理入口,不是业务逻辑:网关擅长做统一入口处的规则拦截与计量,但不应该承载业务语义。把业务判断塞进网关,会让它迅速变成难以维护的「万能中间件」。
2.2 它在系统中的位置
把 AI 网关放进一张简化的调用链路里,它的位置一目了然:
text
业务应用 / Agent / 批处理任务
│ (统一 OpenAI 兼容协议 + 网关虚拟 Key)
▼
┌─────────────┐
│ AI 网关 │ 协议归一化 · 鉴权限流 · 模型路由 · 流式转发 · 计量观测
└─────────────┘
│ (各供应商原生协议 + 托管的上游密钥)
▼
OpenAI / Claude / 通义千问 / 文心一言 / DeepSeek / 自建推理服务
可以看到,网关处在「业务」与「供应商」之间,是所有大模型调用的唯一收口点 。这个位置决定了它的两个特性:一是价值高 ------所有治理能力都能在这里统一实施;二是责任重------它一旦不可用,影响面是全局的,这也是后文反复强调高可用的原因。
2.3 与传统 API 网关的区别
它和传统 API 网关(如 Kong、APISIX)有相似之处,但又有本质区别:
- 传统 API 网关面向「微服务」,关注路由、鉴权、限流、灰度、协议转换;
- AI 网关面向「大模型」,额外关注模型路由、Token 计费、上下文管理、Prompt 安全、多供应商容灾、流式响应(SSE)转发等。
一个直观的对比:
| 维度 | 传统 API 网关 | AI 网关 |
|---|---|---|
| 请求体 | 结构化 JSON / 表单 | 含 Prompt、上下文、多模态内容 |
| 响应体 | 一次性返回 | 多为流式(SSE / chunk) |
| 计量单位 | 请求数 / QPS | Token 数(输入 + 输出) |
| 核心策略 | 路由、鉴权、限流 | 模型路由、降级、成本控制 |
| 安全重点 | 越权、注入 SQL | Prompt 注入、敏感信息泄露 |
| 上游特征 | 自家可控的服务 | 第三方、异构、配额受限、价格波动 |
| 失败语义 | 重试通常无损 | 降级可能改变输出质量,流式中断难续接 |
其中最后两行最容易被低估:传统网关的上游是「自己人」,行为可预期;而 AI 网关的上游是「外部供应商」,随时可能限流、涨价、变更模型版本,甚至直接下线某个模型。AI 网关的很多设计复杂度,本质上都来自「上游不可控」这一事实。
2.4 几个容易混淆的概念
实际交流中,AI 网关常和下面几个概念混用,这里做个简单区分:
| 概念 | 关注点 | 与 AI 网关的关系 |
|---|---|---|
| API 网关 | 微服务流量的统一入口 | 是 AI 网关的基础形态,但缺少模型相关能力 |
| LLM 代理(Proxy) | 单纯转发请求、隐藏密钥 | 是 AI 网关的子集,通常不含治理与计量 |
| 模型服务平台(MaaS) | 模型托管、推理部署、微调 | 偏「生产模型」,AI 网关偏「消费模型」 |
| Agent 框架 | 编排工具调用与多步推理 | 是网关的上层消费者,通常通过网关访问模型 |
理解这些边界很重要:不要指望 AI 网关去做模型托管,也不要指望 Agent 框架去承担统一鉴权与成本核算。各司其职,系统才清晰。
2.5 一个最小可用的 AI 网关长什么样
抛开各种高级能力,一个「最小可用」的 AI 网关其实只需要三件事:统一入口、密钥托管、按别名转发。用几十行代码就能跑起来,理解它有助于看清本质:
python
# 极简 AI 网关示意:统一入口 + 别名映射 + 密钥托管(仅用于理解原理,勿直接上生产)
from fastapi import FastAPI, Request, HTTPException
import httpx, os
app = FastAPI()
# 别名 -> 真实供应商配置;业务侧只认别名
ROUTES = {
"chat-default": {
"base_url": "https://api.openai.com/v1",
"api_key": os.environ["OPENAI_API_KEY"],
"model": "gpt-4o-mini",
},
"chat-cn": {
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"api_key": os.environ["DASHSCOPE_API_KEY"],
"model": "qwen-plus",
},
}
@app.post("/v1/chat/completions")
async def chat(request: Request):
body = await request.json()
alias = body.get("model")
route = ROUTES.get(alias)
if not route:
raise HTTPException(status_code=400, detail=f"unknown model alias: {alias}")
body["model"] = route["model"] # 别名替换为真实模型名
headers = {"Authorization": f"Bearer {route['api_key']}"}
async with httpx.AsyncClient(timeout=60) as client:
resp = await client.post(
f"{route['base_url']}/chat/completions",
json=body,
headers=headers,
)
return resp.json()
这段代码已经体现了 AI 网关最核心的三个价值:业务方只写别名、密钥不出网关、换供应商只改配置。但它没有重试降级、限流、Token 计量、流式透传、多租户隔离------这些正是后面第 4 节要逐项展开的能力,也是「玩具」与「生产可用」之间的差距。
实践提示:如果你只是想验证「统一接入」是否可行,用上面这种极简实现跑通链路即可;一旦要上生产,建议直接选用成熟开源方案,不要自己从零造轮子------流式转发与 Token 计量的坑远比想象中多。
简单说,AI 网关是「模型时代的 API 网关」,它把大模型接入这件事从「点对点硬编码」升级为「平台化统一治理」。它不生产模型能力,而是让模型能力「可被稳定、可控、可计量地使用」。
3. 为什么需要 AI 网关
在没有网关时,业务接入大模型通常是这样:
text
业务代码 -> OpenAI SDK -> OpenAI API
业务代码 -> 通义 SDK -> 通义 API
业务代码 -> 文心 SDK -> 文心 API
这种直连模式会带来一系列问题:
- 多供应商适配成本高:每接一家模型,都要写一套适配代码;
- 切换模型困难:想从 A 模型切到 B 模型,需要改业务代码;
- 缺乏统一治理:限流、鉴权、监控散落在各业务代码里,难以统一管控;
- 成本不可控:Token 消耗没有统一计量,预算超支难以及时发现;
- 安全风险:API Key 散落在各处,泄露风险高,缺乏 Prompt 注入防护。
引入 AI 网关后,业务侧只需对接网关的统一接口,模型供应商的差异被完全屏蔽:
text
业务代码 -> AI 网关 -> OpenAI / Claude / 通义 / 文心 ...
4. AI 网关的核心能力
一个成熟的 AI 网关,能力可以拆成「接入层、治理层、观测层、安全层」四类。下面这张全景图先给出整体认知,再逐项展开:
#mermaid-svg-1pMxtsVAyT9ccT7M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1pMxtsVAyT9ccT7M .error-icon{fill:#552222;}#mermaid-svg-1pMxtsVAyT9ccT7M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1pMxtsVAyT9ccT7M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1pMxtsVAyT9ccT7M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1pMxtsVAyT9ccT7M .marker.cross{stroke:#333333;}#mermaid-svg-1pMxtsVAyT9ccT7M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1pMxtsVAyT9ccT7M p{margin:0;}#mermaid-svg-1pMxtsVAyT9ccT7M .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster-label text{fill:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster-label span{color:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster-label span p{background-color:transparent;}#mermaid-svg-1pMxtsVAyT9ccT7M .label text,#mermaid-svg-1pMxtsVAyT9ccT7M span{fill:#333;color:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M .node rect,#mermaid-svg-1pMxtsVAyT9ccT7M .node circle,#mermaid-svg-1pMxtsVAyT9ccT7M .node ellipse,#mermaid-svg-1pMxtsVAyT9ccT7M .node polygon,#mermaid-svg-1pMxtsVAyT9ccT7M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1pMxtsVAyT9ccT7M .rough-node .label text,#mermaid-svg-1pMxtsVAyT9ccT7M .node .label text,#mermaid-svg-1pMxtsVAyT9ccT7M .image-shape .label,#mermaid-svg-1pMxtsVAyT9ccT7M .icon-shape .label{text-anchor:middle;}#mermaid-svg-1pMxtsVAyT9ccT7M .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1pMxtsVAyT9ccT7M .rough-node .label,#mermaid-svg-1pMxtsVAyT9ccT7M .node .label,#mermaid-svg-1pMxtsVAyT9ccT7M .image-shape .label,#mermaid-svg-1pMxtsVAyT9ccT7M .icon-shape .label{text-align:center;}#mermaid-svg-1pMxtsVAyT9ccT7M .node.clickable{cursor:pointer;}#mermaid-svg-1pMxtsVAyT9ccT7M .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1pMxtsVAyT9ccT7M .arrowheadPath{fill:#333333;}#mermaid-svg-1pMxtsVAyT9ccT7M .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1pMxtsVAyT9ccT7M .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1pMxtsVAyT9ccT7M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1pMxtsVAyT9ccT7M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1pMxtsVAyT9ccT7M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1pMxtsVAyT9ccT7M .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster text{fill:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M .cluster span{color:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1pMxtsVAyT9ccT7M .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1pMxtsVAyT9ccT7M rect.text{fill:none;stroke-width:0;}#mermaid-svg-1pMxtsVAyT9ccT7M .icon-shape,#mermaid-svg-1pMxtsVAyT9ccT7M .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1pMxtsVAyT9ccT7M .icon-shape p,#mermaid-svg-1pMxtsVAyT9ccT7M .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1pMxtsVAyT9ccT7M .icon-shape .label rect,#mermaid-svg-1pMxtsVAyT9ccT7M .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1pMxtsVAyT9ccT7M .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1pMxtsVAyT9ccT7M .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1pMxtsVAyT9ccT7M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安全层
Prompt 过滤
敏感信息脱敏
审计合规
观测层
调用日志
指标监控
链路追踪
治理层
容灾降级
鉴权与 Key
限流配额
成本计量
接入层
统一协议
模型路由
流式转发
4.1 统一接入与模型路由
网关向上游暴露一套统一的大模型调用接口(兼容 OpenAI 格式),内部根据路由规则把请求分发到不同的模型供应商。这是 AI 网关最基础、也最有价值的能力------业务方只需要记住一个 base_url 和一个 api_key。
路由策略通常可以基于以下几类维度:
- 模型名称映射 :把统一的模型别名映射到具体供应商,例如
gpt-4o映射到某供应商的对应模型; - 业务优先级:主用 A 供应商,故障时切 B 供应商;
- 成本策略:简单任务走便宜的小模型,复杂任务走强模型;
- 负载与延迟:同一模型有多个渠道时,按权重或响应延迟做负载均衡;
- 灰度与 A/B:新模型先切 5% 流量,验证效果后再逐步放量。
一个典型的 LiteLLM 配置示例如下,通过 model_list 定义别名与真实模型的映射,再用 router_settings 配置重试与降级:
yaml
model_list:
- model_name: chat-default # 业务侧统一使用的别名
litellm_params:
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
- model_name: chat-default # 同名即构成一个渠道组
litellm_params:
model: deepseek/deepseek-chat
api_key: os.environ/DEEPSEEK_API_KEY
router_settings:
routing_strategy: latency-based-routing # 按延迟选渠道
num_retries: 2
fallbacks: [{"chat-default": ["chat-backup"]}]
业务代码侧则完全不需要感知上面的配置,仍然用标准 OpenAI SDK 调用即可:
python
from openai import OpenAI
client = OpenAI(
base_url="http://ai-gateway.internal/v1", # 指向网关
api_key="sk-gateway-xxx", # 网关签发的凭证
)
resp = client.chat.completions.create(
model="chat-default", # 只写别名
messages=[{"role": "user", "content": "用一句话解释什么是 AI 网关"}],
)
print(resp.choices[0].message.content)
实践提示:模型别名不要直接用供应商的原始模型名(如
gpt-4o),否则一旦想换供应商,业务代码里的模型名又得跟着改,等于白做了网关抽象。
4.2 多供应商容灾与降级
当某个供应商出现故障、限流或超时时,网关可以自动切换到备用供应商,实现无感容灾。这是直连模式几乎做不到的能力。
容灾通常分三个层次,建议按顺序逐层配置:
- 重试(Retry):同一渠道内的瞬时错误(如 429、5xx)先做指数退避重试;
- 降级(Fallback):重试仍失败,则切换到备用渠道,可以是同模型的另一家供应商,也可以是能力稍弱但更稳定的模型;
- 熔断(Circuit Breaker):某渠道连续失败达到阈值后,短时间内直接摘除,避免持续打爆故障方。
yaml
router_settings:
num_retries: 2
retry_after: 1 # 秒
allowed_fails: 3 # 连续失败 3 次触发熔断
cooldown_time: 60 # 熔断冷却 60 秒
fallbacks:
- {"chat-default": ["chat-backup"]}
- {"chat-backup": ["chat-cheap"]}
需要注意的坑:
- 降级不是无损的:备用模型的输出风格、上下文长度、函数调用能力可能不同,业务侧要能容忍这种差异;
- 流式响应中途失败:如果已经向客户端吐了一部分 token 才失败,通常无法「续接」,只能返回错误让前端重试,网关要明确这一行为;
- 避免雪崩:降级目标要预留足够配额,否则主渠道一挂,备用渠道立刻被打满。
4.3 统一鉴权与 Key 管理
业务侧不再直接持有各家模型的 API Key,而是统一使用网关签发的凭证。网关集中管理上游密钥,降低泄露风险,也方便按业务线、按团队做权限隔离。
这一层通常包含三件事:
- 上游密钥托管:供应商 Key 只存在网关(或密钥管理服务)中,业务方永远拿不到;
- 下游凭证签发:给每个业务线/应用签发独立的虚拟 Key,可设置有效期、可用模型范围、预算上限;
- 权限与租户隔离:按团队划分租户,限制其只能调用授权范围内的模型,并独立统计用量。
bash
# 通过网关管理接口签发一个只允许调用 chat-default、月预算 100 美元的虚拟 Key
curl -X POST http://ai-gateway.internal/key/generate \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key_alias": "team-search",
"models": ["chat-default"],
"max_budget": 100,
"budget_duration": "30d",
"rpm_limit": 600
}'
实践提示:虚拟 Key 一定要能「一键吊销」。当某个业务方 Key 泄露时,吊销 + 重新签发应该是一个分钟级的操作,而不是去改一堆业务代码里的配置。
4.4 限流与配额控制
网关可按调用方、按模型、按时间窗口做限流,防止某个业务线过度消耗资源,保障核心业务的服务质量。
限流维度建议至少覆盖以下几层:
| 维度 | 典型配置 | 作用 |
|---|---|---|
| 请求速率(RPM) | 每 Key 600 次/分钟 | 防止单业务打爆网关 |
| 并发数 | 每 Key 50 并发 | 防止长请求堆积拖垮连接池 |
| Token 速率(TPM) | 每 Key 20 万 Token/分钟 | 更贴近真实成本与上游配额 |
| 日/月配额 | 每租户每日 500 万 Token | 兜底预算,防止异常刷量 |
几个容易忽略的点:
- 限流要区分「拒绝」和「排队」:面向用户的在线链路适合快速失败并返回 429,离线批处理链路则更适合排队削峰;
- 上游配额也要管:供应商侧通常有自己的 RPM/TPM 限制,网关的限流阈值应低于上游配额,留出缓冲;
- 限流键要可配置:按 Key、按用户 ID、按租户、按 IP 都可能需要,硬编码一种维度后期会很被动。
4.5 Token 计量与成本核算
网关在转发请求时精确统计每次调用的输入/输出 Token 数,结合各供应商的单价,生成成本账单。这让「每个业务线花了多少钱」一目了然。
计量要做到可信,需要注意:
- 输入与输出分开计:两者单价往往差 3~4 倍,混在一起算会严重失真;
- 缓存命中单独标记:不少供应商对 Prompt 缓存命中部分打折,网关应记录缓存命中量;
- 按维度聚合:至少支持按「租户 / 应用 / 模型 / 日期」四个维度出报表;
- 单价可配置:模型价格变动频繁,价格表应做成配置而非硬编码。
python
# 简化的成本计算逻辑示意
PRICE = { # 单位:美元 / 1K token
"gpt-4o-mini": {"input": 0.00015, "output": 0.0006},
"deepseek-chat": {"input": 0.00014, "output": 0.00028},
}
def calc_cost(model: str, prompt_tokens: int, completion_tokens: int) -> float:
p = PRICE[model]
return prompt_tokens / 1000 * p["input"] + completion_tokens / 1000 * p["output"]
实践提示:成本数据最好能反哺路由策略------当某条链路的单次调用成本明显高于其业务价值时,就该考虑把它路由到更便宜的模型上。
4.6 可观测性
网关统一记录调用日志、耗时、成功率、错误码,并接入 Prometheus、Grafana 等监控体系,形成大模型调用的全局视图。
建议重点关注的指标:
- 黄金三指标:QPS、P95/P99 延迟、错误率,按模型与供应商拆分;
- Token 指标:输入/输出 Token 速率、平均单次 Token 数;
- 首 Token 延迟(TTFT):流式场景下用户真正感知的延迟,比总耗时更关键;
- 降级与熔断次数:反映供应商稳定性,也是容量规划的依据;
- 缓存命中率:直接影响成本与延迟。
日志方面,建议至少保留「请求 ID、租户、模型、Token 数、耗时、状态码、是否降级」这些字段,并支持按请求 ID 串联全链路。注意 Prompt 与响应内容涉及用户数据,落盘前要做脱敏或按需采样。
4.7 安全防护
网关可以在 Prompt 进入模型前做内容过滤,识别并拦截 Prompt 注入攻击、敏感信息泄露等风险,是 AI 应用安全防线的重要一环。
常见的安全能力包括:
- Prompt 注入检测:识别「忽略以上指令」「你现在是......」等越权诱导模式;
- 敏感信息脱敏:在请求出网关前,对手机号、身份证、密钥等做掩码或替换;
- 输出内容审核:对模型返回内容做合规过滤,避免不当内容直达用户;
- 审计留痕:记录谁在什么时间调用了哪个模型、传了什么类型的数据,满足合规要求。
需要清醒认识的是:网关的安全能力是「防线之一」,不是「全部」。它擅长做统一入口处的规则拦截,但无法替代业务侧的权限校验与模型自身的安全对齐。把安全全部寄托在网关层,同样是一种风险。
4.8 能力落地优先级建议
七项能力不必一次全上,建议按下面的顺序分阶段落地,投入产出比最高:
| 阶段 | 优先落地 | 目标 |
|---|---|---|
| 第一阶段 | 统一接入 + 模型路由 + 基础鉴权 | 先把多供应商接进来,跑通统一调用 |
| 第二阶段 | 容灾降级 + 限流配额 + Token 计量 | 保证稳定性与成本可见 |
| 第三阶段 | 可观测性 + 安全防护 | 补齐运维与合规能力 |
先跑通「能用」,再解决「稳用」,最后做到「可控可审计」,是大多数团队验证下来比较务实的路径。
5. 典型架构
前面讲的是「能力」,这一节讲「怎么摆」。一个可落地的 AI 网关,通常不是单个进程,而是由「接入层、网关核心、治理与观测、上游供应商」四段组成的链路。下面先给出整体部署架构,再逐层拆解每一段承担什么职责、部署时要注意什么。
#mermaid-svg-lVkLTmkb5FOgUCVz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lVkLTmkb5FOgUCVz .error-icon{fill:#552222;}#mermaid-svg-lVkLTmkb5FOgUCVz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lVkLTmkb5FOgUCVz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lVkLTmkb5FOgUCVz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lVkLTmkb5FOgUCVz .marker.cross{stroke:#333333;}#mermaid-svg-lVkLTmkb5FOgUCVz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lVkLTmkb5FOgUCVz p{margin:0;}#mermaid-svg-lVkLTmkb5FOgUCVz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster-label text{fill:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster-label span{color:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster-label span p{background-color:transparent;}#mermaid-svg-lVkLTmkb5FOgUCVz .label text,#mermaid-svg-lVkLTmkb5FOgUCVz span{fill:#333;color:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz .node rect,#mermaid-svg-lVkLTmkb5FOgUCVz .node circle,#mermaid-svg-lVkLTmkb5FOgUCVz .node ellipse,#mermaid-svg-lVkLTmkb5FOgUCVz .node polygon,#mermaid-svg-lVkLTmkb5FOgUCVz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lVkLTmkb5FOgUCVz .rough-node .label text,#mermaid-svg-lVkLTmkb5FOgUCVz .node .label text,#mermaid-svg-lVkLTmkb5FOgUCVz .image-shape .label,#mermaid-svg-lVkLTmkb5FOgUCVz .icon-shape .label{text-anchor:middle;}#mermaid-svg-lVkLTmkb5FOgUCVz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lVkLTmkb5FOgUCVz .rough-node .label,#mermaid-svg-lVkLTmkb5FOgUCVz .node .label,#mermaid-svg-lVkLTmkb5FOgUCVz .image-shape .label,#mermaid-svg-lVkLTmkb5FOgUCVz .icon-shape .label{text-align:center;}#mermaid-svg-lVkLTmkb5FOgUCVz .node.clickable{cursor:pointer;}#mermaid-svg-lVkLTmkb5FOgUCVz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lVkLTmkb5FOgUCVz .arrowheadPath{fill:#333333;}#mermaid-svg-lVkLTmkb5FOgUCVz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lVkLTmkb5FOgUCVz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lVkLTmkb5FOgUCVz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lVkLTmkb5FOgUCVz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lVkLTmkb5FOgUCVz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lVkLTmkb5FOgUCVz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster text{fill:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz .cluster span{color:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lVkLTmkb5FOgUCVz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lVkLTmkb5FOgUCVz rect.text{fill:none;stroke-width:0;}#mermaid-svg-lVkLTmkb5FOgUCVz .icon-shape,#mermaid-svg-lVkLTmkb5FOgUCVz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lVkLTmkb5FOgUCVz .icon-shape p,#mermaid-svg-lVkLTmkb5FOgUCVz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lVkLTmkb5FOgUCVz .icon-shape .label rect,#mermaid-svg-lVkLTmkb5FOgUCVz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lVkLTmkb5FOgUCVz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lVkLTmkb5FOgUCVz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lVkLTmkb5FOgUCVz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 上游供应商
OpenAI
Claude
通义千问
文心一言
自建模型
治理与观测
配置中心
日志 / 指标 / 追踪
成本计量
密钥管理
网关核心
协议归一化
鉴权与限流
模型路由
流式转发
接入层
负载均衡 / Ingress
TLS 终止
客户端层
Web / App
内部服务
离线批处理
5.1 分层职责拆解
| 层次 | 核心职责 | 典型实现 |
|---|---|---|
| 客户端层 | 发起大模型调用,只感知网关地址 | 业务应用、SDK、批处理任务 |
| 接入层 | 流量入口、TLS 终止、基础防护 | Nginx / Ingress / SLB |
| 网关核心 | 协议归一化、鉴权限流、模型路由、流式转发 | LiteLLM / Higress / Kong 等 |
| 治理与观测 | 配置下发、日志指标、成本计量、密钥托管 | 配置中心 + Prometheus + KMS |
| 上游供应商 | 真正提供模型推理能力 | 各家云厂商 API、自建推理服务 |
这样分层的好处是:接入层与网关核心解耦 ,网关可以水平扩容;治理与观测旁路化 ,不阻塞主链路;上游供应商可插拔,新增一家只需改配置,不动业务代码。
5.2 三种常见部署形态
不同团队规模,网关的部署形态差别很大,常见的有三种:
- 单机/单实例形态:网关与业务部署在同一台机器或同一个 Pod 内,适合 PoC 验证与个人项目。优点是零网络开销、部署简单;缺点是没有高可用,一旦网关挂掉业务直接不可用。
- 独立服务形态:网关作为独立服务部署,前面挂负载均衡,多副本运行。这是大多数中小团队的主流选择,兼顾了改造成本与可用性。需要注意网关本身要无状态,会话、限流计数等状态外置到 Redis 等组件。
- Sidecar / 网格形态:网关能力以 Sidecar 或 Envoy 插件形式下沉到服务网格,业务 Pod 旁挂一个代理。适合已经上了 Istio 的团队,能做到「业务无感接入」,但运维复杂度明显更高,不建议在网格体系尚未成熟时贸然采用。
5.3 高可用与容量设计
网关是所有大模型调用的必经之路,它一旦不可用,影响面是全局的。因此高可用设计要重点考虑:
- 多副本 + 反亲和:至少 2 个副本,且调度到不同节点/可用区,避免单点故障;
- 无状态化:网关进程本身不保存会话,限流计数、Key 信息、配置统一放外部存储;
- 超时与连接池:上游调用要设置合理的连接超时与读超时,流式场景尤其要注意长连接管理,避免连接被上游长时间占用;
- 优雅发布:滚动更新时先摘流量再停进程,避免正在转发的流式请求被硬切断;
- 容量估算:按「峰值 QPS × 平均响应时间」估算并发连接数,流式请求的并发占用远高于普通 HTTP,容量要留足余量。
5.4 一次请求的完整链路
把上面的架构串起来,一次典型的大模型调用会经过这些步骤:
- 业务应用用统一凭证向网关发起请求,请求体是 OpenAI 兼容格式;
- 接入层完成 TLS 终止与基础限流,转发到网关核心;
- 网关校验虚拟 Key,检查模型权限、预算与限流配额;
- 路由模块根据模型别名与路由策略选出目标渠道;
- 网关把请求转换为供应商协议,携带托管的上游密钥发出;
- 上游返回流式响应,网关边接收边转发给客户端,同时统计 Token;
- 请求结束后,网关异步写入调用日志、指标与成本数据。
这条链路里,第 6 步的流式转发是最容易出问题的地方:既要保证首 Token 延迟足够低,又要在中途失败时给出明确错误,还要准确统计 Token 数。很多网关的坑都集中在这一步。
5.5 架构演进路径
不建议一上来就搭一套完整架构,比较务实的演进路径是:
| 阶段 | 架构形态 | 关注重点 |
|---|---|---|
| 起步期 | 单实例网关 + 少量供应商 | 跑通统一接入,验证可行性 |
| 成长期 | 多副本网关 + 负载均衡 + 基础监控 | 保证可用性,成本可见 |
| 成熟期 | 网关集群 + 配置中心 + 全链路观测 + 安全防护 | 平台化治理,多租户隔离 |
架构是长出来的,不是设计出来的。先解决当下的痛点,再随着调用量和团队规模逐步补齐能力,比一次性设计一套「完美架构」要可靠得多。
6. 主流开源方案
目前社区里比较活跃的 AI 网关开源项目主要有:
- LiteLLM:轻量级,兼容 OpenAI 格式,支持 100+ 模型供应商,适合快速接入;
- One API:国内社区流行,支持多家国产模型,带管理后台,适合私有化部署;
- Higress:基于 Istio/Envoy 的云原生网关,社区已扩展出 AI 网关能力,适合已有 K8s 体系的企业;
- Kong AI Gateway:老牌 API 网关厂商推出的 AI 网关插件,适合已有 Kong 体系的企业。
下面是四个主流方案的横向对比:
| 方案 | 开源协议 | 支持供应商数量 | 是否带管理后台 | 云原生支持 | 适用场景 | 社区活跃度 |
|---|---|---|---|---|---|---|
| LiteLLM | MIT | 100+ | 否(以代码/配置为主) | 一般(可部署于容器) | 快速接入多供应商、轻量代理 | 高 |
| One API | MIT | 数十家(含多家国产模型) | 是 | 一般(可部署于容器) | 私有化部署、国内模型统一管理 | 高 |
| Higress | Apache 2.0 | 多家(通过插件扩展) | 是(控制面) | 强(原生 K8s/Istio) | 已有 K8s 体系、云原生架构 | 中高 |
| Kong AI Gateway | Apache 2.0 | 多家(通过插件扩展) | 是(Kong Manager) | 强(云原生网关) | 已有 Kong 体系、企业级网关 | 中高 |
说明:以上数据基于各项目当前公开信息整理,供应商数量与社区活跃度会随版本迭代而变化,选型时请以官方仓库最新数据为准。
选型建议总结:如果你的诉求是「快速把多家模型接进来、验证 AI 能力」,LiteLLM 是最轻的选择;如果偏重国内模型、需要开箱即用的管理后台,One API 更顺手;如果团队已经深度拥抱 Kubernetes 和 Istio,Higress 能无缝融入现有云原生体系;如果企业已有成熟的 Kong 网关,Kong AI Gateway 则能以插件方式平滑扩展 AI 能力。总体而言,没有「最好」的网关,只有「最适合当前团队技术栈与部署环境」的方案,建议先做小规模 PoC 验证再正式落地。选型时建议结合团队技术栈、部署环境、是否需要管理后台、是否要求云原生等因素综合评估。
为了更直观地辅助决策,下面用一棵决策树把四个判断节点串起来,按顺序回答即可落到具体方案:
#mermaid-svg-uGX1brUSDF7aCzzw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uGX1brUSDF7aCzzw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uGX1brUSDF7aCzzw .error-icon{fill:#552222;}#mermaid-svg-uGX1brUSDF7aCzzw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uGX1brUSDF7aCzzw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uGX1brUSDF7aCzzw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uGX1brUSDF7aCzzw .marker.cross{stroke:#333333;}#mermaid-svg-uGX1brUSDF7aCzzw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uGX1brUSDF7aCzzw p{margin:0;}#mermaid-svg-uGX1brUSDF7aCzzw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uGX1brUSDF7aCzzw .cluster-label text{fill:#333;}#mermaid-svg-uGX1brUSDF7aCzzw .cluster-label span{color:#333;}#mermaid-svg-uGX1brUSDF7aCzzw .cluster-label span p{background-color:transparent;}#mermaid-svg-uGX1brUSDF7aCzzw .label text,#mermaid-svg-uGX1brUSDF7aCzzw span{fill:#333;color:#333;}#mermaid-svg-uGX1brUSDF7aCzzw .node rect,#mermaid-svg-uGX1brUSDF7aCzzw .node circle,#mermaid-svg-uGX1brUSDF7aCzzw .node ellipse,#mermaid-svg-uGX1brUSDF7aCzzw .node polygon,#mermaid-svg-uGX1brUSDF7aCzzw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uGX1brUSDF7aCzzw .rough-node .label text,#mermaid-svg-uGX1brUSDF7aCzzw .node .label text,#mermaid-svg-uGX1brUSDF7aCzzw .image-shape .label,#mermaid-svg-uGX1brUSDF7aCzzw .icon-shape .label{text-anchor:middle;}#mermaid-svg-uGX1brUSDF7aCzzw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uGX1brUSDF7aCzzw .rough-node .label,#mermaid-svg-uGX1brUSDF7aCzzw .node .label,#mermaid-svg-uGX1brUSDF7aCzzw .image-shape .label,#mermaid-svg-uGX1brUSDF7aCzzw .icon-shape .label{text-align:center;}#mermaid-svg-uGX1brUSDF7aCzzw .node.clickable{cursor:pointer;}#mermaid-svg-uGX1brUSDF7aCzzw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uGX1brUSDF7aCzzw .arrowheadPath{fill:#333333;}#mermaid-svg-uGX1brUSDF7aCzzw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uGX1brUSDF7aCzzw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uGX1brUSDF7aCzzw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uGX1brUSDF7aCzzw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uGX1brUSDF7aCzzw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uGX1brUSDF7aCzzw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uGX1brUSDF7aCzzw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uGX1brUSDF7aCzzw .cluster text{fill:#333;}#mermaid-svg-uGX1brUSDF7aCzzw .cluster span{color:#333;}#mermaid-svg-uGX1brUSDF7aCzzw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uGX1brUSDF7aCzzw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uGX1brUSDF7aCzzw rect.text{fill:none;stroke-width:0;}#mermaid-svg-uGX1brUSDF7aCzzw .icon-shape,#mermaid-svg-uGX1brUSDF7aCzzw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uGX1brUSDF7aCzzw .icon-shape p,#mermaid-svg-uGX1brUSDF7aCzzw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uGX1brUSDF7aCzzw .icon-shape .label rect,#mermaid-svg-uGX1brUSDF7aCzzw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uGX1brUSDF7aCzzw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uGX1brUSDF7aCzzw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uGX1brUSDF7aCzzw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
开始选型
是否已有 K8s / Istio 体系?
Higress
是否已有 Kong 体系?
Kong AI Gateway
是否需要开箱即用的管理后台?
是否以国产模型为主?
LiteLLM
One API
读图说明:决策树按「先看存量基础设施,再看功能诉求」的顺序提问。已有 K8s/Istio 体系优先选 Higress,已有 Kong 体系优先选 Kong AI Gateway,两者都能复用现有网关能力、改造成本最低;若都没有,则看是否需要开箱即用的管理后台------不需要就选最轻的 LiteLLM,需要则再判断是否以国产模型为主,是则选 One API,否则仍可回到 LiteLLM。需要说明的是,这只是一条经验路径,实际选型还应结合团队技术栈与 PoC 结果综合判断。
7. 落地实践要点
前面几节讲的是「是什么」和「怎么设计」,这一节讲「怎么真正落地」。AI 网关的落地难点往往不在技术选型,而在组织协作、迁移节奏和长期运营。下面从实施路径、迁移策略、常见坑位、团队分工和运营机制五个方面展开。
7.1 分阶段实施路径
不建议一上来就追求「大而全」,比较务实的做法是按阶段推进,每个阶段都有明确的验收标准:
| 阶段 | 时间参考 | 核心任务 | 验收标准 |
|---|---|---|---|
| 调研与 PoC | 1~2 周 | 选定 1~2 个候选方案,接入 2~3 家供应商 | 跑通统一调用,验证流式与降级 |
| 试点接入 | 2~4 周 | 选 1 条非核心链路接入网关 | 业务无感切换,监控指标正常 |
| 规模推广 | 1~2 个月 | 核心链路逐步迁移,补齐鉴权限流 | 多租户隔离生效,成本可核算 |
| 平台化运营 | 持续 | 完善观测、安全、自助化能力 | 业务方可自助申请 Key 与模型 |
每个阶段结束都要做一次复盘:哪些能力真正被用上了,哪些是「设计了但没人用」的。网关最容易犯的错误是过度设计------堆了一堆策略,结果业务方根本不用。
7.2 存量业务迁移策略
存量业务从直连迁移到网关,是落地中最容易出问题的环节。推荐「先旁路、后主路」的渐进式迁移:
- 双写对比阶段:业务仍走直连,同时把请求复制一份打到网关,只做记录不返回结果,用于验证网关的协议转换与计量是否准确;
- 灰度切流阶段:按用户 ID 或流量比例把一部分请求真正切到网关,观察错误率与延迟变化;
- 全量切换阶段:灰度稳定后全量切换,直连通道保留一段时间作为回退手段;
- 下线直连阶段:确认无回退需求后,清理业务代码中的供应商 SDK 与密钥。
迁移过程中要特别注意两点:一是业务代码里的模型名要统一替换成网关别名 ,否则网关抽象形同虚设;二是保留快速回退开关,一旦网关出问题能分钟级切回直连。
7.3 常见坑位与规避方法
落地过程中,下面这些坑几乎每个团队都会踩到:
- 只做了转发,没做治理:把网关当成一个反向代理,鉴权、限流、计量全没配,等于白搭。网关的价值在治理,不在转发。
- 模型别名设计随意 :直接用供应商原始模型名做别名,换供应商时业务代码还得改。别名应按「业务语义」命名,如
chat-default、summary-cheap。 - 忽略流式场景的特殊性:普通 HTTP 网关的经验直接套用,导致首 Token 延迟高、流式响应被缓冲、中途失败无法感知。
- 限流阈值拍脑袋:没有参考上游配额和历史流量,阈值设得过高起不到保护作用,设得过低误伤正常业务。
- 成本计量不准:只统计请求数不统计 Token,或者输入输出混算,导致账单与实际支出对不上,失去信任。
- 安全能力缺位:以为网关天然安全,实际上 Prompt 注入、敏感信息泄露都需要显式配置规则才会生效。
7.4 团队分工与协作
AI 网关本质是一个「平台型基础设施」,它的成功依赖多方协作,而不是某一个团队单打独斗:
| 角色 | 主要职责 |
|---|---|
| 平台/基础架构团队 | 网关部署、运维、容量规划、版本升级 |
| 安全团队 | Prompt 过滤规则、脱敏策略、审计合规要求 |
| 业务研发团队 | 按统一协议接入、反馈路由与配额需求 |
| 财务/成本团队 | 预算分配、成本分摊规则、账单核对 |
建议设立一个「网关 Owner」角色,负责统一收口需求、协调各方、维护配置规范。没有明确 Owner 的网关,往往会在几个月后变成「没人敢动的黑盒」。
7.5 运营与持续优化机制
网关上线只是开始,长期运营才是关键。建议建立以下机制:
- 周度指标巡检:关注错误率、P99 延迟、降级次数、成本趋势,异常及时定位;
- 月度成本复盘:按业务线核对账单,识别高消耗低价值的链路,推动路由优化;
- 季度容量评估:结合业务增长预测,提前扩容或调整上游配额;
- 配置变更审计:路由规则、限流阈值、密钥的变更都要留痕,避免「谁改的不知道」;
- 定期故障演练:主动模拟供应商故障,验证降级链路是否真的生效。
yaml
# 一个可参考的告警规则片段(Prometheus 风格)
groups:
- name: ai-gateway
rules:
- alert: GatewayHighErrorRate
expr: sum(rate(gateway_requests_total{status=~"5.."}[5m])) / sum(rate(gateway_requests_total[5m])) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "网关 5xx 错误率超过 5%"
- alert: GatewayFallbackSpike
expr: increase(gateway_fallback_total[10m]) > 50
for: 2m
labels:
severity: critical
annotations:
summary: "10 分钟内降级次数异常升高,检查上游供应商"
实践提示:告警不要只盯着网关自身,还要关注「上游供应商可用性」和「业务侧调用失败率」。网关指标正常但业务报错,往往说明问题出在协议转换或配额配置上。
7.6 落地检查清单
最后给出一份可以直接对照使用的检查清单,上线前逐项确认:
- 统一协议已确定(推荐 OpenAI 兼容格式),业务侧 SDK 已切换;
- 模型别名按业务语义命名,未直接使用供应商原始模型名;
- 虚拟 Key 已按业务线签发,支持吊销与预算限制;
- 限流阈值已参考上游配额设定,并留出缓冲;
- 重试、降级、熔断三级容灾已配置并演练过;
- Token 计量覆盖输入/输出,成本报表可按租户维度查看;
- 日志、指标、告警已接入现有监控体系;
- Prompt 过滤与敏感信息脱敏规则已生效;
- 回退方案已就绪,可在分钟级切回直连;
- 网关 Owner 与变更流程已明确。
落地 AI 网关,技术只是其中一半,另一半是流程与协作。把上面这些要点逐项落实,网关才能真正从「一个能跑的代理」成长为「团队可信赖的基础设施」。
8. 总结
AI 网关是大模型应用走向规模化、平台化的必经之路。它把多供应商接入、路由容灾、鉴权限流、成本计量、安全防护等能力统一收敛到一层,让业务团队专注于应用本身,而不是被各家模型的差异反复折腾。
无论你是正在选型的技术负责人,还是准备在项目中引入大模型能力的开发者,AI 网关都值得纳入你的架构视野。从一个小规模试点开始,逐步沉淀出适合自己团队的网关实践,会是性价比很高的投入。