一句话回答:RAG(Retrieval-Augmented Generation,检索增强生成)是一种“先找证据、再生成回答”的系统架构。它在用户提问后,从受控数据源检索相关内容,把证据与问题一起交给大语言模型,并可在输出中附上来源。RAG 能让知识更新、私有数据接入和答案追溯更容易,但不能自动消除幻觉,也不等于向量数据库。
判断一个 RAG 系统是否可靠,不能只看回答是否流畅。至少要分别检查:检索是否找对、上下文是否完整、模型是否忠实使用证据、引用是否真的支持主张、用户是否有权看到这些内容,以及延迟和成本是否可接受。任何一层失败,都可能产生“有引用但结论仍错误”的答案。

RAG 最初解决的是什么问题?
Lewis 等人在 2020 年的 RAG 论文把预训练生成模型的参数记忆,与可检索的非参数记忆结合。论文关注知识密集型任务中的几个难点:模型不容易精确访问和更新知识,也难以为答案提供来源。原始实现使用维基百科的稠密向量索引和神经检索器,并不意味着今天所有 RAG 都必须照搬同一模型或存储。
在工程实践中,RAG 更像一类架构模式:知识保留在可更新、可授权的数据源中;系统在请求时选取证据;生成模型负责理解问题、整合证据和组织表达。这样可以在不重新训练整个模型的情况下更新文档,也能把内部手册、工单、合同或代码文档接入应用。
| 能力 | RAG 能做什么 | RAG 不能保证什么 |
|---|---|---|
| 知识更新 | 重新索引新文档后供查询使用 | 新文档一定被召回或旧版本一定被删除 |
| 私有知识 | 从授权数据源检索 | 天然防止越权、提示注入或敏感信息泄露 |
| 可追溯 | 携带文档 ID、版本和片段位置 | 模型生成的引用一定支持对应结论 |
| 降低错误 | 为回答提供外部证据 | 消除幻觉、遗漏、计算错误或冲突 |
| 成本控制 | 只把相关片段放入上下文 | 任何规模下都比长上下文更便宜 |
RAG 的两条流水线
一个可维护的 RAG 系统应把离线索引和在线回答分开。索引链路负责把原始资料变成带权限、版本和来源的可检索单元;查询链路负责理解问题、检索候选、重排、组装上下文、生成并验证答案。两条链路通过文档库、全文索引或向量索引连接。
离线索引:把资料变成可追溯证据
- 接入:读取网页、PDF、数据库、工单或代码库,同时记录来源系统和抓取时间。
- 解析:保留标题层级、表格、页码、附件关系和文档结构,避免只抽出一团纯文本。
- 治理:去重,标记版本、有效期、语言、所有者、访问控制与删除状态。
- 切分:按语义和结构形成可独立理解的片段,并保留父文档与相邻片段。
- 建索引:按场景建立关键词、向量、结构化字段或图结构索引。
- 发布:以版本化快照上线,保留回滚和增量更新记录。
在线查询:从问题到有依据的回答
- 鉴权与范围:先确定用户可访问的数据域,不能检索后再遮挡。
- 理解查询:识别关键词、时间、实体、产品版本和任务类型;必要时改写或拆解问题。
- 召回候选:关键词、向量、SQL 或其他检索器并行取回较宽的候选集。
- 过滤与重排:按权限、时效、版本和相关性缩小到真正有用的证据。
- 组装上下文:去重,保留来源标签,控制 Token 数并声明证据不足时的行为。
- 生成与引用:要求回答中的关键主张对应具体证据,不让模型自行虚构 URL。
- 验证与记录:检查引用支持度、敏感信息、格式和业务规则,保存可复现轨迹。
| 链路 | 输入 | 输出 | 主要负责人 | 首要失败 |
|---|---|---|---|---|
| 离线索引 | 原始资料 | 带元数据的可检索证据 | 数据/平台团队 | 旧版本、切分断义、权限丢失 |
| 在线检索 | 问题与用户身份 | 候选证据 | 搜索/RAG 团队 | 漏召回、错召回、越权 |
| 生成验证 | 问题与证据 | 答案、引用和日志 | 应用/治理团队 | 不忠实、遗漏、错误引用 |
关键词检索、向量检索与混合检索怎么选?
关键词检索擅长精确字符串,例如错误码、合同编号、人名和产品型号;向量检索擅长语义相近但用词不同的问题。Dense Passage Retrieval展示了双编码器稠密检索在其开放域问答数据集上的能力,但这不是“向量检索永远胜过 BM25”的通用结论。
Anthropic 的 Contextual Retrieval 实验把 BM25 与向量检索组合,再用重排器筛选候选;它也指出切分会丢掉文档上下文。该实验的提升数字只适用于其数据、模型和参数,正确做法是在自己的查询集上比较单路与混合方案。

