RAG:检索增强生成
RAG 在语言模型回答前增加检索:把问题编码为向量,按余弦相似度选出最接近的 k 个文档块,放进提示词,再要求模型依据它们回答。模型无需重新训练,但“仅按上下文回答”的指令不保证一定遵守。
可以把它看成带检索员的开卷考试。检索员先挑资料,答题者再阅读。选中的资料是否相关、是否完整,会影响答案;生成阶段也仍可能误读或编造。本课把检索结果与回答并排显示。
RAG 如何工作
查询前建索引,文档变化时更新。 把文档分成各含数句的块,再用嵌入模型转成向量。本例使用真实 MiniLM,每块 384 维。语义接近的文本往往更靠近,即使用词不同;这种关系来自训练,不是无误的语义判断。块与向量组成索引。
每次提问时检索。 本例用同一嵌入模型编码问题。一般要求问题与文档向量处于兼容空间,不能混用不相关模型;专门共同训练的查询与文档编码器可以不同。计算问题与每块的余弦相似度,排序取 top k,再把它们放到“只依据下方上下文回答”的指令与问题之间,最后生成回答。
若最高分也低于相关阈值,则不生成。没有答案的文档集仍有“最近的一块”;最近只说明排序,不能证明相关。
RAG 逐步演示
默认是虚构智能灯的十块帮助文档,k = 3,问题为 My lamp won't connect to my phone.。分数由真实嵌入计算;下方回答是预设展示,不是实时模型输出。
- 索引。 十块主题为退款、账户转账、蓝牙配对、固件、恢复出厂设置、两项保修条款、店内额度、手机应用、亮度。每块成为一个向量,画布用二维投影显示。
- 编码问题。 同一模型生成问题向量,图上用星号表示。
- 评分。 与十块计算余弦。配对文档使用
Pair the lamp over Bluetooth: hold the base button five seconds...,虽未用症状中的 connect、phone,仍得 0.55,第 1。含 phone、但讲日程与日落渐暗的应用文档只有 0.14,第 5。0.55 约是 0.14 的四倍,但相似度比值不是正确率或概率比值。 - 选 top k。 取蓝牙配对 0.55、恢复出厂 0.50、固件 0.28。除了首选,还带入两个相关度较低的块。
- 扩充提示词。 三块进入规则与问题之间。
- 回答并引用。 展示“按住底座按钮五秒,直到蓝灯脉动;配对使用蓝牙”,引用第 3 块。读者可沿引用核对原句,而不必假设模型此前知道配对方法。
检索如何影响答案
Split fact 问 Can I still get my money back after two months?。退款期限块以 0.53,第 1 入选,说明退款限 30 天。但另一块还说未拆封商品可随时换店内额度;它与礼品包装混在同一块,相关条件被整体主题稀释,只得 0.24,第 4。
k = 3 时,第 2 是普通保修条款 0.29,第 3 是账户转账 0.26,受 money back 等用词牵引。展示回答仅说“购买后 30 天内才能退款”。现金退款期限本身有依据,但遗漏店内额度选项,未完整说明可行的处理方式;店内额度也不能称为现金退款。
把 k 从 3 调为 4,店内额度块进入提示词。同一问题的展示回答就会包含该选项并引用两处资料。改变的是供给的证据,不是重新训练模型。
Not in docs 问 Do you sell replacement bulbs?。文档没有灯泡资料,最高分 0.16,低于阈值 0.35,因此停止生成。关闭阈值后,同样的低相关排序进入提示词,预设回答却说“替换灯泡受两年保修覆盖”。这是有引用但无依据的编造,展示从无关资料生成答案的一种失败机制,不是对 RAG 幻觉成因比例的测量。
Keyword trap 问 Can I trade in an unwanted present through the app?。正确相关块是店内额度,但 app 把账户转账块拉到 0.49,第 1,相关块为 0.48,第 2。k = 1 只提供干扰项,展示回答讲家庭账户转账;k ≥ 2 才纳入换额度条件。嵌入能抵抗部分关键词偏差,不能保证免疫。
Paraphrase 问 How do I erase all my settings and start the lamp like new?。文档没有 erase、settings、like new 这些说法,恢复出厂块仍以 0.67 胜出,是本课最高的第一名分数。
边界情况
- 嵌入空间必须兼容。 不相关编码器的坐标不能直接比较。更换空间时需要重建文档嵌入;专门训练的双编码器并不要求权重完全相同。
- 余弦可为负。 某些无关块得负分,表示向量夹角超过 90°,不等于语义共有量“小于零”。排行榜按真实分数处理。
- 阈值需要校准。 0.35 是本例选择,不是通用规则。真实系统可按语料与模型调整,或用重排器判定。对比 Not in docs 的阈值开关,排序完全相同,只改变是否生成。
- k 是预算。 十块文档中取五块可能带入低分内容。Split fact 的 k=4 已提供缺失证据,k=10 虽也包含它,却增加噪声与阅读成本。
- 分块决定可检索性。 太粗可能混合主题,太细可能丢掉解释事实所需的条件。本例失败来自一块包含两种主题。
常见错误
- 检索漏掉证据时只调生成器。 温度、提示措辞或更强模型不能让未提供的块自动成为检索证据。先查排序与截断位置,再取回缺失资料。
- 把引用当正确性证明。 引用只提供来源指针,仍要检查它是否支持结论,以及资料是否完整。Split fact 的单条退款引用没有提供全部选项。
- 只按 grep 思考。 本例按向量近邻排序,含 phone 的应用块输给不同措辞的配对块;关键词也可能把干扰项排上来。
- 省掉不回答的分支。 无答案仍强制生成,就可能误用最近的无关块。阈值可以拦截本例,但也不是正确性保证。
- 认为增加上下文没有成本。 每块都占上下文窗口与输入预算。上下文与记忆 解释这些资源如何被占用。
模型的简化
嵌入是真实 MiniLM 384 维,分数是真实余弦;语料只有十块,用穷举搜索。大规模系统可能用近似最近邻索引,也常加入重叠分块、关键词与向量混合检索、候选重排和查询改写。
二维图只做 PCA 投影,实际评分使用全部 384 维,应以表格分数为准。回答是脚本,用于固定生成文字并观察检索差异,不能据此声称真实模型必然给出同样回答。