RAG 全景:读 → 切 → 嵌 → 存 → 检 → 答
昨天(Day 20)你给"读外部内容"系好了安全带,阶段3 收官。今天开启含金量爆表的阶段4——RAG(检索增强生成)。它解决一个致命问题:大模型不知道你公司的内部资料、也不知道昨天的新闻。今天先建立全景地图,明白六个步骤各干什么,为后面 D22-28 逐个拆解打底。
为什么大模型必须"外挂"知识
大模型有三个天生短板,正是 RAG 要补的:
- 知识过时:训练截止后发生的事它一概不知(考生毕业后就没再读新书)。
- 不懂你的私有数据:你公司的手册、你的邮件、你的产品文档,它压根没见过。
- 会幻觉:不知道时不说"不知道",而是编一个像模像样的答案(Day 10 讲过)。
👶 小白:那我把公司所有文档,直接一次性粘进 Prompt 里不就行了?
👨🏫 老师:想法对,但塞不下也不划算。回忆 Day 18:上下文窗口是有限的,几百页文档根本放不进去;就算能放,每次问都塞几十万字,又慢又贵,模型还容易"迷失在中间"。RAG 的聪明之处是:不全给,只在问题相关时,精准抽出最相关的几小段给它。开卷考也不是把整个图书馆搬上桌,而是抽出最相关的那几页。
RAG 到底是什么:给"生成"配一个"检索"
拆开这三个字母,就是它的完整工作方式:
拿用户问题,去你的知识库里找出最相关的几段资料。
把找到的资料 + 原问题,一起拼成一个新 Prompt。
模型基于这些资料回答,并可注明"依据是哪段"。
我们公司年假有几天?闭卷(无 RAG):模型没你公司资料 → 编一个"一般是 5-15 天"(可能全错)。
RAG:先从员工手册里检索到
"入职满 1 年享 10 天年假"这段 → 拼进 Prompt → 模型答"根据员工手册,满 1 年 10 天",有据可依、可追溯。
六步流水线全景:读 → 切 → 嵌 → 存 → 检 → 答
一套完整的 RAG 系统,就是下面这条六步流水线。这张图是整个阶段4 的地图,D22-28 就是逐个把它讲透:
| 步骤 | 图书馆类比 | 一句话 | 哪天细讲 |
|---|---|---|---|
| ① 读 Load | 进书 | 把 PDF/网页/数据库里的原文读进来 | D28 实战 |
| ② 切 Chunk | 把书拆成一页页卡片 | 长文档切成"刚好能喂"的小段 | D22 |
| ③ 嵌 Embed | 给每张卡片编"语义坐标" | 把每段文字变成一串数字(向量) | D23 |
| ④ 存 Store | 把卡片按坐标上架 | 把向量存进能快速搜的向量库 | D24 |
| ⑤ 检 Retrieve | 按题目找最相关的几张卡 | 把问题也变向量,找最近的 top-k 段 | D25 |
| ⑥ 答 Generate | 照着抽出的卡片答题 | 资料+问题拼进 Prompt,模型作答 | D28 |
关键分界:离线建库 vs 在线问答
- 离线阶段(建库,前 4 步):把所有文档预处理成向量存好。文档没变就不用重跑。相当于图书馆开馆前,把书都拆页、编好索引、上好架。
- 在线阶段(问答,后 2 步):用户来一个问题,只做"检索 + 生成"两步——查索引取几页、照着答。毫秒到秒级,读者进门马上能查书。
用伪代码把六步串起来(先看骨架,别抠细节)
# ===== 离线:建库(前 4 步,平时做一次)=====
docs = load("手册.pdf") # ① 读:把原文读进来
chunks = split(docs, size=300) # ② 切:切成每段约 300 字(D22)
vectors = embed(chunks) # ③ 嵌:每段变成一串数字/向量(D23)
db = VectorDB() # 一个向量库(D24)
db.add(chunks, vectors) # ④ 存:段落和它的向量一起入库
# ===== 在线:问答(后 2 步,每次提问时做)=====
def answer(question: str) -> str:
q_vec = embed([question])[0] # 问题也变成向量(同一个 embed)
hits = db.search(q_vec, top_k=3) # ⑤ 检:找最相关的 3 段(D25)
context = "\n".join(hits) # 把 3 段拼成"参考资料"
# ⑥ 答:资料 + 问题一起给模型(还记得 Day20 的"包裹"吗?)
prompt = f"只根据下面资料回答,找不到就说不知道。\n资料:\n{context}\n\n问题:{question}"
return ask_llm(prompt)
print(answer("年假有几天?")) # 模型照着检索到的手册片段回答
🔗 深潜:去《LlamaIndex 20 天精讲》看真实框架怎么做 RAG
上面的六步,你不用自己从零造轮子——业界有成熟框架把它们封装好了,LlamaIndex 就是最主流的 RAG 框架之一。本站有一套完整的源码精讲,把"读切嵌存检答"每一步在真实框架里怎么实现讲透了。
VectorStoreIndex 就是在做我今天学的④存 + ⑤检"的通透感。带着地图去深潜,比一上来就啃源码轻松得多。
🔗 想深入?去看《LlamaIndex 20 天源码精讲》 →
👶 小白:有框架帮我全包了,那我还需要懂今天这些原理吗?
👨🏫 老师:太需要了。框架能帮你把流程跑起来,但调不好、出问题时,全靠你懂原理——为什么检索不准?可能是切块切坏了(D22)或 embedding 选错了(D23)。面试也几乎必问"RAG 六步"和"为什么效果差怎么排查"。框架是手,原理是脑,两个都要。
今日小结 + 动手 10 分钟
🧠 今天你应该能回答
- 大模型为什么需要 RAG?(知识过时、不懂私有数据、会幻觉)
- RAG 三个字母各是什么?(检索 Retrieval + 增强 Augmented + 生成 Generation)
- 六步流水线是哪六步?(读→切→嵌→存→检→答)
- 哪几步是"离线建库"、哪几步是"在线问答"?为什么要分开?
- 为什么不能把所有文档直接塞进 Prompt?(放不下、又慢又贵、会迷失在中间)
✋ 动手(约 10 分钟)
不写代码也能做的"人肉 RAG",帮你把六步刻进脑子:
- 找一篇你熟悉的长文档(一份说明书、一篇长文都行)——这是①读。
- 用笔把它手动切成 5-8 个小段,每段一个主题——这是②切。
- 给每段写一句"这段在讲啥"的标签——这就是③嵌的直觉(用一句话代表一段的"意思")。
- 想一个关于这篇文档的问题,凭标签挑出最相关的 1-2 段——这是⑤检。
- 只看这 1-2 段,写出答案——这是⑥答。体会"开卷、只看相关几页作答"的感觉。
行有余力,去 L06 的 《LlamaIndex 20 天精讲》 浏览前 1-2 讲,认个脸,然后回来。