← 课程库
解码 · 部署 · 应用模块八 · 检索增强代码16 分钟

检索增强 RAG:让模型开卷考试

把外部知识检索进来,再生成

学完这节你能:
  • 说清 RAG 的完整流程
  • 理解向量检索与相似度
  • 看懂 masked mean pooling 求句向量

RAG(检索增强生成):回答前先从知识库检索相关文档,把它们放进上下文再生成。这样能引入最新/私有知识,并显著缓解幻觉(回顾 Stage 3)。

  1. 离线:把文档切块,用编码器算成向量,建索引。
  2. 在线:把用户问题也编码成查询向量。
  3. 检索:用余弦相似度找最相近的若干文档块(回顾 Stage 0 的点积/余弦)。
  4. 生成:把检索到的文档 + 问题一起喂给模型,让它「开卷」作答并引用。
相似度 =cos(q,d)=qdqd= \cos(q, d) = \dfrac{q\cdot d}{\lVert q\rVert\,\lVert d\rVert}
句向量常用 masked mean pooling:对有效 token 的向量求平均(padding 不算)
掩码平均:sum(向量×mask) / sum(mask)——正是 Stage 0 项目里的池化。
masked mean pooling + 余弦相似度
# emb: (batch, seq, dim)  mask: (batch, seq)
summed = (emb * mask.unsqueeze(-1)).sum(1)
sent_vec = summed / mask.sum(1, keepdim=True).clamp(min=1)  # 掩码平均
sent_vec = F.normalize(sent_vec, dim=-1)                    # 归一化
sim = query_vec @ sent_vec.T                                # 归一化后点积=余弦相似度

🔑 RAG 三个词记牢:编码(文本→向量)、检索(余弦相似度找最近)、生成(开卷作答)。masked mean pooling 保证 padding 不污染句向量——这是 embedding 的常见坑。

自测RAG 中用 masked mean pooling 求句向量,mask 的作用是:
// 带走一句话

RAG=编码(masked mean pooling 求句向量)+检索(余弦相似度)+生成(开卷);引入外部知识、缓解幻觉,padding 不入池化。

独立练习

做到这些,才算完成本节

  1. 建立 10 个有答案和 5 个无答案问题,分别评估检索命中、引用正确与拒答。
  2. 改变 chunk 大小和 overlap,只改变一个变量,记录召回与上下文噪声的变化。
  3. 在本地运行代码,打印每个关键张量的 shape。
  4. 关闭示例后从空文件重写核心部分,并补一个异常或边界测试。
学习记录

记录本节阅读进度

建议先独立回答自测。读完记录不等于已经掌握。

继续下一课
← 上一课
思维链提示:让模型「想清楚再答」
下一课 →
阶段项目:量化部署 + RAG 问答系统

学完不要急着赶进度:去练习自测,或完成对应的阶段实验