文档解析与切分
文档解析把各种格式的文件转换成带结构信息的文本,切分再把文本分成适合检索的块。块是 RAG 检索和放入上下文的基本单位,切得太大会混入无关内容,切得太小会丢失上下文。本文讲切分策略、块大小与重叠、父子索引,以及表格和异构文档的处理。
1. 面试核心
先记住这几条,再读正文2. 解析
| 文件 | 处理要点 |
|---|---|
| Markdown、HTML | 保留标题层级,按标题分节;去除导航、页脚 |
| Word、PDF(文字版) | 抽取文本和标题样式;处理页眉页脚、分栏、跨页段落 |
| 扫描件、图片 | OCR;版面分析识别标题、段落、表格区域 |
| 表格、Excel | 保持行列关系,不能按字符切断;见下文 |
| PPT | 每页作为单元,合并标题、正文和备注 |
| 代码 | 按函数、类切分,保留文件路径和符号名 |
解析质量直接决定检索上限。PDF 中的表格被抽成一串无序数字、页眉“内部资料”在每个块中重复出现,后续任何检索优化都难以弥补。
3. 切分策略
| 策略 | 做法 | 适用 |
|---|---|---|
| 固定长度 | 每 N 个 Token 切一刀 | 无结构纯文本;实现最简单,容易切断语义 |
| 递归切分 | 按段落 → 句子 → 字符的分隔符逐级尝试,直到长度满足 | 通用默认方案 |
| 结构切分 | 按标题、章节、条款、函数切分 | 有清晰结构的文档、法规、代码 |
| 语义切分 | 计算相邻句子的向量相似度,在相似度明显下降处切分 | 结构不明显的长文本,成本较高 |
3.1 块大小与重叠
- 问题类型决定大小:事实型问答(“年假几天”)答案在一两句话中,小块(数百 Token)更精确;需要理解整段规则或流程的问题,块要更大。
- Embedding 模型的输入上限:超过模型最大长度的部分会被截断,后半段内容无法被检索到。
- 重叠:相邻块重复 10%–20% 的内容,减少答案正好落在边界的情况。重叠会增加索引大小和召回结果中的重复内容。
- 评测确定参数:准备一组问题和对应的正确段落,比较不同块大小、重叠下的召回率和最终回答正确率。
3.2 给块补充上下文
孤立的块可能缺少主语:“上述费用由乙方承担”中的“上述费用”在上一块。常用补充方式:
- 在块前拼接文档标题和章节路径,如“《采购管理制度》> 第三章 费用 > 3.2”。
- 用模型为每个块生成一句说明它在全文中位置和含义的上下文,再与块一起向量化。
- 元数据中保存来源、页码、版本、权限,用于过滤和引用。
4. 父子索引
父子索引把文档切成两级:父块是完整的章节或较大段落,子块是从父块中再切出的小段。只对子块建向量索引;检索命中子块后,返回它所属的父块给模型。
父块:3.2 差旅费用(约 1500 Token)
├─ 子块:国内出差住宿标准……(约 200 Token) ← 与问题匹配
├─ 子块:交通工具等级……
└─ 子块:报销时限……
命中子块 → 返回整个父块
它解决了“小块检索准、大块回答全”的矛盾。多个子块命中同一父块时需要去重;父块过大时会占满上下文,可以只返回命中子块及其前后相邻的子块。
5. 表格与异构文档
- 表格:小表格整体作为一个块,转成 Markdown 表格保留表头;大表格按行分组,每组都重复表头。也可以把每一行转成“字段: 值”的描述文本,便于语义检索。
- Excel 报表:数值计算类问题(求和、同比)不适合靠向量检索回答,应该把数据导入数据库,用 SQL 工具查询;向量索引只存表的说明和字段含义,用于找到该查哪张表。
- 制度文档:按章、条、款的结构切分,块中保留条款编号和制度版本、生效日期,检索时过滤失效版本。
- 混合 PDF:版面分析区分正文、表格、图片;图片可以用多模态模型生成文字描述后入库。
6 · 面试题卡片
6.1 Chunk 的切分大小如何确定?重叠度如何设置?分块过大或过小会有什么问题?
出现公司:字节跳动、浪潮、腾讯、联想、阿里云、TCS
考察重点
- 块大小对检索精度与上下文完整性的影响。
- 结构切分、重叠和用评测确定参数。
参考回答
块过小,与问题匹配精确,但缺少主语和前后文,回答时信息不全,召回结果也更碎;块过大,向量混入无关内容导致相似度被稀释,命中后又占用大量上下文,还可能超过 Embedding 模型的输入上限被截断。
做法是先按标题、段落、条款等结构切分,超长部分再递归按句子细分,避免固定长度硬切断句子和表格。大小按问题类型选择,事实问答用数百 Token,规则流程类更大;重叠取块长的 10%–20%。最终用标注了正确段落的评测集比较不同参数下的召回率和回答正确率来确定,并配合父子索引兼顾两者。
6.2 RAG 为什么需要父子索引?检索小块、返回父文档解决什么问题?
出现公司:虾皮、浪潮、快手
考察重点
- 检索粒度与回答粒度分离。
- 去重与父块过大的处理。
相关内容:父子索引。
参考回答
单一块大小无法同时满足检索和回答:检索希望块小,向量语义集中,匹配更准;回答希望块大,包含完整上下文。父子索引把两者分开:只对小的子块建向量索引用于匹配,命中后返回它所属的父块(章节或大段落)给模型。
实现时子块记录父块 ID;多个子块命中同一父块要去重并保留最高分;父块过大时只返回命中子块及相邻子块,避免占满上下文。
6.3 知识库中有制度文档、Excel 报表、PDF 等不同文件,应该怎么解析和切分?
出现公司:药明康德、浪潮、Deloitte、阿里云
考察重点
- 按文件类型选择解析和切分方式。
- 数值查询走数据库,元数据支持版本过滤。
参考回答
制度文档按章、条、款的结构切分,块中保留条款编号、标题路径、制度版本和生效日期,检索时过滤失效版本,避免新旧制度冲突。PDF 先做版面分析,区分正文、表格和图片,扫描件做 OCR,去除页眉页脚;PPT 按页合并标题、正文和备注。
表格不能按字符切断:小表整体入库并保留表头,大表按行分组并重复表头,或把每行转为字段描述文本。Excel 报表的数值问题需要计算,应导入数据库通过 SQL 工具查询,向量索引只存表结构和字段说明,用来定位该查哪张表。所有块都带来源、页码、权限等元数据。