知识点思维导图
33 个知识节点
RAG(12) - RAG 是什么
读完后,你应能完成以下任务:
- 绘制“RAG(16) - RAG 是什么 / 与进阶篇的分工”的关键对象与数据流,解释“进阶 RAG 主线从 58 开始,”,并用源码位置、日志或 Trace 标注证据。
- 为“RAG(16) - RAG 是什么 / RAG 的本质:先检索,再生成”设计正常与异常输入,验证“区别就一处:模型回答前,多了一步「带着问题去资料库捞证据」。”,输出首个偏差位置与回归测试结果。
- 实现“RAG(16) - RAG 是什么 / 为什么不直接微调模型”的最小代码或配置,检验“知识经常变、需要给用户看依据、又不想烧训练成本——这三个条件凑齐,就是 RAG 的主场。”,输出命令、结果与 Diff,并说明不适用边界。
一句话目标:读完你能讲清 RAG 解决什么问题、它和「裸模型直接问」差在哪,并跑通一个能拒答的最小 RAG。
一、与进阶篇的分工
本篇保留为 RAG 入门总览:目标是先讲清“先检索、再生成、证据不足拒答”。 进阶 RAG 主线从 58 开始, 继续展开向量化检索、loader/splitter、Milvus、混合检索、GraphRAG、LangSmith 和企业级多模态 RAG。
二、RAG 是什么的真实应用场景
你给公司做了个客服助手,接的是通用大模型。 用户问「你们标准版套餐多少钱」,模型张口就答「大概一个月几十块吧」。 问题是:模型根本不知道你们的定价,它在编。
模型的知识来自训练数据,里面没有你公司的价格表、制度文档、最新公告。 这些私有的、会变的知识,它一概不知。 但它又「不会承认不知道」,于是编一个看起来合理的答案——这就是幻觉。
RAG 就是来解决这件事的。 它的思路特别朴素:回答之前, 先去你的资料库里查一查, 把查到的资料一起交给模型, 让它基于资料回答。 查不到,就老实说不知道。
三、RAG 的本质:先检索,再生成
RAG 全称 Retrieval-Augmented Generation,检索增强生成。 拆开看就是两步:
裸模型: 问题 ──────────────────→ 模型 → 凭记忆答(可能编)
RAG: 问题 → 检索资料库 → 相关资料 ┐
├→ 模型 → 基于资料答(有据)
问题 ───────────────────────┘
区别就一处:模型回答前,多了一步「带着问题去资料库捞证据」。 捞到了,证据和问题一起喂给模型; 没捞到,直接拒答,不让模型硬编。
很多人以为 RAG 是「把所有文档都塞给模型」。 不是。 文档可能有几万字,模型上下文塞不下,塞进去也会被无关内容淹没。 RAG 的关键恰恰是只检索出最相关的几段给模型,又准又省。
四、为什么不直接微调模型
「让模型记住公司知识」还有另一条路:微调。 但大多数场景 RAG 更合适,原因有三:
| 对比 | RAG | 微调 |
|---|---|---|
| 知识更新 | 改资料库即可,实时生效 | 要重新训练,慢且贵 |
| 可追溯 | 能给出答案来自哪份文档 | 答案从权重里来,说不清依据 |
| 成本 | 低,不动模型 | 高,要算力和数据 |
知识经常变、需要给用户看依据、又不想烧训练成本——这三个条件凑齐,就是 RAG 的主场。 企业知识库几乎全中。
五、离线入库与在线问答是两条链路
RAG 系统在两个时刻干两件事,别混在一起:
离线入库(资料变动时做一次):
文档 → 切分成 chunk → 转成向量 → 存进向量库(带来源元数据)
在线问答(用户每次提问):
问题 → 转成向量 → 检索 topK 相关 chunk → 拼进 prompt → 模型基于资料答 → 附引用来源
上面这条链路里的每一步, 正是后面几篇要逐个拆开讲的:切分(21)、向量化(22)、向量库(23)、检索重排(24)、回答与引用(25)、评测调优(26)。 这一篇先建立整体认知。
六、工程上真正会踩的坑(本篇独有)
- 以为 RAG 就是把文档塞进 prompt。文档动辄上万字,塞不下也塞不准。RAG 的价值在「只检索出最相关那几段」,检索质量才是上限。
- 检索为空还硬答。这是 RAG 最危险的坑:没检索到资料,模型会拿手头任何东西编一个。必须
if not hits: 拒答,这是硬性兜底,不是可选项。 - 拿 RAG 当成万能答疑。RAG 只擅长「答案明确写在某份资料里」的问题。需要跨多份文档推理、计算、做判断的,光靠检索不够,那是 Agent 的活(27 篇起)。
七、一句话面试答法
RAG 是什么,为什么用它? RAG 是检索增强生成:模型回答前先从知识库检索相关资料,基于资料作答,检索不到就拒答。它解决大模型不知道企业私有知识、知识更新慢、答案无法溯源三个问题。相比微调,RAG 改资料就能更新知识、能给出引用来源、还不用烧训练成本,所以企业知识库基本都走 RAG。
八、动手实践:20 RAG 是什么
用最小代码把 RAG 全流程跑一遍, 并和「裸模型」做对照:同一个问题, 裸模型凭记忆编, RAG 先检索资料再基于资料回答, 没资料就拒答。
8.1 在线运行
直接使用本文“可运行源码”中的沙盒执行; 源码、复制内容和实际运行入口保持一致。
零依赖,纯标准库。
8.2 预期输出
问题:标准版套餐多少钱?
[裸模型] 我们的套餐大概一个月几十块吧,具体记不太清,应该都支持随时退款。
[RAG ] 我们的标准版套餐每月 99 元,包含 5 个席位。(依据:product-faq.md)
引用:product-faq.md -> 我们的标准版套餐每月 99 元,包含 5 个席位。
------------------------------------------------------------
问题:几天内可以退款?
[裸模型] 我们的套餐大概一个月几十块吧,具体记不太清,应该都支持随时退款。
[RAG ] 购买后 7 天内未使用可全额退款,超过 7 天不支持退款。(依据:refund-policy.md)
引用:refund-policy.md -> 购买后 7 天内未使用可全额退款,超过 7 天不支持退款。
------------------------------------------------------------
问题:你们在北京有办公室吗?
[裸模型] 我们的套餐大概一个月几十块吧,具体记不太清,应该都支持随时退款。
[RAG ] 知识库里没有找到相关资料,这个问题我无法回答。
------------------------------------------------------------
对照着看三件事:裸模型每次都答同样一段编的话; RAG 命中资料时基于资料回答并给出来源; 知识库没有相关资料时 RAG 直接拒答。
8.3 代码↔概念对应
| 概念 | 在 main.py 哪里 |
|---|---|
| 知识库(已入库的资料 + 来源元数据) | KNOWLEDGE |
| 检索打分(模拟向量相似度) | score |
| topK 检索,只留命中的 | retrieve |
| 裸模型回答(无依据,会编) | answer_without_rag |
| RAG 回答(基于资料 + 引用来源) | answer_with_rag |
| 检索为空时拒答 | answer_with_rag 里 if not hits |
8.4 说明
真实项目里 score 会换成 embedding 余弦相似度(OpenAI / bge 等),
KNOWLEDGE 会换成向量数据库。
这个 demo 用关键词重叠打分只为讲清流程,不代表生产检索质量。
8.5 可运行源码:RAG 是什么
下方代码就是在线沙盒实际执行的完整源码。
main.py
九、总结
- RAG 的本质:先检索,再生成:区别就一处:模型回答前,多了一步「带着问题去资料库捞证据」。
- 为什么不直接微调模型:知识经常变、需要给用户看依据、又不想烧训练成本——这三个条件凑齐,就是 RAG 的主场。
- 离线入库与在线问答是两条链路:正是后面几篇要逐个拆开讲的:切分(21)、向量化(22)、向量库(23)、检索重排(24)、回答与引用(25)、评测调优(26)。
- 工程上真正会踩的坑(本篇独有):以为 RAG 就是把文档塞进 prompt。
- 一句话面试答法:RAG 是检索增强生成:模型回答前先从知识库检索相关资料,基于资料作答,检索不到就拒答。
学完自测
选择所有正确答案;提交后逐项核对判断依据。