文档加载与分块
目的
加载文档并将文档内容尽可能完整的进行分块,便于后续检索的完整性和问答的准确性
各个文件格式对应的loader处理
文件后缀 | 获取逻辑 |
---|---|
默认:逐页提取文本以及图片 | |
OCR: 提取文本转换为MD | |
.docx | 转化为MD格式, 去除页眉页脚 |
.doc | 转化为docx文件处理 |
.xlsx/.xls | 获取每个Sheet、每个单元格内容进行拼接 |
.pptx/.ppt | 转化为PDF处理 |
.txt | 直接读取文本 |
.md | 直接读取文本 |
.htm/.html | 暂无 |
分块策略
固定长度分块
最直接的策略是根据文档长度进行拆分。这种简单且有效的方法可以确保每个数据块都不超过设定的大小限制。 基于长度拆分的主要优点包括:
- 实施简单
- 块大小一致
- 容易适应不同模型的需求
递归分块
自然语言文本通常由层次化的单元构成,如段落、句子和单词。我们可以利用这种结构,制定拆分策略,确保在保持语义连贯性的同时,适应不同层次的文本粒度。 它优先保持较大的单元(如段落)不变。如果某个单元超过了块大小限制,拆分会进入下一个级别(如句子)。如果仍然需要进一步拆分,则继续到单词级别。
语义分块
与之前的方法不同,基于语义的拆分更加关注文本的内容。尽管其他方法利用文档或文本结构来间接表示语义,这种方法直接分析文本的语义内容。实现这一方法有多种途径,但核心理念是当文本的含义发生显著变化时进行拆分。例如,我们可以通过滑动窗口技术生成文本嵌入,并通过比较这些嵌入来发现语义上的重大差异: 首先,生成前几句的嵌入。 然后,滑动窗口到下一组句子,生成新的嵌入。 比较这些嵌入,发现显著差异,指示可能存在语义“断点”。 这种技术能够生成语义上更连贯的文本块,从而有可能提升诸如检索或摘要等下游任务的表现质量。