生产级 RAG 系统架构

从 Demo 到 Production:可靠性、可扩展性、可观测性与成本控制

27 min read Part of RAG · Ch. 12
← 上一层级:学习路径 · Part 02 · RAG 体系化进阶

生产级 RAG 系统架构

flowchart LR
  A["生产级 RAG 系统架构"]
  A --> B["分类:检索增强 (RAG)"]
  A --> C["关键词:RAG"]
  A --> D["关键词:Production"]
  A --> E["关键词:Architecture"]
  A --> F["关键词:Monitoring"]

做一个能跑的 RAG 并不难:几份文档、一个向量库、一个 prompt,通常半天之内就能拼出一个原型。难的是把它变成一个真正可上线、可维护、可迭代、可审计的系统。

一旦进入真实业务环境,问题会立刻变得具体:文档会持续变化,解析会出错,索引会落后,权限会穿透,检索会抖动,模型会超时,成本会失控,用户还会用一次失败记住你很久。所谓“生产级 RAG”,本质上不是把 Demo 放大,而是把 RAG 当成一个长期运行的在线系统来设计:它要面对脏数据、不稳定依赖、业务高峰、组织权限、错误归因和成本约束。

这篇文章讨论的,不是“怎么把 RAG 跑起来”,而是“怎么让 RAG 在真实环境里长期活着,并且越跑越稳”。

延伸阅读

Demo RAG 和 Production RAG,差的不是规模,而是系统假设

维度Demo RAGProduction RAG
数据量几十到几百文档百万级文档、持续增长
数据更新手动、偶尔增量、持续、可回滚
并发单用户、低频多租户、突发流量、稳定 SLA
检索链路单路径、理想输入多阶段、带失败和降级
质量判断主观感觉“还行”有评测集、有指标、有回归检测
运维方式看日志排错指标、追踪、告警、审计
成本观念暂不关心每次查询、每个租户、每条链路都要算账

Demo 的默认前提通常是: 数据是干净的、文档格式是友好的、索引是最新的、权限是简单的、问题是单轮的、模型是稳定的、成本可以忽略。

而生产环境的默认前提恰好相反: 数据一定不干净,索引一定会有延迟,权限一定会复杂,模型一定会抖动,用户一定会问出系统没准备好的问题。

所以,Demo 证明的是“这个方向有希望”;Production 证明的是“这个系统在不理想条件下仍然可用”。

先看定义:Demo 关注能力上限,Production 关注失败时的下限。

先明确:生产级 RAG 不是一个模型问题,而是一个系统问题

很多团队一开始会把问题理解成“该换哪个模型”“该用哪个向量库”“top-k 设多少”。这些当然重要,但它们通常不是最先决定系统成败的因素。

生产级 RAG 更像下面几个子系统的组合:

  1. 数据系统:文档如何接入、清洗、切分、去重、版本化、回滚。
  2. 检索系统:召回、过滤、rerank、混合检索、权限约束、缓存。
  3. 生成系统:上下文装配、提示词策略、答案约束、引用归因、拒答策略。
  4. 控制系统:超时、重试、熔断、降级、限流、预算控制。
  5. 观测系统:日志、追踪、指标、评测、反馈闭环。
  6. 治理系统:权限、安全、审计、合规、租户隔离。

如果把注意力只放在“回答看起来准不准”,很容易忽略真正导致线上事故的原因:索引漏更新、文档解析错位、ACL 过滤漏掉、缓存污染、多租户串数据、异常流量压垮 rerank 服务、或者某个成本热点在月底把预算打穿。

生产级 RAG 的核心目标

从工程视角看,生产级 RAG 通常要同时满足五个目标:

1. 结果可用

不是每次都完美,而是在多数真实输入下都能给出足够稳定、足够可解释的结果。 “可用”比“偶尔惊艳”更重要。

2. 延迟可控

用户不关心你的链路有多复杂,只关心响应是否够快。 很多 RAG 系统不是答错,而是答得太慢,慢到业务上等于不可用。

3. 成本可控

RAG 的成本不只在生成,还在解析、Embedding、索引、重排、缓存穿透和重复查询。 如果没有成本视角,系统越受欢迎,亏得越快。

4. 风险可控

包括错误答案、过期知识、权限泄露、文档投毒、Prompt 注入、审计缺失。 这些问题在 Demo 里很少出现,在生产里迟早出现。

