首先需要理解分块逻辑处于哪个节点(when): 将文档内容提取为纯文本或者数据清洗后。
同时需理清楚为何需要分块(why):
底座大模型以及嵌入模型的上下文窗口是有限的,如果不切分直接放到窗口内,容易占满整个窗口。 控制检索来源的精度和内容降噪:回答一个问题,并不需要整一本书的内容。只需要检索向量库中最相关的几个分块,交给LLM生成答案 控制token消耗成本
理解分块(what): 追求语义完整性和块粒度的平衡。切块之后不应该是:
块过大,语义被多个话题稀释,适合回答长查询如"分析 AI 在医疗领域的应用现状和未来挑战"; 块过小,完整语义被分割到不同的块,适合回答短查询如“北京的面积是多少”。块太小块数据就多,嵌入时计算量就大,存储空间也会增大,检索效率会变慢
固定长度
将一个文档按固定长度(默认指:按token数量切分,当然也有按字符数切)切分。
优点:实现简单 缺点:语义会被分割,连贯性不足 备注:在相邻块之间设置定长的重叠overlap内容,能一定缓解语义的不连贯
递归字符分块
lc的默认方案。按分割符优先级(段落/换行/句号/逗号/字符)递归的切分,直到每个块都达到预设的token或字符阈值。
优点:语义完整,适合结构化的PDF、Word文档 缺点:不太适合OCR扫描的无分隔符的无段落结构的文本
特殊文档分块
根据不同类型文档的自带特殊结构来分。
Markdown 可以按照标题分块。 代码可以按照函数类分块。 PDF 文档需要处理表格、图像、链接。
表格的提取:
用专业的 unstructured 解析库解析 PDF。 将 PDF 拆分成不同的元素,元素包括文本、表格、图像。 最后对表格进行单独处理,保留其结构信息。 将表格处理为 HTML 或者 Markdown 形式,保存它原有的行列结构 或者 为表格生成描述文字
图像的处理:
从 PDF 中提取所有的图像。 利用多模态大模型(GPT-4V)生成对应图像的文本描述。 将文本描述和原文一起存储到向量数据库,检索时可以返回文本和图像描述。
公式的处理:
将公式转换为LaTex
语义分块
核心是基于内容之间的相似度执行合并和切分。
首先将文本拆分为句子 使用嵌入模型将每一个句子转为向量 比较当前句子的向量和相邻句子向量的余弦相似度,大于某一个阈值,句子合并;小于某一个阈值,分块
基于专门agent分块
agent分析原始文档内容和结构 基于用户可能的查询,动态地选择或者新建分块策略,之后执行分块。
自定义切分
基于垂直领域比如法律法条、金融财报、客服QA、医疗病历自定义切分,无通用性
夜雨聆风