文档处理
高质量的文档处理是RAG系统效果的基础,直接影响检索和生成的质量。
共 3 篇文章·阅读时间:约30分钟
01文档解析
文档解析是将原始文档转换为结构化文本的过程,是RAG数据预处理的第一步。
常见格式解析
使用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摘要
元数据使用场景
- 根据来源过滤:只检索特定文档
- 根据时间排序:优先使用最新文档
- 根据类型筛选:限定回答范围
- 混合检索:元数据过滤 + 向量检索