乐于分享
好东西不私藏

RAG中文档分块的几种方法

RAG中文档分块的几种方法

首先需要理解分块逻辑处于哪个节点(when): 将文档内容提取为纯文本或者数据清洗后。

同时需理清楚为何需要分块(why):

  • 底座大模型以及嵌入模型的上下文窗口是有限的,如果不切分直接放到窗口内,容易占满整个窗口。
  • 控制检索来源的精度和内容降噪:回答一个问题,并不需要整一本书的内容。只需要检索向量库中最相关的几个分块,交给LLM生成答案
  • 控制token消耗成本

理解分块(what): 追求语义完整性和块粒度的平衡。切块之后不应该是:

  • 块过大,语义被多个话题稀释,适合回答长查询如"分析 AI 在医疗领域的应用现状和未来挑战";
  • 块过小,完整语义被分割到不同的块,适合回答短查询如“北京的面积是多少”。块太小块数据就多,嵌入时计算量就大,存储空间也会增大,检索效率会变慢

固定长度

将一个文档按固定长度(默认指:按token数量切分,当然也有按字符数切)切分。

  • 优点:实现简单
  • 缺点:语义会被分割,连贯性不足
  • 备注:在相邻块之间设置定长的重叠overlap内容,能一定缓解语义的不连贯

递归字符分块

lc的默认方案。按分割符优先级(段落/换行/句号/逗号/字符)递归的切分,直到每个块都达到预设的token或字符阈值。

  • 优点:语义完整,适合结构化的PDF、Word文档
  • 缺点:不太适合OCR扫描的无分隔符的无段落结构的文本

特殊文档分块

根据不同类型文档的自带特殊结构来分。

  1. Markdown 可以按照标题分块。
  2. 代码可以按照函数类分块。
  3. PDF 文档需要处理表格、图像、链接。

表格的提取:

  1. 用专业的 unstructured 解析库解析 PDF。
  2. 将 PDF 拆分成不同的元素,元素包括文本、表格、图像。
  3. 最后对表格进行单独处理,保留其结构信息。
  4. 将表格处理为 HTML 或者 Markdown 形式,保存它原有的行列结构 或者 为表格生成描述文字

图像的处理:

  1. 从 PDF 中提取所有的图像。
  2. 利用多模态大模型(GPT-4V)生成对应图像的文本描述
  3. 文本描述和原文一起存储到向量数据库,检索时可以返回文本和图像描述。

公式的处理:

  • 将公式转换为LaTex

语义分块

核心是基于内容之间的相似度执行合并和切分。

  1. 首先将文本拆分为句子
  2. 使用嵌入模型将每一个句子转为向量
  3. 比较当前句子的向量和相邻句子向量的余弦相似度,大于某一个阈值,句子合并;小于某一个阈值,分块

基于专门agent分块

  1. agent分析原始文档内容和结构
  2. 基于用户可能的查询,动态地选择或者新建分块策略,之后执行分块。

自定义切分

基于垂直领域比如法律法条、金融财报、客服QA、医疗病历自定义切分,无通用性