5. 演进可控

你需要能替换 Embedding、调整 Chunking、接入 rerank、加混合检索、改 prompt,而不必每次都推倒重来。 系统不是一次设计完成的,而是在真实问题里迭代成熟的。

一个更接近现实的生产级 RAG 分层架构

可以把它粗略理解为五层:

数据源层
  └── CMS / Wiki / 工单 / PDF / 网页 / DB / 对象存储 / 第三方 API

摄入与索引层
  └── 拉取/订阅 -> 解析 -> 清洗 -> 切分 -> 去重 -> 权限标注 -> Embedding -> 建索引

在线检索层
  └── Query 预处理 -> 意图判断 -> 混合检索 -> ACL 过滤 -> Rerank -> 上下文组装

生成与控制层
  └── Prompt 模板 -> LLM 生成 -> 引用附着 -> 置信度/拒答策略 -> 超时/降级/重试

观测与治理层
  └── 日志 / Tracing / Metrics / Eval / 告警 / 审计 / 成本分账

这个分层的价值,不在于“画图更完整”,而在于它强迫你承认: RAG 的错误不只会出现在“模型最后说错了”这一层,很多错误早在文档解析、切分、索引和过滤阶段就已经埋下了。

数据流水线:大多数 RAG 问题,其实是数据工程问题

很多团队在做 RAG 时,把最多精力花在 prompt 和模型选择上,结果上线后发现最麻烦的是文档摄入:格式不统一、扫描 PDF 提取错乱、表格丢结构、HTML 噪声太多、相同内容重复入库、旧版本没删除、新版本没生效。

这并不意外。 RAG 的上限受模型能力限制,但下限主要由数据流水线决定。

文档摄入,不只是“把文件传进来”

环节要点
接入方式API、Webhook、对象存储监听、定时拉取、消息订阅
格式支持PDF、Word、HTML、Markdown、图片、邮件、工单、数据库记录
解析策略结构保真优先,不要只追求“能抽出纯文本”
元数据补充来源、作者、更新时间、文档类型、租户、权限、业务域
去重机制同一内容不同路径、不同版本重复上传、镜像站重复抓取
权限建模文档级、段落级、租户级 ACL;默认拒绝,显式放行
异常处理解析失败、格式不支持、空内容、乱码、结构丢失要可追踪

一个常见误区是:把文档解析理解成 OCR 或文本提取问题。 实际上,生产环境更关心的是“结构是否保住了”。

例如:

  • FAQ 页面中的标题层级决定了语义边界;
  • 合同中的表格列对齐决定了条款含义;
  • 工单系统里的时间线和评论顺序决定了事件因果;
  • 产品文档中的代码块、注意事项、版本标签比正文段落更关键。

如果解析阶段把这些信息抹平,后面再强的模型也只能在残缺语料上工作。

切分不是越细越好,也不是越大越好

Chunking 是最容易被轻视、也最容易把系统带歪的环节之一。

切得太小:

  • 语义上下文被打散;
  • 检索召回到的是“句子碎片”;
  • rerank 很难判断真正相关性;
  • 生成阶段需要拼接更多 chunk,反而增加噪声。

切得太大:

  • 向量表达变钝;
  • 不同主题混在一起;
  • 上下文窗口被浪费;
  • 一次召回带入太多无关信息,增加幻觉概率。

更现实的做法通常是:

  1. 优先按结构切:标题、段落、列表、表格、代码块,而不是固定字数先行。
  2. 再做长度约束:在结构边界之内控制 chunk 大小。
  3. 保留重叠,但不要迷信重叠:overlap 解决边界断裂,不解决结构错切。
  4. 为 chunk 保留父级信息:章节标题、文档路径、版本号、更新时间。
  5. 面向问答任务设计 chunk,而不是面向存储设计 chunk

一句经验判断: 如果你把召回结果直接给人类看,人类是否能在几秒内判断“这段足不足以回答问题”。如果不能,chunk 设计通常就有问题。

增量更新是常态,全量重建只是手段

全量重建听起来干净,但真实环境里通常不划算:

  • 文档量大时,重建窗口太长;
  • 重建期间索引和源数据可能不一致;
  • Embedding 成本高;
  • 回滚困难;
  • 容易把线上服务拖慢。

所以生产环境更常见的是增量更新 + 周期性校准

