1. 为什么企业需要一个“大模型网关”
1.1 从“能跑通”到“能上线”之间隔着什么
我最早接触大模型接入是在一个内部知识问答项目上。当时团队里几个人各自写脚本,有人用官方 SDK,有人直接发 HTTP 请求,密钥散落在各个.env文件里,模型名、超时时间、重试策略全凭个人习惯。Demo 演示那天一切正常,等到要接入三个业务系统、日均请求量上去之后,问题就集中爆发了:某个业务方把密钥硬编码进了前端、有人不小心把温度参数调到 2.0 导致输出乱码、还有一次上游接口限流直接把整个服务拖垮。
这些问题的共同点是:它们都不是模型能力问题,而是工程治理问题。企业大模型网关要解决的,正是这一层。你可以把它理解成公司内部所有大模型调用的“统一收发室”:所有请求先到这里,由它负责鉴权、限流、路由、日志、计费、内容过滤,再转发给后端真正的模型服务。业务方不需要知道背后接的是哪家模型、密钥是什么、有没有做缓存,只需要按统一协议调用即可。
这个定位决定了网关的核心价值不在“聪明”,而在“稳”和“可控”。一个合格的企业网关,至少要覆盖四件事:统一入口与鉴权、多模型路由与降级、可观测性与成本核算、安全与合规兜底。这四件事听起来朴素,但每一件在真实生产环境里都能踩出一堆坑。
1.2 网关和 Agent、工作流是什么关系
很多人会把网关和 Agent 框架混为一谈,其实它们处在不同层次。Agent 关注的是“怎么让模型自己规划、调用工具、多轮迭代完成任务”,工作流关注的是“把多个步骤按固定或半固定逻辑串起来”,而网关关注的是“这些调用怎么安全、稳定、可计量地打到模型上”。
打个比方:Agent 是厨师,工作流是菜谱,网关是餐厅的采购和出餐窗口。厨师再厉害,如果采购渠道混乱、出餐窗口没有排队机制,餐厅照样会乱。反过来,网关做得再好,也不能替厨师决定这道菜怎么做。所以这三者是互补的,不是替代关系。企业落地时常见的错误顺序是先猛搞 Agent,结果底层调用一团糟,Agent 越复杂,故障越难定位。我的建议永远是:先把网关这层地基打牢,再往上叠工作流和 Agent。
1.3 适合谁来读这篇内容
这篇内容面向三类人:一是正在把大模型能力接入公司系统的后端或平台工程师,你需要一套可落地的网关设计思路;二是负责自动化编程、Agent 工作流搭建的技术负责人,你需要知道底层调用层该怎么规范;三是对大模型工程化感兴趣、想了解“从 Demo 到生产”差在哪的开发者。文中会给出具体的表结构、路由策略、参数计算和排查清单,你可以直接拿去改。
2. 网关整体架构与关键技术选型
2.1 分层设计:接入层、治理层、适配层
我在实际项目里把网关拆成三层,这个划分方式经过几次迭代后比较稳定。
接入层负责对外协议。对外统一暴露一套兼容主流接口规范的 REST 接口,业务方按这套协议调用。这样做的好处是业务方迁移成本低,很多现成的客户端库可以直接用。接入层还要处理请求体大小限制、超时设置、请求 ID 注入这些基础工作。
治理层是网关的大脑,包含鉴权、限流、路由、缓存、日志、计费、内容安全。这一层不直接和模型通信,只做决策。比如鉴权通过后,治理层根据请求里的模型别名、业务方标识、当前各后端健康状态,决定这次请求该走哪个后端、用哪个真实模型名、超时设多少。
适配层负责和各家模型服务对接。不同厂商的请求格式、返回格式、错误码都不一样,适配层把它们统一成内部标准格式。新增一家模型,只需要在适配层加一个适配器,治理层和接入层不用动。这个“对扩展开放、对修改关闭”的设计,是网关能长期维护的关键。
三层之间通过明确的内部数据结构通信,我一般用一个GatewayRequest对象贯穿,里面包含原始请求、鉴权结果、路由决策、目标后端、重试次数等字段。这样任何一层出问题,日志里都能看到完整的决策链路。
2.2 多模型路由策略怎么定
路由是网关最核心也最容易做歪的部分。我见过两种极端:一种是完全写死,一个业务方对应一个模型,改起来要发版;另一种是搞一套复杂的动态评分,结果线上行为难以预测,出问题没人说得清为什么走了这个后端。
我的做法是分层路由 + 显式规则。第一层按业务方配置的“模型别名”路由,业务方调用时写的是chat-standard这种别名,而不是具体模型名。第二层按别名映射表找到候选后端列表,映射表存在配置中心,支持热更新。第三层在候选列表里按权重和健康状态选一个,权重是静态配置,健康状态是运行时探测。
健康探测我用的是被动 + 主动结合:被动是指每次调用失败会记录失败计数,连续失败超过阈值就把该后端临时摘除;主动是指每隔一段时间发一个轻量探测请求。摘除后有个冷却期,冷却结束再放回候选池试探。这套机制在某个后端偶发抽风时特别有用,能自动把流量切走,不用人工介入。
关于降级,我的原则是同级降级、不跨级降级。也就是说,标准档模型出问题,可以降级到另一个标准档模型,但不能悄悄降级到低质量的小模型,否则业务方拿到的东西质量骤降却毫不知情,这比直接报错还糟糕。降级必须记录明确日志,并在响应头里带上降级标记,让业务方自己决定要不要接受。
2.3 密钥管理与鉴权:别把密钥当配置
密钥管理是很多团队翻车的地方。我见过把密钥写进代码仓库的、写进前端 JS 的、在多个服务间明文传递的。正确做法是:密钥只存在于网关这一层,业务方永远拿不到真实密钥。业务方用的是网关签发的访问令牌,令牌和业务方身份绑定,可以单独吊销、单独限流、单独计费。
令牌我一般用带签名的短期凭证,有效期设几小时到几天,配合刷新机制。令牌里编码业务方 ID、权限范围、过期时间,网关验签后直接拿到这些信息,不用查库。这样鉴权这一步几乎不增加延迟。真实的上游密钥存在专门的密钥管理服务里,网关启动时拉取到内存,定期轮换,绝不落盘到业务代码能碰到的地方。
注意:密钥轮换一定要做双密钥过渡。新密钥生效后,旧密钥保留一个宽限期,避免轮换瞬间所有在途请求失败。我吃过这个亏,凌晨轮换密钥导致一批长任务全部中断。
2.4 限流与并发控制:保护自己比保护上游更重要
限流的目的不只是防止把上游打挂,更是防止某个业务方的异常流量拖垮整个网关,影响其他业务方。我采用多维度限流:按业务方总量限流、按业务方单模型限流、按全局总量限流,三层都设阈值,任何一层触发就拒绝或排队。
算法上,令牌桶适合应对突发流量,漏桶适合平滑输出。我一般用令牌桶做业务方级限流,允许一定突发;用并发信号量做全局保护,控制同时在途的请求数。这里有个容易忽略的点:大模型请求的耗时远高于普通接口,一个请求可能占用连接几十秒,所以并发控制比 QPS 限流更关键。我实测过一个场景,QPS 只有 20,但因为每个请求耗时 30 秒,同时在途请求达到 600,直接把连接池打满。所以并发信号量的阈值要根据“平均耗时 × 目标 QPS”来估算,而不是拍脑袋。
关于“AI Agent 怎么扛并发”这个高频问题,我的答案是:Agent 的并发压力往往不在模型调用本身,而在工具调用和状态管理。网关能扛住模型调用这一层,但 Agent 自己的会话状态、工具执行、重试逻辑如果设计不当,照样会雪崩。所以网关要和 Agent 框架配合,网关负责模型调用的并发治理,Agent 框架负责自身状态的并发治理,两边都要做。
3. 核心功能模块的实操实现
3.1 统一请求协议设计
统一协议是网关的地基,设计不好后面全是补丁。我的协议设计遵循几个原则:字段名用通用词汇、必填字段尽量少、扩展字段用命名空间隔离。
请求体核心字段包括:model_alias(模型别名)、messages(对话消息)、stream(是否流式)、max_tokens、temperature、metadata(业务方自定义元数据)。响应体统一包含request_id、model_used、degraded(是否降级)、usage(用量)、content。
这里有个细节值得说:metadata字段我要求业务方至少填biz_scene(业务场景)和trace_id(链路追踪 ID)。前者用于按场景统计成本和效果,后者用于跨系统排查问题。很多团队一开始嫌麻烦不填,等到要分析“哪个场景最费钱”时才发现数据缺失,只能回头补,代价很大。
流式响应的处理是另一个坑。不同厂商的流式格式不一样,有的用 SSE,有的用自定义分块。适配层要把它们统一成一种格式再吐给业务方。我一般统一成 SSE,每个数据块是一个 JSON,包含增量内容和结束标记。流式场景下网关不能做完整响应缓存,但可以做首字节缓存和错误重试——如果连接建立后立刻失败,可以透明重试一次,业务方无感知。
3.2 内容安全与合规兜底
企业场景下内容安全是硬要求。网关这一层要做的是入口过滤 + 出口过滤。入口过滤检查用户输入是否包含明显违规内容,出口过滤检查模型输出是否包含敏感信息。过滤规则我一般用“关键词 + 正则 + 分类模型”三级,前两级快,第三级准但慢,按需启用。
这里要强调一个工程原则:过滤失败要 fail-closed 还是 fail-open,必须按场景明确。面向内部员工的工具可以 fail-open,过滤服务挂了就放行,保证可用性;面向外部用户的产品必须 fail-closed,过滤服务挂了就拒绝,宁可不可用也不能漏。这个决策不能由网关自己拍,要和业务方一起定,写进配置。
另外,日志脱敏也是合规的一部分。请求和响应里可能包含用户隐私,落日志前要脱敏。我的做法是只记录元数据(长度、模型、耗时、用量)和哈希后的内容指纹,原始内容按需采样记录且加密存储,保留期到期自动清理。
3.3 可观测性:没有度量就没有优化
网关的可观测性我分三个层次:指标、日志、追踪。
指标用标准的时间序列系统采集,核心指标包括:请求量、成功率、P95/P99 延迟、各后端错误率、限流触发次数、降级次数、token 消耗量。这些指标按业务方、模型、场景三个维度打标签,方便下钻。
日志记录每次请求的完整决策链路:谁调的、走的哪个后端、为什么走这个后端、耗时多少、用了多少 token、有没有降级。日志要结构化,方便检索。
追踪用分布式追踪系统,把网关的 span 和业务方的 span 串起来。这样排查问题时能看到一个请求从业务方发起、经过网关、打到模型、返回的完整链路。
实操心得:token 计费一定要在网关做,不要在业务方做。业务方各算各的,口径不一致,月底对账能吵翻天。网关统一按实际用量计费,业务方查账单即可。
3.4 缓存策略:什么能缓存,什么不能
大模型调用贵且慢,缓存能省不少钱。但缓存不是无脑加,要分场景。
确定性请求可以缓存:比如固定 prompt 的分类任务、信息抽取任务,同样的输入应该得到同样的输出,缓存命中率高。生成类请求谨慎缓存:同样的输入,用户可能期望不同的输出,缓存会导致体验重复。带随机性的请求不能缓存:temperature 大于 0 的请求,每次结果都不同,缓存没意义。
缓存键的设计很关键。我用的是“模型别名 + 归一化后的 messages + 关键参数”的哈希。归一化包括去除多余空格、统一大小写敏感策略。缓存有效期按场景设,分类任务可以长一些,对话类短一些甚至不缓存。
这里有个坑:缓存和内容安全过滤的顺序。如果先缓存后过滤,可能把未过滤的内容缓存下来,后续命中缓存时绕过过滤。正确顺序是过滤后再缓存,或者缓存命中后仍然过一遍出口过滤。我选后者,因为出口过滤很快,多这一步不影响性能。
4. 自动化编程与 Agent 工作流的落地
4.1 自动化编程场景下网关的特殊要求
自动化编程(比如代码生成、代码补全、代码审查)对网关的要求和普通对话不太一样。第一是延迟敏感,补全场景要求首字节延迟极低,网关不能引入太多开销。第二是上下文长,代码文件动辄几千行,请求体大,网关要能处理大 payload。第三是输出结构化要求高,代码生成往往需要特定格式,网关要支持输出格式约束。
针对延迟,我在网关里对补全类请求走“快速通道”:跳过部分非必要治理逻辑,只做鉴权和路由,直接转发。针对大 payload,接入层要调大请求体限制,同时做流式接收,避免一次性加载到内存。针对结构化输出,网关支持透传格式约束参数,并在适配层做格式校验,格式不对就重试。
4.2 工作流编排:网关之上的一层
工作流是把多个模型调用、工具调用按逻辑串起来。我见过用 Coze 工作流、Dify 工作流搭建的,也见过自己写代码编排的。无论用哪种,底层都要经过网关。
工作流和网关的边界要划清:网关管单次调用的治理,工作流管多次调用的编排。工作流里的每一步调用都走网关,网关不关心这一步在整个流程里的位置。这样职责清晰,工作流框架换掉不影响网关,网关升级不影响工作流。
工作流落地时最容易出问题的是上下文超长。多轮工作流累积的上下文可能超过模型窗口,需要在工作流层做裁剪或摘要。我的做法是在工作流里加一个“上下文管理”节点,负责在每步之前检查 token 数,超了就摘要或截断。这个逻辑不要放到网关,因为网关不知道哪些上下文重要、哪些可以丢,只有工作流自己知道。
4.3 Agent 与工作流的区别及选型
很多人问 Agent 和工作流到底怎么选。我的判断标准很简单:流程是否确定。如果步骤基本固定、分支有限,用工作流,可控、可调试、成本可预测。如果步骤需要根据中间结果动态决定、可能调用未知工具、需要多轮试错,用 Agent。
Agent 的优势是灵活,代价是不可预测。一个 Agent 可能调用 3 次模型就完成,也可能调用 30 次还在绕圈。所以 Agent 必须有预算控制:最大步数、最大 token 数、最大耗时,超了就强制终止并返回当前结果。这个预算控制我建议放在 Agent 框架层,但网关要提供用量查询接口,让 Agent 框架能实时知道已经花了多少。
Agent 的记忆管理也是难点。短期记忆(当前会话)和长期记忆(跨会话)要分开处理。短期记忆放上下文,长期记忆放向量库或结构化存储。网关不负责记忆,但网关的日志可以作为记忆的原始数据来源。
4.4 从工作流到代码:可维护性考量
有些团队用可视化工作流搭原型,跑通后想转成代码以便维护。这个转换要谨慎。可视化工作流的优势是直观,转成代码后可能变得晦涩。我的建议是:原型阶段用可视化,生产阶段用代码,但保留可视化的流程图作为文档。
转代码时,把工作流的每个节点映射成一个函数,节点间的连线映射成函数调用或消息传递。这样结构清晰,也方便单测。网关在这一步的角色是提供稳定的调用接口,让生成的代码直接调用网关,不用关心底层模型细节。
5. 常见问题与排查技巧实录
5.1 典型问题速查表
| 现象 | 可能原因 | 排查方向 | 处理建议 |
|---|---|---|---|
| 请求全部超时 | 上游限流或网络问题 | 查上游错误码、网络连通性 | 启用降级,切换后端 |
| 部分请求失败 | 某后端不健康 | 查各后端错误率 | 摘除异常后端,观察冷却 |
| 延迟突然升高 | 并发过高或缓存失效 | 查在途请求数、缓存命中率 | 调低并发阈值,预热缓存 |
| 计费对不上 | 口径不一致 | 对比网关日志和业务方统计 | 统一以网关为准 |
| 输出被截断 | max_tokens 设置过小 | 查请求参数和响应 finish_reason | 调大 max_tokens 或分段 |
| 流式中断 | 连接超时或上游断流 | 查连接保持配置 | 加心跳,透明重试 |
| 密钥失效 | 轮换未过渡 | 查密钥有效期 | 双密钥过渡,提前告警 |
5.2 排查思路:从现象到根因
排查大模型网关问题,我的顺序是:先看指标,再看日志,最后看追踪。指标告诉你“哪里不对”,日志告诉你“发生了什么”,追踪告诉你“为什么发生”。
举个例子,业务方反馈“最近回答变差了”。先看指标,发现降级次数上升,说明有后端在出问题。再看日志,发现降级都发生在某个特定后端,且错误码是限流。再看追踪,发现这个后端的请求量在某个时间点突增,原因是另一个业务方上线了新功能。根因找到:新功能流量挤占了老业务的配额。解决:给新业务方单独配额,或者扩容后端。
这个链路听起来简单,但前提是三层数据都齐全。我见过很多团队只记日志不记指标,排查时只能靠 grep,效率极低。所以可观测性建设要前置,不要等出问题才补。
5.3 独家避坑技巧
技巧一:给每个请求打上“成本标签”。在 metadata 里记录预估 token 数和实际 token 数,按业务方聚合。这样月底能精确知道每个业务方花了多少钱,避免扯皮。我还会设成本告警,某业务方日消耗超过阈值就通知,防止意外烧钱。
技巧二:灰度发布用流量镜像。新模型上线前,把生产流量复制一份打到新模型,对比输出质量和延迟,不影响真实用户。镜像流量不计费或单独计费,避免污染账单。
技巧三:错误重试要区分错误类型。网络超时、限流这类可重试错误才重试,参数错误、内容违规这类不可重试错误直接返回。无差别重试会放大故障,我见过重试风暴把上游彻底打挂的案例。
技巧四:定期做故障演练。手动摘除一个后端,看网关能不能自动切换;手动触发限流,看业务方能不能优雅处理。演练过的故障才是可控的故障。
技巧五:文档和配置同源。网关的配置项、路由规则、限流阈值,都要有对应的文档,且文档从配置自动生成。人工维护的文档一定会过期,过期文档比没有文档更危险。
6. 从基础到落地的推进节奏
6.1 分阶段建设路线
我不建议一上来就搞大而全的网关。我的推进节奏是四阶段。
第一阶段:统一入口。把散落各处的模型调用收敛到一个服务,统一鉴权和密钥管理。这个阶段不追求功能多,只追求“所有调用都走这里”。这一步能解决 60% 的混乱。
第二阶段:治理能力。加限流、路由、日志、计费。这个阶段开始产生运维价值,业务方能自助查用量、看延迟。
第三阶段:高可用。加多后端、健康探测、自动降级、缓存。这个阶段网关开始能扛故障。
第四阶段:生态集成。和工作流、Agent 框架、监控告警系统打通。这个阶段网关成为基础设施,支撑上层创新。
每个阶段之间留出观察期,确认稳定再进下一阶段。跳阶段建设是翻车重灾区,我见过直接上第四阶段结果基础鉴权都没做好的项目。
6.2 团队协作与职责划分
网关是平台型产品,涉及多方。我的职责划分是:平台团队负责网关本身的开发和运维,业务方负责自己的调用逻辑和配额使用,安全团队负责内容安全规则,财务团队负责计费口径。四方定期对齐,避免各说各话。
业务方接入时,平台团队提供接入文档、SDK、沙箱环境。业务方先在沙箱跑通,再申请生产配额。配额审批要有人负责,不能无限发放,否则总量失控。
6.3 成本控制的几个实操手段
成本是大模型落地绕不开的话题。除了前面说的缓存和计费,还有几个手段。
模型分级:不是所有任务都需要最强模型。分类、抽取用轻量模型,复杂推理用强模型。网关支持按别名路由,业务方按需选择。
输出长度控制:很多请求的 max_tokens 设得过大,模型生成一堆废话。网关可以设默认上限,业务方要突破需申请。
批量合并:多个小请求可以合并成一个大请求,减少调用次数。这个要在业务方做,网关提供批量接口支持。
闲时调度:非实时任务可以放到低峰期执行,利用更宽松的配额。网关支持优先级队列,低优先级任务排队等待。
这些手段叠加起来,我实测能把成本压到原来的三分之一左右,且不影响核心体验。
6.4 后续扩展方向
网关建好之后,可以往上长很多东西。比如 A/B 测试框架,让不同业务方用不同模型对比效果;比如提示词管理,把 prompt 集中管理、版本化;比如效果评估,自动采样输出做质量打分。这些都不是网关的核心,但网关提供了数据基础,做起来事半功倍。
我个人在实际操作中的体会是:大模型工程化最难的不是模型本身,而是把不确定性装进确定的工程框架里。网关就是那个框架的底座。底座稳了,上面的 Agent、工作流、自动化编程才能放心折腾。底座不稳,上面越花哨,塌得越快。所以如果你正在规划企业大模型落地,先把网关这层想清楚,比急着上 Agent 重要得多。