大家的AI
机器学习Playground 试玩
加载中…

学习

Ch.12

RAG:用检索减轻幻觉

RAG 一览

Closed-book=闭卷;RAG=开卷查资料

问 「退款政策?」 时,Closed-book 只靠记忆,RAG Top-k 检索→增强→生成。

Closed-book:只靠记忆 · RAG:检索后生成

?✦✦
查询
VS
Closed-book
📚不看资料›🚫不检索›🧠只靠记忆›❌幻觉错误

无外部检索

?
?
?
?
?
无依据
看似合理
→
AI
→
✕幻觉风险
VS
RAG
📚文档库›🔍检索›📝增强›✨生成

Top-k 选择

Top-3

相似度前 k 块

📄📄📄
依据块 (Top-k)
→
AI
→
✨✓有据回答
Closed-book — 无检索生成 · RAG — 检索·增强·生成
Closed-book—无外部文档→幻觉与过时信息风险
RAG—存储→嵌入→Top-k→增强→生成

一个问题如何被处理

  1. 收到用户问题
  2. 嵌入以便算相似度
  3. Closed-book 不检索;RAG 取 Top-k
  4. 在预算内用模板增强
  5. 生成并记录来源与 k
设想公司里的制度问答机器人。员工问「今年年假能累计几天?」,若模型用过时但听起来合理的规则作答,信任会立刻崩塌——这就是幻觉(Hallucination):说得像真的,但没有可靠依据。
RAG(检索增强生成) 像开卷答题:先查资料、贴进提示、再写答案。Closed-book(闭卷) 只靠训练记忆,跟不上每周新增的 PDF、新闻和内部库,全量重训也不现实。流程是 检索 → 填空(增强)→ 生成。
实务中常见说法:长文档切成块(一页),用嵌入把意思变成数字坐标,向量库按相似度快速找文,Top-k 只取前 k 块,cos(余弦) 看方向是否相近,ctx 是一次最多能读的长度,提示是指令+问题全文,Token(词元) 约是词/字大小的小单位。budget = ctx−提示−问题 就是答题纸上减掉题目说明后剩下的空位。本章用比喻与数字讲解,不做艰深证明。

如何读公式(RAG)

1. 余弦相似度 + Top-k — 检索核心
检索要比较问题 q 与文本块 c 在语义上是否指向相近方向,这个分数叫余弦相似度:
cos(q,c)=q⋅c∥q∥∥c∥\text{cos}(\mathbf{q},\mathbf{c})=\dfrac{\mathbf{q}\cdot\mathbf{c}}{\|\mathbf{q}\|\|\mathbf{c}\|}cos(q,c)=∥q∥∥c∥q⋅c​
q 是查询嵌入,c 是块嵌入。分数越高通常越相关(常读在 0–1 附近),再取 Top-kkk 只保留前 kkk 块(k=5 即五块)。像视频站用标题/描述的坐标推荐「接下来看」;分数 0.92, 0.81, 0.55, 0.30, 0.12 时 Top-k=3 用前三块。「差旅报销」应贴近「交通餐费」,远离「社团通讯」。记:方向 → 前 k → 贴证据。
q (query)qcos(q,c)chunks c₁…c₅92%c1相似度78%c255%c341%c422%c5Top-k · 相似块
读图时,柱高表示 cos(q,c);绿线下 Top-k 的块填入模板空位。
2. 分块 — 一口大小
长文不能每次整本粘贴,要切成块入库。千页菜谱拆成菜谱卡片;问「汤底」只抽汤类卡。
需调节块大小(如 200 token)与重叠(如 40 token)。「7 日内退款」若在边界被切断且无重叠,条件可能落到下一块而搜不到。20 token 太短缺语境;800 token 一块可占满预算。大小 + 重叠 是检索底座。
3. 上下文预算 — 一张答题纸
ctx 像一张答题纸:先写系统提示和用户问题,剩余才贴块。
chunk_budget=ctx−prompt−query\text{chunk\_budget}=\text{ctx}-\text{prompt}-\text{query}chunk_budget=ctx−prompt−query
4096−512−200=3384;1200 // 200= 6 块;8192−1024−256=6912。减法算预算与 // 算最多块数 是同一流程的前后两步。
4. 提示模板 — 填空
用固定格式发送,`{retrieved_chunks}` 只填 Top-kkk 正文,结构是「仅根据下文作答」+ 粘贴区 + 题目。
```
Context:
{retrieved_chunks}
Question: {user_query}
Answer:
```
例如贴 `[块1] 购买后7日内可退...`,再问 `海外配送可退吗?`。模板就是增强(Augment) 的盒子。

