1351 字
7 分钟
RAG:检索增强生成

RAG 解决什么问题#

大模型的知识固定在参数里,存在三个限制:

  • 训练语料有截止日期,无法回答最新事实;
  • 私有文档和领域知识没有进入预训练;
  • 参数化知识难以追溯来源,容易产生幻觉。

检索增强生成(Retrieval-Augmented Generation, RAG)在生成前先从外部知识库检索相关片段,把片段作为上下文交给模型,让模型基于证据回答。它不改变模型参数,更新知识只需更新索引。

RAG 与 知识增强 的“知识外用”路线一致;区别在于 RAG 特指“检索文档片段 + 生成”的工程流程。

基本流程#

RAG 通常分为离线和在线两条链路:

离线:文档 → 清洗 → 切块 → 向量化 → 索引
在线:问题 → 改写/向量化 → 检索 → 重排 → 拼接上下文 → 生成

1. 索引#

  • 文档清洗:去掉导航、广告、重复页眉页脚,保留正文和结构;
  • 切块(chunking):把长文档切成适合检索和放入上下文的片段。块太小缺乏上下文,块太大检索不精确且挤占提示长度。常见做法是按段落或标题切分,设置 10%–20% 的重叠,保留跨块语义;
  • 向量化:用嵌入模型把每个块编码为向量,见 词向量基础 和 词向量的评价;
  • 建索引:用向量数据库或近似最近邻(ANN)索引(如 HNSW、IVF)支持快速相似度检索。

2. 检索#

稀疏检索基于词项匹配,代表是 BM25:

score⁡(q,d)=∑t∈qIDF⁡(t)⋅f(t,d)(k1+1)f(t,d)+k1(1−b+b∣d∣/avgdl⁡)\operatorname{score}(q,d) = \sum_{t \in q} \operatorname{IDF}(t) \cdot \frac{f(t,d)(k_1+1)} {f(t,d) + k_1(1-b+b|d|/\operatorname{avgdl})}

它擅长精确匹配专有名词、数字和代码,但无法处理同义改写。

稠密检索把问题和文档编码为向量,用余弦相似度或内积检索:

sim⁡(q,d)=eqTed∥eq∥∥ed∥\operatorname{sim}(q,d) = \frac{\mathbf{e}_q^T \mathbf{e}_d} {\|\mathbf{e}_q\|\|\mathbf{e}_d\|}

它能捕捉语义相似,但可能忽略精确关键词。

混合检索把稀疏和稠密分数加权融合,兼顾两者。检索到候选后,可以用 cross-encoder 重排序:把问题和每个候选片段一起输入模型,输出更精细的相关性分数,取前几个送入生成。

3. 生成#

把问题和检索到的片段拼成提示:

请仅根据以下资料回答问题。资料中没有的信息,请回答“资料未提及”。
资料:
[1] ...
[2] ...
问题:...

常见约束包括:

  • 要求引用片段编号,便于追溯;
  • 明确“不知道”时不要编造;
  • 控制片段数量和长度,避免超出上下文窗口;
  • 对冲突资料要求说明分歧。

查询优化#

用户问题往往不适合直接检索,可以在检索前做改写:

  • 查询改写:把口语化问题改写成包含关键词的检索式;
  • 多查询:生成多个不同角度的查询,合并检索结果;
  • HyDE:先让模型生成一个假设答案,再用假设答案的向量去检索,适合问题和文档表述差异较大的场景;
  • 递归/多跳检索:先检索一部分,根据结果生成下一步查询,适合多跳问答。

这些方法能提高召回,但会增加延迟和调用次数。

评价#

RAG 的评价要分开看检索和生成:

环节指标
检索Recall@k、Precision@k、MRR、NDCG
生成答案正确性、忠实性(是否只依据资料)、相关性、引用准确性
端到端任务成功率、人工评分、延迟与成本

忠实性尤其重要:答案可能正确,但依据的是模型自身知识而不是检索资料;也可能引用了错误片段。评价时需要区分“答案对不对”和“有没有依据”。

常见问题#

  • 切块不当:关键信息被切断,检索到的片段不完整;
  • 检索不到:问题与文档表述差异大,或嵌入模型不适配领域;
  • 上下文噪声:检索片段过多,模型忽略关键信息,或出现“中间丢失”(长上下文中间部分利用率低);
  • 知识冲突:多个片段说法不一致,模型需要判断或说明;
  • 索引过期:文档更新后未重新索引,回答仍是旧知识;
  • 提示注入:检索到的网页或文档可能包含恶意指令,不能当作可信指令执行;
  • 端到端归因困难:答案错误时,难以判断是检索错了还是生成错了。

与微调的关系#

RAG 和微调解决不同问题:

  • RAG:补充外部、实时、私有知识,知识可更新、可追溯;
  • 微调:改变模型的行为、格式、风格和领域能力,知识内化到参数。

两者可以结合:先用 SFT/LoRA 让模型学会领域术语和回答格式,再用 RAG 提供具体事实。对于频繁更新的知识,优先用 RAG;对于稳定的任务模式,优先用微调。

相关阅读#

RAG:检索增强生成
https://biscuit0613.github.io/posts/nlp/12-03-rag/
作者
Biscuit
发布于
2026-10-20
许可协议
CC BY-NC-SA 4.0
提示工程:从手工模板到自动优化
CoT、ToT 与 GoT:让模型展开推理