团队只有一个模型、一个人调的时候,业务代码直连官方 SDK 没问题。模型变成三个、调用方变成五条业务线,问题就不在模型分数上了。密钥进仓库、账单对不上、主模型 5xx 时页面直接炸、出事之后日志里只有一行 status=500。
这些是接入问题。网关要收的是鉴权、路由、限流、成本、审计,不是再包一层「更聪明的 prompt」。
下面按我们给企业画蓝图时的顺序写。不绑定某一家开源网关的菜单名,换成你们现有的组件也能对。
什么时候该有网关
出现任意两条,就可以立项,不用等「大模型中台」立项通过:
- 两套以上上游(OpenAI 兼容接口 + 国产 + 开源自托管)
- 个人 Key 出现在前端环境变量或 CI secret 以外的聊天记录里
- 月账单需要打开三个控制台才能加总
- 安全同事问「这段代码上周有没有出过公司」,没人能在当天回答
网关不是增长功能。它是组织开始把 AI 当生产依赖时的排水管。
路由:按任务,不按喜好
不要做「一个 default 模型打天下」,也不要做「每个开发自己选」。我们用一张静态表,变更走评审:
| 任务类 | 主模型 | 回落 | 禁止 |
|---|---|---|---|
| 代码补全 / 仓库 Agent | 低延迟、上下文大的编码模型 | 次一级编码模型 | 把整仓发到未签约地区 |
| 内部问答 | 便宜的长上下文 | 本地检索 + 小模型 | 未脱敏的人事数据 |
| 对客文案 | 按品牌语气微调过的模型 | 人工草稿 | 自动外发 |
| 分类 / 抽取 | 小模型或自托管 | 规则 | 用旗舰模型刷量 |
路由键用「任务类 + 租户 + 数据级别」,不要用「用户今天想用谁」。任务类写进 SDK 的 X-Task 或请求体字段,网关拒绝未知任务类。拒绝比默默落到旗舰模型便宜。
数据级别至少三档:公开、内部、受限。受限档只允许去合同里写明训练策略的上游,或不出域的自托管。这一条比选模型重要。
降级:先写失败,再写成功
业务最怕的不是慢,是裸的上游错误词。降级策略要写成状态机,不要写成 if 堆。
- 主模型超时或 5xx:切到回落模型,响应头打
X-Fallback: 1 - 回落也失败:返回网关自己的 503,body 是稳定的错误码,不是上游原文
- 触发内容或区域政策:不要回落成「换一家更松的」。直接拒,记审计
- 限流:按租户 429,给
Retry-After。不要悄悄换成更贵的模型帮他打满
熔断按上游+区域,不要按整网关。一家美国节点挂了,不该带倒国内问答。
有人会问要不要自动重试。幂等的补全可以重试一次;带工具调用、已产生副作用的 Agent 步骤,禁止盲重试。重试策略写进任务类,不要全局一把梭。
审计:日志是事后唯一能交的东西
管理层问「这个月 AI 花在谁身上」,安全问「那次泄漏经过哪次调用」,答案都只能来自网关日志。业务库里没有这份事实。
最低字段:
- 时间、租户、调用方服务、调用方主体(人 or 工作负载)
- 任务类、主模型、是否回落、上游请求 id
- token 入/出、金额(按当时单价快照,不要事后反推)
- 决策:放行 / 拒绝 / 限流,以及原因码
- 提示词与响应:按保留策略。默认只留哈希和截断,受限档可以不落盘正文
保留窗口和法务一起定,常见是 30 天元数据、7 天正文、受限档 0 天正文。网关不是数据湖,别在这里训练自己的模型。
成本报表按租户 × 任务类出。能十分钟回答「上月研发的编码模型花了多少」,网关才算活着。
鉴权和限流
对内签发短寿命的团队 Key,映射到角色,不映射到某个人的上游账号。上游的官方 Key 只存在网关侧的密钥槽,轮换时业务代码零改动。
限流两层:租户 QPS,租户日预算。预算打满失败关闭,不要透支到下月再补发票。有人会觉得不近人情。对财务来说,不可预测的模型账单比一次 429 更不近人情。
不要做的设计
不要让网关「智能选模型」。选模型是产品决策,应落在路由表。网关偷偷升级模型,eval 会漂。
不要在网关里做完整 RAG。检索属于应用。网关一做检索,权限模型会和业务权限撕成两张皮。
不要用公共商业中转顶替内网入口,还假装数据没出过第三家。中转解决的是账号调度,解决不了提示词多经过一跳。提示词不能离开公司边界时,网关要部署在自己的账户和网络里。请求最终仍会到上游模型,这一点对管理层要讲直。
不要把网关项目做成「我们自己的 ChatGPT」。聊天 UI 可以有,验收标准仍是:新员工当天能领到 Key、当天出现在审计里、主模型挂了页面不爆上游堆栈。
我们把这层叫做接入,是服务阶梯的第一层。完整方法和交付物在 fxai.ai。蓝图说明:https://fxai.ai/no…