RAG: 检索支撑有据回答

1. 开卷 vs 闭卷:RAG 为何出现
只用大模型回答,相当于 Closed-book(闭卷):像默写考试,只能凭训练时记住的内容作答。RAG(检索增强生成) 更像开卷:答题前先去资料库(文档存储) 找相关一页(块/Chunk),贴进提示再写答案。
常见流程是 检索 → 填空(增强)→ 生成。先选出相关块,填入模板的 `{context}` 空位,最后由模型生成回复。
员工问「今年年假规定有什么变化?」时,闭卷可能凭去年的常识说得头头是道;RAG 会找到今年人事制度 PDF 第 7 页,并以该页为据回答。差别不在措辞是否漂亮,而在是否引用了具体页面。
2. 嵌入:把文字变成坐标
计算机很难直接比较「退款」「退货」的语义,所以用嵌入把句子变成一串数字(向量),让相近主题在空间里靠得更近,就像地图上咖啡店聚在一起。
检索时用余弦相似度(cos):看两个向量方向是否接近(角度),比直线距离更能反映话题是否相关。「退款」与「退货·拒付」相近,「午餐菜单」则较远。RAG 按 cos 排序,优先选用最相关的块。
3. 分块与 Top-kkk 检索
一份 500 页的制度 PDF 无法每次整本塞进提示,需要分块:把长文切成一口大小(例如 200 token) 再入库。切得越细,可检索的块越多;但块太短会丢失上下文。
用户提问后,用嵌入与 cos 排序,Top-kkk 只把最相关的前 k 块交给模型(k=3 即 3 块)。海量块要靠向量库快速查找,类似图书馆的卡片目录——不必每次重读全书,只取相似片段。
k 过大时,无关段落容易混入,成本也会上升,因此需要合适的 k,并非越多越好。
4. 上下文预算与提示模板
模型一次能读的文字有上限 ctx(上下文长度),可想象成一张答题纸。先占用系统提示和用户问题的位置,剩余空间才用来贴检索到的块,这部分叫块预算,计算公式为 budget = ctx−提示−问题。
粘贴时使用提示模板:固定格式,`{context}` 放检索内容,`{question}` 放用户问题,并常附带「仅根据下文回答」,减少模型脱离资料瞎猜。
例如 ctx=4096,提示 512,问题 200,预算为 3384;若每块约 200 token,大约可贴 3384 // 200 ≈ 16 块。减法算预算与 // 算最多块数 是同一流程的前后两步。

重要性

1. 为什么需要 RAG — 从“装懂”到可核对
大模型很会把话说顺。遇到内部制度、产品手册、昨天的新闻等没学过或常变的信息时,仍可能语气笃定却答错;错误答案有时已进入审批或客服才被发现。
RAG 先查资料再写。可以追到「制度 PDF 第 12 页第 3 段」,文档或检索不对时改资料、调 k。目标不是零幻觉,而是让答案更容易核实。
例:「海外配送也适用 7 天退款吗?」— 闭卷易套用国内规则;RAG 会找配送条款块再有条件回答。
2. 不重训整模,也能跟上“今天的知识”
周一早上上传新制度 PDF,通常不会为此把 7B 从头训一遍。RAG 里切块 → 嵌入 → 更新向量库即可,同一个模型当天就能引用新条文。
比喻: 教材出了新版,换图书馆书架即可,不必给每个学生重做大脑。
例:「2026 福利 FAQ」— 场景题里常选更新分块与向量库而非全量重训,原因在此。
3. 模型再聪明,页给错了也会错 — 检索是半边产品
生成再强,检索页错了业务上也会错。「退货」问题若贴上「食堂菜单」块,措辞再顺也不可用。
答案异常时,先看 Top-k、块大小、重叠、重排,不要只调 temperature(回答随机度)。recall@k 问的是「正确答案有没有进前 k 名?」——检索成绩单,与文笔好坏分开评估。RAG 把 ①依据
②时效
③检索质量 放在同一条流水线上管理。

如何使用

