做平台架构这几年,我有个越来越强烈的体会:AI 项目真正难的,不是模型选型,而是模型落地之后的“杂活”。模型换了一家性能更好的,老业务代码得跟着改;A 部门接得飞起,B 部门还抱着旧 SDK 不放;好不容易跑通一条 Agent 链路,模型一升级,输出格式直接崩给你看。你会发现,所有团队都在围绕“模型的不可控”和“系统的多样化”做无边无际的适配工作。
这个矛盾堆到最后,基本都会指向同一个解法——在网络层和业务层之间,塞一个专门管模型流量的“AI 网关”。它的作用可以一句话概括:把大模型、Agent、内部老系统全部挂在一个统一的出入口上,模型变了你不用动业务代码,老系统接新模型也不用重写接口,Agent 团队甚至可以像访问一个普通服务一样去调用多个模型。这篇文章,我就把“AI 网关”这件事从设计思路、核心能力、选型对比、落地实操到排坑经验,完整地讲一遍。不管你是架构师、后端负责人,还是正要搞 Agent 的工程师,都值得看完。
1. AI 网关到底在管什么
1.1 模型层管不住:API 越来越多,治理跟不上
先说最直接的痛点。公司里一旦开始正经用 AI,模型供应方大概率不会只有一家。你可能有 OpenAI 系的模型、有开源的 Qwen、有国产商业 API,也可能有自建微调模型。每个模型的鉴权方式不一样,有的用 API Key,有的用 Bearer Token,有的还要带组织 ID;每个模型的计价方式也不一样,有按 token 的,有按调用次数的,有按并发数的;每个模型还有各自的频率限制,有的每分钟 60 次,有的每小时 1000 次。
如果每个业务团队都自己对接,那你最后会收获一堆不可控的东西:代码里写死的模型 API Key、散落在各处的模型配置、谁也不知道每个月花了多少钱的账单一堆乱码。更麻烦的是,模型本身还经常出问题:供应商限流了、模型临时不可用、新版本输出格式变了。你在业务代码里根本没法快速响应这些变化,只能等着报错、改代码、重新发布。
AI 网关在这里的作用,就是把“模型供应”抽象成一种可插拔的统一资源。业务侧只需要知道“我要调一个大语言模型,走这个地址就行”,网关负责具体选哪个模型、怎么鉴权、怎么计费、怎么限流。当我需要把主力模型从 A 换到 B 的时候,只需要改网关侧的配置,业务代码一行都不用动。
1.2 老系统接不上:协议、鉴权、返回格式全是坑
老系统接入 AI 的痛,比新项目明显得多。这里说的老系统,可能是运行了五六年的 Java 服务,可能是银行对接场景下那种只能走 HTTP 的内部系统,也可能是一套还在用 SOAP 的历史中间件。它们普遍有几个共同问题:调用外部服务的方式极其固定,改造成本高;没有统一的 API Key 管理规定;对“长连接”“流式传输”这种新玩法消化不良。
举例说,某个内部 OA 系统想要接一个“智能摘要”的能力,它的技术栈是真的很旧,只支持 POST JSON 后同步返回结果。但今天主流大模型 API 基本都是流式 SSE 输出,有的还要 WebSocket 或者长轮询。你让老系统去改造支持 SSE,不是不能做,但开发排期、联调成本都很高。
这时候如果有一个 AI 网关在中间做“协议翻译”,事情就简单了。你可以让老系统继续用它的同步 POST,网关在内部把请求转成流式调用,攒齐完整响应后再同步返回。老系统只看到一个普通的 HTTP 接口,感知不到背后是流式还是非流式。这就是网关层做“适配”的核心价值——它把新世界的复杂协议,翻译成旧世界能听懂的话。
1.3 Agent 连不起来:多模型协作不是“调两次 API”那么简单
Agent 是这两年最火的方向,也是把 AI 网关问题暴露得最彻底的场景。一个正经的 Agent 系统,背后通常要调度多个模型:一个负责意图识别,一个负责工具调用,一个负责生成最终回复,可能还有一个负责反思和纠错。有的 Agent 还需要在多个任务之间切换模型,比如简单任务用小模型省钱,复杂任务用大模型保证质量。
如果你在代码里硬编码这些调用的目标地址和 Key,Agent 的逻辑就会和模型供应商深度绑定。模型一升级、地址一变化、限流策略一调整,Agent 就直接躺平。更麻烦的是,Agent 的调试和观测成本本来就高,你还很难说清楚“这次 Agent 行为异常,到底是因为模型输出不对,还是工具调用失败,还是上下文被截断了”。
AI 网关能把 Agent 对模型的依赖,降级为对“一个服务”的依赖。Agent 不需要关心模型是 GPT 还是 Qwen,只需要告诉网关“我这次任务比较难,给我用高智能模型”,网关来做路由、限流、降级、日志跟踪。这样一来,Agent 的开发和迭代速度会有非常明显的提升,因为模型的“技术债”被网关接住了。
2. AI 网关的核心设计逻辑:先想清楚要管什么
2.1 统一抽象:把“模型”变成可替换资源
我自己最早做 AI 网关时犯过一个错误:一上来就想把所有模型 API 的全部参数都透传出去,结果网关越做越像代理工具,没有真正的治理能力。后来我悟了:网关的第一要义不是“原样转发”,而是“定义一个公司内部统一的模型调用抽象层”。
这个抽象层大概长这样:统一请求格式、统一返回格式、统一鉴权、统一错误码。这意味着不管底层是 OpenAI 风格接口,还是 Claude 风格接口,还是国产模型的特殊风格,到了网关这一层,都要转成内部约定的标准格式。业务方只需要掌握一种调用方式,剩下的由网关内的“模型适配器”负责。
这样做还有一个隐藏好处:当你引入新模型时,只需要写一个新的适配器,而不需要说服所有业务团队改代码。模型团队和业务团队之间的协作边界一下子就清晰了——业务团队直接对接网关,模型团队只跟网关的适配器层打交道。我后面会详细展示这个适配器层该怎么设计。
2.2 流控与降级:别让模型供应商把你拖死
模型供应商的 API 并不总是可靠的,这是所有 AI 网关都必须正视的事实。在实际运营中,你会遇到供应商限流、区域网络抖动、模型临时过载、甚至 Key 被封禁等一堆情况。如果不做流控和降级,任何一个供应商出问题,都会直接打到业务上。
流控这件事,不能只看“每分钟调用次数”。你需要做的是多维度限流:按调用方(哪个部门、哪个应用)、按模型(哪个供应商)、按时间窗口(分钟/小时/天)。比如你有一个内部工具应用每天调大模型几千次,它在高峰期把供应商额度全打光了,另一个核心业务却等着同一个模型出结果,那就麻烦了。所以一定要在网关层做好“优先级流控”:核心业务保底,非核心业务可以排队、降级、或者直接拒绝。
降级策略同样重要。常规做法是给同一个模型组配置多个可用供应源,主模型挂了自动切备用。比如 A 模型供应商整体超时,网关直接转给 B 供应商的等价模型。更复杂一点的,还可以做“智能降级”:如果用户输入很短、任务简单,可以自动降到一个小模型,延迟低还省钱;只有复杂任务才走到大模型。网关把这些策略配置化之后,业务方完全不需要感知。
2.3 审计与安全:你的系统需要知道谁在调模型
AI 网关还有一个容易被忽视、但特别重要的职责:审计与安全。大模型服务本质上是一个黑盒外部依赖,你把企业内部数据发给它,这里面的合规风险、数据安全风险,都是实际存在的。如果没有任何审计机制,你压根不知道哪个部门把什么数据发给了哪个模型。
网关的统一出口优势在这里体现得很充分。所有模型请求都过网关,你就能在网关层记录:谁在什么时间、调用了哪个模型、上传了什么 Content、消耗了多少 token、返回结果是什么。这些日志可以作为事后审计依据,也可以用来做成本拆分——月底给各个部门出账单的时候,直接从网关日志里拉数据,清清楚楚。
安全方面,网关侧至少要做到几件事:敏感信息脱敏(比如请求里的身份证号、手机号在日志里自动打星号);IP 白名单/内网访问控制;针对模型返回内容的合规检查(比如判断是否存在涉政、涉黄等违规内容再返回给用户)。这几点加在一起,才能让业务方放心把数据流交给一个统一入口。我自己做的时候,还把“用户身份标识”强制加入了调用链,意思是网关会要求每个业务请求必须带一个业务侧的用户 ID,方便事后定位问题,而不是只看到一个应用级别的 Key。
3. 技术选型:自建、开源还是云托管
3.1 三个选型方向的适用场景
聊完设计逻辑,进入实操层面。第一步肯定是选型,AI 网关这个领域现在也有不少轮子了,不必什么都自己造。大体上分三个方向:自研轻量网关、基于开源项目二次开发、直接采购云托管网关。
自研轻量网关适合什么场景?你的业务形态极其特殊,比如要对接公司内部自研模型的 RPC 协议,或者有非常强的私有化安全要求,必须把网关部署在完全隔离的内网,并且要做一些非标准的扩展。自研的优势是灵活性极高,但代价是后续的稳定性、性能、观测能力都得自己一点点填。
开源项目二次开发是当前的主流选择。比较常见的有 LiteLLM、Higress AI 网关、Portkey 网关等。它们的共同点是把“统一模型抽象”“多供应商路由”“限流降级”“日志审计”这些基础能力都做好了,你拿来部署,改一改配置,再按需加一个自定义插件,就能贴合自己公司的场景。我建议大多数团队从这个方向起步。
云托管网关则是“开箱即用”路线。像很多云厂商现在都提供 AI 网关服务,你只要把模型 API Key 填进去,它自动帮你做代理、监控、计费。适合手上云资源已经用得很深、不想自己运维的团队。缺点是你对网关内部的策略逻辑把控力弱,想要搞一些“非常规”的路由策略,会比较费劲。
3.2 开源方案横向对比
| 方案 | 接入方式 | 限流/降级 | 观测能力 | 二次开发成本 | 适合场景 |
|---|---|---|---|---|---|
| LiteLLM | Python 库 / 代理服务 | 基础限流、多模型 fallback | 有日志、可自定义导出 | 低,Python 生态友好 | 中小团队快速接入,偏 Python 技术栈 |
| Higress AI 网关 | 独立网关,支持 K8s 部署 | 插件式限流、灰度、熔断 | 集成 Prometheus / 阿里云 SLS | 中,需要了解插件机制 | 已有 K8s/微服务体系的团队 |
| Portkey | 云服务 / 自托管 | 较强,支持多级缓存 | 自带观测面板 | 低,但深度定制需商业版 | 想要快速上线且重视可观测性的团队 |
我实测下来的感受是:如果团队偏 Python、希望尽快跑起来验证效果,LiteLLM 很顺手;如果公司已经有成熟的 K8s 基础设施,对网关性能和治理能力要求比较高,Higress 这类独立网关更持久;如果只想给 Agent 项目加个可控入口,Portkey 的开箱体验确实省心。
3.3 我最终选择的方案与理由
我自己的最终选择是“开源网关 + 少量自研”,具体组合是:底层用 LiteLLM 作为模型路由和适配核心,前面加一层 Nginx 做流量控制和简单的 IP 白名单,再配套一套自研的配置管理接口和审计日志存储。
这么选主要看中了三点。第一,LiteLLM 对主流模型格式的兼容性做得非常好,接入 OpenAI、Anthropic、Azure OpenAI、各种开源模型服务都很快,不用自己写一堆适配器。第二,它的多模型 fallback 功能支持在请求层面配置“主模型失败后自动走备选模型”,这是我业务中最急需的能力,省了我自己写重试逻辑。第三,团队整体偏 Python 和 Node.js,LiteLLM 的生态贴合度更高。自研的部分则聚焦在“企业定制需求”上,比如把网关的管理接口接入内部权限系统、把审计日志同步到公司的日志平台等等,这些开源方案给不了,只能自己补。
4. 从零落地一个轻量 AI 网关(实操)
4.1 最小架构与目录设计
下面我拿一个简化版的自研 AI 网关示例,帮你把上面的设计思路落到代码里。这个示例不追求生产级完整度,但能让你看清核心链路长什么样:统一接入层、模型路由、协议适配、审计日志、以及给 Agent 和旧系统用的专用接口。
ai-gateway/ ├── main.py # FastAPI 入口,统一暴露 HTTP 接口 ├── config.yaml # 模型供应商、路由策略、限流阈值配置 ├── router.py # 模型路由核心逻辑 ├── adapters/ # 协议适配器目录 │ ├── openai_adapter.py │ ├── qwen_adapter.py │ └── fallback_adapter.py ├── middleware/ │ ├── auth.py # 内部应用鉴权 │ ├── audit.py # 审计日志 │ └── ratelimit.py # 简单限流 └── client_demo/ # 存放对接示例代码其实你不用照着这个目录原样抄,关键是理解它的分层逻辑:路由和适配分开,原因在于“路由决定去哪个模型,适配决定怎么跟那个模型说话”。如果混在一起写,每加一个模型就要动路由代码,很容易出 bug。
4.2 实现统一模型路由
路由层的核心,是根据请求里的元信息选择正确的模型。我常用的做法是:让业务方在请求 Header 里带两个字段,一个是X-Tenant-ID(租户/部门标识),另一个是X-Model-Tier(模型档位,比如fast/smart/expensive)。网关拿到这两个字段后,结合配置中心的路由表,决定最终调哪个模型。
# router.py 核心片段 MODEL_TIERS = { "fast": ["qwen-turbo", "gpt-4o-mini"], "smart": ["qwen-max", "gpt-4o"], "expensive": ["o1-preview"], } def resolve_model(tenant_id: str, tier: str) -> str: candidates = MODEL_TIERS.get(tier, []) if not candidates: raise ValueError(f"unknown model tier: {tier}") # 根据租户这个月的消耗情况,决定是否用便宜档位 if get_tenant_quota_remaining(tenant_id) < 100: return "qwen-turbo" return candidates[0]这个设计的好处是,业务方不用感知具体模型名,只用表达“我要什么样的智能程度”。这样当模型团队上线了新模型,或者采购策略调整,只需要在配置中心改MODEL_TIERS映射,业务代码完全不用动。从我的实践经验看,这是网关层最有价值的设计之一。
4.3 接上老系统:协议适配器
协议适配器是网关里最“脏活累活”的部分,也是老系统能顺利接入的关键。我这边处理过几种典型情况:老系统只支持同步 HTTP JSON 返回;老系统拿不到 API Key 只能走内部服务账号;老系统连不上外网,需要网关侧做代理转发。
下面这段伪代码,展示了一个最常用的“同步转流式”适配场景。老系统发一个普通 POST,网关内部用流式方式调用大模型,等全部 token 收齐后,再一次性返回给老系统。
# adapters/sync_to_stream_adapter.py import httpx, json async def call_model_with_sse_collect(url: str, payload: dict) -> dict: async with httpx.AsyncClient() as client: async with client.stream("POST", url, json=payload) as resp: full_text = "" async for line in resp.aiter_lines(): if not line.startswith("data:"): continue data = json.loads(line[5:].strip()) full_text += data.get("delta", {}).get("content", "") return {"result": full_text, "usage": {"total_tokens": len(full_text)}}老系统的接入流程,也因此简化成三步:把请求地址改成网关的地址,把 Header 里的鉴权换成内部服务账号体系,把返回结果里“嵌套的 content 字段”提取逻辑调整一下。整个过程不涉及老系统对 SSE 的理解,对老系统的改造成本压到了最低。
4.4 给 Agent 提供专用观测端点
Agent 场景下,我对网关的要求会比普通业务接口更高,因为 Agent 是多步骤、多模型的,出了问题很难靠人肉排查。我通常会在网关上加一个/v1/agent/traces的观测端点,用于记录一次 Agent 完整运行过程中调用了哪些模型、每次调用的耗时、token 消耗、以及每个环节的输入输出摘要。
# 在网关记录 Agent 调用链 @app.post("/v1/agent/traces") async def record_agent_trace(trace: AgentTrace): trace.trace_id = uuid4().hex save_trace_to_storage(trace) return {"trace_id": trace.trace_id}有了这个 trace_id,Agent 开发者在出问题时,可以直接去日志平台拉取整条链路,看到底是哪个模型返回异常、哪个工具调用超时、哪一步的上下文被截断。这个能力在自研 Agent 项目中的价值极大。毕竟 Agent 的调试本身就是难点,如果网关能提前把关键链路数据沉淀下来,排查效率能翻倍。
5. Agent 场景下的高级玩法
5.1 多模型路由与 Failover 链路
Agent 场景里,Failover 不是“可选功能”,而是“保命功能”。因为 Agent 的任务往往是长链路,一旦中途模型供应商限流或超时,整个任务就可能前功尽弃。一个好的做法是,在网关层为 Agent 任务设计多级 fallback 链路:主模型失败后,自动切换到备胎模型;备胎模型也失败,再切换到本地轻量模型兜底。
比如一个意图识别模型,正常走qwen-max,一旦 qwen-max 连续两次超时,网关自动把流量切到gpt-4o-mini,这样 Agent 至少不会因为模型不可用而中断。切流量这个动作,对 Agent 来说是透明的,它只看到“调用网关还是成功的,只是响应速度变慢了或者模型换了一个”。Failover 链路的配置通常放在网关的配置中心里,这样可以在不改代码的情况下动态调整。
5.2 技能注册与模型分配策略
有些 Agent 框架会允许开发者注册“技能节点”,比如“搜索工具”“代码执行器”“知识库检索”。这些技能节点在调用模型时,往往需要不同的模型参数和不同的计费策略。网关在这个场景下,可以做一个“技能感知路由”:根据 Agent 传过来的技能标识,自动匹配最适合的模型和超时时间。
我做过一个比较有效的设计:网关维护一个“技能到模型档位”的映射表,例如代码生成类技能默认走smart档,知识库问答类技能默认走fast档,长文本摘要则走expensive档。Agent 在上游只声明“我这个节点是代码生成”,网关自己决定用哪个模型。这样有两个直接好处:一是 Agent 逻辑更干净,不掺和模型选择;二是新模型上线可以直接通过改映射表生效,连 Agent 代码都不需要重新发版。
5.3 上下文与配额管理
Agent 的上下文管理,是我在网关实践中踩坑最多的点。起初我以为上下文处理是 Agent 框架自己的事,后来发现,如果不在网关层做统一管控,就会出现:Agent 开发者在每个节点手动拼 prompt,拼着拼着把关键系统提示词覆盖了,或者把历史消息里的大段工具返回全塞进去,token 成本直接失控。
在网关层面能做的事情有两件。第一,限制单次请求的最大输入 token 数,超出部分直接报错或自动截断,避免模型因为 prompt 太长而拒绝服务或产生低质量回答。第二,对系统消息和工具返回结果做结构化区分,在网关日志里单独记录,方便分析 Agent 到底消耗了多少 token 在“工具返回内容”上。这个数据对后面的成本优化很有价值。
配额管理则主要面向多租户场景。你可以给每个部门、每个 Agent 项目设置每日/每月的 token 预算,达到阈值后自动降级到便宜的模型,或者直接拒绝非核心请求。有了这个,月底财务结算的时候,就不需要人工去各个模型控制台导账单了,直接用网关的配额报表就行。
6. 常见问题与排查技巧实录
6.1 问题排查速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 网关返回 401,但业务侧说 Key 没问题 | 网关侧未识别租户身份 | 检查请求头X-Tenant-ID是否传递,以及该租户是否有权限调用当前模型档位 |
| 某个模型频繁超时,但供应商控制台显示正常 | 网关连接池不够,或网络到供应商侧延迟高 | 检查网关到模型 API 的平均延迟,调大连接池上限,必要时启 fallback 模型 |
| 老系统接入后返回格式跟预期不一致 | 网关适配层未做老系统兼容 | 查看适配层里“同步转流式”的逻辑,确认返回字段是否有额外嵌套 |
| Agent 任务中断,日志里没有任何报错 | 可能是上下文长度超过模型上限但报错被吞了 | 在网关层检查请求的预估 token 数,看是否触发截断或拒绝策略 |
| 审计日志有流量,但成本数据和模型控制台对不上 | 有请求走了缓存或 fallback 到低价模型 | 核查该租户是否有缓存策略,以及 fallback 链路是否记录到了实际使用模型 |
这张表是我自己在运维过程中积累的排错手册。每次遇到线上问题,先对着表看一遍,通常能定位个八九不离十。如果不在这个范围里,那基本就是网关自身的 bug 或者配置问题,再去代码层排查。
6.2 上线初期最容易踩的 5 个坑
第一个坑是“网关变成新瓶颈”。这个隐患在我早期的测试环境中就暴露过:所有模型流量都过网关,但网关只开了一个单实例,模型响应稍微慢一点,线程池就堵死,导致所有业务超时。我的建议是网关服务必须支持横向扩容,并且要做好连接池和超时时间的调优,至少保证网关自身的处理速度要远快于模型响应速度。
第二个坑是“限流失真”。有一段时间,我用的是单机版限流,结果网关一扩容,限流就失效了,因为每个节点各自算自己的请求数。后来把限流存储换成 Redis 或者其他分布式存储,才算真正解决问题。做限流之前,先想清楚网关是不是要部署多节点,别等到扩容完才发现限流不准。
第三个坑是“日志太多但观测不够”。日志量大不代表你能快速定位问题。我建议在网关侧除了记录原始请求日志,还要埋一些关键指标:模型单次请求耗时、消耗 token 数、错误类型分布、供应商可用率。这些指标通过 Prometheus 采集,再接上 Grafana 面板,比单纯翻日志有效得多。
第四个坑是“fallback 配置太激进”。我见过有团队把所有请求都配成主模型失败后立即走备胎模型,结果主模型偶发抖动时,流量全部涌向备胎模型,备胎也被打崩。fallback 一定要加“健康检查”和“连续失败次数”的门槛,不能一超时就连环切换。
第五个坑是“忽略了模型输出格式的差异”。不同模型对同样的指令可能生成不同的 JSON 结构,尤其是老系统对接时,这个问题很容易被忽略。网关侧最好对关键输出做一次“格式规范化”,比如强行提取 JSON 中的某个字段,或者对返回做一次 schema 校验。这个能力看似简单,但能避免很多线上兼容性问题。
6.3 性能调优与成本控制建议
性能调优方面,我最想强调的是“不要把网关做成同步阻塞的集中式设施”。很多业务方把网关当成普通 API 网关用,发一个请求,等它转发到模型,模型流式返回,再转发回来。这个过程听起来没问题,但如果并发一高,网关的代理线程会被模型的长时间占用拖垮。要解决这个问题,可以引入异步 I/O 和流式转发,网关不要攒完整响应后再吐给客户端,而是边收模型 token 边转发给调用方,这样网关注入的延迟几乎可以忽略。
成本控制方面,我有三个比较有效的实践。第一是缓存,对重复性的请求(比如相似的问题、相似的知识库检索)做语义缓存,直接返回历史结果或模板结果,能省下可观的大模型调用费用。注意这个缓存必须做到“按租户、按内容哈希”双重维度,不能缓存到用户隐私数据。第二是 token 压缩,网关可以在转发前把历史对话做摘要压缩,减少每一轮调用的输入 token 数量。第三是模型档位选择,对周期性的非关键任务,自动切到低价模型跑,比如凌晨的定时分析报告,完全没必要用最贵的大模型。
7. 写在最后:一个让你少踩坑的实战习惯
如果你问我,AI 网关落地过程中最重要的经验是什么,我的回答不是技术选型,也不是代码细节,而是“上线前把统一的接入规范文档写好”。刚开始做网关的时候,我以为把接口部署好,大家自然就会用了。后来发现,业务团队根本不知道怎么表达自己的模型需求,有的传模型名,有的传档位,有的啥都不传,全靠网关猜。我后来专门花了两天时间写了一份《AI 网关接入指南》,明确规定了每个部门和业务线必须上报的元数据字段、需要申请的权限等级、以及模型档位的可选范围。从那之后,接入效率一下子上来了。
另外一个习惯是,每个新模型上线,先在网关上做一周的灰度,只放 5% 的流量过去,观察延迟、错误率和 token 消耗,稳定后再慢慢切到全量。不要因为某个模型“听起来很强”就直接全量切,你永远不知道它在实际业务场景会输出什么奇怪的东西。网关的价值恰恰在于,它能让你“灰度切换模型”这件事变得无比轻松。
最后说一句:AI 网关不是一个固定形态的“盒子”,它是你公司模型治理体系的载体。刚开始可以做得轻一点,先解决“统一入口”的问题;等用的人多了,再加限流、审计、缓存、配额这些高级能力。重要的是先把入口立起来,让所有模型流量有迹可循,后续的治理才有素材和抓手。