策略说明
文档级增量新增、删除、修改按文档粒度处理
Chunk 级增量只重算变化片段,降低 Embedding 和索引成本
双版本索引新旧索引并存,灰度切换,必要时快速回滚
延迟容忍窗口接受“准实时”而不是一味追求实时
一致性校验定期比对源数据版本与索引版本,发现漏同步

这里有个经常被忽略的 trade-off: 实时更新不一定比准实时更好。

如果你的知识库主要是内部文档、产品手册、FAQ,通常分钟级甚至小时级延迟都可以接受。 为了一个业务上并不需要的“实时”,把摄入链路做成高复杂度同步系统,往往不值。

版本管理不是锦上添花,而是事故恢复能力

RAG 的“错误答案”很多时候不是因为检索差,而是因为系统混用了不同版本的数据:

  • 文档已经更新,索引还是旧的;
  • chunk 已经替换,但缓存还指向旧引用;
  • Embedding 模型换了,新旧向量混在一个索引里;
  • 线上 A/B 测试流量写进了同一份结果缓存。

因此,至少要明确几类版本:

  • 源文档版本
  • 解析版本
  • Chunking 版本
  • Embedding 版本
  • 索引版本
  • Prompt / 生成策略版本

只有版本可见,问题才可追。

检索基础设施:线上系统比“召回率高”要求更多

在 Demo 里,检索经常被简化成先看定义: “把 query 向量化,然后去向量库 top-k 搜一下。”

这当然是 RAG 的骨架,但离生产还很远。 因为在线检索真正面对的是三个同时成立的约束:

  1. 要尽量找对
  2. 要足够快
  3. 要符合权限与成本边界

这三个目标经常彼此冲突。

不要把向量检索当成唯一检索

向量检索擅长语义相似,但对某些场景并不是最优:

  • 精确术语、产品型号、错误码、合同编号;
  • 带时间、版本、组织名的查询;
  • 用户明确知道关键词,只是希望系统帮他定位。

因此,生产级系统里很常见的是混合检索

  • 向量检索:解决语义匹配;
  • 关键词 / BM25:解决精确匹配;
  • 元数据过滤:解决范围约束;
  • rerank:解决候选排序。

这比单纯调 top-k 更接近实际效果优化路径。

检索链路通常至少是“两段式”

一个常见的在线路径是:

Query
 -> 预处理(改写/去噪/语言识别/租户识别)
 -> 粗召回(向量/BM25/混合)
 -> 元数据过滤(权限、时间、产品线、文档类型)
 -> Rerank
 -> 上下文去重与压缩
 -> LLM 生成

这条链路的意义在于把“找得全”和“找得准”拆开:

  • 粗召回负责不要漏太多
  • rerank 负责把真正相关的提上来
  • 上下文压缩负责别把噪声也一起塞给模型

很多系统一开始觉得 rerank 太贵,先省掉。 这在小规模语料里未必有问题,但一旦文档库增长、内容变杂、chunk 变多,缺少 rerank 往往会直接体现为:召回结果“看起来都沾边,但放进 prompt 后答非所问”。

ACL 过滤要尽量前置,而不是事后补救

多租户、企业知识库、内部工具场景里,权限不是附属需求,而是架构前提。

最危险的一种做法是:

  1. 先全局召回;
  2. 再在结果里做权限过滤;
  3. 过滤后如果没结果,就从剩余内容里凑几个。

这会产生两个问题:

  • 性能问题:大量无权限数据参与候选生成;
  • 安全问题:日志、缓存、追踪甚至模型上下文里可能已经看过不该看的内容。

更稳妥的原则是:

  • 召回前先确定租户和身份上下文;
  • 召回时把 ACL / tenant filter 纳入检索条件;
  • 日志和 tracing 也要遵守同样的脱敏与隔离策略。

先看定义:权限过滤最好属于检索条件,而不是后处理逻辑。

向量库扩展,不只是“能存更多向量”

向量数据库仍然是生产 RAG 的关键基础设施。Qdrant、Milvus、Weaviate、Pinecone 等都在持续强调面向生产规模的向量检索能力,但它们的取舍点并不相同:有的更偏托管易用性,有的更偏自建控制力,有的更强调混合检索或对象模型,有的更适合与现有基础设施深度整合。(Qdrant)

所以,选择向量库时,真正该问的不是“谁最先进”,而是:

  • 你要托管还是自建?
  • 你是更关心易用性,还是更关心可控性?
  • 数据量增长速度如何?
  • 是否要跨区域、跨租户隔离?
  • 是否需要复杂过滤和混合检索?
  • 是否能接受索引重建窗口?
  • 成本主要来自存储、查询还是运维人力?

可以参考一个更工程化的判断方式:

规模 / 诉求更常见的选择逻辑
早期产品、语料较小、团队偏小优先简单、易运维、快速上线
中等规模、需要更强过滤与扩展优先稳定性、过滤能力、备份与扩容机制
大规模、多租户、强合规、自建基础设施优先可控性、分片、副本、容量规划与治理能力

不要把向量库选择理解成一次性拍板。 更现实的是:前期为了快,中期为了稳,后期为了治理,关注点会逐渐变化。

缓存:不是简单“省钱”,而是控制系统波动

缓存经常被当作性能优化手段,但在生产 RAG 中,它更像是稳定器。

常见缓存层

缓存层作用风险
Query 缓存对重复问题直接复用结果相似但不等价的问题可能误命中
Embedding 缓存相同文本不重复计算向量Embedding 版本切换时要失效
检索结果缓存热门 query 复用候选文档索引更新后可能脏读
最终答案缓存高频 FAQ 直接命中容易掩盖知识过期问题

缓存真正难的部分不在“怎么存”,而在何时失效

例如,某个问题昨天命中的答案是对的,今天知识库更新后就可能已经不该再返回。 如果缓存键只看 query 文本,而不看租户、权限、索引版本、语言、prompt 版本,系统就会出现“看起来偶尔答错”的幽灵问题。

因此,生产环境里缓存键至少要考虑:

  • query 归一化结果
  • 租户 / 用户权限范围
  • 索引版本
  • Embedding / rerank / prompt 版本
  • 语言或区域
  • 是否命中实时数据源

缓存提升的是吞吐,但处理不好会损害正确性。

容错、超时与降级:线上系统一定要先设计失败路径

生产级 RAG 的一个根本变化是: 你必须接受某些调用会失败,而且这种失败不是异常情况,而是常态的一部分。

为什么超时比正确更优先

对很多交互式场景来说,10 秒后返回一个理论上更优的答案,往往不如 2 秒内给出一个有限但可信的答案。

所以你需要明确每一段链路的时间预算:

  • query 改写多久;
  • 检索多久;
  • rerank 多久;
  • LLM 生成多久;
  • 总请求多久必须结束。

一旦没有时间预算,链路就会不断“为了更好再加一步”,最后把响应时间拖垮。

重试要有限,而且要分类型

不是所有失败都该重试:

  • 瞬时网络错误:适合有限重试;
  • 下游超负荷:重试可能雪上加霜;
  • 参数错误 / 解析错误:重试没有意义;
  • 权限拒绝:绝不应重试绕过。

更重要的是,要避免“串联重试风暴”: 上层服务重试 2 次,下层检索重试 2 次,LLM 再重试 2 次,最后一个请求在系统内部放大成很多倍的真实开销。

降级不是失败,而是服务策略

情况常见降级策略
向量库暂时不可用回退到关键词检索或只查结构化 FAQ
rerank 服务超时使用粗召回结果,但减少上下文长度
大模型拥堵或昂贵降级到便宜模型,限制回答范围
无法确认答案依据显式拒答,并给出可追溯来源或建议提问方式
成本超预算限制高成本链路,仅对高价值请求使用

很多团队把“无法回答”视为产品失败,其实并不准确。 在生产环境中,带依据的拒答通常比“编一个不太确定的答案”更可靠。

质量保障:RAG 质量不是一个分数,而是一套观测面

RAG 质量很容易被误判。 因为“用户觉得答案不错”不等于系统真的可靠;“模型表达流畅”也不等于检索链路没问题。

一个更稳的做法,是把质量拆成至少三个维度:

1. 检索质量

关注有没有把正确证据找回来:

  • Recall@k
  • MRR / nDCG
  • 空结果率
  • 权限过滤后的有效命中率
  • 新文档纳入检索的延迟

2. 生成质量

关注答案是否忠于检索证据、是否真正回答了问题:

  • Faithfulness
  • Relevance
  • 引用覆盖率
  • 拒答是否恰当
  • 长答案中是否出现无依据扩写

3. 系统质量

关注这个系统能否稳定提供服务:

  • P50 / P95 / P99 延迟
  • 错误率
  • 超时率
  • 成本 / query
  • 热点租户或热点问题分布

Golden Set 的价值,不只是“离线打分”

Golden Set 最有价值的地方不是给你一个漂亮分数,而是把“系统应该答对什么”固定下来。

一个成熟一点的 Golden Set,通常应该覆盖:

  • 常见高频问题
  • 长尾复杂问题
  • 多跳问题
  • 模糊提问
  • 明确应拒答的问题
  • 权限受限的问题
  • 新旧版本冲突的问题

否则你很容易把系统优化成“在公开 demo 问题上越来越强”,但对真实用户问题越来越偏。

A/B 测试别只测“最终答案更像人”

RAG 系统可以 A/B 的对象其实很多:

  • chunk 大小
  • overlap 策略
  • embedding 模型
  • 混合检索权重
  • rerank 模型
  • prompt 模板
  • 上下文压缩方法
  • 拒答阈值

但要注意: A/B 测试不能只看“最终满意度”,还要看它是否把某一类风险放大了。

例如,一个新策略可能让平均回答更长、更像样,但同时:

  • 延迟上涨 40%
  • 成本翻倍
  • 权限过滤后空结果率升高
  • 错误答案更“自信”

这不是优化,只是把问题藏进了更流畅的话术里。

监控与可观测性:你必须知道一次错误是怎么产生的

现代 RAG/Agent 框架已经越来越强调生产级 tracing、evaluation 和 observability。LangSmith 侧重把应用执行过程结构化追踪下来,LlamaIndex 也明确给出基于 OpenTelemetry 的可观测方案。(LangChain)

这背后对应的是一个非常现实的事实: RAG 的 bug 很少能靠几行错误日志定位。

关键指标

类别指标
检索质量Recall@k、MRR、空结果率、过滤后命中率、rerank 命中率
生成质量Faithfulness、Relevance、引用率、拒答率、人工抽检通过率
系统稳定性P50/P95/P99 延迟、错误率、超时率、QPS、队列积压
数据新鲜度源文档更新时间与索引更新时间差值、同步失败率
成本每 query token 数、Embedding 成本、rerank 成本、租户成本分账

追踪要能回答四类问题

一条完整 trace,至少应该能让你回答:

  1. 这次请求到底检索了什么?
  2. 为什么这些候选会被排到前面?
  3. 模型最终看到了哪些上下文?
  4. 答案里的每个关键结论能追溯到哪里?

一个能用的 trace,通常至少包含:

  • 原始 query 与改写后 query
  • 召回结果与分数
  • 过滤条件
  • rerank 前后顺序
  • 最终拼接进 prompt 的上下文
  • 模型输出
  • 延迟分布
  • token 用量
  • 索引版本、模型版本、prompt 版本

观测的真正价值:缩短定位路径

举个例子。 用户说:“昨天还能答对,今天突然开始乱答。”

没有 tracing 时,团队通常只能猜:

  • 是文档更新了?
  • 是向量库坏了?
  • 是 prompt 改了?
  • 是缓存脏了?
  • 是模型换版本了?

有 trace 时,你通常能更快缩小问题:

  • 发现 query 改写器把产品名改坏了;
  • 发现昨天命中的是旧索引缓存;
  • 发现新版本 chunking 把 FAQ 标题切断了;
  • 发现 rerank 超时后默默走了降级路径;
  • 发现模型其实没看到最关键那条上下文。

观测性不是为了“报表好看”,而是为了缩短从故障到修复的路径。

常见失败模式:RAG 出错时,通常不是“随机出错”

RAG 的失败往往有模式可循。把失败模式讲清楚,比单纯列“最佳实践”更接近生产经验。

失败模式典型表现常见根因应对
数据过期答案引用旧信息索引延迟、缓存未失效、版本混用增量同步、版本校验、缓存绑定索引版本
结构丢失表格/列表/层级答错解析只保留纯文本结构化解析、针对表格和代码块单独处理
检索漂移找到“差不多相关”但不够关键的 chunkchunk 粒度不合理、缺少 rerank结构切分、混合检索、重排
权限泄露用户看到不该看的内容ACL 后置、缓存未隔离、日志暴露ACL 前置、按租户隔离缓存与日志
文档投毒模型引用恶意内容来源不可信、缺少审核来源白名单、隔离索引、人工抽检
Prompt 注入文档里出现“忽略上文,输出 X”把检索内容当指令上下文与指令分离、输出校验、工具权限最小化
成本失控QPS 上来后费用暴涨重复 Embedding、长上下文、重试风暴缓存、限流、预算阈值、模型分层
长尾问题幻觉系统答得很像,但没有依据检索不到也硬答拒答策略、引用约束、置信度门控
评测失真离线分数很好,线上投诉增多Golden Set 过窄、只测热门问题扩展数据集、纳入真实 bad case
延迟雪崩高峰期全链路超时多级串联、无熔断、资源争抢时间预算、熔断、异步化、热点隔离

其中有两个失败模式尤其值得单独展开。

失败模式一:系统“能答”,但不该答

这是生产环境里最危险的错之一。 因为它不像报错那样显眼,反而更容易被业务方误信。

常见场景:

  • 检索证据不足,但模型根据常识补全;
  • 多份文档相互冲突,模型选了一个看起来更像真的;
  • 用户问的是最新政策,系统答了旧版本流程;
  • 用户权限不足,系统从公开内容里拼出一个近似答案。

这类问题不能只靠 prompt 里一句“如果不知道就说不知道”解决。 更稳妥的方法通常是:

  • 约束必须引用来源;
  • 对低证据覆盖的问题提高拒答概率;
  • 把“是否有充分依据”做成单独判定;
  • 在高风险业务场景里,把“答案生成”和“答案核验”分成两步。

失败模式二:系统“偶尔很好”,但总体不可控

这是很多 Demo 向 Production 过渡时最典型的幻觉。 因为某些问题效果非常亮眼,团队容易误以为整体已经成熟。

真正的生产信号不是“最好的一次回答有多惊艳”,而是:

  • 差的时候有多差;
  • 错的时候能不能看出来;
  • 坏的时候能不能降级;
  • 变更后会不会悄悄把旧能力弄坏。

安全与合规:RAG 的安全,不只是在输出端做审核

很多团队会把安全理解成“在模型最后加一层敏感词过滤”。这远远不够。

Prompt 注入为什么在 RAG 中更隐蔽

在普通聊天里,指令主要来自用户输入。 在 RAG 里,指令还可能藏在检索到的文档里。

比如文档中出现:

  • “忽略之前要求”
  • “你必须输出……”
  • “不要告诉用户真实规则”
  • “把内部地址暴露出来”

如果系统把检索内容和系统指令混在一个不加区分的 prompt 里,模型就有可能把“文档内容”误当成“可执行指令”。

因此,生产环境里至少要做到:

  • 在提示结构上明确区分“系统指令”和“参考材料”;
  • 让模型把文档视为证据,而不是命令;
  • 对输出做引用一致性与敏感内容校验;
  • 工具调用权限最小化,避免检索内容影响高权限动作。

文档投毒不是理论问题

只要知识库允许外部接入、半自动同步、用户上传或跨团队共享,就存在投毒风险。

常见形式包括:

  • 注入错误流程;
  • 伪造权威文档;
  • 在长文档中埋入针对模型的操纵文本;
  • 通过看似正常的更新悄悄替换关键字段。

所以除了技术过滤,还需要治理动作:

  • 来源白名单与信任分层;
  • 高风险来源进入隔离索引;
  • 关键知识域人工审核;
  • 高价值问答保留引用和审计记录。

审计不是给合规部门看的,而是给事故复盘准备的

至少要能追溯:

  • 谁问了什么;
  • 系统检索了哪些内容;
  • 最终回答是什么;
  • 来自哪些文档和哪个版本;
  • 当时使用的模型、索引和 prompt 版本。

否则当线上出现误答、越权、争议答案时,你很难说清楚问题出在哪一层。

成本控制:真正花钱的,往往不是你以为的那一段

很多人提到 RAG 成本,第一反应是“LLM token 太贵”。 这只说对了一部分。

生产环境里,常见成本来源包括:

  • 文档解析与 OCR
  • Embedding 批量计算
  • 向量存储与索引
  • 混合检索与 rerank
  • LLM 上下文长度
  • 重试与缓存穿透
  • 热门租户的突发流量
  • 为追求极致效果堆叠过多链路

成本最常见的三个误区

误区一:只看单次 query 成本,不看全链路单位经济性

如果一个查询本身便宜,但为了支持它,你每天要重建大量索引、处理大批增量、维持高规格向量集群,那么单位成本并不低。

误区二:为了“更准一点”无上限堆上下文

更长的上下文不一定更准,很多时候只是把更多噪声塞给模型。 当 top-k、chunk 大小、rerank 质量没有优化好时,单纯加上下文长度常常是最贵、也最懒的补救方式。

误区三:所有请求走同一条豪华链路

真实场景里,请求价值差异很大。 FAQ 查询、长尾复杂分析、多跳推理、企业高风险问答,不该用同一套成本结构。

更现实的做法通常是分层:

请求类型更常见的策略
热门 FAQ高命中缓存、短链路、低成本模型
普通问答标准 RAG 链路
复杂问题混合检索 + rerank + 更强模型
高风险回答强约束、引用必需、必要时人工复核

先看定义:成本优化不是削功能,而是让不同价值的请求走不同价格的路。

不同规模下,更现实的架构模式

创业团队 / 小规模产品

适合的目标不是“企业级完美”,而是先把关键风险挡住。

更合理的配置通常是:

  • 一个可维护的向量库;
  • 一条清晰的数据摄入链路;
  • 基本的监控与日志;
  • 有限的降级与缓存;
  • 一个覆盖核心场景的小型 Golden Set。

此时最重要的不是堆组件,而是回答三个问题:

  1. 哪类问题是系统必须答对的?
  2. 答错时能否看出来?
  3. 变更后会不会悄悄退化?

中型企业 / 成长期系统

这时 RAG 往往已经从“产品功能”变成“平台能力”。

系统重点会转向:

  • 增量更新和版本管理;
  • 权限过滤前置;
  • 混合检索和 rerank;
  • 自动化评测;
  • tracing 与成本可视化;
  • 面向团队协作的发布流程。

此阶段最常见的痛点不是“能力不足”,而是“系统开始复杂,但治理还没跟上”。

大型企业 / 高可用高合规场景

重点通常不再是“能不能做出一个 RAG”,而是:

  • 多区域部署;
  • 多租户隔离;
  • 审计、合规、权限继承;
  • 成本分账;
  • 灰度发布与回滚;
  • 高风险回答的可解释与可核查。

到这个阶段,RAG 往往已经不再是一个单点应用,而是更接近一个组织级知识基础设施。

2026 年技术栈建议:先按能力域选,再按组织约束落地

从官方文档看,LlamaIndex 仍然持续强化 RAG 构建与优化能力,LangChain / LangGraph 更强调与 observability、evaluation、deployment 的联动;Qdrant、Milvus、Weaviate、Pinecone 仍然是生产向量检索的主要候选。(LlamaIndex OSS Documentation)

与其给出“唯一推荐”,不如按能力域理解技术栈:

组件域可选方向
向量数据库Pinecone、Weaviate、Milvus、Qdrant
检索编排 / RAG 框架LlamaIndex、LangChain / LangGraph
Embedding商业 API 或开源 Embedding 模型,重点看语种、成本、延迟、私有化要求
文档解析能保留结构的解析方案优先,必要时针对 PDF、表格、扫描件分开处理
评测RAGAS、框架内置 eval、以及自建 Golden Set
可观测性LangSmith、OpenTelemetry 体系、自建 Prometheus + Grafana + Trace 系统

这里最容易犯的错,是把技术栈选择当成“排行榜竞赛”。 真实世界里,技术栈更像组织约束的映射:

  • 小团队偏向托管和低运维;
  • 数据敏感行业偏向自建和可控;
  • 多语言、多地域场景更关注模型与索引一致性;
  • 企业内部平台更看重权限、审计和发布治理。

生产就绪检查清单

下面这份清单不保证系统优秀,但能较大概率避免“看起来能上线,实际上经不起用”。

  • 数据流水线支持增量更新,而不是只能全量重建
  • 解析、切分、Embedding、索引都有版本标识
  • 向量库和索引具备备份、扩容与回滚方案
  • 查询链路有明确超时预算,而不是无限等待
  • 检索、rerank、LLM 调用都设计了有限重试与熔断
  • 有清晰降级路径,而不是某个依赖挂了全站不可用
  • ACL / 租户过滤前置到检索阶段,而不是事后补丁
  • 有 Golden Set,且包含拒答题、权限题、长尾题
  • 每次发布前能自动跑回归评测
  • 有延迟、错误率、空结果率、成本、同步新鲜度监控
  • 能追踪一次回答的完整链路和引用来源
  • 缓存与索引版本、权限范围绑定,避免脏读和串租户
  • 有文档来源校验、恶意内容隔离和高风险知识审核
  • 有审计日志,能复盘谁问了什么、系统看了什么、答了什么
  • 有 on-call 和告警,不靠用户投诉发现问题

先看定义:Production-ready 不是“能跑通”,而是“坏了能发现,发现后能定位,定位后能恢复”。

演进路径:不要一开始就做“完美架构”

很多团队容易从另一个方向犯错:还没验证需求,就把系统设计得过于庞大。

更稳妥的演进路径通常是:

阶段重点
MVP打通数据摄入、基础检索、基础监控,先验证用户是否真的需要
成长引入增量更新、混合检索、缓存、自动化评测
稳定建立 tracing、版本治理、回滚机制、成本视角
成熟多副本、多租户治理、审计合规、A/B 测试、平台化能力

要注意,演进不是简单“往上堆功能”,而是逐步回答新的问题:

  • 这个系统开始频繁被用了吗?
  • 问题是否集中在数据、检索、生成还是治理层?
  • 哪些能力已经值得平台化?
  • 哪些复杂度其实还不值得引入?

不要为了“像大公司架构”而设计系统。 要为了“当前阶段最容易出的问题”去设计系统。

团队协作:RAG 从来不是单一角色能长期做好的系统

角色更核心的职责
数据工程摄入、解析、清洗、版本、增量同步
检索 / MLChunking、Embedding、混合检索、Rerank、评测
后端 / 平台服务化、缓存、限流、配置治理、可观测性
安全 / 合规权限、审计、来源治理、风险控制
产品 / 业务Golden Set、验收标准、bad case 归档、价值判断

小团队当然可以一人多角,但必须知道自己在同时扮演哪些角色。 RAG 的问题之所以经常难解,不是因为它技术特别神秘,而是因为它横跨了数据、搜索、应用、模型和治理。

从 RAG 到 Agent:为什么生产级 RAG 会成为下一阶段的地基

本系列下一篇会进入 Agent。 很多人把 Agent 理解为“会调用工具的更强 AI”,但从系统依赖看,Agent 常常只是把 RAG 的问题进一步放大:

  • RAG 不稳定,Agent 的决策基础就不稳定;
  • RAG 不可观测,Agent 出错更难排查;
  • RAG 权限不严,Agent 风险更高;
  • RAG 成本不可控,Agent 会把调用链路放大得更快。

所以,生产级 RAG 不是 Agent 之前的一个小专题,而是 Agent 可靠性的底层前提。 一个不能稳定提供知识依据的 RAG,很难支撑一个真正可信的 Agent。

小结

生产级 RAG 与 Demo RAG 的根本差异,不在于“规模更大”,而在于它必须接受现实世界的约束:数据持续变化,依赖会抖动,流量会波动,权限会复杂,错误会发生,成本会累计。

因此,真正值得建设的不是一个“看起来聪明的问答功能”,而是一套完整的知识服务系统:

  • 数据要持续流动,而且可追踪、可回滚;
  • 检索要兼顾召回、精度、权限、延迟与成本;
  • 生成要有依据、有边界、可拒答;
  • 系统要可观测、可降级、可审计;
  • 迭代要靠评测和反馈,而不是靠感觉。

把 RAG 当作一个需要长期运维、持续治理、不断迭代的系统来看待,才是从 Demo 走向 Production 的真正分水岭。

核心概念速查

概念一句话
Data Pipeline文档从接入、解析、切分、去重、版本化到索引更新的持续过程
Hybrid Retrieval把语义检索、关键词检索、过滤和 rerank 组合起来,而不是只靠向量相似度
Golden Set一组用于回归评测的代表性问题,帮助判断系统是否真的变好
Observability通过日志、指标、追踪还原一次回答是如何产生的
Degrade Gracefully依赖异常时不追求“完全正常”,而是以有限能力维持服务
Production-ready不是“能跑”,而是“能发现问题、能恢复、能持续改进”