
前些日子帮一个团队看他们的RAG知识库项目功能已经跑通了向量库也建了prompt也调了但一上生产就各种别扭几个业务方共用一个模型账号调账单对不上换大模型供应商时所有服务的SDK都要跟着改知识库更新后重建embedding把外部API和本地模型一起跑延迟忽高忽低出了问题时根本说不清是哪一环慢了。后来我们做了一次架构调整在RAG链条前面引入了一层AI网关整套系统一下就顺了。这里说的AI网关用了一个叫MAI Gateway的方案核心思路就是让所有模型调用、检索调用、重排序调用都走统一的出口对外暴露标准接口对内做路由、缓存、限流、可观测。这篇文章就把这套行业落地方案掰开讲清楚包括为什么RAG需要网关、网关放在哪一环、配置怎么拆、混合检索怎么提命中率、上生产之后怎么治理。对正在做RAG知识库、AgentRAG或者想把现有RAG项目工程化的人应该都能用得上。1. 为什么RAG系统需要一个AI网关先说说团队踩过的坑很多人的第一反应是RAG的核心在检索和生成跟网关有什么关系网关不就是个API转发器吗这个想法我一开始也有直到被现实教育了。1.1 真正让RAG团队头疼的不是检索是“模型出口”失控一个典型的RAG服务链路大概是用户提问 → 生成Query → 检索向量库 → 拿到TopK文档 → 拼Prompt → 调大模型生成答案。表面上看大模型调用只是最后一步但实际做项目时这一步的失控点非常多团队可能同时用了云端大模型和本地部署的开源模型两套接口、两套鉴权、两套计费规则代码里全是if-else。为了让答案更准RAG经常要做多路检索、多次重排每次重排也要调模型接口风格各不相同。一个模型服务想升级版本或者换供应商所有下游业务方都跟着改代码改一次崩一次。业务方多的时候账号混用某个团队跑个压测脚本把额度打满其他团队的线上问答直接被限流影响。出了问题想排查日志散落在各个服务里谁调的模型、用了多少token、哪个模型慢完全没法回答。这些问题其实都指向同一个核心概念模型出口需要统一治理。而AI网关本质上是给“模型调用”这个动作加了一个统一的入口和出口。1.2 RAG链条上的三个“默认动作”网关全都参与如果我们把RAG拆成三个阶段看网关其实不是局外人而是每个阶段都绕不开的基础设施阶段一召回前——需要调Embedding模型把问题和文档向量化。Embedding模型的选择、版本、供应商是RAG准确率的隐性决定因素。阶段二召回中——可能涉及向量检索、全文检索、各种检索器的服务间调用虽然这部分往往不走模型网关但网关可以承担检索器的统一暴露和结果聚合。阶段三生成前——需要把检索结果拼成Prompt调大模型。这里涉及模型选择、上下文长度控制、流式输出、超时处理全是网关的活。所以我的结论是网关不但和RAG相关而且是RAG从demo走向生产的关键一层。它不是替代检索而是给检索和生成之间的一切模型交互提供可控性。1.3 MAI Gateway在RAG方案里的定位我们在实际落地时选用的MAI Gateway定位是一个轻量的AI网关核心能力包括统一模型接入兼容常见的模型API格式内部可配置多个供应商和多个模型对外只暴露一套接口。模型路由与降级根据规则把请求分到不同模型某些模型不可用时自动降级。嵌入与重排序模型管理把embedding、rerank也当作“模型资源”统一管理。限流、配额、缓存、可观测面向多业务方共用场景的治理能力。用一句话概括MAI Gateway不负责理解你的业务它负责让你的RAG系统在模型调用层面“有条理”。这对后续做混合检索、多租户、精细化成本分摊都很有帮助。2. MAI Gateway与RAG的接入模型入口、出口和中间件先把架构位置理清楚后面配置才不懵。2.1 建议采用“模型出口”式的接入拓扑在RAG项目里我不太建议把网关放在外网入口直接代替业务网关那会让网关承担太多职责边界变模糊。比较稳的做法是把它作为“模型出口网关”放置在RAG业务服务和各类模型、检索服务之间。业务前端/内部系统 ↓ RAG业务服务负责Query改写、Prompt组装、文档处理 ↓ MAI Gateway统一模型出口 ↓ 多个上游云端大模型 / 本地模型 / Embedding服务 / Rerank服务 / 向量库相关服务在这个拓扑里RAG业务服务该干多少活还是干多少活但任何模型调用都不再直连上游而是打到MAI Gateway。好处是上游模型如何切换对RAG服务透明RAG服务只认网关注册的“模型名”。对模型供应商的限流、重试、熔断统一在网关侧完成。日志里能完整记录“服务A在上午10点请求了模型X耗时多少token多少被谁限制过”事后复盘很容易。2.2 标准化接口层OpenAI兼容是简化一切的关键现在的模型API格式五花八门。为了不让RAG业务服务和上游模型耦合MAI Gateway对外应该只暴露一套标准格式比如Chat Completions的请求/响应结构。网关内部再完成格式转换。实际落地时业务服务只需要维护一份简单的HTTP客户端指向MAI Gateway的地址就行。上游模型今天用这个明天用那个对业务方来说只是网关配置里的一个转发目标变化。这里要特别注意一个细节格式转换不只是请求体响应体也要转换。尤其是本地部署的开源模型很多返回格式和标准接口不完全一致。网关在做转换时最好对流式输出和非流式输出分别测试避免字段遗漏。2.3 网关不只是LLM转发Embedding和Rerank也要统一暴露做RAG的人容易把网关等同于“大模型网关”忽略了Embedding和Rerank。实际上这两类模型调用也很适合纳管Embedding不同供应商的向量维度不同如果以后想换Embedding模型存量向量需要重建这是个大事。通过网关把Embedding模型名规范化至少在调用层留了缓冲。Rerank很多场景会用专门的Rerank模型做精排这类模型往往独立部署接口也各有各的习惯。在网关上把它们统一封装RAG服务就不用写一堆适配代码。MAI Gateway里可以把这些模型都当成普通上游来注册然后通过不同的API路径暴露。对RAG服务来说调用方式和调用大模型没有本质区别都是发一个请求拿到一个结果只是模型名不同而已。3. 落地实践检索增强链上网关配置拆解理论讲再多不如把配置过程走一遍。下面是我们当时落地MAI Gateway的一套关键配置按核心链路拆成四块。3.1 先回答一个问题网关要不要参与检索这是很多团队纠结的点。我的建议是初版别让网关直接参与检索服务的调用逻辑而是让它负责检索工具的“模型侧调用”。简单说向量库查询、关键词检索这些数据服务接口不需要经过网关它们本来就跑在内网直接调用没问题。但“把文本转成向量去查”的Embedding调用、“把召回结果重新排序”的Rerank调用这些属于模型调用必须经过MAI Gateway。这样做的理由很直接如果网关连向量库都代理每次检索都要多一跳延迟和排障复杂度都上去了收益却不大。模型调用纳管后RAG服务反而更轻——它不需要知道Embedding模型部署在哪只需要调网关就行。3.2 配置上游模型别硬编码密钥用环境变量注入MAI Gateway的模型接入通常在配置文件里定义上游和路由。我的习惯是上游定义里只写endpoint和模型标识密钥用环境变量引用不落到代码仓库。给每个上游设置独立的超时时间因为云端模型和本地模型的响应速度差异很大。把“模型名”和“上游模型名”做一层映射业务方请求gpt-4o网关内部可能已经转发到了某个更便宜的兼容模型业务方无感知。配置示意upstreams: - name: cloud-llm type: openai-compatible endpoint: https://api.example.com/v1 api_key_env: CLOUD_LLM_KEY timeout: 60s - name: local-llm type: openai-compatible endpoint: http://localhost:11434/v1 api_key_env: timeout: 120s models: - name: chat-default upstream: cloud-llm upstream_model: gpt-4o-mini - name: chat-long-context upstream: cloud-llm upstream_model: gpt-4o-128k - name: chat-local upstream: local-llm upstream_model: llama3.1-8b这样配置后RAG服务里不管哪个环节要生成回答都只调chat-default或chat-long-context这类逻辑名。想切换模型时改的是网关配置文件不是业务代码。3.3 Embedding和Rerank在网关上如何暴露Embedding模型可以单独注册成一个上游再对外暴露一个统一路径。models: - name: embed-default upstream: cloud-llm upstream_model: text-embedding-3-small - name: rerank-default upstream: local-llm upstream_model: bge-reranker-v2-m3RAG服务在做文档入库时可以走网关的embedding接口得到的向量维度以网关返回为准。如果以后想换Embedding模型至少代码层的改动可控只需要考虑向量重建策略。Rerank接口也建议封装成标准请求格式接收query、候选文档列表、top_n返回排序后的结果。MAI Gateway内部去调实际的Rerank模型并把返回结果整理成统一结构。这个动作对RAG命中率的影响非常大后面会细说。3.4 流式与缓存RAG网关的隐藏工作RAG场景里用户希望答案像聊天一样一个字一个字蹦出来所以流式响应几乎是标配。网关做流式转发时有几个容易踩的坑超时设置要偏宽松流式接口往往是一次连接长连接和普通短请求的超时策略完全不同。网关不能缓存流式响应但可以缓存“非流式请求”的结果。对RAG场景来说如果两个用户问的问题完全相同知识库检索结果也一样那么第二次请求可以直接命中网关缓存省一大笔模型调用费。缓存命中后如果还走流式要注意把缓存内容按流式格式重新包装不能直接吐纯文本。建议把“缓存开关”设计成可配置并给不同请求打上不同标签。比如带Cache-Control: no-cache的请求不走缓存适合对时效性要求高的场景普通问答类请求开启缓存收益明显。4. 混合检索与RAG命中率网关层能做哪些提升做RAG的都知道检索质量直接决定最终回答质量。现在很多人都在聊Agentic RAG、GraphRAG、Ontology RAG背后都是同一个诉求提高命中率减少知识割裂。而网关在这种新的RAG架构下又能做什么4.1 命中率问题的本质只用向量检索不够很多RAG项目的“问答不准”不是大模型不行而是召回的TopK文档里根本没有答案。向量检索擅长语义相似但不擅长精确关键词匹配比如型号、编号、人名、特殊术语。这时候需要混合检索向量召回 关键词召回BM25或全文检索一起上再把结果合并。混合检索落到实践里等于RAG服务要同时调多个检索引擎。如果这些检索器都有各自的协议RAG服务代码会越写越脏。通过MAI Gateway可以把每个检索器也注册成“工具模型”统一成一种调用方式。4.2 多路召回在网关层的实现思路我们不一定要把检索器的数据查询逻辑放进网关但可以把“多路召回的对外接口”放在网关上。举个例子MAI Gateway对外提供一个retrieve接口接收query和top_k网关内部依次调用向量检索服务、关键词检索服务或者并行调用然后把两路结果按分数加权合并返回给RAG服务。query → MAI Gateway /retrieve ├→ 向量检索服务 ├→ BM25检索服务 └→ 结果合并 → 返回top_k候选集这样RAG服务完全不知道底层有几路检索它只负责把候选集拿去做后续处理。以后想加第三路GraphRAG检索也只需要在网关里加一个上游不用动业务代码。4.3 Rerank重排序网关最适合承载的位置多路召回后的候选集可能有一两百条但最终拼进Prompt的一般只有5~10条。直接按召回分数截断并不合理因为不同检索器的分数尺度不同最好的办法是先粗召回再用Rerank模型精排。Rerank模型的特点是计算成本比Embedding高但只对候选集排序不会全文向量化。把Rerank放在网关有天然优势RAG服务不需要知道Rerank模型部署在哪里只需把query和候选文档传到网关接口。网关可以控制并发保证同一时刻不会打爆Rerank服务。网关日志能记录每次Rerank的耗时和结果变化方便后续调参。我们实际的做法是先召回Top50网关调Rerank模型精排后返回Top5或Top8。命中率比纯向量召回有非常明显的提升。如果你的RAG项目现在还在“向量召回直接拼Prompt”强烈建议加这一步。4.4 用日志和Trace验证命中率变化提到命中率就离不开度量。MAI Gateway的日志是天然的数据源建议在网关层记录这些字段会话和请求ID关联RAG业务侧的业务追踪ID。Query原文、召回的文档ID列表、Rerank后的文档ID列表。用户是否采纳了回答或用户是否继续追问这能反推检索质量。模型名、token数、耗时、缓存是否命中。有了这些数据就能做hit rate分析。比如统计一批问题里答案命中的文档是否出现在Rerank后的Top5里。如果很多问题的答案文档排在Top10之外说明召回阶段需要改进如果答案文档在Top5里但生成效果还是差那问题可能在Prompt侧。以前这种分析全靠拍脑袋现在至少有了数据支撑。5. 从单点验证到生产MAI Gateway的治理与可观测性单点验证阶段网关跑通流程就行了。但到了生产环境网关的价值主要体现在治理能力上。5.1 限流、熔断与降级多个业务方共用时必备RAG系统往往不止一个业务场景在用有的做智能客服有的做内部知识问答有的做文档总结。这些场景的调用频率、优先级、预算都不一样。MAI Gateway可以按API Key、请求路径、模型名分别配置限流策略。比如客服场景每秒最多20个并发内部问答场景每秒最多50个并发。模型上游如果频繁超时或返回5xx网关要能自动熔断把这个上游的流量切到备用模型。降级策略也要提前想好当云端大模型不可用时是否降级到本地模型当高精度Rerank不可用时是否直接按召回分数排序当Embedding服务抖动时是否允许使用缓存向量这些都是生产事故发生时能救命的设计建议在配置阶段就写好别等线上出了问题再临时改。5.2 成本分摊与配额解决“模型账单算不清”的难题RAG项目跑起来之后token消耗是实打实的钱。如果多个业务方共用一个模型出口成本分摊必须要做。MAI Gateway可以在请求带上业务标签比如projectcustomer-service网关在日志里记录每个标签的token数、调用次数按天汇总。成本治理的另一个手段是配额限制。给每个业务方设置月度token预算超出后自动降级到便宜模型或者拒绝调用。RAG场景尤其需要这种机制因为知识库更新时批量Embedding调用很贵如果不设配额一次批量任务可能把整月预算烧掉。5.3 生产排障事件复盘超时、截断和SSE噪声上线一段时间后我们处理过几次典型的网关相关问题这里列一下排查思路希望对你有用。现象一回答到一半突然断了。先看是不是网关侧响应超时。大模型生成时间本来就长如果网关超时设得太短流式连接会被网关主动断开。解决方式是把流式场景的超时设置单独调大并为长文本生成配置单独的路由规则。现象二缓存没生效调用量还是很大。检查一下请求头。很多HTTP客户端默认会带一些随机参数比如时间戳导致网关的缓存键每次都不一样。建议在网关侧配置缓存键提取规则只取URL路径、关键请求体字段、业务标签别整包做哈希。现象三本地模型和云端模型的输出格式混用下游解析报错。排查后发现网关在做格式转换时把上游的finish_reason字段映射错了。这个问题的根因是不同上游的标准字段含义不完全一致。建议在网关测试阶段就列一个字段映射表把常见字段逐一核对。5.4 MAI Gateway在RAG生产中的配置参考配置项推荐值说明非流式请求超时60s生成型任务要给足时间流式请求超时300s流式连接建议放宽缓存TTL3600sRAG问答类请求适合短时缓存单模型并发上限按上游模型能力配置保护上游服务熔断阈值连续失败5次或错误率50%和上游健康检查配合使用这只是我们项目的经验值不同团队可以按需调整。核心是不要照搬要理解每个参数背后的目的。6. 可直接复制的配置清单我的推荐配置与避坑经验最后给出一份比较稳的落地配置思路可以直接当模板用。6.1 网关接入RAG的最小配置流程先整理出当前RAG系统里所有模型调用点Embedding、Rerank、大模型生成。把每个调用点改成指向MAI Gateway的地址对外统一用逻辑模型名。在网关配置文件里注册上游云端模型、本地模型、Embedding服务、Rerank服务。配置好路由规则、限流策略、超时时间。接入追踪日志至少把请求ID、模型名、耗时、token数记下来。先跑知识库重建任务验证Embedding链路再跑在线问答验证生成链路。6.2 一个参考级的完整配置示例server: port: 8080 cache: enabled: true ttl: 3600 upstreams: - name: cloud-llm type: openai-compatible endpoint: https://api.example.com/v1 api_key_env: CLOUD_LLM_KEY timeout: 60s - name: local-llm type: openai-compatible endpoint: http://localhost:11434/v1 timeout: 120s - name: embed-service type: openai-compatible endpoint: http://embed.internal:8000/v1 timeout: 30s - name: rerank-service type: custom-http endpoint: http://rerank.internal:8000/v1/rerank timeout: 20s models: - name: chat-main upstream: cloud-llm upstream_model: gpt-4o-mini fallback: chat-local - name: chat-local upstream: local-llm upstream_model: llama3.1-8b - name: embed-main upstream: embed-service upstream_model: bge-m3 - name: rerank-main upstream: rerank-service upstream_model: bge-reranker-v2-m3 routes: - path: /v1/chat/completions model: chat-main - path: /v1/embeddings model: embed-main - path: /v1/rerank model: rerank-main rate_limit: projectA: chat-main: 10qps embed-main: 20qps rerank-main: 10qps这个示例里加了几个关键点fallback字段主模型故障时自动切本地模型。embed-main和rerank-main独立路径专门给RAG服务用。rate_limit按项目分防止互相挤兑。6.3 三个让我印象最深的坑第一个坑网关层做太多协议转换。一开始我们希望网管把所有上游都转成同一种格式结果遇到各种自定义字段越转越复杂。后来想通了所有上游尽量用OpenAI兼容协议对实在不兼容的服务只做“最小适配”不为追求对齐所有字段而牺牲稳定性。第二个坑缓存键设计不合理。RAG场景里一个请求的完整内容通常包括system prompt、检索到的文档、用户问题。如果缓存键只取用户问题两个用户问一样的问题但附带的检索文档不同可能会命中错误缓存。建议把缓存键设计成包含文档ID列表的指纹。第三个坑忽略Embedding批量调用的限流。知识库重建时批量Embedding会瞬间涌到网关。如果不提前设好并发控制上游Embedding服务很容易被打挂。现在每次重建知识库前我都会专门检查一下embed-main的限流参数再考虑分批提交。最后说点实际的体会把MAI Gateway接到RAG链路里是我最近半年做过的性价比最高的一次架构调整。它没有改变检索算法的本质却让整个系统的模型调用层变得可治理、可观测、可调配。以前调模型是各搞各的现在是统一出口换模型、查问题、算成本都变成了一件很省事的事。如果你现在还在用“RAG服务直连大模型SDK”的方式来搭项目建议尽早把网关层加进去哪怕先用最简配置。RAG项目一旦进入多知识库、多业务方、多模型的阶段再回头补网关的改造成本会高很多。如果只让我给你一条建议那就是模型出口统一治理这件事越早做越好。