Skip to content

01. RAG 详解

版本:v1.1

最后更新:2026-07-06

适用对象:希望系统理解 RAG 原理、架构、检索优化、评测与企业落地的开发者和产品技术负责人

1. 什么是 RAG

RAG 是 Retrieval-Augmented Generation 的缩写,通常译为“检索增强生成”。

一句话解释:

  • RAG 不是让模型凭记忆回答,而是先从外部知识库检索证据,再让模型基于证据生成答案。

一个典型 RAG 回答过程可以写成:

text
User Question
 -> Query Understanding
 -> Retrieval
 -> Rerank / Filter
 -> Context Assembly
 -> Generation
 -> Citation / Verification

RAG 的关键不是“把文档塞给模型”,而是:

  • 找到正确证据
  • 控制证据质量
  • 让模型忠实使用证据
  • 对答案和引用进行评估

如果没有检索、排序、上下文构造和评测,只是把几个文档片段拼进提示词里,严格来说还不能算一个可靠的 RAG 系统。


2. RAG 的论文背景

RAG 这个名字来自论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks。这篇论文的核心思想是把两类能力结合起来:

能力含义优点局限
参数化记忆模型权重里学到的知识推理速度快,语言能力强知识可能过时,难以追踪来源
非参数化记忆外部文档、索引、数据库可更新、可追溯、可扩展依赖检索质量和数据治理

论文里的 RAG 模型会先检索相关文档,再把检索结果和问题一起交给生成模型。它解决的是一类知识密集型任务:问题的答案往往依赖外部事实,而不是只靠语言模式就能稳定回答。

这给工程实践带来一个很重要的启发:

  • 模型不应该承载所有知识,知识应该放在可更新、可审计、可检索的外部系统里。

3. 为什么需要 RAG

只靠模型自身回答,会遇到几个现实问题。

3.1 私有知识缺失

模型不知道企业内部文档、工单、制度、项目记录和最新产品资料。

3.2 知识更新慢

模型训练完成后,参数中的知识不会随着你的业务文档自动更新。

3.3 缺少证据链

很多企业场景不能只要一个答案,还要知道:

  • 答案依据哪份文档
  • 文档版本是什么
  • 是否符合权限范围
  • 出错后能否追溯

3.4 长上下文成本高

把所有资料都放进上下文窗口,通常会遇到:

  • token 成本高
  • 延迟高
  • 噪音多
  • 模型注意力被稀释

3.5 幻觉风险

没有证据约束时,模型容易生成看似合理但无法验证的内容。

RAG 的价值就是把“回答问题”变成一条可观察、可优化的链路。


4. RAG 的核心心智模型

可以把 RAG 看成三个系统的组合。

text
Knowledge System
 -> Retrieval System
 -> Generation System

4.1 Knowledge System

负责知识从哪里来、如何清洗、如何更新、如何授权。

它包括:

  • 文档源
  • 解析器
  • chunking 策略
  • metadata
  • 权限模型
  • 版本管理

4.2 Retrieval System

负责把用户问题映射到候选证据。

它包括:

  • query 改写
  • embedding
  • 关键词检索
  • 向量检索
  • metadata filter
  • hybrid search
  • reranking

4.3 Generation System

负责把证据转成最终答案。

它包括:

  • prompt assembly
  • answer policy
  • citation policy
  • refusal policy
  • structured output
  • answer verification

RAG 做不好时,问题可能出现在任何一层。只调最后的 Prompt,通常只能解决一小部分问题。


5. RAG 的两条主链路

RAG 不是只有在线问答阶段,它至少有两条链路。

5.1 离线索引链路

离线链路负责把文档变成可检索资产。

text
Document Sources
 -> Ingestion
 -> Parsing
 -> Cleaning
 -> Chunking
 -> Metadata Enrichment
 -> Embedding
 -> Indexing
 -> Quality Check

每一步都可能影响最终答案。

环节常见问题影响
Ingestion文件重复、版本混乱、权限丢失检索结果脏或越权
ParsingPDF 表格丢失、标题层级丢失证据不完整
Cleaning去掉了关键字段或保留太多噪音召回不准
Chunking切太碎或切太大语义断裂或噪音过多
Metadata来源、时间、权限缺失难过滤、难追溯
Embedding模型不匹配、未重建索引召回质量差
Indexing删除和更新不及时过期内容被召回