① 建“知识图书馆”(入库·分块)
先收集规章、手册、FAQ 等可信文档,切成块并保留文件名、页码等元数据,以便日后「出示出处」。
块经嵌入写入向量库,像建卡片目录,避免每次把五百页 PDF 整本塞进提示,之后只取相关片段。
② 找最匹配的页(检索)
问题也向量化,按 cos(q,c) 取 Top-kkk(例如 5 块),必要时重排/去重。
「能检索但答案怪」时,多半先查 k、块大小与重叠,再动生成参数。
③ 组装试卷(增强)
在 ctx−提示−问题 的预算内拼接块,填入模板 `{context}`,并写「仅根据下文回答」。这是 Augment — 让模型读贴上的页,而不是空猜。
④ 写出答案(生成) — 四步连成一线
模型生成回复;好的产品会给出链接、页码、块 ID。记录 k、块大小、预算、分数,幻觉或过时答案增多时调检索。
串联起来:采集/分块像把资料切成披萨片入库(分割器、向量库);检索用书签般的嵌入、cos、Top-kkk 找页;增强在开卷卷面上按模板与预算贴参考;生成让 LLM 对着参考写。一句话:建库 → 找页 → 填空 → 生成。

小结

用一句话概括本章:RAG 就是开卷答题——先检索相关资料,增强时把内容填进提示里的空位,最后生成答案。三步记作:检索 → 填空(增强) → 生成。
检索阶段会从长文档里挑出与问题相近的文本块。余弦相似度 cos(q,c) 表示「问题 q 与块 c 在语义上是否指向相近方向」,分数高的保留 Top-kkk 块即可。增强阶段把选中的块放进提示模板的 `{context}` 位置。模型一次最多能读 ctx 个 token;减去系统提示和用户问题后,剩下的才是可贴资料的预算:预算 = ctx−提示−问题。若每块约 200 token,大约能贴 预算 // 块大小 块。
举例:员工问「退款政策是什么?」,用 cos 从制度 PDF 里选出最相关的 3 块贴进提示,而不是整本塞进去。若 ctx=4096,提示占 512、问题占 200,就要先减掉 512+200,只在剩余空间里放依据。
若一次检索仍不够(需要跨多份文档推理),会延伸到多跳检索(根据上一轮结果再搜)或智能体(自动规划下一步查什么)。

解题说明

做题时先想 闭卷默写(Closed-book) vs 开卷查书(RAG)。闭卷无检索;RAG 找页后用 cos(q,c)、Top-kkk、预算、模板填空再生成。
记住 检索→增强→生成。预算 = ctx−提示−问题,再 预算 // 块大小 得最多几块。temperature 管回答随机性,不等于检索好坏。
常见计算: 4096−512−200=3384 · Top-kkk=5 → 5 块 · 1200÷200 → 1200 // 200= 6。余弦:「退货」↔「退款制度」近;「食堂」远。

示例 (概念 · concept) — 最接近 RAG:② 检索→增强→生成 → 2

示例 (判断 · ox) — 用嵌入检索 → 1

示例 (判断 · ox) — 闭卷先 Top-k PDF → 0
一次会话里常见 上下文预算(vote)、Top-k(vote)、块数(aggregate/config)。套路是:ctx 减去提示与问题,再 // 块大小。
示例 (上下文预算 · vote) — 上限 4096,提示 512,问题 200 → 块预算? → 3384
示例 (Top-k · vote) — Top-k 5 → 选几块? → 5
示例 (块数量 · aggregate) — 预算 1200,块大小 200 → 1200 // 200= 6
示例 (整除 · config) — 1400 // 200 接近 → 7
示例 (场景 · scenario)
「制度问答要紧急更新 PDF。先做?
①全量重训
②重新分块并更新向量库
③去掉 softmax」
→ 答案 2
示例 (场景 · scenario)
「能检索但答案仍偏。先看?
①temperature=0
②Top-k、块大小、重排
③显卡驱动」
→ 答案 2
示例 (概念 · concept)
「Top-k 过大常见副作用?
①无法检索
②噪声与成本上升
③嵌入维度为0」
→ 答案 2
示例 (概念 · concept)
「嵌入 最接近?
①优化器名
②把文本变成向量做相似检索
③只做批归一化」
→ 答案 2
示例 (判断 · ox)
「提示模板 在 `{context}`、`{question}` 处填入检索结果。」
→ 答案 1
示例 (判断 · ox)
「余弦相似度 大则 欧氏距离 一定小(教学简化)。」
→ 余弦看方向 → 答案 0
示例 (流水线 · ensemble)
「Top-k 2,每块摘要 4 句 → 总句数? (2×42 \times 42×4)」
→ 8
示例 (上下文预算 · vote)
「上限 8192,提示 1024,问题 256 → 块预算?」
→ 6912
示例 (块数量 · config)
「预算 2400,块大小 200 → 12」