RAG实战笔记(一)RAG 技术原理与架构拆解
微信公众号原文链接:RAG实战笔记(一)RAG 技术原理与架构拆解
https://mp.weixin.qq.com/s/axrqOtQAKT5nIw6AvlZM1A
一、RAG 是什么
RAG(Retrieval-Augmented Generation,检索增强生成)= 检索 + 生成。 核心思想:在让大模型回答问题前,先从「私有知识库」里检索出相关资料, 把资料作为上下文一起喂给大模型,从而:
-
让模型回答基于你自己的数据(而非训练语料);
-
缓解「幻觉」(模型编造不存在的内容);
-
知识可热更新(换索引即可,不用重新训练模型)。
一句话流程:用户问题 → 检索相关文档片段 → 拼接上下文 → 大模型生成答案 → 返回(含来源)

二、整体架构(分层)
1. 数据源层
系统支持多种格式的原始数据输入,包括 PDF、Word、TXT、Markdown、CSV 以及网页等。
示例:
上传《产品使用手册.pdf》《常见问题.docx》《公司年报.csv》以及官网帮助中心页面,作为知识库的数据来源。
2. 切片层(文本预处理)
对长文档进行语义完整的分块处理,将文档切分为若干较小的片段(Chunk),确保每个片段保留相对完整的语义信息。
示例:
将句子“我们去公园散步,看到了很多花。花的种类有月季、郁金香和绣球。”切成两个片段:
-
片段 1:我们去公园散步,看到了很多花。
-
片段 2:花的种类有月季、郁金香和绣球。
而不是按词拆成“我们 / 去 / 公园”,那样会丢失上下文语义,不利于后续检索和生成。
3. 向量存储层
将每个切片通过嵌入模型(Embedding)向量化,生成对应的向量表示,并存入向量数据库。本流程默认使用 FAISS,也兼容 Chroma、Milvus 等。
示例:
使用嵌入模型将片段“公园里种植了月季和郁金香”转换为一个 1536 维向量,写入 FAISS 索引;同时保留原始文本,便于后续展示引用来源。
4. 召回层(多路检索)
用户查询时,系统同时执行两路召回:
-
向量语义召回:基于向量相似度
-
关键词召回:BM25 算法
两路结果通过 RRF(倒数排名融合)算法进行融合,得到初始候选片段集合。
示例:
用户提问:“公园里有什么花?”
-
向量召回可能找到“公园里种植了月季和郁金香”等语义相近的片段;
-
BM25 关键词召回则匹配包含“公园”“花”等关键词的片段。
两路结果用 RRF 融合后,得到一个综合排序的候选片段列表。
5. 重排层(精排)
对候选集进行精细排序,默认使用 Cross-Encoder(交叉编码器)进行重排;若该模型不可用,则回退为轻量级打分策略。
示例:
Cross-Encoder 对“问题—候选片段”逐一打分,例如:
-
片段 A:0.92
-
片段 B:0.81
-
片段 C:0.63
最终保留高分片段进入生成层,提升答案的准确性。
6. 生成层(答案合成)
取重排后的 Top-K 个最相关片段,将其与用户问题组装成 Prompt,提交给大语言模型(LLM)生成最终答案,并同时返回引用来源。
示例:
取 Top-3 片段作为上下文,Prompt 可组装为:
请基于以下资料回答问题。
资料1:公园里种植了月季和郁金香。
资料2:花园中还有绣球花。
资料3:月季和郁金香在春季开放。
问题:公园里有什么花?
LLM 输出:
公园里有月季、郁金香和绣球花。
引用来源:[1][2]

三、常见坑与优化点
|
问题 |
原因 |
对策 |
|---|---|---|
|
答非所问 |
切片过大/重叠不足 |
调小 chunk、增大 overlap |
|
检索不到 |
切得太碎或 Embedding 不匹配 |
调整切片;换领域适配的 Embedding |
|
幻觉 |
模型自由发挥 |
强约束 Prompt + 返回来源 |
|
召回不准 |
只有单路召回 |
加 BM25 多路融合 + 重排 |
|
慢 |
每次重算 |
索引持久化 + 缓存向量 |
更多推荐

所有评论(0)