5.2 在线查询链路

在线链路负责把用户问题转成答案。

text
Question
 -> Normalize / Rewrite
 -> Retrieve
 -> Rerank
 -> Filter
 -> Build Context
 -> Generate Answer
 -> Validate / Cite

在线链路的核心目标是:

  • 用尽量少、尽量准、可追溯的证据支持回答。

6. 文档解析与清洗

RAG 系统的上限经常由文档处理决定。

6.1 文档解析要保留结构

企业文档里,结构信息往往比正文还重要。

应该尽量保留:

  • 标题层级
  • 表格
  • 列表
  • 代码块
  • 图片说明
  • 页码
  • 章节路径
  • 更新时间
  • 来源链接

如果解析后只剩一坨纯文本,检索和引用都会变难。

6.2 清洗不是越干净越好

清洗的目标不是把文本变短,而是保留对回答有价值的信息。

应该移除:

  • 重复页眉页脚
  • 无意义水印
  • 大量导航菜单
  • 广告和噪音

应该谨慎保留:

  • 表格字段名
  • 编号
  • 产品型号
  • 法条条款
  • 错误码
  • 时间和版本

这些内容对语义模型不一定显眼,但对企业问答往往是关键。


7. Chunking 为什么决定下限

Chunking 是把长文档切成检索单元的过程。它决定了检索系统能看到什么粒度的知识。

7.1 切太大的问题

  • 一个 chunk 里包含太多主题
  • 相似度被平均掉
  • top-k 召回里噪音增多
  • 放进上下文后占用大量 token

7.2 切太小的问题

  • 缺少前后文
  • 表格或流程被切断
  • 标题和正文分离
  • 模型拿到证据却无法完整回答

7.3 常见切分策略

策略适合场景风险
固定长度切分快速原型、纯文本容易切断语义
滑动窗口需要保留上下文重复内容多,成本上升
按段落切分文档结构清晰段落长度不稳定
按标题层级切分手册、制度、知识库依赖解析质量
语义切分长文、主题变化明显实现复杂,需要评测
表格专用切分财务、产品、合同需要保留列名和行语义

7.4 推荐做法

更稳的做法通常是:

  1. 保留标题路径,例如 一级标题 > 二级标题 > 当前段落
  2. 每个 chunk 带上来源、页码、更新时间、权限等 metadata。
  3. 对表格、代码、FAQ 使用专门切分策略。
  4. 用评测集调 chunk size 和 overlap,而不是凭感觉。

8. Embedding 与向量索引

Embedding 会把文本转成向量,使语义相近的文本在向量空间里更接近。

OpenAI Embeddings 文档把 embedding 描述为文本相关性的数值表示,可用于搜索、聚类、推荐、异常检测和分类等任务。放到 RAG 里,它主要承担语义检索的基础表示。

8.1 Query embedding 和 document embedding

典型向量检索会分别处理:

  • 文档 chunk embedding:离线生成并写入索引
  • 用户 query embedding:在线生成,用来查找相似 chunk

8.2 选择 embedding 模型要看什么

维度说明
语言覆盖是否支持中文、英文或多语言
领域适配是否适合代码、法律、医疗、客服等语料
向量维度影响存储、检索速度和成本
成本入库和查询都会产生调用或算力成本
更新策略换 embedding 模型通常需要重建索引

8.3 常见坑

  • 文档用一个 embedding 模型,查询用另一个模型。
  • embedding 模型更新后没有重建历史索引。
  • 把过长、过杂的 chunk 直接做 embedding。
  • 忽略中文分词、英文缩写、产品编号等精确匹配问题。

9. 检索方式:关键词、向量、混合检索

RAG 检索不是只有向量检索。

9.1 关键词检索

关键词检索适合:

  • 产品型号
  • 错误码
  • 人名
  • 项目名
  • 条款编号
  • 精确字段

它的短板是对同义表达、口语化问题和抽象概念不够友好。

9.2 向量检索

