Skip to main content

01 - 网关是什么:从五行代码长出来的东西

读这篇之前

不需要任何前置知识。你只要写过一次"调用大模型 API"的代码就够了。

读完这篇,你会知道:AI 网关解决什么问题、它由哪六件事组成、本专题后面那些术语分别指什么。

讲 AI 网关,最糟糕的开场是"AI 网关是一个统一的 LLM 流量入口,提供路由、限流、可观测能力"。这句话每个字你都认识,但它什么也没告诉你。

所以我们换一种方式:从一段能跑的代码开始,一个需求一个需求地加,看它怎么一步步长成一个网关。

一、第 0 天:五行代码

from openai import OpenAI

client = OpenAI(api_key="sk-xxx")
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)

跑通了。这时候你不需要网关。任何在这个阶段引入网关的行为都是过度设计。

二、第 30 天:老板说要接 Claude

理由可能是成本,可能是某个任务 Claude 效果更好,也可能只是不想被一家绑死。

问题来了:Anthropic 的接口和 OpenAI 的不一样。 不只是 URL 和密钥不同,请求体的结构就不同 —— OpenAI 把 system 提示放在 messages 数组里,Anthropic 把它放在顶层的 system 字段;返回体的结构也不同。

于是你的代码变成这样:

def chat(provider, messages):
if provider == "openai":
resp = openai_client.chat.completions.create(
model="gpt-4o", messages=messages)
return resp.choices[0].message.content
elif provider == "anthropic":
system = next((m["content"] for m in messages if m["role"] == "system"), None)
rest = [m for m in messages if m["role"] != "system"]
resp = anthropic_client.messages.create(
model="claude-sonnet-4-5", system=system,
messages=rest, max_tokens=4096)
return resp.content[0].text

你刚刚写下了网关的第一个能力:协议转换(protocol translation)。

📖 术语:provider(供应商) 提供模型 API 的一方,比如 OpenAI、Anthropic、AWS Bedrock、阿里云百炼。同一个模型可能有多个 provider —— 比如 Claude 既能从 Anthropic 官方调,也能从 AWS Bedrock 调,两者接口不同、价格不同、限额不同。

三、第 45 天:线上 503 了

某天下午 OpenAI 抖了一下,你的服务跟着挂了十分钟。

老板:为什么不自动切到 Claude?

def chat(messages):
try:
return call_openai(messages)
except Exception:
log.warning("openai failed, falling back to anthropic")
return call_anthropic(messages)

第二个能力:故障转移(fallback)。

但很快你会发现这个实现太粗糙:

  • OpenAI 挂了 10 分钟,这 10 分钟里每个请求都要先失败一次、等超时、再重试 —— 用户感受到的延迟翻倍
  • 更好的做法是"记住它挂了,接下来一段时间直接不发给它",这叫熔断(circuit breaking);过一会儿再试探性地发一个请求看恢复没有,这叫健康检查(health check)

📖 术语:fallback / 熔断 / 冷却 fallback 是"这次失败了换一个";熔断是"连续失败达到阈值后,直接停止往这里发请求";冷却(cooldown) 是熔断后等待多久再试。 本专题 03 - 路由与容错 会看到 Higress 是怎么把这三件事实现在真实代码里的。

四、第 60 天:一个 API Key 不够用了

流量上来了,OpenAI 开始返回 429 Too Many Requests

你去看文档,发现每个 API Key 有两个限额:

📖 术语:RPM / TPM

  • RPM(Requests Per Minute):每分钟最多发多少个请求
  • TPM(Tokens Per Minute):每分钟最多消耗多少 token(输入 + 输出一起算)

这两个限额是 provider 给你设的硬上限,超了就直接拒绝。绝大多数生产事故是 TPM 打满,因为一个长文档请求就能吃掉几万 token。

于是你申请了 5 个 API Key 轮着用:

keys = ["sk-a", "sk-b", "sk-c", "sk-d", "sk-e"]
i = 0

def next_key():
global i
i = (i + 1) % len(keys)
return keys[i]

轮询(round-robin)能用,但很快就不够了:

  • 某个 key 被封了,还在往里发请求
  • 5 个 key 的额度不一样,平均分配会让小额度的先满
  • 有些请求要 3 万 token,有些只要 200,按请求数轮询会让 TPM 分布极度不均

这时你需要的是:按"哪个后端当下最空"来选,而不是轮着来。

📖 术语:deployment(部署) 这是本专题最重要的一个词。一个 deployment = 一个具体的、可调用的模型端点,由「provider + 模型名 + 密钥 + 地域」共同确定。

