文档处理

高质量的文档处理是RAG系统效果的基础,直接影响检索和生成的质量。

共 3 篇文章·阅读时间:约30分钟

01文档解析

文档解析是将原始文档转换为结构化文本的过程,是RAG数据预处理的第一步。

常见格式解析

PDF

使用PyMuPDF、pdfplumber等库提取文本。
注意处理表格、多栏布局、图片内文字。

Word (DOCX)

使用python-docx库提取,支持保留标题层级。
可保留段落格式信息用于智能切分。

Markdown

结构化格式,可以直接按标题层级切分。
标题层级信息可作为chunk的元数据。

HTML

需要提取正文内容,去除导航栏、广告等干扰。
可利用标签结构识别内容区块。

解析挑战

  • 表格处理:表格内容被切分后失去语义,需要专门的表格解析
  • 公式提取:LaTeX公式需要特殊处理,保持数学含义
  • 图片内文字:需要OCR识别,如扫描文档或截图
  • 代码块:保持代码的完整性和缩进
  • 多语言混合:中英文混排文档需要特殊处理

解析工具推荐

  • Unstructured:通用文档解析库
  • Marker:PDF转Markdown,支持公式和表格
  • LangChain Document Loaders:多种格式的加载器

02文本切分

文本切分将长文档划分为适合检索和生成的chunk,是RAG系统的关键环节。

切分策略

固定大小切分 (Fixed Size)

按字符数或token数固定切分。
优点:简单高效;缺点:可能切断语义连贯性。

语义切分 (Semantic Splitting)

按自然段落或语义单元切分。
优点:保持语义完整;缺点:chunk大小不均匀。

递归字符切分 (Recursive Character)

先按段落切,不够再按句子,再按单词。
兼顾语义和可控性,是常用选择。

标题切分 (Header Splitting)

利用文档的标题层级结构切分。
适合结构化文档,如Markdown、技术文档。

参数设置

  • chunk_size:每个chunk的最大长度,通常256-1024 tokens
  • chunk_overlap:相邻chunk的重叠长度,通常chunk_size的10-20%
  • 分隔符优先级:段落 > 句子 > 单词 > 字符

参数选择建议

  • 短问答:chunk_size=256-512,重叠较小
  • 复杂分析:chunk_size=512-1024,较大重叠
  • 长文档摘要:chunk_size=1024+,保留更多上下文

03Chunk优化

高级Chunk优化策略可以显著提升RAG系统的检索和生成效果。

高级切分

Small2Big / Parent Document

用小chunk检索,用大chunk生成。
检索时用细粒度chunk(256 tokens),生成时补充父chunk(1024 tokens)。

Contextual Chunking

为每个chunk添加上下文描述。
"这段内容来自XXX文章的XXX章节,主要讨论..."

LLM-based Chunking

使用LLM判断最佳的切分点。
成本高但效果最好,适合关键文档。

元数据增强

为每个chunk添加丰富的元数据,可以提升检索精度和系统可解释性。

常用元数据

  • 来源信息:文档名、URL、页码
  • 结构信息:章节标题、层级路径
  • 时间信息:文档创建/更新时间
  • 类型信息:文章类型、主题分类
  • 统计信息:chunk长度、位置
  • 摘要信息:LLM生成的chunk摘要

元数据使用场景

  • 根据来源过滤:只检索特定文档
  • 根据时间排序:优先使用最新文档
  • 根据类型筛选:限定回答范围
  • 混合检索:元数据过滤 + 向量检索
----