微信公众号原文链接: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 多路融合 + 重排

每次重算

索引持久化 + 缓存向量

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