智泊AI--RAG构建
智泊AI–RAG构建
1.为什么需要RAG
由于大模型的训练机制导致,大模型是静态的知识库,导致了如下缺点:
- 知识的缺失:一般发生在垂直领域,大模型获取不到垂直领域的一些私有数据。
- 时效性:大模型对数据的训练是非实时的,对于一些时效性的数据或者场景无法命中实时的数据。
2.什么是RAG
所谓的 RAG 就是三个单词的组合——检索、增强、生成。
- 检索:在提问大模型之前,会先在模型之外检索并获取数据。检索的方式是多种多样的,因为检索方式的不同,RAG 可以分为不同的类型:
- 基于向量检索:Native RAG
- 基于文本检索:wiki
- 基于文档索引:PageIndex RAG
- 基于实体:GraphRAG,基于三元组
- 增强:基于用户问题去检索到知识后,将问题和知识一起构建为提示词。
- 生成:大模型最终结合问题和知识生成回答内容。
3.RAG的构建
正常来讲,RAG 系统的构建分为:离线构建、在线查询。
离线和在线的区别:最早的来源于服务器的部署概念,offline(离线)和 online(在线)。
- 离线:指非本地用户无法访问、不受干扰的过程。
- 在线:服务已上线,非本地用户可以访问。
4.离线构建
离线构建:要提前将知识库搭建,一般步骤包括但不限于:清洗、分块、向量化、存储。
提示:在企业落地的过程中,90% 以上的工作量在清洗和分块之上,因为业务的复杂度不同。
- 清洗:数据清洗,一般包含文档加载、清洗、增强等操作。
- 文档加载:基于现有的文档加载器将不同类型的文档转为统一类型的数据(掌握常用的工具即可)。
- 数据清洗:主要是基于通用规则的清洗(格式、脱敏、去重)、基于业务(版本、范围、名称语义的多样性统一、数据冲突)的清洗。
在企业中,RAG 的落地一般策略:主要针对企业文档很多、来源复杂,通常会抽取部分数据来实现快速流程验证,然后再普及推广。
文档分类:
- 基于类型
- 基于业务场景
- 基于文档的内容,主要针对数据清洗部分(例如图片、表格)
清洗流程和规则的建立:
- 基于代码:对于抽取出来的业务清洗规则通过代码来实现,需要考虑是否具备可延展性。
- 基于人工:一般来说,如果需要处理的数据规模较小、规则难以抽取,都会采用人工处理的方式。
全局的方针:需要少量文本进行验证。
分块:将一个大文档切分为多个小文档。
- 分块原因:
- 技术层面:后续的向量化需要用到向量模型,向量模型的输入长度有限制,所以要保证进行向量化操作的文档块小于等于向量模型的输入限制。
- 业务层面:用户的问题可能只和某个文档中的某一块信息有关,如果用整个文档去回答问题,会导致 token 损耗增加、处理速度变慢、引入的噪声过多等。
- 分块方法:
- 常见的:基于固定字符数、重叠窗口、基于句子、递归。
- 进阶:外在基于业务场景去选择或自定义,常见的有:基于对话、父子结构、基于语义等。
- 分块原因:
向量化:基于向量模型,将分块之后的知识转化为对应的句向量(块向量),即一个知识块转化成一个向量(目前较好用的中文向量化模型:bge-m3)。向量模型与大模型一样,也是可以训练得到,不过向量模型训练成本较大。
- 稀疏向量模型
- 稠密向量模型
存储:对于向量来说,需要用到向量数据库去进行存储。
提示:对于向量数据库而言,存储知识只是开始,最终向量数据库的目的是为了实现快速的检索。
5.在线查询
当我们构建好知识数据库后,就可以基于知识库去实现在线查询。过程:查询 → 向量化 → 检索 → 增强 → 生成。
- 查询:用户提交问题。
- 向量化:用户查询的是字符串,知识是向量,需要将用户的查询也转化成相同标准的向量。
注意:用户的查询向量化和知识库的向量化必须使用相同的向量模型。
- 检索:使用用户查询所转化得到的向量在向量数据库中进行检索。一般常用的三种:
- 余弦相似度:方向的一致性
- 欧式距离:计算的是向量坐标的距离
- 点积
- 增强:基于向量检索拿到文本块后,将问题和对应的文本块一起构建提示词,从而达到增强提示词的效果。
- 原有的提示词:只有用户问题
- 增强的提示词:用户问题 + 问题相关的知识
- 生成:让大模型基于用户问题 + 问题相关的知识去回答用户问题。
6.FastGPT搭建RAG
首先导入数据库。

配置一个对话 agent 并导入知识库。

注意:由于内容较少,数据库中的结果重排需要关闭掉,可以查看执行流程:

7.分块方法
基础的分块方式主要有四种:
| 分块方式 | 优点 | 缺点 |
|---|---|---|
| 基于固定长度 | 处理方便 | 容易有语义割裂 |
| 基于固定长度 + 重叠窗口 | 一定程度上解决语义割裂问题 | 增加资源消耗,引入更多噪音(一般是语句长度的 5%—20%) |
| 基于句子 | 保证语义的完整性 | 在实际中,业务更多的是段落 |
递归分块:是 LangChain 中封装的一个分块方法,是结合了以上三种优点的一种分块方法,一般作为企业落地的首选分块方法;一般来说,只有当递归分块不满足业务需要时,才会考虑其他方法。
图片处理:
- 图片单独分块:
- 图片转为 base64 编码直接存储。
- 借助多模态模型去理解图片,生成图片的描述性文字作为分块(人工可以介入)。
- 原本图片的位置使用描述性索引文字进行描述,指向真正的图片,借助多模态模型去理解图片(人工不介入)。