AI网关实战:从部署到核心功能,小团队接入大模型的最佳实践
1. 这个 37K Star 的项目到底解决了什么问题先说个我自己踩过的坑。去年我给团队搭内部 AI 服务接了大模型 API一开始觉得挺简单不就是 HTTP 请求嘛拿着 Key 调一下返回结果就完事了。结果真正上线两周麻烦事全来了——不同组的人来要 KeyKey 不知道怎么分配有人写脚本把额度刷爆了账单直接飙了几千块后来要接入多家大模型做容灾切换代码里全是 if else再后来要做内容审核、敏感词过滤每个调用方都自己实现一遍质量参差不齐。整个系统越来越乱但你还不能说它哪里坏了就是到处都别扭。后来我翻 GitHub 找方案看到了这个 37K Star 的开源 AI 网关项目。名字里带“网关”两个字第一反应是这东西跟 Nginx 差不多看完文档我才意识到它解决的根本不是转发这么简单而是把 AI 应用接入大模型时那一大堆琐碎但关键的横切能力全部下沉到了一个统一入口里Key 管理、配额控制、多模型路由、缓存、限流、审计日志、内容安全全都有。对于 10 人以下的团队来说最吸引人的是商业授权政策这个规模内可以免费用。10 个人的团队意味着什么意味着大概率没有专职的基础设施团队可能就一两个后端顺手把 AI 接入的事也干了。你让他们自己从零写一套模型网关不现实直接上云厂商的托管网关又贵又不够灵活而这个项目刚好卡在一个非常舒服的位置——开源、可自托管、功能完整、小团队免费。这篇文章我会从实际落地的角度把这个网关的核心设计、部署方式、关键功能、我踩过的坑一条条讲清楚。不管你是后端开发、技术负责人还是想给团队搭 AI 基础设施的“兼职运维”都应该能从中找到可以直接抄作业的内容。2. 为什么 AI 应用需要一个独立网关层2.1 没有网关时AI 接入会乱成什么样先说一个很典型的场景。你们团队做的是一个知识库问答产品后端要调大模型。刚开始只有一个人负责这个事代码里写死了一个 API Key指向 GPT-4o。上线后产品经理说我们想对比一下各家模型的效果于是代码里加了 switch case模型 A 用这个 Key模型 B 用另一个 Key。后来测试环境也要接入于是又复制了一份配置专门给测试用。再往后市场部要做活动需要在短时间里批量生成文案结果直接把生产环境的 Key 用到爆那天账单多了两千块。销售部说我们也要接 AI 写日报于是后端同学把一个 Key 给了他们但是没法限制他们每天能调多少次。再往后安全同事过来说所有对外请求都要记录日志做合规审计不然不行。你看每一个需求单看都不复杂但是叠加起来代码越来越臃肿Key 散落在各个服务里权限没法管控出了问题不知道是谁调的。这就是典型的“AI 接入缺乏统一治理层”的症状。2.2 网关在架构中的位置这个 AI 网关的定位是放在你的应用服务和各种大模型 API 之间的一层代理。你的后端服务不再直接跟 OpenAI、Anthropic、国内的各家大模型 API 打交道而是统一请求网关由网关去转发到实际的大模型服务商。听起来跟传统的 API 网关很像但它针对 AI 场景做了很多专门的设计。比如它理解 OpenAI 的请求格式能直接把 /v1/chat/completions 这样的请求转成其他家的格式它能处理流式响应不会把 SSE 流搞丢它知道什么是 token能按 token 数做配额管理而不是只按请求次数。这些东西Nginx 做不到Spring Cloud Gateway 也做不到——它们都是通用网关不感知 AI 协议。我当时画过一张部署图网关放在内网服务通过内部域名访问网关网关再出去访问公网的大模型 API。这样有几个好处Key 不用下发到每个服务里只存在网关一处所有请求都经过网关日志集中接入新模型只要改网关配置不需要改业务代码。2.3 小团队为什么更应该用网关大厂有专门的基础设施团队内部有各种平台自研网关照理不误。但 10 人团队不会去自研他们要的是开箱即用。这个开源项目的核心价值就是把大厂的基础设施能力以开源的形式下沉给了小团队。而且小团队用网关还有一个隐藏的好处它可以作为一个统一入口把各种 AI 能力不同厂商的模型、不同的模型版本封装成一个内部 API 面。这样业务代码面对的是一个稳定的接口契约底层模型怎么换、换哪家业务完全不感知。10 人团队里可能就一两个人懂 AI 接入他们维护一个网关其他人只需要拿一个内部定的 Key 来调用门槛一下就低了。3. 部署实操从零把 AI 网关跑起来3.1 我推荐的部署方式与准备工作这个项目官方提供 Docker 镜像也支持 Kubernetes Helm Chart 部署。对于 10 人团队我的建议是如果你们已经有 K8s 集群用 Helm 部署如果没有直接用 Docker Compose 在单台机器上跑完全够用。部署前准备几样东西一台 Linux 服务器2C4G 起步如果并发不高这个配置绰绰有余Docker 和 Docker Compose如果走 K8s 就是 Helm 3至少一个大模型 API 的 Key比如 OpenAI 的或者国内厂商的一个域名最好有因为后面配置回调、审计日志都会方便一些没有也行用 IP 访问选 2C4G 这个配置我是实际测过的。网关本身只是做转发和策略控制不承担模型推理所以 CPU 和内存消耗都很低。真正吃资源的是后面的大模型服务跟网关没关系。3.2 快速部署的完整流程先创建一个工作目录我是放在 /opt/ai-gateway 下面mkdir -p /opt/ai-gateway cd /opt/ai-gateway然后准备一个 docker-compose.yml 文件。我当时的配置大概长这样注意版本号要按官方最新版本调整version: 3.8 services: ai-gateway: image: ghcr.io/your-project/ai-gateway:latest container_name: ai-gateway ports: - 8080:8080 environment: - GATEWAY_ADMIN_TOKENyour_admin_token - GATEWAY_DATABASE_URLpostgres://user:passdb:5432/gateway depends_on: - db restart: unless-stopped db: image: postgres:15-alpine environment: - POSTGRES_USERuser - POSTGRES_PASSWORDpass - POSTGRES_DBgateway volumes: - pgdata:/var/lib/postgresql/data volumes: pgdata:这里我把 Postgres 也一并起了。为什么不建议用 SQLite因为团队虽然小但多实例部署迟早会来到时候 SQLite 迁移到 Postgres 麻烦得很。一步到位用 Postgres后面省心。启动之后访问 http://服务器IP:8080会看到管理后台的登录页。第一次登录用环境变量里配的 ADMIN_TOKEN 换取登录态进去之后第一件事是改默认密码这个我不说你也知道。3.3 接入第一个大模型登录后台之后进入“供应商”页面点击新增。以 OpenAI 为例只需要填两个东西供应商类型OpenAIAPI Key你的 sk-xxxx保存之后再创建一个“模型”配置关联到刚才的供应商指定模型名称比如 gpt-4o-mini。然后创建一个“渠道”或者叫“通道”把模型挂上去。这里有个概念容易绕晕供应商、模型、渠道三者是什么关系我自己的理解是——供应商是“跟谁买”模型是“买哪个”渠道是“对外怎么卖”。同一家供应商可以买到多个模型同一个模型也可以通过多个渠道暴露出去。你会慢慢发现这个分层设计其实非常灵活。配置完成之后网关会生成一个内部调用地址一般是 /v1/chat/completions。你用工具测一下curl http://localhost:8080/v1/chat/completions \ -H Authorization: Bearer your_gateway_key \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 你好说一句话}] }如果返回了模型的回复说明网关已经通了。注意这里用的 Bearer Token 不是 OpenAI 的 Key而是网关自己签发的 Key——从这一刻起你的业务代码就不用再持有任何上游 API 密钥了。4. 核心功能拆解这些能力才是它值 37K Star 的原因4.1 模型路由与多供应商容灾这是我用的最多的功能没有之一。我们生产环境接了三家大模型一家国外的两家国内的。为什么接三家第一因为要对比效果和价格第二就是怕一家挂了全站瘫了。以前我自己写切换逻辑用的是配置中心加开关切换至少要改配置、发版耗时五分钟以上而且切换的时候流量会中断一小会儿。网关把这个事变成了一个路由策略。你可以给同一个逻辑模型配置多条上游通道每条通道设置权重。比如通道 A国外某模型权重 50通道 B国内某模型权重 30通道 C国内另一家的模型权重 20网关会按权重分配流量。当某一条通道连续报错达到阈值它会被自动标记为“不健康”后续流量将自动跳过它打到其他通道。等它恢复之后自动重新加入。我实际测过主通道故障时网关自动摘除节点的耗时大约在几秒到十几秒之间业务端会感觉到一点点抖动但不会整个挂掉。这个傻瓜式容灾能力让我少加了无数个夜班。以前我们做过一次线上演练直接把主通道的 API Key 改成错的结果网关自动切换到了备用通道业务方甚至没察觉到异常。4.2 租户隔离与 Key 管理网关里面可以创建多个“租户”这其实就是我们内部的各个业务线。每个租户有自己的 Key、自己的配额、自己的模型可见范围。我把这个能力用到我们内部变成了这个样子知识库团队一个租户Key 前缀 kb-prod配额 100 万 token/天文案生成工具一个租户Key 前缀 copy-prod配额 30 万 token/天测试环境一个租户Key 前缀 test配额 5 万 token/天每一个 Key 出来的请求都会打上租户的标签。在日志和报表里我能一眼看到哪个团队调了多少、花了多少钱、调用集中在哪个时间段。这个能力看似朴素但真的太实用了。有个细节值得点赞允许对单个 Key 设置独立的限额而不只是租户级别。这就有意思了——同在一个租户下普通成员和团队负责人的权限可以不同限流策略也可以不同。我之前遇到过的情况是一个团队只报上来一个 Key结果十几个后端在共享某个人写了个死循环把整个团队的额度刷完了。用上 Key 级限额之后每个人按照自己的实际需求单独领 Key各管各的互不影响。4.3 缓存与性能优化AI 接口的响应速度普遍不快一次请求动不动三五秒。对于某些场景比如客服问答、常见问题查询用户的很多问题其实是重复的。如果能命中缓存既能大幅削减 token 费用又能把响应时间压缩到毫秒级。网关支持语义缓存。它不只是把请求原文做一个哈希匹配而是会先把用户的问题做 embedding 向量化然后在缓存里做相似度检索。比如用户问“怎么退款”和“退款流程是什么”语义上是同一个问题就认为这两条请求可以共享同一个响应。我一开始觉得这个功能是锦上添花后来发现它是省钱神器。像我们客服机器人这个场景用户问题的重复率比你想象高得多命中率能做到 30% 以上。这意味着大模型真实调用减少了三成费用也降了三成。延迟也从 3 秒降到了 300 毫秒体验提升巨大。开启方式很简单后台勾一下语义缓存配置一个向量数据库地址we support Qdrant/Milvus/Redis with vector module把相似度阈值调到 0.9 左右就行。阈值别设太低0.8 以下容易把不同问题混在一起返回错误的答案。4.4 内容安全与审计说到内容安全这是我们上这个网关最直接的一个推力。合规那边要求所有对外提供服务的 AI 接口必须经过内容审核。以前这个是业务自己接第三方审核服务每个业务写一遍。现在网关内置了审核环节可以配置在请求发送前先过一遍审核。支持模式有三种使用内置的敏感词列表适合快速过滤明显违规内容调用第三方内容安全 API比如国内云厂商的文本审核服务在提示词层面做注入检测拦截 prompt injection 攻击我对这个功能的态度是网关做这层安全检测不能替代业务自己的安全设计但可以作为一个兜底防线。它最大的价值是“统一”。某项内容审核策略需要加强了在网关配置一下所有经过网关的 AI 请求立即生效不用各业务线各自改代码发布。做过合规的人都知道这种“一键全局生效”的能力有多么难得。审计日志也值得一提。网关会把每一次请求的完整信息记录到数据库谁调的、调的哪个模型、prompt 是什么、响应是什么、花了多少 token、耗时多长、是否触发了安全策略。这些日志可以对接外部日志系统做长期归档。真要出什么事这些数据就是你的保护伞。5. 进阶玩法把它玩出花来5.1 结合 Prometheus 做全面可观测网关本身暴露了 Prometheus 格式的监控指标。我把它接进了我们现有的监控系统主要看几个指标每秒请求数QPS各通道的响应延迟 P50/P95/P99token 消耗速率错误率分布这些指标配上 Grafana 面板之后会发生一个很酷的变化——以前我们是问题发生之后才去查日志现在是问题发生之前就能从曲线里看出端倪。比如某条通道的 P99 延迟连续走高就有理由怀疑它快出问题了可以提前做一些分流准备。我最常用的一个看板布局是左边放总体 QPS 和 token 消耗右边放各通道的延迟对比下方放错误分布。这个布局一眼扫过去整个 AI 服务的健康状况基本就有数了。5.2 用网关做灰度发布大模型应用跟传统应用一样也有版本发布的问题。模型升级、Prompt 模板调整、推理参数调整都可能影响线上效果。网关支持基于请求头或用户 ID 的灰度策略。我做过一次典型的灰度知识库问答的线上版本默认打到 GPT-4o-mini内部测试组请求头里加一个 X-Gray: beta打到 GPT-4o然后让几个核心用户先进 beta 组对比效果。确认没问题之后把默认流量也切过去。整个过程完全不改代码只动网关配置。对于一些没有独立灰度能力的小团队来说这个场景几乎就是刚需因为这已经是当前最强的大模型了但每次切换还是需要验证。5.3 作为统一认证入口因为所有请求都经过网关所以认证也可以统一在这里做。网关支持 JWT 校验、Basic Auth、自定义 Header 透传等模式。我们内部对接的一个业务系统它现有的用户体系是自建的 JWT。网关配置了 JWT 公钥校验之后业务系统直接拿现有的 Token 来调 AI 接口就行不需要再造一套凭证。这种“适配现有体系”的能力让网关在接入时不那么有侵入性这一点对小团队来说很重要——他们没有资源去做大的改造。6. 常见问题与避坑指南6.1 踩过的坑部署与配置类先说一个部署上的坑。我第一次部署时网关和数据库没做健康检查结果数据库还没完全启动网关就先起来了反复连库失败。后来发现是 Docker Compose 里少配了 depends_on 的 condition。加了 healthcheck 之后问题解决db: healthcheck: test: [CMD-SHELL, pg_isready -U user -d gateway] interval: 10s timeout: 5s retries: 5还有一个比较隐蔽的坑容器时间问题。网关的限流和配额逻辑依赖系统时间如果容器的时区或时间错了配额判断会出错。建议在 Docker Compose 里加上 TZAsia/Shanghai 环境变量并且确保宿主机时间同步。6.2 踩过的坑使用与配置类在使用阶段最典型的坑是模型名称不一致。OpenAI 的模型叫 gpt-4o国内某家的模型叫 glm-4有些网关在路由时如果配置不正确请求会 404。排查思路是这样的先看网关日志里记录的转发地址如果 URL 不对调整模型映射配置如果 URL 对了但报 401检查 API Key。流式输出也是一个高频雷区。网关层的流式转发跟普通 HTTP 转发不同它不能等全部响应完成再返回必须边接收上游数据边推给下游。如果通的网关实现得不好流式响应会卡顿甚至中断。这个项目在处理 SSE 流式上做得比较好前提是客户端不要自己加缓冲中间件。我遇到过内部一个服务用 HttpClient 默认配置去调用网关导致流式响应被缓冲到全部结束才返回用户端感觉非常慢。解决办法是把 HttpClient 的超时和缓冲行为改成逐行读取直接透传流。配额相关的坑也有。有人设置了租户配额但没设置 Key 级配额结果租户下的某个 Key 把整个租户的配额刷完了。建议刚上线时至少每个 Key 都设置一个保守配额兜底然后再按实际情况调整。6.3 常见问题速查表这里整理一个我在实际使用中碰到的高频问题对照你遇到类似症状的时候可以直接对号入座症状可能原因排查思路请求返回 401Bearer Token 错误或过期检查网关签发的 Key 是否有效确认租户状态请求返回 404模型名称未正确映射检查模型配置和路由规则确认转发到上游的路径流式输出卡顿上游响应被缓冲确认客户端没有对 SSE 做额外缓冲处理部分请求超时某条通道上游出现问题查看监控面板中通道的延迟和错误率考虑提升熔断阈值配额不到点就报错时间配置不对或多个实例时区不一致检查容器的 TZ 配置统一时区日志量大导致磁盘满审计日志未设置清理策略配置日志保留周期或同步到外部存储6.4 关于高可用的两个提醒如果你是想把网关单实例跑起来自己用我的态度是可以但记得定期备份数据库。配置和数据都在数据库里备份好了重建一个实例就是几分钟的事。如果团队业务已经比较重要了建议至少部署两个网关实例前面挂一个负载均衡器。网关本身是无状态的状态都在数据库里所以多实例部署非常自然。两个实例互不感知请求分摊过来还顺带解决了单点故障。别把鸡蛋放一个篮子里这是我们做后端的基本素养。不过多实例部署之后有一个注意点限流和配额是跨实例共享的依赖数据库的原子操作来实现所以数据库别用 SQLite一定要用 Postgres 或 MySQL。这也是我从第一天就让你用 Postgres 的原因。7. 最后再分享一个真实的使用心得我回头看这个项目最大的感受不是某一个功能有多强、性能有多猛而是它把一个非常分散、非常琐碎的领域AI 接入治理给系统化了。对于团队来说很多问题不是不能解决而是一个个去解决的成本太高。一个网关把这些问题打包解决而且项目本身还给了小团队免费空间这在我看来是这个项目能刷到 37K Star 的真正原因。根据我的实践经验如果你想上了这个网关之后不出幺蛾子有几件事值得在最初就做到位一是所有 Key 必须分租户分人管理宁可多建 Key 也不要共享二是开启语义缓存之前先小流量试跑几天确认相似度命中没有误伤再全量放量三是监控面板从第一天就接好后面出了问题能快速定位。这个项目后续还能怎么扩展我个人目前在研究的是把网关接入内部的知识库检索流程做一个带 RAG 的通用问答入口。网关负责模型路由、限流和审计知识库负责检索增强两者通过内部接口配合。这样一来团队内部各种“接入大模型”的需求都收敛到同类架构之下成本低、可控性好。如果你们也是十来个人的团队我真心建议试试这个方案——自己造轮子真的不如先站在这个 37K Star 的轮子上往前再跑一段。