检索增强生成通俗解密 (RAG: Retrieval-Augmented Generation)¶
在构建企业级大模型应用时,几乎 80% 的实际场景都离不开一个核心技术:RAG(检索增强生成,Retrieval-Augmented Generation)。
很多初学者接触大模型时,常常产生这样的疑问: - “大模型参数那么大,为什么不知道我昨天发布的新产品?” - “大模型为什么张口就来,凭空捏造不存在的历史事件或虚假代码(大模型幻觉)?” - “我想让大模型学习我们公司内部成千上万篇内部飞书文档,是不是必须花几百万重新训练一个模型?”
答案是否定的。解决这些问题的黄金钥匙,就是 RAG。
1. 初学者通俗类比:闭卷考试 vs 开卷考试¶
理解 RAG 最形象的比喻就是考场做题:
flowchart LR
subgraph PureLLM ["纯大模型 (闭卷考试)"]
direction TB
P_Brain["依靠大脑记忆 (预训练参数)"]
P_Prob["缺点: 容易遗忘、知识滞后、容易胡思乱想 (幻觉)"]
P_Brain --> P_Prob
end
subgraph RAG ["RAG 系统 (开卷考试)"]
direction TB
R_Search["先去图书库精准翻出相关参考书页 (检索 Retrieval)"]
R_Read["把书页摊在桌上,照着书本整理答案 (生成 Generation)"]
R_Search --> R_Read
end
- 纯大模型问答(闭卷考试):全凭模型几个月甚至两年前预训练时记住的参数记忆。一旦被问到最新时事或企业私有数据,它只能依靠概率强行拼凑,极易产生幻觉(Hallucination)。
- RAG 系统(开卷考试):模型在回答前,系统先帮它从外部知识库中“搜出最相关的 3 篇文档段落”,然后把文档和问题一起塞给模型:“请严格根据这 3 段参考资料,回答用户的问题”。这样,回答不仅准确客观,还能给出信息引用的出处来源!
2. RAG 全景架构:五步搭建流水线¶
一个完整的 RAG 系统分为两大链路:离线索引链路(建库)与在线问答链路(检索与生成)。
flowchart TD
subgraph Offline ["阶段一:离线数据准备 (建知识库)"]
Doc["1. 原始知识文档 (PDF / Word / Markdown)"] --> Chunk["2. 文本切块 (Chunking)"]
Chunk --> EmbModel["3. 文本向量化 (Embedding 模型)"]
EmbModel --> VecDB[("4. 存入向量数据库 (Vector DB)")]
end
subgraph Online ["阶段二:在线实时交互 (问答生成)"]
UserQ["用户提问: '2026年公司年假政策是什么?'"] --> QEmb["向量化问题"]
QEmb --> Search["5. 向量相似度检索 (Top-K 近邻搜索)"]
VecDB -.-> Search
Search --> Context["召回最相关的 3 个文本块"]
Context & UserQ --> Prompt["组装提示词: '基于以下参考资料回答...'"]
Prompt --> LLM["大语言模型 (LLM)"]
LLM --> FinalAnswer["输出准确答案 (并附带文档来源)"]
end
3. 核心技术细节拆解¶
3.1 文本切块 (Chunking) 的艺术¶
一本 500 页的员工手册,为什么不能直接全部喂给向量模型? 1. 向量模型的输入限制:Embedding 模型通常只支持 512 到 8192 个 Token 的输入; 2. 检索精度(信噪比):如果一整本书对应一个向量,其语义会被极度稀释。只有把文档切成大小适中的“知识块(Chunks)”,检索时才能精准命中具体某一条款。
原始长文: [====================================================]
切块方案: [块 1: 500字] (重叠 50字) [块 2: 500字] (重叠 50字) [块 3: 500字]
- 分块大小(Chunk Size):经验值通常在 \(300 \sim 800\) 字符之间;
- 滑动窗口重叠(Chunk Overlap):相邻文本块之间通常保留 \(10\% \sim 20\%\) 的重叠内容。这样可以防止关键句子正好被切刀从中间截断,导致语义丢失。
3.2 向量数据库 (Vector Database) 与余弦相似度¶
将切好的文本块通过 Embedding 模型转换成高维向量后,需要存放在专为“高维向量近邻检索”设计的数据库中。
- 常见向量数据库:Chroma(轻量易学)、Milvus(分布式高并发)、Pinecone(全托管云服务)、Qdrant、PGVector(PostgreSQL 向量插件)。
- 相似度计算(余弦相似度 Cosine Similarity): 向量数据库通过计算两个向量夹角的余弦值来判断语义相似度:
数值越接近 1,表示两个文本语义越接近(即便它们使用的具体字词不同,例如“如何退货”和“我不想要了想退款”在向量空间中距离极近)。
4. 工业级进阶:混合检索 (Hybrid Search) 与重排 (Reranker)¶
在工业级生产实践中,很多初学者会发现:单纯依赖向量检索(Dense Retrieval),经常会搜出“看着差不多、但核心实体全错”的结果。
典型案例:
用户搜索:“iPhone 15 Pro Max 电池容量”
向量检索可能召回了一篇关于“iPhone 14 Pro Max 续航体验”的段落。因为在向量空间里,手机续航和电池的语义极度接近,模型忽略了“15”和“14”这一个字符的致命差别!
为了解决这个问题,现代工业级 RAG 标配 混合检索 + Reranker 重排机制:
flowchart TD
UserQuery["用户查询 Query"] --> Dense["稠密向量检索 (Vector Search)<br>捕捉宽泛深层语义匹配"]
UserQuery --> Sparse["稀疏关键词检索 (BM25 / 倒排索引)<br>精准锁定型号、人名、代码专有名词"]
Dense --> Candidates1["候选文档 30 篇"]
Sparse --> Candidates2["候选文档 30 篇"]
Candidates1 & Candidates2 --> Merge["混合合并与去重 (60 篇)"]
Merge --> Reranker["交叉编码重排器 (Cross-Encoder Reranker)<br>高精度深度打分重排"]
Reranker --> Top3["精选最优 Top-3 核心段落"]
Top3 --> LLM["输入给大模型生成最终回答"]
- 混合检索 (Hybrid Search):结合 BM25(传统关键词倒排索引)与 Dense Vector(语义向量)。专有名词由 BM25 兜底,深层含义由向量覆盖,取长补短。
- 重排器 (Reranker):向量召回虽然快,但它是单独计算每个段落的向量,段落与问题之间缺乏精细交互。Reranker 模型(如 BGE-Reranker)将问题和候选段落拼接在一起,进行深度的双向交叉注意力打分,只挑出最匹配的 \(3 \sim 5\) 篇交给大模型,极大降低了噪音。
5. RAG 落地黄金准则总结¶
| 优化维度 | 推荐实践 | 避坑提醒 |
|---|---|---|
| 文档清洗 | 过滤无意义页眉、页脚、版权免责声明、乱码字符 | 垃圾进,垃圾出(Garbage in, Garbage out) |
| 切块策略 | 结合 Markdown 标题层级切分(保持章节完整性) | 切忌固定按每 200 字机械硬切 |
| Prompt 防幻觉 | 明确指令:“仅根据提供的背景资料回答,资料中未提及的请如实说明无法获知,严禁凭空推测” | 防止模型在知识缺失时开始信口开河 |
| 溯源引用 | 在输出格式中强制要求附带 [参考来源: 文档名#段落编号] |
提升企业客户对回答真实性的信任感 |