RAG:检索增强生成到底增强了什么
RAG 这题最容易被答浅。很多人只会说“先查资料,再让大模型回答”。这句话方向没错,但不够面试化。更完整的表达应该是:RAG(Retrieval-Augmented Generation,检索增强生成)是一种把外部知识检索结果动态注入模型上下文,再由模型基于这些资料生成答案的方案。
0. 面试速答(30 秒版 TL;DR)
- RAG 不是训练模型,而是给模型在回答前临时补资料。
- 它解决的核心问题是:模型参数里的知识不够新、不够全、不够贴业务。
- 标准链路通常是:
- 文档切块
- 向量化
- 建索引
- 检索召回
- 重排
- 把片段放进 Prompt
- 生成答案
- RAG 的关键不只是“查到资料”,而是查到对的资料,并且让模型正确使用这些资料。
- 一句话:RAG 增强的不是模型参数,而是模型推理时可用的上下文。
1. 为什么需要 RAG?
只靠大模型参数,会遇到几个典型问题:
- 知识过时
- 企业内部知识不在预训练语料里
- 某些领域答案必须基于原文,不能凭模型“感觉”
- 需要引用来源,方便追溯
所以你可以把 RAG 理解成:
- 给模型外挂一个“临时可查资料区”
它的本质不是让模型更聪明,而是让答案更有依据。
2. 一条标准 RAG 流程
这条链路里最值得记住的是两层:
- 离线侧:文档如何被处理和建索引
- 在线侧:问题如何被检索并注入生成
3. RAG 的关键步骤,不是每一步都同等重要
3.1 切块(Chunking)
切块是很多系统效果不稳定的根源。
切得太大:
- 噪音多
- 上下文浪费
- 检索不准
切得太小:
- 语义被切碎
- 模型拿不到完整因果关系
所以切块本质上是在平衡两件事:
- 可检索性
- 语义完整性
3.2 检索(Retrieval)
检索目标不是“查很多”,而是:
- 优先把真正相关的片段找出来
常见检索方式有:
- 向量检索
- 关键词检索
- 混合检索
实际工程里,一个非常重要的经验是:
- 召回率和精确率要一起看
只追求召回多,可能把大量噪音也带进 Prompt。
3.3 重排(Rerank)
为什么很多 RAG 要加重排?
因为第一轮检索往往负责“尽量别漏”,但不一定最会排序。
重排做的事情是:
- 对候选片段再次判断相关性
- 把更像答案依据的片段排到前面
一句话理解:
- 检索负责找候选,重排负责把最该看的顶上来。
3.4 生成(Generation)
资料找到了,不代表答案一定好。
生成阶段仍然可能出问题:
- 模型忽略检索片段
- 模型过度总结,丢细节
- 模型把多个片段拼错
- 模型夹带参数知识里的幻觉
所以一个好的 RAG Prompt 往往会明确要求:
- 仅基于给定资料回答
- 资料不足时明确说不知道
- 尽量给出处或引用片段
4. RAG 和微调(Fine-tuning)有什么区别?
这题很高频。
可以直接这样答:
| 维度 | RAG | 微调 |
|---|---|---|
| 改的是什么 | 运行时上下文 | 模型参数 |
| 更新知识成本 | 低 | 高 |
| 适合场景 | 知识问答、企业文档、强时效内容 | 风格迁移、格式学习、特定任务行为调整 |
| 是否容易带来源引用 | 相对容易 | 不直接提供 |
面试里一句话总结:
- RAG 更像“开卷考试”,微调更像“改学生脑子里的习惯”。
5. 一个最小可落地示例
type Chunk = {
text: string;
score: number;
};
async function answerWithRag(question: string): Promise<string> {
const recalled: Chunk[] = await retrieve(question);
const ranked = recalled.sort((a, b) => b.score - a.score).slice(0, 4);
const context = ranked.map((item) => item.text).join("\n\n");
return callModel({
system: "你只能基于提供的资料回答;资料不足就明确说明。",
user: `问题: ${question}\n\n资料:\n${context}`,
});
}
这段代码虽然很简化,但能说明 RAG 的核心动作:
- 先取资料
- 再拼上下文
- 最后再生成
6. 前端 / Agent 系统里,RAG 常见用法
典型场景包括:
- 产品文档问答
- 内部知识库助手
- API 文档 Copilot
- 工单、FAQ、操作手册统一检索
- 对聊天机器人增加“基于事实回答”的能力
如果是前端产品,RAG 很常见的真实落点是:
- 带引用的搜索问答
- 文档助手
- 面向客服或运营的知识增强型聊天
7. 为什么做了 RAG,还是会幻觉?
这是最容易被追问的一题。
原因通常不止一个:
- 没召回到真正相关的内容
- 召回内容太多,噪音盖过重点
- Chunk 切得不好,证据链断裂
- Prompt 没明确约束“只基于资料回答”
- 模型把参数知识和检索内容混合了
所以要记住:
- RAG 不是幻觉消除器,它只是把“回答有依据”的概率显著提高。
8. 评估 RAG,不能只看最终答案像不像
成熟一点的评估至少会拆成三层:
- 检索是否召回了对的片段
- 重排是否把关键片段排前面
- 生成是否忠于资料
否则你很容易出现:
- 最终答案错了,却不知道错在检索还是生成
这是很多团队做 RAG 的常见盲区。
9. 面试高频追问
9.1 RAG 的核心瓶颈通常在哪?
标准答法:
通常不在模型本身,而在检索质量,包括文档清洗、切块策略、召回策略、重排质量和 Prompt 约束。很多 RAG 系统效果差,不是因为模型不够强,而是因为前面的资料准备和检索链路做得不够好。
9.2 RAG 一定要向量数据库吗?
标准答法:
不一定。向量检索很常见,但不是唯一方案。关键词检索、倒排索引、混合检索都可以构成 RAG。关键不在“是不是向量库”,而在“能不能把相关资料稳定找出来”。
9.3 RAG 和搜索引擎有什么区别?
标准答法:
搜索引擎核心是返回候选结果列表,RAG 则是在检索结果基础上进一步把内容喂给模型,由模型做综合生成。也就是说,RAG 往往是“检索 + 生成”的组合系统。
10. 常见误区
- 误区一:把 RAG 等同于向量数据库。 向量库只是实现手段之一。
- 误区二:以为接上文档就一定更准。 如果检索噪音很大,效果可能更差。
- 误区三:只看最终回答,不拆检索指标。 这样很难定位问题根因。
- 误区四:以为 RAG 可以完全代替微调。 两者解决的问题并不相同。
11. 速记要点
- RAG = 检索增强生成
- 增强的是 运行时上下文
- 标准流程:切块 -> 向量化 -> 检索 -> 重排 -> 生成
- 难点主要在 切块、召回、重排、约束生成
- 和微调的区别是:RAG 改上下文,微调改参数