Day 21 / 共 68 天 · 阶段4 RAG 检索增强

RAG 全景:读 → 切 → 嵌 → 存 → 检 → 答

昨天(Day 20)你给"读外部内容"系好了安全带,阶段3 收官。今天开启含金量爆表的阶段4——RAG(检索增强生成)。它解决一个致命问题:大模型不知道你公司的内部资料、也不知道昨天的新闻。今天先建立全景地图,明白六个步骤各干什么,为后面 D22-28 逐个拆解打底。

📍 你在 68 天里的位置(阶段4 · RAG 检索增强 D21-28,今天开篇)
D21 RAG 全景 D22 chunking D23 embedding D24 向量库 D25 检索 D26 rerank D27 评测 D28 实战
💡 今天的世界观:开卷考试 + 图书馆 今天把大模型想成一位知识渊博但记不住你私人资料、也记不住最新消息的考生。① 闭卷考(不给资料直接问)他只能凭记忆答,遇到你公司内部问题就瞎编(幻觉);② RAG = 让他开卷考——答题前,先派个图书管理员去书库把最相关的几页抽出来放到他桌上;③ 而"六步流水线"就是这座图书馆的运转流程:进书、拆页、编索引、上架、按题找书、照着书答。记住"闭卷会瞎编,开卷先找书"。
L01

为什么大模型必须"外挂"知识

🤔 痛点你问模型"我们公司的报销上限是多少?"——它根本没见过你公司的制度,却一本正经给你编了个"5000 元"。或者你问"今天的汇率",它只知道训练截止那天的旧数据。
💡 本质一句话大模型的知识被"冻结"在训练那一刻,且从没见过你的私有资料。RAG 就是在它答题前,临时把相关资料"喂"到它眼前,让它照着资料答,而不是凭记忆瞎编。

大模型有三个天生短板,正是 RAG 要补的:

  • 知识过时:训练截止后发生的事它一概不知(考生毕业后就没再读新书)。
  • 不懂你的私有数据:你公司的手册、你的邮件、你的产品文档,它压根没见过。
  • 会幻觉:不知道时不说"不知道",而是编一个像模像样的答案(Day 10 讲过)。

👶 小白:那我把公司所有文档,直接一次性粘进 Prompt 里不就行了?

👨‍🏫 老师:想法对,但塞不下也不划算。回忆 Day 18:上下文窗口是有限的,几百页文档根本放不进去;就算能放,每次问都塞几十万字,又慢又贵,模型还容易"迷失在中间"。RAG 的聪明之处是:不全给,只在问题相关时,精准抽出最相关的几小段给它。开卷考也不是把整个图书馆搬上桌,而是抽出最相关的那几页。

L02

RAG 到底是什么:给"生成"配一个"检索"

💡 本质RAG = Retrieval(检索:先去找资料) + Augmented(增强:把资料塞进 Prompt) + Generation(生成:模型照着资料答)。三个词连起来就是全过程。

拆开这三个字母,就是它的完整工作方式:

R 检索

拿用户问题,去你的知识库里找出最相关的几段资料。

A 增强

把找到的资料 + 原问题,一起拼成一个新 Prompt。

G 生成

模型基于这些资料回答,并可注明"依据是哪段"。

📝 例子:同一个问题,闭卷 vs RAG 问:我们公司年假有几天?
闭卷(无 RAG):模型没你公司资料 → 编一个"一般是 5-15 天"(可能全错)。
RAG:先从员工手册里检索到"入职满 1 年享 10 天年假"这段 → 拼进 Prompt → 模型答"根据员工手册,满 1 年 10 天"有据可依、可追溯
👶 一句大白话RAG 就是把"闭卷全靠背"改成"开卷先翻书再答"。模型还是那个模型,但答题前手边多了正确资料,就不容易胡说了。
L03

六步流水线全景:读 → 切 → 嵌 → 存 → 检 → 答

一套完整的 RAG 系统,就是下面这条六步流水线。这张图是整个阶段4 的地图,D22-28 就是逐个把它讲透:

RAG 六步流水线(上排离线建库,下排在线问答) 📦 离线·建库(平时先做好) ① 读 Load 进书:PDF/网页 ② 切 Chunk 拆成小段(D22) ③ 嵌 Embed 变向量(D23) ④ 存 Store 入向量库(D24) 💬 在线·问答(用户来提问时) ⑤ 检 Retrieve 问题→找最相关段(D25) 拼进 Prompt 资料+问题(增强) ⑥ 答 Generate 模型照资料回答 查这里
图注:上排 4 步是"平时先把图书馆建好",下排 2 步是"用户来了按题取书、照书回答"。检索(⑤)会去查建库时存好的向量库(④)。
步骤图书馆类比一句话哪天细讲
① 读 Load进书把 PDF/网页/数据库里的原文读进来D28 实战
② 切 Chunk把书拆成一页页卡片长文档切成"刚好能喂"的小段D22
③ 嵌 Embed给每张卡片编"语义坐标"把每段文字变成一串数字(向量)D23
④ 存 Store把卡片按坐标上架把向量存进能快速搜的向量库D24
⑤ 检 Retrieve按题目找最相关的几张卡把问题也变向量,找最近的 top-k 段D25
⑥ 答 Generate照着抽出的卡片答题资料+问题拼进 Prompt,模型作答D28
L04