向量检索适合:

  • 语义相近表达
  • 用户问题和文档措辞不同
  • 概念型查询
  • 自然语言问答

它的短板是可能召回“语义相关但业务不相关”的内容,尤其在专有名词和编号场景里。

9.3 混合检索

OpenAI File Search 文档说明,文件搜索会同时使用语义检索和关键词检索,并基于 vector stores 管理文件内容。这也反映了真实 RAG 系统的常见方向:混合检索通常比单一路径更稳。

典型混合检索链路:

text
Query
 -> Keyword Search
 -> Semantic Search
 -> Merge Candidates
 -> Metadata Filter
 -> Rerank
 -> Context Assembly

混合检索的关键不是“多加一个搜索方式”,而是让不同信号解决不同问题。


10. Query 改写与查询理解

用户问题通常不是天然适合检索的。

10.1 为什么要 query 改写

常见用户问题:

  • 太短:报错 500
  • 太口语:这个咋弄
  • 有指代:刚才那个配置怎么改
  • 多意图:帮我查价格,顺便看能不能退款
  • 缺上下文:审批规则是什么

直接拿这些 query 做检索,效果往往不稳定。

10.2 常见改写方式

改写方式示例
补全上下文把“这个配置”改成具体配置名
拆分多意图价格问题和退款问题分开检索
生成关键词从自然语言里提取错误码、产品名、条款号
多查询扩展同一问题生成多个等价检索 query
语言归一中英文术语、缩写、别名统一

10.3 改写的风险

query 改写可能引入新错误。

所以要记录:

  • 原始 query
  • 改写后的 query
  • 检索结果
  • 最终答案

否则线上排障时很难知道问题出在哪里。


11. Reranking 与上下文构造

初始检索通常只是找候选集,不能直接把候选全部塞给模型。

11.1 reranking 解决什么

reranking 的目标是重新排序候选证据,让真正有用的片段排到前面。

它通常用于:

  • 初始召回较多
  • 混合检索需要统一排序
  • top-k 命中但高价值内容不靠前
  • 需要压缩上下文

11.2 上下文构造要做什么

Context assembly 不是简单拼接,它至少要考虑:

  • 去重
  • 排序
  • 来源标记
  • 权限过滤
  • token 预算
  • 证据完整性
  • 相邻 chunk 补全
  • 引用编号

推荐格式:

text
<context>
[doc_id: A, title: ..., section: ..., updated_at: ...]
内容片段...

[doc_id: B, title: ..., section: ..., updated_at: ...]
内容片段...
</context>

这样模型更容易引用来源,系统也更容易做回溯。


12. 生成阶段:Prompt 不是补救一切的魔法

RAG 的生成 Prompt 应该明确三类规则。

12.1 证据边界

text
只能基于提供的 context 回答。
如果 context 不足以回答,请明确说明资料不足。
不要编造文档中没有的政策、数字、链接、负责人或版本。

12.2 输出结构

text
## 答案
[直接回答]

## 依据
- [引用 doc_id 和关键片段]

## 不确定点
- [没有则写“无”]

12.3 冲突处理

text
如果不同资料存在冲突:
1. 优先使用更新时间更近的资料。
2. 明确说明冲突来源。
3. 不要自行合并成一个看似确定的结论。

生成阶段的核心不是让答案更长,而是让答案忠实、可验证、可追踪。


13. 引用与可追溯

RAG 里的引用不是装饰,而是生产系统的审计能力。

13.1 好引用应该满足什么

  • 能定位到文档
  • 能定位到章节或页码
  • 能知道文档版本
  • 能看到更新时间
  • 能确认用户是否有权限访问

13.2 常见引用问题

问题原因
引用存在但答非所问模型没有真正使用证据
引用到错误文档检索排序或上下文拼接问题
引用粒度太粗chunk 和 metadata 设计不足
引用无法打开来源链接或权限同步失败

如果引用不能帮助排查和复核,它就只是“看起来可信”。


14. RAG 评测:必须拆开看

RAG 评测至少要分为检索层和生成层。RAGAS、ARES 等研究和工具也都强调:RAG 评估不能只看最终答案,而要分别关注上下文相关性、答案忠实性、答案相关性等维度。

14.1 检索层指标