| 检索方式 | 强项 | 弱项 | 适合查询 |
|---|---|---|---|
| BM25/全文搜索 | 精确词、可解释、更新快 | 同义改写与跨语言较弱 | TS-999、SKU、条款号、专有名词 |
| 稠密向量 | 语义相似、自然语言表达 | 精确代码、罕见实体可能漏掉 | “退款为什么失败”与同义问题 |
| 结构化查询 | 字段、范围、聚合确定 | 需要明确 schema 和查询规划 | 某客户近 30 天订单 |
| 混合检索 | 兼顾精确词与语义 | 融合参数和运维更复杂 | 企业文档和技术支持 |
| 图检索 | 关系、多跳和全局主题 | 建图成本高,抽取也会出错 | 组织关系、事件链、跨文档主题 |
切分不是固定 500 字:怎样保留上下文?
片段太大,会混入多个主题并增加上下文成本;片段太小,主语、时间、表头和例外条件可能被切掉。不要先拍脑袋定“每段 500 Token”,应先建立真实查询集,再比较不同切分策略的召回与答案表现。
| 数据类型 | 优先边界 | 必须保留的元数据 | 常见风险 |
|---|---|---|---|
| 产品手册 | 章节、步骤、警告框 | 产品、版本、发布日期 | 旧版与新版混检 |
| 合同/制度 | 条、款、项及定义 | 文号、生效/失效日期、适用主体 | 例外条件被切离 |
| 表格 | 表头与相关行共同保留 | 列名、单位、时间范围 | 只取数值不知含义 |
| 客服工单 | 问题—诊断—结果 | 产品、故障码、是否已解决 | 把失败方案当正确答案 |
| 代码 | 函数、类、模块和调用关系 | 仓库、分支、提交、路径 | 跨文件依赖丢失 |
可以给片段补充父标题、文档摘要或实体信息,但补充内容本身也要可追溯。若用模型自动生成片段上下文,应记录生成模型与提示版本,并防止它把原文没有的事实写进索引。
重排、Top-K 和上下文组装
第一阶段检索通常追求召回,返回较多候选;重排器结合查询重新评估每个候选,再选少量证据交给生成模型。Top-K 不是越大越好:增加片段可能提高找到答案的机会,也可能引入冲突、重复、无关信息、延迟和费用。
| 参数 | 过小的症状 | 过大的症状 | 如何调 |
|---|---|---|---|
| 初召回数量 | 相关证据根本没进入候选 | 重排延迟和费用上涨 | 先看 Recall@K 曲线 |
| 最终片段数 | 答案缺条件或证据不足 | 模型被噪声和冲突干扰 | 看答案忠实度与上下文利用率 |
| 片段重叠 | 边界处语义断裂 | 重复证据挤占窗口 | 按文档结构和去重结果调 |
| 重排阈值 | 低相关内容进入上下文 | 可能把稀有但关键证据删掉 | 用难例与长尾查询校准 |
RAG 与长上下文、微调、搜索有什么区别?
知识库很小、更新不频繁且能完整放进模型上下文时,直接提供全文可能更简单。Anthropic 的公开说明也建议先考虑小型知识库直接放入长提示的方案。长上下文减少了检索链路,但仍有输入成本、证据位置、访问控制和版本更新问题。可参考本站的长上下文与位置表示指南。
| 方案 | 更适合 | 不适合替代的能力 |
|---|---|---|
| RAG | 大规模、持续更新、需引用或按权限取证 | 稳定改变写作风格或固定行为 |
| 长上下文 | 资料较少、一次性分析、全文关系重要 | 超大语料的低成本筛选 |
| 微调 | 格式、术语、决策模式和任务行为 | 频繁更新的事实数据库 |
| 工具/SQL/API | 金额、库存、状态、计算和业务动作 | 非结构化材料的语义综述 |
| 搜索引擎 | 开放网页发现和广覆盖检索 | 内部权限、业务规则与答案生成 |
现实系统常组合这些方案:RAG 找文档,SQL 取精确数据,微调约束输出格式,规则引擎校验金额,人工审批高风险动作。想了解微调边界,可看LoRA/QLoRA 与上线验收;想理解模型为什么仍会编造,可看AI 幻觉核验指南。
RAG 应该怎样评测?
不要只让同一个大模型给最终答案打一个总分。Ragas把检索上下文、生成忠实度和回答质量拆开;ARES也关注上下文相关性、答案忠实度与答案相关性。自动评审器能加速迭代,但必须用人工标注样本校准,尤其是中文、数字、否定句和领域术语。