关键分界:离线建库 vs 在线问答

🤔 痛点初学者常把六步想成"每次提问都从头跑一遍"——那也太慢了,每问一次就重新读切嵌存全部文档?
💡 本质六步分成两个时段:前四步(读切嵌存)是"平时先把图书馆建好",做一次、长期用;后两步(检、答)才是"用户来提问时"实时跑,快而轻。
  • 离线阶段(建库,前 4 步):把所有文档预处理成向量存好。文档没变就不用重跑。相当于图书馆开馆前,把书都拆页、编好索引、上好架。
  • 在线阶段(问答,后 2 步):用户来一个问题,只做"检索 + 生成"两步——查索引取几页、照着答。毫秒到秒级,读者进门马上能查书。
📝 例子:新增一份文档时发生什么 公司更新了报销制度 PDF。你只需对这份新文档跑一遍前 4 步(读→切→嵌→存),把它的向量加进已有的库里。用户的问答体验完全不受影响,也不用重建整个库。这就是"离线/在线分离"的好处。
👶 一句大白话建库像"图书馆装修上架",费点时间但一次搞定;问答像"读者进门查书",天天发生、要快。别把装修和查书混成一件事。
L05

用伪代码把六步串起来(先看骨架,别抠细节)

💡 本质今天只求"看懂流程长什么样",每一步的真实实现是后面几天的内容。下面用假函数占位,把六步串成一条线:
# ===== 离线:建库(前 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("年假有几天?"))    # 模型照着检索到的手册片段回答
看这段的重点不是每个函数怎么实现,而是数据是怎么流动的:文档→切块→向量→入库(建库);问题→向量→检索→拼 Prompt→回答(问答)。把这条线记住,后面每天都是在给其中一步"填肉"。
L06

🔗 深潜:去《LlamaIndex 20 天精讲》看真实框架怎么做 RAG

上面的六步,你不用自己从零造轮子——业界有成熟框架把它们封装好了,LlamaIndex 就是最主流的 RAG 框架之一。本站有一套完整的源码精讲,把"读切嵌存检答"每一步在真实框架里怎么实现讲透了。

💡 建议的学法你现在已经有了"六步全景地图",这时候去看框架源码,会有一种"哦,它这个 VectorStoreIndex 就是在做我今天学的④存 + ⑤检"的通透感。带着地图去深潜,比一上来就啃源码轻松得多。

🔗 想深入?去看《LlamaIndex 20 天源码精讲》 →
⚠️ 深潜提示:LlamaIndex 那套教程内容较深,是"选学加餐"。建议先大致浏览它的前几讲(了解 Document / Node / Index 三个核心概念)就回来继续 Day 22——因为 D22-27 会把 chunking、embedding、向量库、检索、评测逐个讲细,学完这些再回头深潜 LlamaIndex 会更顺。学完记得回来继续 Day 22!阶段4 的 D27 还会再放一次 LlamaIndex 深潜(讲 RAG 评测)。

👶 小白:有框架帮我全包了,那我还需要懂今天这些原理吗?

👨‍🏫 老师:太需要了。框架能帮你把流程跑起来,但调不好、出问题时,全靠你懂原理——为什么检索不准?可能是切块切坏了(D22)或 embedding 选错了(D23)。面试也几乎必问"RAG 六步"和"为什么效果差怎么排查"。框架是手,原理是脑,两个都要。

L07

今日小结 + 动手 10 分钟

🧠 今天你应该能回答

  • 大模型为什么需要 RAG?(知识过时、不懂私有数据、会幻觉)
  • RAG 三个字母各是什么?(检索 Retrieval + 增强 Augmented + 生成 Generation)
  • 六步流水线是哪六步?(读→切→嵌→存→检→答)
  • 哪几步是"离线建库"、哪几步是"在线问答"?为什么要分开?
  • 为什么不能把所有文档直接塞进 Prompt?(放不下、又慢又贵、会迷失在中间)

✋ 动手(约 10 分钟)

不写代码也能做的"人肉 RAG",帮你把六步刻进脑子:

  1. 找一篇你熟悉的长文档(一份说明书、一篇长文都行)——这是①读
  2. 用笔把它手动切成 5-8 个小段,每段一个主题——这是②切
  3. 给每段写一句"这段在讲啥"的标签——这就是③嵌的直觉(用一句话代表一段的"意思")。
  4. 想一个关于这篇文档的问题,凭标签挑出最相关的 1-2 段——这是⑤检
  5. 只看这 1-2 段,写出答案——这是⑥答。体会"开卷、只看相关几页作答"的感觉。

行有余力,去 L06 的 《LlamaIndex 20 天精讲》 浏览前 1-2 讲,认个脸,然后回来。

明天预告 · Day 22:文本切分 chunking。今天六步里的②切,是决定 RAG 效果好坏的第一道关。明天专讲:为什么必须切、按长度切还是按语义切、overlap(重叠)是干嘛的、切太大太小各会出什么问题。切不好,后面全白搭。
← Day 20 提示词注入 Day 22 · 文本切分 chunking →