举例:下面是同一个模型名 gpt-4o 底下挂的四个 deployment:

deploymentprovider密钥地域TPM
AOpenAI 官方sk-a300K
BOpenAI 官方sk-b150K
CAzure OpenAIkey-1东部200K
DAzure OpenAIkey-2西部200K

业务代码只说"我要 gpt-4o",从这四个里挑一个就是网关的工作。这个动作叫路由(routing)

第三个能力:路由。

五、第 90 天:财务来问账

"上个月模型花了 12 万,哪个团队花的?"

你打开 OpenAI 后台,只有一张总账单。业务代码里所有团队共用同一个 key,分不出来

正确的做法是:给每个团队发一把不同的密钥,但这些密钥不是 provider 的真密钥,而是你自己发的

研究团队   →  litellm-key-research-xxx   →  网关 →  真实 sk-xxx
客服团队 → litellm-key-support-yyy → 网关 → 真实 sk-xxx

📖 术语:虚拟密钥(virtual key) 网关自己签发的、给业务方使用的密钥。它的价值在于:

  1. 真实的 provider 密钥只存在于网关里,业务方拿不到,泄露了也只影响一个团队
  2. 每把虚拟密钥可以绑定自己的配额(quota)预算(budget)可用模型范围
  3. 用完了直接吊销,不用动 provider 的密钥

04 - 多租户与配额 会拆 LiteLLM 是怎么实现这套东西的。

第四个能力:多租户与计费归属。

六、第 120 天:合规和安全找上门

  • 用户可能把身份证号粘进对话框 → 要在发给外部模型之前脱敏
  • 模型可能输出不该输出的内容 → 要在返回给用户之前过滤
  • 出了问题要能查:谁、什么时候、调了什么模型、花了多少钱 → 要有审计日志

第五个能力:内容安全与可观测。

📖 术语:guardrail(护栏) 在请求进入模型前、或响应返回用户前插入的检查逻辑。典型的有:敏感词过滤、PII(个人身份信息)脱敏、提示注入检测。 云厂商通常把这一层做成独立产品(阿里云内容安全、AWS Bedrock Guardrails),网关负责把它挂进流量链路。

七、第 150 天:Agent 来了

业务开始做 Agent,需要连一堆外部工具 —— GitHub、内部数据库、公司 API。这些工具通过 MCP 协议接入。

📖 术语:MCP(Model Context Protocol) Anthropic 2024 年底提出、现已成为事实标准的协议,用来让 AI 应用连接外部工具和数据源。一个提供工具的服务叫 MCP Server,使用工具的一方叫 MCP Client

于是出现了一批全新的问题:

  • Agent 要连 5 个 MCP Server,难道要在 Agent 代码里配 5 个地址和 5 套凭证?
  • 两个 MCP Server 都有个叫 search 的工具,怎么区分?
  • 哪些工具允许哪个团队调用?
  • delete_file 这个工具,允许调,但只允许在 /tmp 下 —— 这条规则写在哪?

第六个能力:MCP 代理与工具级授权。 这是"LLM 网关"和"Agent 网关"的分界线,05 - MCP 网关 专门讲这个。

八、你已经写了一个网关

回头看这六件事:

这就是 AI 网关。 它不是一个突然被发明出来的组件,而是每个把大模型用到一定规模的团队必然会重新造一遍的东西。

现成的方案(LiteLLM、Higress、云厂商的托管产品)的价值在于:上面六件事里的每一件,它们都已经踩过一遍坑了。本专题接下来要做的,就是把这些坑一个个翻出来给你看

九、什么时候不需要网关

同样重要 —— 下面这些情况,引入网关是净亏损:

情况为什么不需要
只用一个 provider、一个模型六件事一件都不成立
单人项目 / 内部工具多租户和计费归属没有意义
延迟极度敏感且请求量小多一跳网络不划算
团队没人能维护它网关挂了 = 全站 AI 功能挂了,这个单点你得养得起

判断标准很简单:上面六件事,你现在真实需要几件?少于三件就先别上。

十、这个专题怎么读

你的情况建议路径
想搞懂网关是怎么实现的按顺序读 02 → 03 → 04 → 05
要选一个云厂商的托管产品直接跳 0607
已经在用,想调优03 - 路由与容错08 - 性能与形态代价
主要做 Agent05 - MCP 网关 是重点

下一篇02 - 四种形态:网关该做成一个库、一个独立进程、一个 Envoy 扩展,还是一个 Wasm 插件?