乐于分享
好东西不私藏

RAG技术详解(一):文档分片逻辑

RAG技术详解(一):文档分片逻辑

大家好。今天开始我们来聊聊RAG(Retrieval-Augmented Generation)技术。RAG作为连接大模型和私有知识库的桥梁,主要分为三个阶段:
  1. 文档分片 – 将大文档切分成小块

  2. 向量化与存储 – 将分片转换为向量并存入向量数据库

  3. 检索与生成 – 根据用户问题检索相关分片并生成答案

这篇文章我们先聚焦在文档分片这个环节,特别是如何处理PDF、XLSX、DOCX这三种常见文档格式。

为什么需要文档分片?

大模型有一个输入长度限制,比如GPT-4是8K、32K甚至更长,但对于动辄几十上百页的文档,直接丢进去肯定不行。所以我们需要把文档切分成合理大小的片段,每个片段既不能太短(丢失上下文),也不能太长(超出模型限制)。

三种常见文档的分片方案

1. PDF文档分片

PDF是最常见的文档格式之一。处理PDF需要的核心依赖:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.5</version></dependency><dependency><groupId>technology.tabula</groupId><artifactId>tabula</artifactId><version>1.0.5</version></dependency>

PDF支持的分片方式

  • 章节标题分片(默认):按照文档的标题结构进行分片

  • 固定长度分片:按照指定的字符数进行分片

  • 正则表达式分片:自定义正则表达式作为分隔符

PDF分片的关键点

  1. 表格处理:PDF中的表格比较难识别,Tabula库可以帮助提取表格数据

  2. 跨页问题:表格或段落可能跨页,需要特殊处理

  3. 换行处理:PDF中的换行很多,需要合理合并

2. XLSX/Excel文档分片

Excel表格数据有其特殊性,需要的核心依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.4</version></dependency>

XLSX支持的分片方式

  • 按行分片(默认):将Excel的每一行作为一个分片

  • 按标题分片:按照表格的标题列进行分片

Excel分片的关键点

  1. 表头处理:确定哪一行是表头很重要

  2. 合并单元格:合并单元格的数据需要特殊处理

  3. 多Sheet:Excel可能有多个Sheet,需要分别处理

3. DOCX/Word文档分片

Word文档是最复杂的格式之一,需要的核心依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.2.4</version></dependency>

DOCX支持的分片方式

  • 章节标题分片(默认):按照Word的标题样式进行分片

  • 固定长度分片:按照字符数分片

  • 正则表达式分片:自定义分隔符

Word分片的关键点

  1. 样式识别:Word的标题通常有特定的样式(标题1、标题2等)

  2. 图片处理:图片需要单独保存并在分片中引用

  3. 表格处理:Word中的表格也需要转换为合适的文本格式


其他常用工具库

处理文档时还有一些通用的工具库很实用:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.10.0</version></dependency><dependency><groupId>com.googlecode.juniversalchardet</groupId><artifactId>juniversalchardet</artifactId><version>1.0.3</version></dependency><dependency><groupId>org.commonmark</groupId><artifactId>commonmark</artifactId><version>0.22.0</version></dependency>

分片策略设计模式

我们的代码采用了策略模式,每种文档类型都有自己的分片策略,同时每种策略内部又支持多种分片方式。这样的设计让扩展新的文档类型或分片方式非常方便。


总结

文档分片是RAG的第一步,也是非常关键的一步。好的分片能让后续的检索更精准。这篇文章我们介绍了:

  1.  RAG的三个阶段

  2. PDF、XLSX、DOCX三种文档的分片方式

  3. 所需的Maven依赖

  4. 每种文档分片的注意事项

下一篇文章,我们会继续讲解向量化与存储,敬请期待!


扫码关注公众号,获取更多AI技术干货!