指标关注点
Recall@k正确证据是否进入前 k 个结果
Hit Rate是否至少命中一个有效证据
MRR第一个正确证据排在多靠前
nDCG排序质量是否合理
Context Precision放进上下文的片段有多少真正有用
Context Recall所需证据是否被上下文覆盖

14.2 生成层指标

指标关注点
Faithfulness答案是否忠实于证据
Answer Relevance答案是否回答了用户问题
Citation Accuracy引用是否支撑答案
Completeness是否覆盖问题所需关键点
Refusal Quality证据不足时是否正确拒答
Safety是否泄露敏感信息或越权内容

14.3 最小评测集

建议先准备 50-100 条样本:

  • 常规问答
  • 精确编号查询
  • 多文档综合问题
  • 证据不足问题
  • 文档冲突问题
  • 权限边界问题
  • 过期文档问题
  • 容易误召回的问题

每条样本要记录:

  • 用户问题
  • 期望答案
  • 必须命中的证据
  • 允许使用的文档范围
  • 不允许出现的内容
  • 失败类型标签

15. RAG 常见失败模式

失败类型表现根因修复方向
覆盖失败知识库没有答案文档缺失或未入库补文档、补同步流程
解析失败原文有答案但索引里没有PDF、表格、标题解析丢失改解析器和结构保留
切分失败召回片段不完整chunk 太小或切断上下文调整 chunk 和 overlap
召回失败有答案但没搜到embedding、query、索引问题query 改写、混合检索
排序失败找到了但排很后rerank 不足或权重不合理reranking、权重优化
过滤失败正确内容被过滤掉metadata 或权限过滤过严检查过滤规则
上下文污染塞了很多无关片段top-k 过大、去重不足压缩、去重、阈值
消费失败证据在上下文里但答案错prompt 弱或模型没遵守证据强化证据规则和引用
引用失败答案对但引用错引用生成和证据绑定弱显式 doc_id、引用校验
权限失败用户看到不该看的内容权限未进入检索过滤权限前置过滤
更新失败召回旧政策索引没有增量更新版本和重建机制

这张表比“模型答错了”更有行动价值。


16. 优化 RAG 的推荐顺序

当 RAG 效果不好时,不建议直接去调 Prompt。更稳的顺序是:

  1. 看原始知识是否覆盖答案。
  2. 看解析后文本是否保留关键信息。
  3. 看 chunk 是否完整表达语义。
  4. 看 metadata 是否能支持过滤和追溯。
  5. 看检索是否命中正确证据。
  6. 看 rerank 是否把关键证据排到前面。
  7. 看上下文是否噪音过多。
  8. 看 Prompt 是否约束证据使用。
  9. 看模型是否适合当前任务。
  10. 把失败样例加入回归集。

很多团队会跳过前 7 步,直接改提示词。这样偶尔能修好一个样例,但很难让系统整体变稳。


17. RAG、Fine-tuning、长上下文怎么选

方案适合解决不适合解决
RAG私有知识、可更新知识、证据引用固定风格学习、深层行为对齐
Fine-tuning输出风格、任务模式、格式习惯高频变化的知识更新
长上下文少量长材料临时分析大规模知识库长期检索
Prompt Engineering任务定义、输出约束、流程控制缺失知识或检索质量差

一个实用判断:

  • 知识经常变,优先 RAG。
  • 行为要稳定,考虑 fine-tuning。
  • 材料少但长,考虑长上下文。
  • 输出不稳定,先检查 Prompt 和结构化输出。

这些方案经常组合使用,而不是互斥。


18. 企业 RAG 的权限与安全

企业 RAG 最大的风险之一不是答错,而是越权召回。

18.1 权限过滤要前置

权限不能只在答案生成后处理。更稳的做法是:

text
User Identity
 -> Allowed Scopes
 -> Retrieval Filter
 -> Candidate Documents
 -> Answer Generation

也就是说,用户无权访问的文档不应该进入候选集。

18.2 metadata 必须支持权限

常见权限字段:

  • tenant_id
  • department_id
  • document_acl
  • sensitivity_level
  • owner_team
  • valid_from
  • valid_to

18.3 安全边界

