RAG(检索增强生成)学习笔记

March 22, 2026 (1mo ago)


tags:


RAG(检索增强生成)学习笔记


🤔 先搞清楚:为什么需要 RAG?

大模型的三个痛点

直接把所有文档扔给大模型回答问题,会遇到:

| 痛点 | 说明 | |---|---| | 上下文限制 | 模型窗口有限,文档太长就"读了后面忘了前面" | | 成本高 | 输入越多,推理越贵 | | 速度慢 | 模型要消化大量内容,推理严重变慢 |

RAG 的思路

不发送全部文档,只发送最相关的内容。

传统方式:用户问题 + 全部文档 → 大模型 → 回答(又慢又贵)
RAG 方式:用户问题 + 相关片段 → 大模型 → 回答(快且准)

RAG 是什么

全称: Retrieval Augmented Generation(检索增强生成)

一句话: 先检索找到相关内容,再让大模型基于这些内容生成答案。

最常见应用: 智能客服、知识库问答。


RAG 的五个环节

整体流程分两段:

┌─────────────────┐    ┌─────────────────────┐
│  准备阶段(离线)  │    │   回答阶段(在线)     │
│                  │    │                      │
│  ① 分片          │    │  ③ 召回(粗筛 10 个)  │
│  ② 索引          │ →  │  ④ 重排(精选 3 个)   │
│                  │    │  ⑤ 生成(大模型回答)   │
└─────────────────┘    └─────────────────────┘

① 分片(Chunking)

是什么: 把一篇长文档切成很多小片段。

怎么做: 可以按字数(1000 字/片)、段落、章节、页码来切。

例子:

一篇 10 页的产品手册
  → 切成 20 个片段,每个约 500 字

② 索引(Indexing)

是什么: 把每个片段变成向量(数字数组),存到向量数据库里。

这一步需要先理解三个概念:

向量(Vector)

向量 = 一组数字,代表文本的"含义坐标"。

"苹果是水果" → [0.8, 0.3, 0.9, ...]   (几百维的数组)
"香蕉是水果" → [0.7, 0.35, 0.85, ...]  (很接近!因为语义相似)
"今天天气好" → [0.1, 0.9, 0.2, ...]    (很远,因为语义不同)

直觉: 向量就是把文字"翻译"成数学坐标,意思相近的文字,坐标也相近。

Embedding(嵌入)

是什么: 把文本转成向量的过程。用专门的 Embedding 模型完成。

关键特性: 含义相近的文本 → 向量也相近。

常用模型: OpenAI text-embedding-3、BGE、M3E 等。

向量数据库

是什么: 专门存向量、查向量的数据库。

存什么: 每个片段的向量 + 原始文本。

代表产品: Milvus、Pinecone、Chroma、Weaviate。


③ 召回(Retrieval)

是什么: 用户提问时,从向量数据库里找到最相关的 10 个片段。

流程:

用户问题 "退款流程是什么?"
    ↓
Embedding 模型 → 问题向量 [0.3, 0.7, ...]
    ↓
向量数据库 → 计算相似度 → 返回最相近的 10 个片段

相似度计算方法:

| 方法 | 原理 | 简单理解 | |---|---|---| | 余弦相似度 | 两个向量夹角的余弦值 | 夹角越小 → 越相似 | | 欧式距离 | 两个点之间的直线距离 | 距离越小 → 越相似 | | 点积 | 方向 × 长度 | 值越大 → 越相似 |

召回的特点: 快、便宜,但不够准。像是"粗筛"。


④ 重排(Reranking)

是什么: 从召回的 10 个片段里,再精选出最相关的 3 个。

为什么需要重排? 召回用向量相似度(快但粗糙),重排用 Cross Encoder 模型(慢但精准)。

类比:

召回 = HR 看简历,快速筛出 10 个候选人
重排 = 面试官逐个深入评估,选出 3 个最合适的

对比:

| | 召回 | 重排 | |---|---|---| | 模型 | 向量相似度 | Cross Encoder | | 速度 | 快(毫秒级) | 慢(百毫秒级) | | 准确率 | 较低 | | | 成本 | 低 | 高 |

核心思路: 用便宜的方法先粗筛,用贵的方法再精排。总成本比直接精排低很多。


⑤ 生成(Generation)

是什么: 把精选的 3 个片段 + 用户问题一起发给大模型,生成最终答案。

输入:
  - 用户问题:"退款流程是什么?"
  - 片段1:"退款需在7天内申请..."
  - 片段2:"退款路径:订单详情→申请退款..."
  - 片段3:"退款到账时间一般3-5个工作日..."

大模型输出:
  "退款流程如下:1)在7天内申请;2)进入订单详情点击申请退款;
   3)审核通过后3-5个工作日到账。"

完整流程图

              准备阶段(离线,一次性)
              ================================
原始文档  ──→  分片  ──→  Embedding  ──→  向量数据库
              (切小块)    (转成向量)      (存起来)


              回答阶段(在线,每次提问)
              ================================
用户问题  ──→  Embedding  ──→  向量数据库  ──→  召回10个片段
              (问题转向量)    (查相似度)       (粗筛)

                        ──→  Cross Encoder  ──→  精选3个片段
                              (重排)            (精筛)

                        ──→  大模型  ──→  答案
                              (生成)

💡 核心思想总结

| 原则 | 说明 | |---|---| | 先检索,再生成 | 不是把所有东西扔给模型,而是先找到相关的 | | 两阶段筛选 | 召回(粗筛)+ 重排(精筛),比直接精筛成本低 | | 向量 = 语义坐标 | 把文字变成数字,用数学方法找相似 | | Embedding ≠ 生成模型 | Embedding 只负责"理解语义转成向量",不负责回答问题 |


📝 常见问题

Q: RAG 和微调(Fine-tuning)有什么区别?

RAG 是"给模型看参考书",微调是"给模型补课"。RAG 不改模型本身,微调改模型参数。

Q: 为什么召回和重排要分两步?

性价比。全部用 Cross Encoder 太贵,全部用向量相似度太不准。两步结合最优。

Q: 分片大小怎么选?

太大 → 信息不够聚焦,召回不精准。太小 → 丢失上下文。一般 500-1000 字。

Q: 向量维度越高越好吗?

不一定。维度高 = 更精细但更慢更占空间。一般 768 或 1536 维就够了。