Day 61 / 共 68 天 · 阶段 11 部署
AI 网关:给所有大模型调用装一道"总闸"
昨天(Day 60)学了把 Agent 部署到云上(Bedrock/Vertex 等)。今天补上生产环境最后一块拼图:AI 网关——所有对大模型的请求先经过一道"总闸",在这里统一做鉴权、限流、多模型切换、Token 计量和缓存。学完你就理解真实公司怎么"管住"成百上千个 Agent 的 LLM 调用;明天(Day 62)开始动手做求职作品集第一件:知识库 RAG 助手。
📍 你在阶段 11(部署 D57-61)的位置
D57 Docker→
D58 K8s→
D59 CI/CD→
D60 云上部署→
D61 AI 网关
💡 用一个类比兜住今天(今天全程沿用「小区大门 + 门卫室」的世界观)
你的每个 Agent 服务 = 小区里的一户人家。AI 网关 = 小区唯一的大门 + 门卫室:所有进出(对大模型的请求)都得从这里过。鉴权 = 门卫查工牌(没证不放行);限流 = 大门口的闸机(一次只放几个,防挤爆);多模型路由 = 门卫按你要找谁,指到对应楼栋(找 GPT 去 A 座、找 Claude 去 B 座);Token 计量 = 门口的水电表(记录每户用了多少,好分摊账单);缓存 = 门卫室的"快递代收点"(一样的问题上次答过就直接给,不用再麻烦楼里)。今天你从"住户"升级成"物业经理"。
L01
什么是 AI 网关:一道统一的"总闸"
🤔 痛点公司里有十几个 Agent 服务,每个都直接拿着 API Key 去调 OpenAI/Claude。结果:Key 到处散落(泄露风险)、没人知道谁花了多少钱、某个服务写了个死循环把额度烧光、想从 GPT 换成 Claude 得改十几处代码……乱成一锅粥。
💡 本质AI 网关就是在"你的服务"和"大模型 API"中间加的一道统一入口。所有请求都先到网关,网关替你把 鉴权、限流、路由、计量、缓存、日志 这些"公共活儿"一次性办了,你的业务代码只管发请求,脏活累活网关兜。就像小区不让每户单独开个门通马路,而是统一走大门、由门卫室统一管。
图注:网关把"每户各管一摊"变成"统一门卫室",公共安全和账务一处搞定。
👶 网关是新东西吗?不是。Web 后端一直有"API 网关"(如 Nginx、APISIX)管普通 HTTP 请求。AI 网关就是在这个老概念上,加了大模型特有的能力:按 Token 计量、按语义缓存、多个大模型之间智能路由。你之前学的 K8s/云部署管的是"服务在哪跑",网关管的是"请求怎么进出"。
L02
统一入口 & 多模型路由:门卫指路
🤔 痛点今天用 OpenAI,明天老板说太贵换国产,后天想给简单任务走便宜模型、难任务走贵模型。如果每个服务里都硬编码了
openai.com 的地址和调用格式,一换就要全线改代码、重新测试、重新上线。💡 本质网关给你一个统一的地址和统一的调用格式(通常兼容 OpenAI 的
/v1/chat/completions)。你的代码永远只发给网关,至于背后真正走哪个模型,由网关的路由规则决定——就像门卫按你要找谁,帮你指到对应楼栋,你不用记每栋楼的门牌。换模型 = 改网关一处配置,业务代码一行不动。# 业务代码:地址只写"网关",格式沿用 OpenAI 那套(大多数网关都兼容)
from openai import OpenAI
client = OpenAI(
base_url="http://ai-gateway.mycompany.com/v1", # ← 指向网关,不是 openai.com
api_key="团队内部发的网关 key", # ← 网关自己的 key,不是各大厂的真 key
)
resp = client.chat.completions.create(
model="fast", # ← 只写一个"逻辑名字",具体走哪个模型由网关决定
messages=[{"role": "user", "content": "帮我总结这段话..."}],
)
print(resp.choices[0].message.content)
# 想把 "fast" 从 GPT 换成 DeepSeek?改网关配置即可,这段代码永远不动
📝 举个例子:贵活便宜活分流(呼应 Day 15 多模型路由)
网关配一条规则:
model=fast → 走便宜的国产模型(处理"分类、抽取"等简单活);model=smart → 走 Claude/GPT 顶配(处理"写报告、复杂推理")。你在代码里按任务难度填 fast 或 smart,成本立刻降下来,而且哪天出现更便宜的新模型,只在网关把 fast 指过去就行。L03
鉴权 & 限流:门卫查证 + 闸机放行
🤔 痛点①真正的大厂 API Key 特别值钱(能烧钱),不能让每个开发都拿到、更不能写进前端代码。②某个服务 bug 写了死循环疯狂调用,几小时就能把整月额度烧光,还可能被大厂限速殃及其他服务。
💡 本质鉴权=门卫查工牌:真 Key 只放在网关里,各团队只拿到网关发的"内部通行证",没证不放行、丢了随时吊销。限流=大门闸机:规定"每个通行证每分钟最多 N 次",超了就排队或拒绝(返回 429),既护住钱包,也防某个服务把别人挤爆。
# 网关配置(示意,不同产品字段名不同,理解意思即可)
consumers: # 谁能进(各团队的"通行证")
- name: team-rag
key: rag-xxxxx # 团队 A 的内部 key
- name: team-support
key: support-yyyyy # 团队 B 的内部 key
rate_limit: # 限流:每个 key 每分钟最多几次
team-rag: 60/minute
team-support: 600/minute # 客服流量大,配额高些
# 真正的 OPENAI_API_KEY 只存在网关服务器上,谁也拿不到明文
👶 小白:限流把请求挡了(429),那用户不就用不了了吗?
👨🏫 老师:限流不是"绝情拒绝",而是"有序排队"。触发 429 时,你的客户端应该等一会儿再重试(叫指数退避,回忆 Day 32 的失败重试)。它保护的是"整体不崩"——宁可个别请求慢几秒,也好过一个失控服务把所有人的额度烧光、把整个大门挤爆。这就是闸机存在的意义:牺牲一点点通行速度,换整体不踩踏。
L04
Token 计量 & 缓存:水电表 + 快递代收
🤔 痛点月底账单来了 8 万块,老板问"哪个团队花的、值不值",你两手一摊答不上来——因为大家共用一个 Key,根本分不清谁花的。另外,很多用户问的其实是同一个常见问题,每次都真去调一次大模型,既慢又浪费钱。
💡 本质Token 计量=给每个通行证装"水电表":网关记录每次请求用了多少输入/输出 Token、折算多少钱、算在哪个团队头上,月底自动出账单(呼应 Day 13 的 Token 计费、Day 56 成本归因)。缓存=门卫室的"快递代收点":一模一样(甚至语义相近)的问题上次答过,直接把上次答案返回,不再麻烦大模型——秒回且免费。
图注:缓存省钱省时间,计量让每一分钱都能归到具体团队——这两样是成本治理的地基。
👶 语义缓存是什么?普通缓存要求问题"一字不差"才算命中。语义缓存更聪明:"今天天气咋样"和"今儿天气如何"意思一样,就当同一个问题(用 Day 23 学的 embedding 判断相近)。当然要小心:带用户隐私或"实时性强"的问题(如"我账户余额")不能缓存,否则会串号或返回过期数据——网关一般能按规则开关。
L05
两款主流网关:Higress vs APISIX
🤔 痛点市面上网关一大堆,面试被问"你了解哪个 AI 网关",总不能只会说"就是个总闸"。至少要能说出一两个真实产品、它们的定位差别。
💡 本质它俩都是国内很流行的开源 API 网关,近两年都加强了 AI 能力(多模型代理、Token 限流、语义缓存等)。共同点:统一入口、插件化、能跑在 K8s 上。差别主要在生态和定位,记住下面这张表足够应付面试。
| 维度 | Higress | APISIX |
|---|---|---|
| 出身 | 阿里开源,基于 Envoy/Istio 生态 | Apache 顶级项目,基于 Nginx/OpenResty |
| 定位 | 主打云原生 + AI 原生网关,K8s Ingress 友好 | 通用高性能 API 网关,插件极其丰富 |
| AI 能力 | 内置 AI 代理/多模型路由/Token 限流/缓存等 AI 插件 | ai-proxy 等插件做多模型代理、限流、可观测 |
| 扩展 | Wasm 插件(多语言写扩展) | Lua/Wasm 插件 |
| 共同能力 | 统一入口、鉴权、限流、灰度、可观测、热更新配置 | |
📝 面试怎么答(照这个说)
"AI 网关就是给所有大模型调用加的统一入口,统一做鉴权、限流、多模型路由、Token 计量和缓存。国内常见的开源实现有阿里的 Higress(云原生/AI 原生,Envoy 系)和 Apache APISIX(通用高性能,Nginx 系),都提供 AI 代理插件。选型上,已经重度用 K8s 的团队用 Higress 顺手,想要通用网关 + 海量插件的用 APISIX。"——一句话讲清概念 + 两个产品 + 选型逻辑,加分。
想把这两款网关的源码和 AI 插件吃透?各有一套 20 讲精讲(选学,学完回来继续 Day 62):
🔗 深入 Higress AI 网关 20 讲 → 🔗 深入 APISIX 网关 20 讲 →L06
上手感受:给自己的 Agent 前面挂个网关
🤔 痛点道理都懂,可"网关"三个字听着还是很虚。有没有办法花几分钟真切感受一下"请求先过一道闸"是什么体验?
💡 本质你不必一上来就啃完整的 Higress/APISIX。先理解流程本身:一切都是"你的请求 → 网关(做点事) → 大模型 → 原路返回"。下面用一段极简 Python 模拟网关最核心的三件事(计量 + 缓存 + 转发),让你看清网关"在中间到底干了啥"。
# 一个"迷你网关",只为理解原理(生产别这么写,用 Higress/APISIX)
cache = {} # 缓存:问题 → 上次的答案
usage = {} # 计量:团队 → 累计 token
def gateway(team, question, real_llm):
# 1) 鉴权(示意):不认识的团队直接拒
if team not in {"team-rag", "team-support"}:
return "403 拒绝:无效通行证"
# 2) 缓存:这题上次答过就直接返回,不花钱
if question in cache:
print("✅ 命中缓存,秒回、0 花费")
return cache[question]
# 3) 没命中 → 真去调大模型
answer, tokens = real_llm(question) # real_llm 返回(答案, 用了多少token)
# 4) 计量:记进这个团队的"水电表"
usage[team] = usage.get(team, 0) + tokens
cache[question] = answer # 顺手存进缓存
return answer
# 演示(real_llm 这里用假函数代替真实大模型调用)
fake = lambda q: (f"针对『{q}』的回答", 120)
print(gateway("team-rag", "什么是RAG", fake)) # 第一次:真调,计量 +120
print(gateway("team-rag", "什么是RAG", fake)) # 第二次:命中缓存,0 花费
print(gateway("陌生团队", "hi", fake)) # 被鉴权拦下
print("账单:", usage) # {'team-rag': 120}
👶 我要会写网关吗?不用!转行阶段,你的目标是看懂网关解决什么问题、会画那张"服务→网关→模型"的图、会用兼容 OpenAI 的方式把 base_url 指向网关。真正部署 Higress/APISIX 是运维/平台团队的活。面试你被问到的,99% 是"为什么要网关、它管哪几件事"——这些你今天已经拿下了。
L07
今日小结 + 动手 10 分钟
🧠 今天你应该能回答
- AI 网关是什么?它加在"你的服务"和"大模型"之间干哪几件公共活儿?
- 用"小区大门"类比,分别说出鉴权/限流/路由/计量/缓存对应门卫的什么职责?
- 为什么真 API Key 要藏在网关里,业务代码只用"内部通行证"?
- 多模型路由怎么让"换模型 = 改一处配置"?(base_url 指向网关)
- Higress 和 APISIX 各是什么出身、怎么选?(能背 L05 那段面试话术)
✋ 动手 10 分钟:跑通"迷你网关"并画出请求路径
① 把 L06 的迷你网关代码复制到 mini_gateway.py 跑一遍,观察:第二次相同问题是不是"命中缓存",最后账单里是不是只统计了真正调用的那次。
② 试着自己加一条限流:给 usage 之外再加个 count 字典,某团队本次会话调用超过 3 次就返回 "429 太频繁,稍后再试"。
count = {}
def check_limit(team, limit=3):
count[team] = count.get(team, 0) + 1
return count[team] <= limit # 超过 limit 返回 False → 该拒绝了
# 在 gateway 开头调用它,False 就 return "429 太频繁,稍后再试"
③ 在纸上画一遍:Agent → 网关(鉴权→限流→缓存→计量→路由) → 大模型 → 原路返回。能默画出来,今天就通关了。
明日预告 · Day 62:部署篇结束!从明天起进入阶段 12 实战求职——动手做能写进简历的作品集。第一件:知识库 RAG 助手。我们会用"需求 → 摄入 → 检索 → 问答 → 评测 → 部署"一条龙,把前面学的 RAG(阶段4)、评测(阶段9)、部署(阶段11)全部串成一个真能跑、能演示、能讲故事的项目。