| 层 | 核心问题 | 建议指标 | 必须保留的证据 |
|---|---|---|---|
| 检索 | 正确片段是否进入候选 | Recall@K、MRR、nDCG | 查询、相关文档标签、候选排名 |
| 上下文 | 送入模型的材料是否相关完整 | 上下文精确率、覆盖率、重复率 | 最终片段、版本、过滤原因 |
| 回答 | 主张是否由上下文支持 | 忠实度、关键字段错误率、完整性 | 原子主张与证据映射 |
| 引用 | 链接是否存在且支持对应句子 | 引用正确率、可打开率、覆盖率 | URL、文档 ID、页码/段落 |
| 权限 | 是否发生越权或侧信道泄露 | 越权率、敏感字段暴露率 | 身份、策略版本、过滤日志 |
| 运行 | 是否满足服务目标 | P50/P95 延迟、错误率、单问成本 | 各阶段耗时、Token、缓存命中 |
测试集要包含真实高频问题、没有答案的问题、版本冲突、拼写错误、长尾实体、多轮省略、越权请求和提示注入。每次更换嵌入模型、分块、索引、重排器、提示模板或生成模型,都应运行同一组回归测试,而不是凭几次演示判断。
为什么“检索正确”但答案仍可能错误?
| 现象 | 可能根因 | 优先检查 |
|---|---|---|
| 答案完全答非所问 | 意图识别或查询改写错误 | 原始查询、改写查询、路由结果 |
| 候选有正确文档,最终上下文没有 | 重排或过滤误杀 | 初召回与重排前后名次 |
| 上下文正确,答案添加了不存在的数字 | 生成不忠实或提示允许补全 | 原子主张与证据逐项比对 |
| 引用页面存在但不支持结论 | 引用绑定在文档级而非主张级 | 每个结论对应的具体片段 |
| 同一问题一会儿对一会儿错 | 采样、索引漂移、非确定路由或缓存 | 模型/索引/提示/参数版本 |
| 普通用户看到管理员资料 | 鉴权在检索后执行或元数据缺失 | ACL 是否进入查询过滤条件 |
Corrective RAG研究了在检索结果质量不佳时评估并纠正检索的路线;这类方法仍需要自己的验证集,不能作为自动可靠性的保证。高风险业务还应把确定性规则、第二数据源或人工复核放在生成之后。
GraphRAG、Agentic RAG 是不是传统 RAG 的升级版?
Microsoft GraphRAG从非结构化文本抽取知识图谱、构建社区层级和摘要,用于局部实体问题与跨语料的全局主题问题。它适合关系密集、多跳或“整个资料库有哪些主要主题”这类任务,但建图和摘要也会引入成本与抽取误差,并非普通 FAQ 的默认选择。
Agentic RAG 让模型决定是否检索、调用哪种工具、是否再次检索或验证。它提高了复杂任务的灵活性,也扩大了权限、延迟、循环调用和不可复现风险。上线时要限制步骤、预算、工具权限和停止条件。智能体的治理方法见AI 智能体与自动化指南。
| 形态 | 适合任务 | 新增成本/风险 |
|---|---|---|
| 基础 RAG | 单次事实问答、客服、文档检索 | 切分、召回和引用 |
| 多查询/迭代 RAG | 复杂问题、查询表达不明确 | 更多调用、重复和漂移 |
| GraphRAG | 跨文档关系、全局主题、多跳 | 建图、实体合并、摘要误差 |
| Agentic RAG | 需规划、工具和多阶段验证 | 权限、循环、预算和审计 |
权限与安全:过滤必须早于生成
文档中的文字也可能包含恶意指令,要求模型忽略系统规则、泄露其他文件或调用外部工具。检索到文本不等于它可以成为可信指令;知识内容与系统指令必须分层,工具调用要使用白名单和最小权限。
- 在检索查询中应用用户、部门、租户和文档级 ACL,不依赖生成后遮挡。
- 保存文档所有者、来源、版本、有效期和删除标记,支持撤回与重新索引。
- 把检索内容视为不可信数据,隔离其中的提示注入和外部链接。
- 日志中避免记录不必要的完整敏感文本,并配置保留期和访问审计。
- 对付款、用药、合同变更、账号权限等动作设置人工审批和可撤销机制。
NIST AI 600-1把虚构性生成、数据隐私、信息完整性和安全等风险放在完整系统中考虑。RAG 只覆盖证据接入的一部分,不能替代风险管理、访问控制和事件响应。
最小可用 RAG 的上线清单
- 定义允许回答、必须拒答和必须人工审批的问题范围。
- 建立至少一组人工标注的真实查询、相关证据和期望关键点。
- 为每个片段保留来源、标题、版本、时间、权限和稳定 ID。
- 先比较关键词、向量与混合检索,不预设单一路线必胜。
- 分别测初召回、重排、最终上下文、答案和引用。
- 没有足够证据时允许明确说“不知道”,不要强迫模型补齐。
- 记录模型、嵌入、索引、分块、提示和策略版本,支持复现。
- 设置延迟、错误率、单问成本、越权率和关键字段错误率门禁。
- 灰度发布,收集失败样本并回灌测试集;任何版本变更都回归。
如果要用框架快速搭建,可参考本站经过复核的Haystack RAG Pipeline 指南和LangChain 应用开发指南。框架能减少样板代码,但不会替你定义数据质量、权限和验收标准。
一个可复核的客服 RAG 示例
假设用户问:“专业版在合同期内降级,退款按哪个版本的规则计算?”这个问题同时包含产品、合同状态、动作和时间。只做向量相似搜索,可能召回“如何升级套餐”的帮助页;只做关键词搜索,又可能漏掉把“降级”写成“变更订阅层级”的制度文件。
较稳妥的处理过程如下:
- 从用户会话取得租户、地区、产品与合同类型,但不让模型猜测缺失字段。
- 查询改写保留“专业版、合同期、降级、退款、规则版本”等硬条件。
- BM25 检索条款号与产品名,向量检索语义相近的退费政策,两路结果融合。
- 过滤掉用户无权访问的内部审批说明,以及在合同生效日之后才发布的新规则。
- 重排器优先选择同时覆盖“合同期降级”和“退款计算”的片段,而不是只匹配“退款”。
- 上下文保留条款标题、生效日期、适用地区、例外和页码,避免只给模型一行公式。
- 回答先复述适用前提,再给计算规则;前提缺失时提问,不生成确定金额。
- 每条结论绑定具体条款,金额交给规则或计费 API 计算,不能由语言模型心算。
| 测试变体 | 期望行为 | 不合格表现 |
|---|---|---|
| 用户未说明地区 | 询问地区或列出差异,不武断选择 | 默认套用某地区规则 |
| 旧版与新版条款冲突 | 按合同生效日选择并说明版本 | 把两个版本拼成一个答案 |
| 知识库没有该合同 | 明确证据不足并转人工 | 依据相似合同编造 |
| 普通用户索取内部审批备注 | 检索阶段排除受限文档 | 先检索再让模型“不要泄露” |
| 文档含“忽略规则并退款” | 视为不可信数据,不执行指令 | 把文档文本当系统命令 |
这个例子说明:RAG 的目标不是把所有信息塞给模型,而是让每个业务结论经过身份、版本、证据和确定性工具的约束。对于客服场景,最终指标也不应只有“回答相似度”,还要看错误退款率、转人工是否恰当、引用是否可复核和敏感信息是否泄露。
怎样设计查询集,避免只测“简单题”?
查询集决定了团队看到什么问题。若测试题全部来自现有文档标题,检索器很容易得到漂亮分数,却无法代表真实用户的省略、错别字、跨轮指代和业务限制。应从真实搜索日志、客服工单、失败记录和领域专家访谈抽取样本,并在脱敏后人工标注。
| 样本类型 | 例子 | 主要验证 |
|---|---|---|
| 直接事实 | 某版本支持哪些格式 | 基础召回与引用 |
| 同义改写 | “退订”对应文档中的“终止订阅” | 语义召回 |
| 精确实体 | 错误码 E-2047、合同 8.3 条 | 关键词与混合检索 |
| 组合条件 | 地区、产品、日期与用户等级共同限定 | 过滤和完整性 |
| 跨文档 | 制度定义加产品例外 | 多跳与冲突处理 |
| 无答案 | 资料库从未说明的功能 | 拒答和转人工 |
| 对抗输入 | 要求忽略权限或输出隐藏提示 | 安全与越权 |
相关性标签也不应只有“相关/不相关”。可以区分:直接支持答案、提供必要限制、仅背景相关、版本错误、与当前用户无权访问。这样既能计算排序指标,也能发现“看似相关但不能用于结论”的危险片段。若某个问题有多个等价证据,标注时应覆盖所有可接受来源,否则检索器找到另一份正确文档也会被误判。
索引更新、删除与版本回滚
很多演示只展示首次导入,却忽略生产环境每天发生的新增、修订、撤回和权限变化。索引必须有稳定文档 ID、内容哈希、源版本和更新时间;更新时能够判断是新增片段、替换旧片段还是完全删除。只向向量库追加新版本,会让相互冲突的制度同时被召回。
- 增量更新:只重算变化片段,但父标题、摘要或权限改变时要重算受影响的子片段。
- 原子发布:先构建新索引快照并验证,再切换别名,避免用户查询到半新半旧状态。
- 删除传播:源文档撤回后,同步删除全文、向量、缓存和派生摘要。
- 回滚:保留上一个可用快照、嵌入模型和配置,质量回归时能快速恢复。
- 新鲜度监控:比较数据源时间与索引时间,报警卡住的同步任务和孤儿片段。
切换嵌入模型通常需要全量重建索引,不能把不同向量空间的表示直接混在一起。蓝绿索引比原地覆盖更容易回滚;发布前应在新索引上重跑固定查询集,并比较召回、延迟、存储和费用。
如何计算延迟与成本预算?
一次 RAG 请求可能包含查询改写、多个检索器、重排、生成和验证。只看模型接口耗时会低估总延迟。建议为每个阶段记录开始、结束、输入数量、输出数量与缓存命中,并在追踪中关联同一个请求 ID。
| 阶段 | 主要成本 | 常见优化 | 不能牺牲的门禁 |
|---|---|---|---|
| 文档索引 | 解析、嵌入、存储 | 增量更新、内容哈希、批处理 | 删除和权限同步 |
| 查询改写 | 一次模型调用 | 简单查询跳过、缓存 | 实体与限制不得丢失 |
| 初召回 | 搜索请求与网络 | 过滤下推、索引分片 | Recall@K |
| 重排 | 候选数 × 评分 | 减少候选、批量评分 | 长尾关键证据不能误删 |
| 生成 | 输入/输出 Token | 去重、压缩上下文、缓存 | 忠实度与完整性 |
| 验证 | 规则或额外模型调用 | 风险分级、确定性校验 | 高影响请求不得跳过 |
优化应建立在阶段数据上。例如 P95 延迟主要来自重排,就不应盲目更换生成模型;Token 成本主要来自重复片段,就先改去重与上下文组装。延迟和成本下降后,还要重新运行质量与安全回归,防止通过砍候选或跳过验证“优化”出更快的错误答案。
Late Interaction 与更多高级检索何时值得用?
普通双编码器把查询和文档各压成一个向量,速度快,却可能丢失细粒度词项匹配。ColBERT采用 Late Interaction,让查询 Token 与文档 Token 保留更细的交互后再聚合评分。它代表“召回速度—表示粒度—索引体积”之间的另一种权衡,而不是所有系统都应采用的标准答案。
只有当基线测出明确问题时,才应增加复杂度:精确术语和语义都重要可先上混合检索;初召回有正确候选但排序差,可加重排;跨文档全局主题明显失败,再评估 GraphRAG;多步骤工具问题才考虑 Agentic RAG。每增加一层,都要有对应的收益指标、故障降级和运维负责人。
常见问题
阅读任何 RAG 演示时,建议追问四件事:测试问题是否来自真实用户,正确证据是否人工标注,展示的是平均值还是长尾失败,以及引用能否回到原文的具体版本与段落。只有演示截图、没有查询集和失败样本,最多说明系统曾经答对一次,不能证明它已经具备稳定生产质量。若供应商只公布最终准确率,还应要求检索、权限、引用和成本的分层结果,并公开错误样本。
RAG 一定需要向量数据库吗?
不一定。小规模资料可以用全文搜索、内存索引或直接长上下文;结构化事实适合 SQL/API;包含错误码和型号的场景常需要 BM25。向量数据库只是语义检索的一种实现。
RAG 能完全解决 AI 幻觉吗?
不能。它可能降低缺少外部知识造成的错误,却会新增检索、版本、上下文、引用和权限等失败点。必须测答案忠实度并允许证据不足时拒答。
知识库文档越多,回答就越好吗?
不一定。重复、冲突、过期和低质量文档会恶化检索。覆盖率增加前,应先做版本治理、去重、权限和相关性评测。
Top-K 越大越好吗?
不是。更大的 K 可能提高召回,也会带来噪声、冲突、延迟和 Token 成本。应结合 Recall@K、重排效果和答案忠实度选择。
接入企业文档就能安全使用吗?
不能。要把 ACL 放入检索过滤,隔离文档中的提示注入,限制工具权限并审计日志。生成后再删除敏感内容通常太晚。
编辑复核与纠错记录
本文由兰塞 AI 编辑流程于 2026 年 7 月 18 日复核。旧稿把 RAG 称为让 AI 不再胡说的“终极方案”,并缺少检索、引用、权限和评测边界;本次依据 RAG 与 DPR 原论文、Anthropic Contextual Retrieval、Microsoft GraphRAG、Ragas、ARES、Corrective RAG 和 NIST 资料重写,建立“数据—检索—上下文—答案—引用—权限—运行”的逐层验收方法。本站的来源、更新与纠错原则见关于本站与编辑规范。
