1351 字
7 分钟
RAG:检索增强生成
RAG 解决什么问题
大模型的知识固定在参数里,存在三个限制:
- 训练语料有截止日期,无法回答最新事实;
- 私有文档和领域知识没有进入预训练;
- 参数化知识难以追溯来源,容易产生幻觉。
检索增强生成(Retrieval-Augmented Generation, RAG)在生成前先从外部知识库检索相关片段,把片段作为上下文交给模型,让模型基于证据回答。它不改变模型参数,更新知识只需更新索引。
RAG 与 知识增强 的“知识外用”路线一致;区别在于 RAG 特指“检索文档片段 + 生成”的工程流程。
基本流程
RAG 通常分为离线和在线两条链路:
离线:文档 → 清洗 → 切块 → 向量化 → 索引在线:问题 → 改写/向量化 → 检索 → 重排 → 拼接上下文 → 生成1. 索引
2. 检索
稀疏检索基于词项匹配,代表是 BM25:
它擅长精确匹配专有名词、数字和代码,但无法处理同义改写。
稠密检索把问题和文档编码为向量,用余弦相似度或内积检索:
它能捕捉语义相似,但可能忽略精确关键词。
混合检索把稀疏和稠密分数加权融合,兼顾两者。检索到候选后,可以用 cross-encoder 重排序:把问题和每个候选片段一起输入模型,输出更精细的相关性分数,取前几个送入生成。
3. 生成
把问题和检索到的片段拼成提示:
请仅根据以下资料回答问题。资料中没有的信息,请回答“资料未提及”。资料:[1] ...[2] ...问题:...常见约束包括:
- 要求引用片段编号,便于追溯;
- 明确“不知道”时不要编造;
- 控制片段数量和长度,避免超出上下文窗口;
- 对冲突资料要求说明分歧。
查询优化
用户问题往往不适合直接检索,可以在检索前做改写:
- 查询改写:把口语化问题改写成包含关键词的检索式;
- 多查询:生成多个不同角度的查询,合并检索结果;
- HyDE:先让模型生成一个假设答案,再用假设答案的向量去检索,适合问题和文档表述差异较大的场景;
- 递归/多跳检索:先检索一部分,根据结果生成下一步查询,适合多跳问答。
这些方法能提高召回,但会增加延迟和调用次数。
评价
RAG 的评价要分开看检索和生成:
| 环节 | 指标 |
|---|---|
| 检索 | Recall@k、Precision@k、MRR、NDCG |
| 生成 | 答案正确性、忠实性(是否只依据资料)、相关性、引用准确性 |
| 端到端 | 任务成功率、人工评分、延迟与成本 |
忠实性尤其重要:答案可能正确,但依据的是模型自身知识而不是检索资料;也可能引用了错误片段。评价时需要区分“答案对不对”和“有没有依据”。
常见问题
- 切块不当:关键信息被切断,检索到的片段不完整;
- 检索不到:问题与文档表述差异大,或嵌入模型不适配领域;
- 上下文噪声:检索片段过多,模型忽略关键信息,或出现“中间丢失”(长上下文中间部分利用率低);
- 知识冲突:多个片段说法不一致,模型需要判断或说明;
- 索引过期:文档更新后未重新索引,回答仍是旧知识;
- 提示注入:检索到的网页或文档可能包含恶意指令,不能当作可信指令执行;
- 端到端归因困难:答案错误时,难以判断是检索错了还是生成错了。
与微调的关系
RAG 和微调解决不同问题:
- RAG:补充外部、实时、私有知识,知识可更新、可追溯;
- 微调:改变模型的行为、格式、风格和领域能力,知识内化到参数。
两者可以结合:先用 SFT/LoRA 让模型学会领域术语和回答格式,再用 RAG 提供具体事实。对于频繁更新的知识,优先用 RAG;对于稳定的任务模式,优先用微调。
相关阅读
- 知识增强的整体思路:知识增强的大语言模型
- 知识图谱作为外部知识源:知识图谱
- 提示构建:提示工程
- 智能体中的检索与工具调用:基于大语言模型的智能体
- 检索与生成评价:NLP 评价指标