最近在给一个站点的对话功能做升级,要同时用几家大模型。原本想直接调各家SDK,写了两天发现这路子有点费劲——有的需要走代理,有的鉴权头不一样,返回的格式也各玩各的。更头疼的是计费模型各一套,想控制成本根本无从下手。后来我干脆自己搭了个轻量API网关,把所有上游统一封装成一个接口,算是把几个难题按住了。
第一个坑是协议适配。我是参照OpenAI的chat completions格式做统一入口,因为团队里其他人已经用熟了。每一家上游都写一个adapter,把请求参数和返回结果做映射。别小看这步,光是“温度”参数和“top_p”在不同模型里的取值范围就折磨人。还有流式输出,各家事件名不一样,得逐字对齐。搞完这个,后面换模型、加新渠道都只需加一个适配器,总算能只跟一种接口打交道了。

第二个体会是fallback必须做。实际操作中,某家大模型经常因为并发过高给我限流,哪怕官方说“放宽了”,高峰期还是一撞一个准。后来我在网关里配了优先级和熔断逻辑:主通道被限流超过三次,就把请求自动转到备用的另一个模型。同时把超时时间设短一点,别让用户一直转圈。这样做的代价是牺牲一点回复质量稳定性,但换来了可用率,我觉得值。
再说省钱。很多请求其实不需要每次都问大模型。我把常见问题做了一层缓存,用语义向量做召回,命中就直接返回。没命中才走上游。另外,对话历史太长的就先做裁剪,只保留最近几轮和关键摘要,token消耗立刻降了不少。网关里还会记下每次请求用了哪个渠道、消耗多少token,月底对账一目了然,哪家便宜哪家贵心里有数。
限流这块我一开始没做,是线上被堵了一次才补的。我给每个上游渠道建了一个令牌桶,按它们的RPM限制设定速率,多余请求就排队等待或丢到备用队列。调用的客户端也加了重试策略,只在网络抖动和5xx时重试。效果很明显,再没出现过一个人刷挂整个站点的情况。
这些功能写起来不复杂,维护各家接口变化却很耗时间。后来前同事推荐了 寓守API,说它把聚合主流模型、统一接口、限流统计这些事都做了。我自己试了试,基础功能基本够用,省下不少造轮子的时间。如果你也正在为一个一个接API发愁,不妨去问问它是不是你需要的那个答案。