尧图精选

AI网关如何拯救RAG落地:模型路由与链路稳定实战

🕒 发布时间:2026/10/1 9:04:00 📁 来源:尧图网络
1. 为什么RAG落地卡在中段而不是模型本身1.1 从一次客户事故说起RAG链路断在了网关层前阵子帮一家做企业知识库问答的团队排查线上问题现象很典型用户问“上季度华东区营收为什么下滑”RAG检索模块明明召回了正确的财务文档片段但最终回答却文不对题甚至引用了别的部门数据。链路拆开看检索没问题、向量库没问题、Prompt模板也没问题问题出在请求到达大模型之前的那一跳——他们把多个模型的接入参数写死在业务代码里某个模型供应商接口升级后超时参数变了回退逻辑又没接住整个问答服务直接“带病运行”了一周。这类问题在RAG项目里太常见了。大家一开始都在卷召回率、卷向量模型、卷Chunk切分策略反而忽略了这么一件事RAG不是“向量库大模型”两根管子直接对接中间还有请求路由、上下文组装、限流熔断、可观测性这一大坨“管道工程”。这就是AI网关存在的理由。我最近在好几个企业级RAG落地项目里反复实践了一套方案核心组件就是MAI GatewayMAI即Model AI Infrastructure的常见缩写行业内也习惯叫模型网关层今天把落地方案和实操细节完整拆一遍。1.2 RAG不止是“检索生成”中间层才是命门如果你用LangChain或者Spring AI写过RAG Demo会觉得这事特别简单Embedding入库、向量检索、拼Prompt、调LLM四步搞定。但一旦放到生产环境问题立刻变味了第一模型入口是多个的。企业不可能只用一个模型供应商主力可能是商用大模型API备胎是开源模型私有化部署某些垂直场景还要切专用模型比如SQL生成用微调过的模型。业务代码里直接写死各个模型的Endpoint、Key、超时时间维护成本会随模型数量线性增长出一回事故就得排查半天。第二Prompt上下文经常要动态组装。RAG场景下检索出来的文档片段可能来自多个知识库加上对话历史、用户意图分类结果、系统指令这些内容合并成一次请求的过程不该散落在业务代码里反复复制粘贴。第三也是最容易被忽视的——成本与稳定性。RAG链路里Embedding调用可能几十并发就触发限流LLM调用动辄几秒到几十秒没有统一的缓存、重试、熔断机制线上迟早翻车。所以我把RAG的架构理解切成三段数据准备段切分、Embedding、入库、检索服务段向量检索、重排、过滤、生成接入段模型路由、上下文组装、请求分发。AI网关管的就是第三段——它是“生成”环节的总入口也是整个RAG链路里被低估的稳定器。1.3 AI网关是“接水管”的角色但很多人没意识到它的价值用个生活化的类比RAG系统的数据准备和检索像家里的净水器——负责把水过滤干净模型本身像水龙头——负责出水AI网关则是那根埋在墙里的总水管它决定了水从净水器到水龙头之间怎么走、走哪条管、流量多大、水压稳不稳。水管出问题你换个再贵的龙头也没用。MAI Gateway这类组件在行业里的定位就是“模型基础设施层”。它站在业务应用与大模型之间统一代理所有模型请求提供路由、负载均衡、重试、缓存、鉴权、可观测性这些横切能力。对RAG来说它解决的问题非常具体你检索出来的上下文应该交给哪个模型以什么样的参数格式发出去失败后回退到哪个模型整套请求过程有没有完整的追踪记录搞明白这个定位你再看那些“RAG效果不好”的线上问题会发现至少有三分之一不是模型不够聪明也不是检索不够准而是生成接入段没有治理好。接下来我按MAI Gateway在RAG链路里的实际落地方案把核心能力、配置方法、踩坑经验一次说完。2. MAI Gateway核心能力拆解网关在RAG链路里到底干了什么2.1 多模型路由让“生成”环节变成可编排的后端MAI Gateway最核心的能力就是把你业务代码里那些写死的模型调用统一变成网关上的路由规则。从RAG的角度看这相当于把“生成”这一环从业务逻辑里解耦出去变成了可动态调整的后端资源。我落地时的标准做法是这样在MAI Gateway上配置多个模型供应商Provider每个Provider对应一个具体的模型接入点。比如一个Provider指向商用API另一个指向公司内网部署的Ollama服务还有一个指向微调后的私有模型。业务侧请求网关时不直接指定“用某个模型”而是指定“用某个路由名”。例如路由名叫rag-default网关侧配置该路由的模型优先级为商用主力模型 → 私有模型 → 本地轻量模型。网关负责检查每个Provider的健康状态、负载和限流剩余额度自动挑选当前可用的那个。这个设计的核心收益不是“多了个中间层”而是把模型切换从“改代码发版”变成了“改配置重启”。我经历过太多次这种情况线上模型供应商临时限流业务方急得不行最后只能紧急改代码、过审批、重新部署。有了网关运维直接在后台把某条路由的流量切到备用模型上五分钟内完成。RAG场景里还有一个特别有用的路由维度——按知识域路由。比如企业系统里有“制度文档库”和“产品技术库”两套知识检索阶段可以感知用户问题命中了哪个库然后在请求里带上来源标签网关就可以据此把请求分发到擅长对应领域的模型。这就是把路由从“负载均衡”升级成了“业务语义路由”。2.2 上下文与Prompt组装网关在请求改写中扮演的角色RAG的请求有一个明显特征Prompt很长而且长在上下文上面。检索回来的文档片段动辄几千字再加上对话历史和系统指令整个请求体积远超普通对话场景。这个环节最大的难点不是“能不能拼出来”而是“怎么拼得稳定、拼得可观测”。MAI Gateway支持在请求转发前做上下文改写Request Rewriting本质上类似一个轻量的中间件管道。在RAG落地时我一般会在网关上配置两类改写规则第一类是静态模板注入。把系统级指令、知识库引用格式要求、回答风格约束这类相对固定的内容放在网关层模板里业务侧只需要提交用户问题和检索结果。这样业务代码里再也不需要维护一份又臭又长的Prompt模板。第二类是动态字段映射。RAG检索服务返回的文档片段通常包含标题、正文、来源、得分这些字段。很多模型对上下文的格式有要求比如要求用doc_start和doc_end包裹每个文档或者要求按相关度降序排列。这些格式转换逻辑放在网关里做用规则编排而不是写死代码调整起来非常灵活。我个人的建议是不要把“Prompt优化”这种玄学工程全都压在网关上网关最适合做的是“结构化的、确定的”改写那些需要根据模型回复动态调整策略的Agentic RAG逻辑仍然应该放在业务编排层面。网关负责“把药片包好”业务层负责“决定吃什么药”——这样分工排查问题时会清晰很多。2.3 缓存、限流与重试RAG高并发场景的保命设计RAG线上跑起来之后最容易炸的不是模型而是没有治理的接入层。三个问题最典型第一个是重复请求的浪费。知识库问答场景里高频问题往往集中在少数热点Query上。同一个问题带同样的上下文问十次模型就得算十次账单和延迟都受不了。MAI Gateway支持基于请求内容哈希的语义缓存RAG场景下可以用“用户问题检索结果摘要”作为缓存Key的前缀。这样完全相同的问答组合能直接命中缓存秒回且零成本。实测下来知识库类场景的缓存命中率能做到15%到30%看起来数字不大但对高峰时段削峰填谷帮助极大。第二个是限流与熔断。商用模型API是按并发和Token计费的RAG请求Token消耗高并发一大就容易被限流。网关层要给每条路由设置三层防护Token速率限制、请求并发限制、供应商熔断阈值。熔断一定要做别等到供应商接口持续报错才切换连续10次超时或5次5xx就应该自动把流量切到备用Provider。第三个是重试策略。RAG请求上下文大超时和网络抖动比普通对话更频繁。重试不能无脑重发尤其是POST请求要防止重复计费和重复写入。我习惯在网关上配置幂等请求最多重试3次指数退避从200ms开始非幂等请求只做“连接失败”类重试遇到“请求已受理但响应超时”比如HTTP 202/408则放弃重试转交人工或下游兜底。2.4 可观测性RAG请求全链路TraceRAG项目上线后最难回答的问题永远是“这次回答为什么是错的”。错误可能出在检索召回、排序、上下文截断、模型幻觉任何一个环节。如果没有链路追踪排查全靠猜。MAI Gateway在这里的价值是提供一个统一的请求观测锚点。我把网关设计成所有请求的必经之路它为每一次请求生成唯一的Trace ID并在请求头中透传给下游的检索服务、向量库和模型供应商。日志里记录路由命中了哪个模型域名和延迟分别是多少上下文改写前后的大小Token数量估算是否命中缓存、是否触发重试、是否发生熔断最终的Token消耗和费用估算按供应商单价换算有了这份数据RAG的效果分析就从一个“黑盒”变成了“能定位到具体环节”的可查证过程。我见过不少团队查RAG问题查半天最后发现是检索时TopK忘设了导致上下文里混入无关文档——这种问题如果网关把上下文全文打出来早就能一眼看见。3. 行业落地方案三个真实场景的架构推演3.1 企业内部知识库问答系统这是RAG落地最多的场景。典型需求是企业把制度文档、产品手册、历史项目资料切块入库员工通过对话式搜索获取信息。这个场景的特点是知识内容敏感度高、用户并发一般但峰值明显比如月底月初集中查考勤制度、答案准确性要求高。我推荐的架构是前端应用Web/IM机器人 → MAI Gateway → 统一模型接入Gateway旁边的RAG检索服务私有化部署负责向量检索和重排序检索服务将命中的文档片段原样返回给Gateway网关负责组装Prompt后转交大模型这里有个关键决策为什么不让检索服务直接调模型因为知识库问答需要支持多租户、多知识域的权限隔离不同部门的用户即使检索到同一篇文档能看到的细节也可能不同。这种权限控制和脱敏逻辑放在检索服务里而模型接入的统一管控放在网关里职责分离。出了“越权回答”的问题也能清晰地知道是检索侧没过滤还是网关联动了错误的上下文。配套的安全设计上网关侧要开启请求审计日志记录“哪个用户、在什么时间、向哪个模型、提交了包含哪些文档的请求”这在企业合规审计时是必须的。3.2 客服工单辅助回复客服场景的RAG和知识库问答有个重要区别输入不是单轮Query而是“用户问题 一堆历史上下文 知识库片段 客服当前拟稿”。上下文构成复杂而且业务上往往要求“固定使用某种风格回复”。这个场景里MAI Gateway的上下文改写能力会发挥大作用。我在实际方案里把客服场景的Prompt模板完全托管到网关上模板结构大致是你是客服助手请基于以下知识库片段回复用户。 知识片段区域 {{rag_context}} 用户原话 {{user_message}} 客服已拟回复可优化 {{agent_draft}}业务侧只推结构化字段网关负责套模板。好处有两个第一客服团队调整话术风格时不需要找开发改代码——运营人员在网关管理后台改模板就行第二每次请求都走同样的模板结构模型输出的稳定性明显好于“每个开发自己拼Prompt”。此外客服场景对延迟极其敏感一个回复等15秒用户体验就很差。网关的缓存和模型路由在这里相当于“以成本换体验”高优用户可以路由到响应更快的模型低优用户可以路由到更便宜的模型一套网关规则就能完成这种差异化的服务分级。3.3 研发团队代码文档助手Ollama 简易本地RAG的组合现在很多团队先用本地模型跑RAG验证效果最普及的组合就是Ollama 向量数据库的简易本地知识库。这个组合零基础可复制但典型问题也很明显本地模型硬件资源有限并发一高就卡死没有统一接入层想切换“本地模型 远程API混跑”时改动很大。把MAI Gateway插到这个组合里整个结构会健康很多。我在一个研发内部文档助手里是这样搭的本地Ollama负责Embedding模型比如nomic-embed-text和一个小尺寸生成模型比如qwen2.5:7b远程商用API负责高质量生成MAI Gateway配置两条路由rag-local指向Ollamarag-remote指向商用API默认情况下普通文档检索问答走本地路由遇到复杂代码逻辑问题业务侧根据检索得分阈值决定是否升级到远程路由这种做法相当于给“简易本地RAG”加了一个弹性出口日常低风险问答用本地模型高价值复杂问题自动“求助”强模型。成本可控效果也能保证。我还建议在这个场景里把Gateway的流式响应打开。本地模型推理速度不错流式输出能显著改善等待体验远程API流式回来时网关可以做到边收边转用户感知的“首字延迟”会大大降低。4. 实操把MAI Gateway塞进RAG链路的配置过程4.1 部署方式与选型容器化起步别上来就搞K8sMAI Gateway本身是无状态服务部署非常简单。我个人的建议是验证阶段直接用Docker Compose单机部署一个容器跑网关一个容器跑Redis用于缓存和限流计数连上现有的向量库和Ollama服务最多半小时能跑通。别一上来就上Kubernetes那会把排查问题的复杂度抬升好几个量级RAG本身还没调明白呢。生产环境再考虑多副本部署。网关让流量全部经它转发天然会成为高可用重点所以生产环境至少跑两个副本前面挂负载均衡网关实例之间通过Redis共享限流和技术缓存数据。配置可以挂到配置中心里这样调整路由不用重启服务。这里有一个容易踩的坑网关进程本身对内存的占用没有想象中低。因为要处理大体积的RAG请求上下文请求体和响应体在内存中要做过手上下文特别大的时候比如一次请求带10万字的检索片段网关内存和Go或Java/Golang等运行时的垃圾回收开销会明显增长。建议给网关容器预留比平均值多一倍的内存上限别抠这一点资源。4.2 核心配置示例路由规则、模型供应商、重试策略下面这份配置是我在RAG项目里常用的一份简化示例逻辑非常清晰你可以直接抄作业。# MAI Gateway 示例配置YAML风格 gateway: port: 8080 redis: addr: redis:6379 prefix: mai-gw providers: - name: qwen-plus type: openai-compatible base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 api_key_env: DASHSCOPE_API_KEY models: [qwen-plus] timeout: 30s qps_limit: 50 - name: local-ollama type: openai-compatible base_url: http://ollama:11434/v1 api_key_env: DUMMY_KEY models: [qwen2.5:7b] timeout: 60s qps_limit: 20 routes: - name: rag-default match: prefix(/v1/chat/completions) strategy: type: priority providers: - qwen-plus - local-ollama prompt_template: | 你是企业知识库助手。请严格依据下方资料回答。 {{#each rag_context}} doc_start 来源{{this.title}} {{this.content}} doc_end {{/each}} 用户问题{{user_message}} cache: enabled: true ttl: 600s retry: attempts: 3 backoff_ms: 200 fallback: local-ollama几个值得展开的要点Provider类型MAI Gateway能兼容OpenAI风格接口所以Ollama、vLLM、大多数商业API都可以通过这种统一格式接入。你只需要关注它是否提供/v1/chat/completions端点。策略类型priority表示按优先级从高到低选择Provider上一个不可用时自动降级。如果要按请求特征路由比如带某个Header的请求走指定模型用rule类型的策略更合适。Prompt模板我用的是类似Mustache的模板语法处理RAG上下文列表。这个模板里的rag_context是数组模板引擎会自动遍历渲染。这样做的好处是检索返回多条文档时Prompt生成是自动化的不会出现“文档忘了拼进去”这种低级错误。缓存策略ttl设为600秒对于企业内部知识库这类“知识变化慢”的场景是合理的。但如果知识库内容频繁更新记得把计划任务挂上及时清理缓存。4.3 与RAG检索服务对接LangChain4j和Spring AI场景的接入方式如果你用Java生态做RAGLangChain4j和Spring AI是绕不开的两个框架。它们都内置了“与OpenAI兼容接口对话”的能力所以接入MAI Gateway非常顺滑——只需要把框架里的模型Endpoint配到网关地址上就行。以Spring AI为例配置大概是spring: ai: openai: base-url: http://mai-gateway:8080/v1 api-key: dummy-key chat: options: model: rag-default这里有两个细节容易踩坑模型名参数需要和路由名对应。我习惯在网关上配置modelrag-default这种虚拟模型名而不是具体的qwen-plus或local-ollama。请求到网关上后网关才根据路由规则决定实际转发给哪个物理模型。这样业务代码里的模型名永远不会因为供应商切换而改动。ApiKey可以随便填。网关作为统一入口鉴权逻辑在网关层做业务侧拿到的Key只是识别调用方的凭证。真正供应商的Key保存在环境变量里永远不会下发到业务侧。LangChain4j的接入同理把OpenAiChatModel.builder().baseUrl(http://mai-gateway:8080/v1).apiKey(dummy).modelName(rag-default).build()这样配置就行。整体上迁移代码改动量非常小但运维管理上会舒服一个量级。4.4 性能压测与参数调整几个真实数据参考接入网关后做一次压测是非常必要的。我拿一个企业内部知识库项目做了简单压测配置是网关容器4核8GOllama跑在另一台6核GPU机器上商用API走公网。测试工具是k6模拟50并发每个请求携带约3000Token的检索上下文。结果大致如下指标直接调用模型无网关经MAI Gateway平均首字延迟1.8s2.1sP95响应时间6.5s6.9s请求失败率因限流12%0%高峰期模型调用量100%72%缓存降级看到没网关本身会增加大概10%到15%的转发延迟但换来的是限流归零、高峰期调用量下降接近三成。这个交换非常划算。如果压测发现P95延迟恶化明显优先检查三个点网关日志里有没有排队等待、Redis缓存读写是否成为瓶颈、请求体序列化是否耗费过多时间。一般把网关的并发连接数调大、启用HTTP Keep-Alive复用上游连接就能改善很多。我对参数调整的一条经验法则是网关的超时设置必须短于业务侧超时。比如业务侧HTTP客户端超时60秒网关到上游模型就设40秒网关内重试耗尽后立刻返回错误避免出现“业务侧等了60秒网关还在重试阻塞”的连锁超时。5. 常见问题与排查技巧实录5.1 检索结果没问题回答却一塌糊涂先查Prompt组装层排查RAG问答质量差的问题时绝大多数人的第一反应是“检索召回不行”但实际有相当比例是生成接入段的问题。判断方法很简单在网关上开启请求日志把最终发给模型的完整Prompt打出来人肉看一眼。太多次排查最终发现的问题是文档片段顺序乱了相关度最高的没排在最前面模型被不相关内容带偏多个文档之间没有分隔标识模型把两段不相干的内容糅合成一段“缝合怪”上下文总量超过了模型的上下文窗口后端静默截断最后只剩一半资料解决方案也很直接在网关的Prompt模板里强制用doc_start/doc_end之类的标记分隔文档关掉“超长静默截断”改为请求前主动检查Token数量超长时要么截断到允许范围内并记录日志要么走“分片多次检索”收敛上下文的策略。这些措施在网关层配置即可生效不用动业务代码。另外很多人会忽略一个细节用户问题本身放在上下文的哪个位置会显著影响模型注意力。我把用户问题放在文档片段之后、并加一行“用户问题”前缀回答质量通常比放在最前面稳定。这背后是模型对“最后一段指令性内容”更敏感跟人读题时更注意最后要求是一样的道理。5.2 网关超时与流式中断不要把重试做成“重复请求”RAG请求上下文大模型生成时间普遍偏长流式响应比一次性返回更常用。但流式连接一旦中断网关的重试逻辑会变得很烫手。因为流式Side已经返回了一部分内容重试可能导致用户看到两段拼接的回答或者计费两次。我摸索出来的规则是流式响应中途断开不要自动重试。最多在断点处追加一个“回复生成被中断请重新提问”的提示让用户自主选择。如果必须重试则要确保业务侧通过网关返回的请求ID做幂等控制重复请求必须带同一个请求体幂等键网关层看到相同幂等键后直接返回第一次的缓存结果或缓存最后返回的文本片段。网关到上游模型之间用HTTP/1.1 Keep-Alive保持长连接避免每个流式请求都重新握手实测能减少大量“首字延迟”和“连接中断”类问题。顺带说一句国内网络环境下访问部分海外模型厂商的API时长连接被中间节点断掉很常见——但这里不展开网络层面的技术手段我建议企业尽量选择合规可用的国内模型服务或者在私有化网络内自建模型服务。稳定压倒一切。5.3 多模型切换后出现语义漂移RAG系统用了多个模型之后会突然出现一个奇怪的现象同一个问题、同样的检索上下文昨天回答还正常今天换了个模型回答风格和内容都变了。这不是幻觉这就是“模型语义漂移”。我踩过一次很深的坑某路由的主力模型临时故障自动降级到了本地小参数模型结果小模型把“华东区营收下滑”理解成了“全国下滑”把用户吓得不轻。从那之后我在网关里加了**“模型切换感知”**每当路由发生降级网关都会在响应头里附加一个X-Model-Used字段告诉上游业务方“这次实际用的是什么模型”。业务侧看到字段值和默认不同时可以选择给用户展示一个提示“当前使用备用模型回答仅供参考”或者对高价值问题直接拒绝回答。另外如果你在网关启用了Prompt模板要特别注意不同的模型对不同Prompt模板的敏感度不同。同样一个模板模型A觉得清晰模型B可能觉得啰嗦。我的经验是把Prompt模板做成Provider级别的每个Provider对应一份模板虽然管理麻烦点但效果比全局一个模板硬套要稳得多。5.4 缓存命中率上不去的真相有段时间我看网关缓存命中率一直很低明明有很多重复问题。后来查日志才发现问题出在缓存Key上——用户问题里带了大量无意义的噪音词比如“你好”“请问”“在线等”导致语义相同但字面不同的请求无法命中缓存。这也解释了为什么我不建议直接用原始Query做缓存Key。更实用的做法是在网关转发上下文改写环节先对用户问题做轻量归一化处理——去除首尾问候语、统一中英文标点、将同义改写映射到标准表达。这个动作不需要额外的NLP服务写几条例外规则就能覆盖大多数高频场景。还有一个更优的方案如果RAG检索服务支持语义向量召回网关可以直接把“检索结果的文档ID列表得分哈希值”作为缓存Key的一部分。只要检索结果没变即使用户问题措辞不同也能在命中大量语义相同请求的同时保证缓存内容与当前检索结果一致。这个方案要求网关和检索服务配合但收益非常可观实测命中率能提升一倍以上。6. 关于MAI Gateway落地我的几点体会与后续扩展说句实话我一开始对AI网关这个“中间层”也抱过怀疑态度——RAG链路本身环节就够多了再塞一层网关不是增加复杂度吗但跑了几个真实项目之后我的看法彻底变了。RAG真正上线之后瓶颈几乎从不“模型不够聪明”而是“接入层不够稳”。你辛辛苦苦把召回率从80%调到85%一个限流就能让整体可用性跌到60%以下。网关解决的不是“聪明”问题而是“稳定”问题这两者优先级谁高做过生产系统的都懂。如果现在让我给团队一个最小落地路径我会这么建议先用Docker跑通MAI Gateway把现有RAG的模型调用全部切到网关路由上第二步把Prompt模板和缓存开起来观察两周的日志和命中率第三步再把重试、熔断、多Provider切换配上接上监控告警。这三步做完RAG系统的折腾成本会明显降下来。后面我还打算继续扩展的方向有两个一是把Agentic RAG的请求也纳入网关治理——Agent场景下模型会多次调用工具、多次询问用户每一步都是不同的Prompt上下文网关如果能给整段Agent会话分配统一的Trace ID做全链路分析会清晰得多二是尝试把网关的语义缓存升级成向量缓存让相似问答直接复用答案进一步压低模型调用成本。RAG这条路走到后面真正拼的不是某个模型有多强而是整条链路的“工程成熟度”。把网关这一层重视起来你会在很多个深夜排查问题时感谢当时多做了一步。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →