# 案例 03 · DocuMind:给 500 人公司用的企业 RAG 知识库 > 一句话点题:**本案例练的是「可信 AI 问答」——RAG 不是把文档丢给 AI,而是把可授权、可检索、可引用、可评测的证据交给 AI,让它基于资料回答,不知道就说不知道。** --- > **🧪 案例篇第 3 篇 · 本案例只练一件事** > > 练**企业 RAG 知识库**下的架构判断:什么时候该用 RAG 而不是长上下文 / 微调,文档怎么切块和入库,向量 / 关键词 / 知识图谱检索怎么配合,以及如何控制幻觉、权限泄露、提示注入和 token 成本。 > > | 读完你应该能 | 本案例靠什么练 | > |---|---| > | 说清 RAG 系统为什么不是简单聊天框 | 拆开离线文档入库和在线检索生成两条链路 | > | 判断切块、向量检索、关键词检索、知识图谱检索、重排怎么配合 | 用混合检索 + Graph RAG + 重排 + 引用兜住答案质量 | > | 把权限和引用放进架构,不是事后补丁 | 在块级元数据里保存 ACL,生成时强制引用来源 | > | 看懂 AI 系统怎么做质量回归 | 用评测集、检索指标、引用命中率、拒答率持续压住退化 | > > **重要提醒:下面是教学化案例,不是某个企业知识库产品的内部图纸。** 数字用于数量级推理,目的是练判断,不是给出唯一答案。 --- ## 开场:为什么企业知识库不是「接个大模型」就完了 因为企业里最常见的 AI 需求,不是写一个万能机器人,而是让员工少翻文档、少问同事、少踩旧坑。 > **DocuMind** 是一家 500 人公司的内部知识库助手。公司有产品手册、客服 SOP、销售方案、合同模板、技术 Runbook、人事制度、会议纪要。员工希望直接问:「企业版退款规则是什么?」「这个客户能不能走特殊折扣?」「线上故障升级流程怎么走?」 第一眼看,这像是一个聊天框: - 用户输入问题; - 系统查一查文档; - 大模型生成答案; - 页面展示结果。 但真正上线后,最危险的不是「回答慢一点」,而是: > **AI 一本正经地答错,引用不存在的资料,或者把 HR / 法务 / 客户私密文档泄露给没有权限的人。** 所以这一章不写「怎么调一个模型 API」。它问一个更具体的问题: > **如何让 AI 只基于当前用户有权限看到的资料回答,并且每个关键结论都能指回原文?** 这章和前两章的压力源完全不同: - [StarArena](../stararena-ticketing/README.md) 怕的是高并发和库存错误。 - [PatchDesk](../patchdesk-saas/README.md) 怕的是多租户边界和副作用失控。 - **DocuMind 怕的是答案不可信、资料越权、成本失控、质量退化没人知道。** --- ## 读前小词典 这篇会反复出现几个词,先用人话对齐一下: | 词 | 人话解释 | |---|---| | RAG | Retrieval-Augmented Generation,检索增强生成。先查资料,再让大模型基于查到的资料回答。 | | LLM | Large Language Model,大语言模型。可以理解成负责读材料、组织答案的模型。 | | Token | 模型处理文本的基本单位。字越多、资料塞得越多,token 越多,成本和延迟越高。 | | Embedding | 把一段文字变成一串数字向量,让系统能按语义相似度搜索。 | | Chunk | 文档块。把长文档切成小段,每段独立建索引和检索。 | | 向量库 | 专门存向量并找「语义最相近」内容的数据库。 | | 知识图谱 | 把知识整理成「实体 + 关系」的网。比如「客户 A 属于集团 B」「合同 C 包含条款 D」。 | | 实体 / 关系 | 实体是人、产品、客户、合同、系统等对象;关系是它们之间的连接,比如「负责」「依赖」「适用」「属于」。 | | Graph RAG / 知识图谱 RAG | 先在知识图谱里找相关实体和关系,再结合文档块生成答案。它擅长回答「谁和谁有关」「规则怎么传导」「这个客户是否适用某条政策」这类关系问题。 | | 关键词检索 / BM25 | 传统搜索方式。BM25 是一种常见排序算法,对人名、产品型号、合同编号这类精确词很有用。 | | 混合检索 | 向量检索 + 关键词检索一起用。一个懂语义,一个懂精确词。 | | 重排 / Rerank | 先召回一批候选文档块,再用更精细的模型重新排序,挑真正能回答问题的几块。 | | Top-K | 最终取前 K 个结果。比如 top-6 就是只把最相关的 6 个文档块交给模型。 | | 引用 / Citation | 答案后面标出依据来自哪份文档、哪一段。没有引用的企业问答很难信。 | | 幻觉 | 模型编出看起来合理但没有依据的内容。 | | 提示注入 | 文档或用户输入里藏着「忽略之前规则」之类的恶意指令,诱导模型越权或乱答。 | | ACL | Access Control List,访问控制列表。记录谁能看哪份文档。 | | 评测集 | 一批标准问题、标准资料和期望答案,用来检测系统改动后有没有变差。 | --- ## 一、起始状态:先跑通可信问答,别先造大平台 DocuMind 的第一版目标很朴素:**让员工问常见政策、产品和流程问题时,能得到带来源的答案。** 起始阶段的约束大概是这样: | 维度 | 起始阶段 | |---|---| | 试点用户 | 50~100 人 | | 文档规模 | 5,000~20,000 份 | | 文档来源 | 网盘、内部 Wiki、PDF、Word、网页 | | 每日问答 | 500~2,000 次 | | 峰值问答 | 1~3 QPS | | 团队规模 | 3~5 名工程师 | | 核心目标 | 证明员工愿意用,且答案有据可查 | | 最不能错 | 无权限资料不能被检索进答案;没有依据时不能编 | 这时最合理的架构不是自研大模型,也不是一开始就搞复杂 Agent,而是**托管大模型 API + 简单 RAG 管线 + 清晰权限元数据 + 评测集**: ``` 文档源 │ ▼ ┌────────────────────────────────────────────┐ │ 离线入库管线 │ │ 解析 → 清洗 → 切块 → 权限元数据 → 向量化 │ └──────────────┬─────────────────────────────┘ ▼ ┌──────────────────┐ │ 知识索引 │ │ 向量 + 关键词 + 元数据│ └────────┬─────────┘ │ 用户提问 ▼ │ ┌──────────────────┐ └────▶│ 在线问答服务 │ │ 鉴权 → 检索 → 重排 │ │ 组装上下文 → LLM │ │ 引用校验 → 返回答案 │ └──────────────────┘ ``` 这不是「简单套壳」。RAG 的难点不在聊天框,而在聊天框后面的证据链。 --- ## 二、量化假设:它不是被 QPS 压垮,而是被质量压垮 先算一笔账。假设 DocuMind 在公司内部推广半年后: ``` 员工数:500 活跃用户:300 文档总数:80,000 活跃知识源:产品文档、客服 SOP、法务模板、销售资料、技术 Runbook、人事制度 平均每份文档:3,000~8,000 tokens 切块大小:500~800 tokens,重叠 80~120 tokens 文档块数量:40 万~100 万 每日新增 / 更新文档:500~1,500 份 每日问答:5,000~15,000 次 峰值问答:5~10 QPS 检索目标:800ms 内完成召回 + 重排 检索质量:Recall@20 ≥ 85%,重排后 top-5 命中率 ≥ 75% 回答目标:首字 < 2s,完整答案 P95 < 10s 质量目标:高频问题引用命中率 > 95%,无依据问题拒答率 > 90% 安全目标:未授权 chunk 进入模型上下文次数 = 0 成本目标:每次回答只喂必要证据,不把整篇文档塞进上下文 ``` 这个 QPS 对普通 Web 服务并不高。真正会拖垮系统的是另外四件事: 1. **检索不准**:明明有答案,却没找到正确文档块。 2. **上下文污染**:找到了相似内容,但不是能回答问题的内容,模型被噪音带偏。 3. **权限错误**:用户没有权限看的内容被检索出来,最终出现在答案里。 4. **质量不可见**:换了模型、改了切块、调了 prompt 后,答案变差却没人知道。 所以 DocuMind 的架构重心不是「怎么抗 10 万 QPS」,而是: > **把答案质量、证据来源、权限边界和成本预算做成系统结构,不要指望模型自己永远乖。** --- ## 三、触发信号:什么时候说明第一版开始不够用 第一版跑起来后,不要凭感觉升级。看这些信号: | 信号 | 表现 | 为什么这是架构问题 | |---|---|---| | 答案没有引用 | 用户问政策,AI 给出一段很像真的话,但没有来源 | 企业场景里,不可核验的答案很难信 | | 引用是错的 | 引用了 A 文档,但答案其实来自模型猜测 | 生成和证据没有绑定,需要引用校验 | | 精确词搜不到 | 产品型号、合同编号、人名经常搜偏 | 纯向量检索不擅长精确匹配,需要关键词检索 | | 权限过滤太晚 | 先检索出敏感块,再在前端隐藏 | 敏感内容已经进入模型上下文,泄露已经发生 | | 文档更新后仍答旧规则 | 新政策上传了,系统还引用旧版本 | 入库管线缺少版本、增量更新和索引新鲜度指标 | | 提示注入生效 | 文档里写「忽略系统规则」,模型真的照做 | 检索内容被当成可信指令,没有隔离外部文本 | | token 成本上涨 | 每次回答塞 20 个大块,账单快速膨胀 | 缺少 top-K、摘要、缓存和模型路由 | | 改动后质量变差 | 换了切块策略后,没人知道召回率掉了 | 没有评测集和回归门禁 | 这些信号不是在说「模型还不够强」。它们在说:**证据链和控制面还没有架构化。** --- ## 四、核心矛盾:AI 会说话,但企业要证据 DocuMind 的核心对象不是「聊天消息」这么简单,而是三组东西: 1. **文档 / 文档块 / 版本**:资料从哪里来、现在是哪一版、切成了哪些块。 2. **权限 / 元数据 / 来源**:谁能看、属于哪个部门、引用时能不能回到原文。 3. **问题 / 检索结果 / 答案 / 评测记录**:用户问了什么、找到了什么、模型基于什么回答、结果好不好。 如果只看最简单路径,它像这样: ``` 用户问题 → 向量检索 → 找几段文档 → 塞给 LLM → 返回答案 ``` 但真实系统必须在每一步都回答: - 这个用户有权限看哪些文档? - 文档块是不是最新版本? - 这几块真的能回答问题,还是只是语义相似? - 答案里的每个关键结论能不能指回引用? - 检索到的文档里如果有恶意指令,模型会不会照做? - 这次回答花了多少 token,值不值得? 所以新的架构命题变成: > **不要把 RAG 当成「向量搜索 + 大模型」,而要把它当成一条证据生产线。** 证据生产线有两条链路: ``` 离线链路:文档 → 解析 → 切块 → 权限元数据 → 向量 / 关键词索引 在线链路:问题 → 鉴权 → 检索 → 重排 → 组装证据 → 生成 → 引用校验 → 记录评测 ``` 离线链路决定「资料能不能被正确找到」。在线链路决定「找到的资料能不能被安全、节制、可核验地交给模型」。 --- ## 五、方案推演:检索到底怎么做 这是本案例最重要的决策。很多 RAG 原型失败,不是模型不够强,而是检索路线太天真。 ### 方案 A:长上下文,把相关文档整篇塞给模型 ``` 用户问题 + 整篇产品手册 + 整篇政策文档 → LLM ``` | 优点 | 代价 | |---|---| | 实现最简单,不用维护复杂索引 | 文档一多就塞不下,成本和延迟迅速上升 | | 小规模演示效果可能不错 | 噪音多,模型容易忽略真正关键段落 | ### 方案 B:纯向量检索 ``` 问题向量 → 向量库 top-K → LLM ``` | 优点 | 代价 | |---|---| | 能按语义找相近内容,搭建快 | 对编号、人名、产品型号、条款号不稳定 | | 适合问法和文档表达不完全一致的场景 | 「相似」不等于「能回答」,容易召回看起来像但不够准的块 | ### 方案 C:混合检索 + 重排 + 引用约束 ``` 问题 ├─▶ 向量检索:找语义相近 ├─▶ 关键词检索:找精确词 └─▶ 合并候选 → 重排 → top-K 证据块 → LLM → 引用校验 ``` | 优点 | 代价 | |---|---| | 兼顾语义和精确词,生产质量更稳 | 组件更多,需要调参和评测 | | 重排能把「像」筛成「真相关」 | 延迟和成本会增加,要控制候选数量 | | 引用约束让答案可核验 | 需要保存块 ID、文档版本、来源位置 | ### 方案 D:知识图谱 RAG,先找实体和关系,再找证据文档 ``` 问题:这个客户能不能走企业版特殊折扣? ├─▶ 实体识别:客户、集团、合同、产品线、地区、销售 owner ├─▶ 图谱查询:客户 → 所属集团 → 合同 → 适用条款 → 审批规则 ├─▶ 文档检索:围绕这些实体和条款找原文证据 └─▶ LLM:基于图谱关系 + 文档引用生成答案 ``` | 优点 | 代价 | |---|---| | 擅长跨文档、多跳关系问题,比如客户归属、系统依赖、政策适用范围 | 建图成本高,要做实体抽取、关系抽取、消歧和持续更新 | | 能把「为什么适用 / 不适用」讲清楚,不只返回相似文档 | 图谱错了会把答案带偏,而且错误更隐蔽 | | 对权限、版本、血缘追踪更清楚 | 图谱节点和边也要有权限与来源,否则照样会泄露 | 知识图谱 RAG 不是「比向量 RAG 更高级,所以一定要上」。它适合这些信号出现之后再加: - 用户经常问「A 和 B 有什么关系」「这个客户归哪个集团」「这个服务依赖哪些系统」。 - 答案需要跨多份文档推理,单个 chunk 很难直接回答。 - 组织里已经有比较稳定的主数据,比如客户、合同、产品、系统、人员、部门。 - 业务更关心关系链和适用性,而不只是找一段原文。 把几条路线并排看: | 方案 | 擅长 | 不擅长 | 什么时候上 | |---|---|---|---| | 向量 RAG | 问法不同但意思相近 | 精确编号、复杂关系 | MVP 和大多数普通文档问答的起点 | | 混合 RAG | 语义 + 精确词 | 跨文档关系推理 | 生产级企业知识库主线 | | Graph RAG | 实体关系、政策适用、依赖链、影响分析 | 图谱构建成本高,关系抽错会误导答案 | 关系问题变多、人工排查成本高、评测证明普通 RAG 到顶后再上 | DocuMind 第一阶段选择:**混合检索 + 重排 + 强制引用;知识图谱 RAG 作为关系密集场景的第二阶段增强,不一开始全量建图。** 关键不在「有没有向量库」,而在于: > **检索结果必须同时满足相关性、权限、版本、关系正确性和成本预算。只满足语义相似,不够。** --- ## 六、关键架构决策:用 ADR 把为什么留下来 ADR 是 Architecture Decision Record,可以理解成「架构决策记录」。AI 系统最容易在后面被人问:「为什么不微调?为什么不用长上下文?为什么必须引用?为什么要做评测?」这些都应该提前写下来。 ### ADR-01:采用 RAG,不把企业知识写进模型参数 - **背景**:公司文档经常更新,很多内容有权限边界,并且答案必须可溯源。 - **选择**:用 RAG。文档保存在企业侧,提问时只检索当前用户有权限的相关片段,再交给模型生成。 - **放弃**:放弃第一阶段微调模型来记住企业知识;也放弃每次把整篇资料塞进长上下文。 - **换来**:资料可更新、答案可引用、权限可控制、成本更可控。 - **风险**:回答质量高度依赖检索质量。检索错,模型也会错。 - **复审条件**:如果只是固定语气 / 格式问题,可以考虑微调;如果知识量极少且固定,可以考虑长上下文;如果知识快速变化且要引用,RAG 仍是主线。 ### ADR-02:文档入库必须可重放,并保存块级权限、来源和版本 - **背景**:企业文档不是所有人都能看,而且同一政策可能有多个版本。 - **选择**:文档解析后按结构切块;每个 chunk 保存 `source_id`、`doc_id`、`doc_version`、`chunk_version`、`source_url`、`section`、`acl`、`updated_at`、`parser_status` 等元数据;解析、切块、embedding、索引都可以按版本重放;解析失败的文档进入隔离队列,不进线上索引。 - **放弃**:放弃只存一段裸文本和向量的简单做法。 - **换来**:检索时可以先按权限和版本过滤,引用能回到原文,旧版本可以下线;如果切块策略或 embedding 模型变了,可以可靠重建索引。 - **风险**:入库管线更复杂,解析、切块、权限同步都可能出错。 - **复审条件**:如果权限模型变复杂,要把 ACL 同步和索引更新做成独立可靠管线,并增加权限回归测试。 ### ADR-03:答案必须经过引用约束、拒答策略和评测回归 - **背景**:企业不怕 AI 说「不知道」,怕它没有依据却说得很肯定。 - **选择**:生成 prompt 明确要求只基于证据块回答;每个关键结论带引用;没有足够证据时拒答;每次改模型、prompt、切块、检索参数前跑评测集。 - **放弃**:放弃「只要回答自然就行」的体验优先路线。 - **换来**:答案可核验,质量退化可发现,高风险问题更安全。 - **风险**:拒答率可能上升,用户会觉得系统不够聪明。 - **复审条件**:当拒答过多时,先查检索召回和文档覆盖,不要直接放宽模型约束。 ### ADR-04:知识图谱 RAG 只先覆盖关系密集领域 - **背景**:DocuMind 后期会遇到很多关系型问题,比如「这个客户属于哪个集团」「某系统故障会影响哪些产品」「某条政策适用于哪些合同」。这些问题靠单个相似文档块很难稳定回答。 - **选择**:先在客户、合同、产品、系统依赖这几类稳定主数据上建轻量知识图谱;图谱节点和边必须保存来源、版本、ACL 和置信度;在线检索时先用图谱找实体关系,再回到原文 chunk 做引用。 - **放弃**:放弃第一天从所有文档里自动抽取全公司知识图谱。 - **换来**:跨文档关系问题更稳,答案能解释「为什么相关」,也能追溯关系来自哪份资料。 - **风险**:实体抽取和关系抽取会错;图谱过期后会系统性误导答案。 - **复审条件**:当关系型问题占比高、主数据稳定、并且普通混合检索经常答不清关系链时,再扩大图谱范围。 --- ## 七、演进后的结构与数据流 下面只画 DocuMind 的核心结构。它不是一个聊天框,而是一套离线 + 在线的证据系统。 ### 起始路径 ``` 用户问题 └─▶ 生成问题向量 └─▶ 向量库 top-5 └─▶ 拼进 prompt └─▶ LLM 回答 ``` 问题是:权限、版本、精确词、引用、评测都没有被固定住,一旦文档和用户多起来就会失控。 ### 演进后的结构 ``` ════════════ 离线:把文档变成可检索证据 ════════════ 文档源 PDF / Word / Wiki / 网页 / 表格 │ ▼ ┌──────────────────────────────────────────────┐ │ 入库管线 │ │ 解析 / OCR → 清洗 → 结构化切块 → 权限元数据 │ │ → embedding → 实体/关系抽取 → 写索引 │ └───────────────┬──────────────────────────────┘ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 原始文档存储 │ │ 向量索引 │ │ 关键词索引 │ │ 图谱索引 │ │ 文件 + 版本 │ │ chunk + ACL │ │ chunk + ACL │ │ entity/edge │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ ════════════ 在线:把问题变成可引用答案 ════════════ 用户问题 │ ▼ ┌──────────────────────────────────────────────┐ │ 在线问答服务 │ │ 鉴权 → 查询改写 → 实体识别/图谱扩展(可选) │ │ → 权限过滤检索 → 混合召回 │ │ → 重排 → 证据组装 → LLM 生成 → 引用校验 → 记录日志 │ └───────────────┬──────────────────────────────┘ ▼ 带引用答案 / 拒答 ``` 这张图的核心变化不是「多接了一个模型」,而是结构变清楚了: - **入库管线**负责把不同格式文档变成干净、可检索、带权限的证据块。 - **向量索引**负责语义召回,解决「问法和文档措辞不同」。 - **关键词索引**负责精确词召回,解决「型号、编号、人名、条款号」。 - **图谱索引**负责关系召回,解决「客户属于谁、政策适用于谁、系统依赖谁」。 - **重排器**负责从一批候选里挑真正能回答问题的块。 - **证据组装器**控制 top-K、token 预算、来源格式,避免把噪音塞给模型。 - **引用校验和评测日志**让答案质量可检查、可回归。 ### 跟一次「企业版退款规则」提问走到底 ``` 1. 员工问:企业版客户退款规则是什么? 2. 在线问答服务完成鉴权,拿到 user_id、部门、角色、可访问文档范围。 3. 查询改写把问题补成更适合检索的形式,比如「企业版 退款 政策 合同 取消」。 4. 向量检索召回语义相近的政策 / 合同块。 5. 关键词检索召回包含「企业版」「退款」「取消」的精确命中文档块。 6. 两路候选合并去重,并且只保留当前用户有权限看的 chunk。 7. 重排器从几十个候选里选出最能回答问题的 5~8 个证据块。 8. 证据组装器把块 ID、文档标题、版本、段落位置和正文一起放进 prompt。 9. LLM 只允许基于这些证据回答,每个关键结论必须带引用。 10. 引用校验确认引用 ID 真实存在,且来自本次检索结果。 11. 如果证据不足,系统返回「当前资料中没有找到足够依据」,而不是编。 12. 系统记录问题、检索结果、引用、token、延迟、用户反馈,进入评测和排障。 ``` 这里的关键点: - 权限过滤要发生在检索和组装上下文之前,不能等答案生成后再遮。 - 引用必须指向真实 chunk 和文档版本,不能让模型自由编来源。 - 检索到的文档内容是证据,不是指令。文档里的「忽略系统规则」不能生效。 - 没有证据时拒答是正确行为,不是失败。 - 每次回答都要留下检索和生成日志,否则质量问题无法复盘。 --- ## 八、坏了怎么办:故障场景与兜底 | 故障 | 直接后果 | 检测方式 | 架构兜底 | |---|---|---|---| | 文档解析丢表格 | 价格、限制、例外条款丢失 | 解析抽样检查、表格覆盖率 | 对表格单独抽取;关键文档人工验收 | | 解析失败文档仍入库 | 乱码或半截内容被当成证据 | `parser_status`、乱码率、抽样检查 | 失败文档进入隔离队列,修复后重放入库 | | 切块太大 | 检索块噪音多,模型抓错重点 | 命中块人工评审、token 异常 | 按标题 / 段落结构切块,限制块大小 | | 切块太小 | 召回片段缺上下文,答案断章取义 | 答案引用不完整、用户反馈 | 加重叠,为块补充标题和父级章节 | | 纯向量检索漏掉精确词 | 合同编号、产品型号、人名搜不到 | 精确查询评测集召回率低 | 加关键词检索 / BM25,再做混合召回 | | 权限过滤太晚 | 敏感文档进入模型上下文 | 权限穿透测试、日志审计 | 检索阶段按 ACL 过滤;chunk 级保存权限 | | 文档版本过期 | AI 引用旧政策 | 索引新鲜度、旧版本命中率 | 文档版本化,旧 chunk 下线,增量重建索引 | | 提示注入生效 | 文档诱导模型越权或乱答 | 红队测试、注入样本评测 | 将检索内容标注为不可信证据;系统指令和证据隔离 | | 实体抽取错误 | 把客户、产品、合同关系连错 | 图谱抽样验收、实体消歧评测 | 低置信关系不入线上图谱;关键实体人工审核 | | 图谱关系过期 | 政策适用关系引用旧规则 | 关系更新时间、旧版本命中率 | 关系带版本和来源 chunk;文档下线时同步下线关系 | | 图谱权限过滤遗漏 | 用户通过关系路径看到无权实体 | 权限穿透测试、图谱查询审计 | 图谱节点和边都带 ACL;检索前过滤,不是生成后遮挡 | | 图谱路径无原文证据 | 答案看似有推理链但无法核验 | 路径引用校验失败率 | 每条关系必须能回到来源 chunk;缺来源只能作为线索,不能作为答案依据 | | 引用被编造 | 答案看似有来源但查不到 | 引用 ID 校验失败率 | 只允许引用本次检索 chunk;生成后校验 | | 没证据还硬答 | 幻觉造成错误决策 | 无答案问题评测、用户反馈 | 证据不足就拒答;提高召回而不是放松约束 | | 成本突然上涨 | token 账单失控、延迟变高 | 每问 token、top-K、上下文长度 | 限制 top-K,缓存热门问答,简单问题走小模型 | | 超过预算仍硬生成 | 单次问题烧穿预算,还可能很慢 | 单问预算、用户 / 部门配额 | 超预算时返回相关资料列表、走小模型摘要或转人工 | | 改动后质量退化 | prompt / 模型 / 切块升级后答案变差 | CI 跑评测集、线上 A/B | 评测不过不发布;保留回滚版本 | | 向量索引不可用 | 问答失败或大量超时 | 检索错误率、依赖健康检查 | 降级到关键词搜索;必要时只返回资料列表不生成答案 | 企业 RAG 的成熟度,不是看回答多像人,而是看它错的时候能不能被发现、被限制、被修复。 --- ## 📌 拿模板验证这次推演 本案例不是重写 RAG 模板,而是把「企业内部知识库」里最容易被低估的几条边界拿出来细推。 | 可复用模板 / 章节 | 本案例复用什么 | 本案例重点补什么 | |---|---|---| | [RAG 知识库](../../templates/rag-knowledge-base/README.md) | 文档入库、切块、向量化、检索、重排、引用 | 用企业权限、版本、新鲜度和评测把 RAG 讲成可上线系统 | | [AI 对话产品](../../templates/ai-chat-product/README.md) | LLM 编排、上下文组装、token 成本、安全护栏 | 说明聊天框只是入口,证据链才是核心 | | [向量数据库](../../templates/vector-database/README.md) | 向量索引、相似度检索、元数据过滤 | 强调相似不等于相关,必须配合关键词和重排 | | [搜索引擎](../../templates/search-engine/README.md) | 关键词检索、排序、权限过滤 | 把 BM25 这类传统搜索能力拉回 RAG 主链路 | | [大模型时代的架构判断](../../tutorial/17-大模型时代的架构判断.md) | 非确定性、上下文工程、成本 / 延迟 / 质量三角 | 把这些抽象判断落到企业知识库问答 | | [评测驱动](../../tutorial/25-评测驱动把够好写进架构.md) | 用评测集定义「够好」 | 让检索、引用、拒答都能回归 | > **读法建议**:先读本章,再回看 [RAG 知识库模板](../../templates/rag-knowledge-base/README.md)。你会更容易看懂:RAG 的重点不是「模型更聪明」,而是「证据更可靠」。 --- ## 🎯 随堂检验 --- ## 本案例小结 - **RAG 不是把文档丢给 AI,而是搭一条证据生产线。** 离线链路负责把文档变成可检索证据,在线链路负责把问题变成可引用答案。 - **它不会先被 QPS 压垮,会先被质量压垮。** 检索不准、引用错误、权限越界、评测缺失,比 10 QPS 更危险。 - **纯向量检索不够。** 企业知识库里有大量编号、人名、条款号和专有名词,混合检索 + 重排通常更稳。 - **Graph RAG 是增强检索,不是银弹。** 当问题核心从「找相似段落」变成「找实体关系和适用路径」时,知识图谱能补上普通 RAG 的短板;但它同时引入抽取、更新、权限和评测成本。 - **权限要在检索前生效。** 敏感块一旦进入模型上下文,就不能靠前端隐藏来补救。 - **没有证据就拒答。** 企业 AI 的成熟不是永远有话说,而是在证据不足时敢于说不知道。 - **评测是架构的一部分。** 切块、模型、prompt、重排任何一处改动,都可能让质量退化;没有评测集就无法稳定演进。 > **承上启下**:这一章把 [RAG 知识库模板](../../templates/rag-knowledge-base/README.md) 落到一个企业内部产品。下一章如果继续写实时聊天 / 协同系统,压力会再次变化:重点会从答案可信,转向长连接、消息时序、离线投递和多人编辑冲突。 --- ## 相关链接 - 模板对照:[RAG 知识库](../../templates/rag-knowledge-base/README.md) · [AI 对话产品](../../templates/ai-chat-product/README.md) · [向量数据库](../../templates/vector-database/README.md) · [搜索引擎](../../templates/search-engine/README.md) - 方法论:[02 · 架构师的思考框架](../../tutorial/02-架构师的思考框架.md) · [17 · 大模型时代的架构判断](../../tutorial/17-大模型时代的架构判断.md) · [22 · AI 原生系统设计](../../tutorial/22-AI原生系统设计.md) - 硬骨头:[16 · 安全与多租户架构](../../tutorial/16-安全与多租户架构.md) · [25 · 评测驱动](../../tutorial/25-评测驱动把够好写进架构.md)