RAG Prompt 还要处理:

  • prompt injection
  • 文档里的恶意指令
  • 敏感信息泄露
  • 跨租户召回
  • 外部链接伪造

尤其要注意:文档内容不是系统指令。来自文档的“忽略上面的规则”等文本应该作为被检索内容,而不是更高优先级的指令。


19. 成本与性能优化

RAG 的成本通常来自四块:

  • 文档入库和 embedding
  • 向量库与索引存储
  • 在线检索和 rerank
  • 生成模型 token

19.1 常见优化方式

优化点做法
入库成本增量索引、去重、只重建变化文档
检索成本metadata 过滤、缓存热门 query
上下文成本top-k 控制、去重、压缩、相邻 chunk 按需补全
生成成本小模型预处理、大模型生成、结构化输出减少重试
延迟并行检索、异步 rerank、流式输出

19.2 不要为了省 token 破坏证据

压缩上下文要谨慎。

如果压缩导致:

  • 删除关键限定条件
  • 删除表格列名
  • 删除版本信息
  • 删除否定词

答案质量会明显下降。


20. 一个可落地的 RAG 最小架构

如果从零做一个企业知识库 RAG,可以先做下面这套最小架构。

text
文档源
 -> 文档同步任务
 -> 解析与清洗
 -> chunk + metadata
 -> embedding + 索引
 -> 检索 API
 -> rerank / filter
 -> answer prompt
 -> 引用输出
 -> 日志与评测回流

20.1 最小字段设计

每个 chunk 至少建议有:

json
{
  "chunk_id": "string",
  "document_id": "string",
  "title": "string",
  "section_path": ["string"],
  "source_url": "string",
  "page": 1,
  "updated_at": "datetime",
  "tenant_id": "string",
  "permission_scope": ["string"],
  "content": "string"
}

20.2 最小日志设计

每次问答至少记录:

json
{
  "question": "string",
  "rewritten_query": "string",
  "retrieved_chunk_ids": ["string"],
  "used_chunk_ids": ["string"],
  "answer": "string",
  "citations": ["string"],
  "latency_ms": 0,
  "failure_type": null
}

没有日志,就很难复盘 RAG 失败。


21. RAG 上线检查清单

数据与索引

  • 文档来源是否明确
  • 是否有增量同步机制
  • 是否保留标题、表格、页码和来源
  • 是否有 chunk_id、document_id、updated_at
  • embedding 模型变更后是否能重建索引

检索与排序

  • 是否支持关键词和语义检索
  • 是否支持 metadata 过滤
  • 是否按 query 类型评测
  • 是否能观察 top-k 结果
  • 是否有 rerank 或阈值策略

生成与引用

  • 是否要求只基于 context 回答
  • 证据不足时是否能拒答
  • 是否输出引用
  • 引用是否能定位到原文
  • 是否能处理文档冲突

权限与安全

  • 权限过滤是否发生在检索前或检索中
  • 用户无权文档是否不会进入候选集
  • 是否处理 prompt injection
  • 是否记录敏感访问日志

评测与运维

  • 是否有固定评测集
  • 是否分开评估检索和生成
  • 失败样例是否回流
  • 是否有版本和回滚机制
  • 是否监控成本、延迟和拒答率

22. 学习和实践路线

建议按下面顺序学习和落地:

  1. 先理解 RAG 的检索增强思想。
  2. 学 Embeddings 和向量数据库。
  3. 做一个最小知识库问答原型。
  4. 加入 metadata、来源、权限和引用。
  5. 建立最小评测集。
  6. 优化 chunking 和混合检索。
  7. 加 rerank、query 改写和上下文压缩。
  8. 建立失败复盘和回归机制。

如果跳过评测,RAG 很容易长期停留在“demo 感觉不错”的阶段。


23. 推荐搭配阅读


24. 参考资料

以下资料在 2026-07-06 检查时可访问:

论文与研究

官方文档


25. 一句话总结

RAG 是一套把外部知识、检索系统和生成模型组合起来的工程方法。它的难点不在“会不会把文档塞进 Prompt”,而在文档流水线、检索质量、上下文构造、证据引用、权限安全和评测闭环是否足够扎实。