结构、标题、列表与表格
本节目标
把“纯文本抽取”升级为结构化元素:保留标题层级、列表、代码、表格、阅读顺序和来源位置,并能区分源文档显式提供的结构与解析器推断出的结构。
为什么一串文字不够
句子“必须禁用外部工具”如果位于“高风险操作”标题下,含义与适用范围就依赖标题路径。表格中的 0.92 若丢掉行名、列名和单位,也无法安全回答问题。对 RAG 来说,结构既帮助切块和召回,也是引用与人工复核的证据。
常见元素包括:
title、heading、paragraph;- 有序/无序
list_item及嵌套层级; code_block、语言和原始空白;table、行、列、表头、合并关系与 caption;- 图片、公式、脚注、页眉/页脚;
- 页面、坐标、字符/词范围和阅读顺序。
显式结构与推断结构
HTML 的 <h2>、Markdown 的 ## 和 DOCX 样式可能显式表达标题。PDF 页面上“字号大且加粗”只是视觉特征,未必真是标题。建议为元素记录:
structure_source: explicit | inferred;- 推断器与版本;
- 使用的规则或模型配置;
- 可选置信信号和警告;
- 原始位置,供人回看页面。
置信信号只能帮助排序复核,不能自动证明语义正确。视觉模型输出同样是概率性推断,不应覆盖原生结构或原始坐标。
一个可追溯元素契约
{
"element_id": "sha256:abc...:e0012",
"kind": "paragraph",
"text": "请求必须设置超时。",
"text_sha256": "...",
"order": 12,
"location": {"page": 3, "bbox": [72, 120, 510, 158]},
"section_path": ["可靠性", "超时"],
"attributes": {"structure_source": "explicit"}
}element_id 在同一个源版本和解析配置内应稳定;order 表示采用的阅读顺序;location 用于回到原文。对于文本文件,本库项目用 line_start/line_end;PDF 可用页码和 bounding box。坐标系必须注明原点、单位、旋转和裁切框,否则数字本身不可解释。
不要把敏感全文复制到每个日志或索引记录。文本与元数据的存储权限可以分开,但引用链不能断。
标题、列表和代码
标题路径
解析标题时维护栈:遇到 H2 就关闭此前同级及更深层级,再把新标题压入。若从 H1 直接跳到 H3,不要凭空断言中间标题;可以保留跳级警告。标题重复很常见,因此 section_path + order 比标题字符串更可靠。
列表
列表项需保存:有序/无序、层级、序号(如有)、复选状态和父项关系。将嵌套列表平铺成段落会丢掉步骤依赖与例外条件。
代码
代码块的换行和缩进属于语义。保留语言标记、原始文本、来源位置;展示或执行前再做密钥检测与安全治理。文档里的代码从来不是“因为来自知识库就可信”。
表格:同时保存结构和派生文本
表格至少需要:
- 行列与表头;
- 合并单元格、跨页关系(若可得);
- caption、脚注、单位;
- 页面/坐标与原始单元格文本;
- 结构推断警告。
为了检索,可以把一行派生为“模型 A 的延迟为 120 ms”,但这句话必须指向原表格,且不能替代结构化单元格。否则列错位时,派生句会把错误包装得更自然。
典型难点包括无边框表、重复表头、跨页表、单元格换行、嵌套表、脚注和合并单元格。DataFrame 能构造出来只说明语法成功,不说明行列事实正确。
阅读顺序与版面
PDF 内部对象顺序可能是“左栏第一行、右栏第一行、左栏第二行”,也可能把页眉、脚注插入正文。简单按 (y, x) 排序在多栏、浮动图片和旋转页面上会失败。
可采用分层策略:
- 优先使用格式中可信的逻辑结构;
- 对页面建立版面区域和栏;
- 在区域内排序元素;
- 标记页眉页脚、caption、脚注等角色;
- 用目标文档类型的人工样本验证顺序。
Docling 等现代解析框架把版面、阅读顺序、表格、公式与统一文档表示作为独立能力。这说明“选一个库”不会消除契约与评测工作;版本、模型和配置变化仍需重新验收。
质量检查
自动检查可发现:
- 标题层级异常或所有内容都成了一个段落;
- 元素
order重复、位置越界、页数缺失; - 页眉页脚在每页重复进入正文;
- 表格列数漂移、空表头、重复表头未处理;
- 异常长行、大量空元素或零宽字符激增;
- 派生文本找不到原元素。
人工 gold set 还要逐项标注:阅读顺序、标题父子关系、关键表格单元、公式和图注。自动完整性高不等于语义正确。
常见错误与排查
- 按字体大小写死标题:不同模板、脚注和封面会破坏规则。
- 先丢页码/坐标再切块:后续无法可靠引用与修复。
- 把结构解析和 chunking 混为一步:改变切块策略就被迫重跑昂贵解析。
- 只保留 LLM/VLM 生成的 Markdown:生成文本可能补写、重排或遗漏;应保留中间结构与原始定位。
- 忽略重复标题:只用标题名生成 ID 会碰撞。
练习
- 为标题、段落、嵌套列表、代码、表格和图注扩展上面的元素 schema。
- 给一个双栏页面画出区域划分与阅读顺序,列出三种会让
(y, x)排序失败的情况。 - 将表格一行转换成检索文本,并写出它回到原单元格的指针。
- 为 20 份目标文档设计 gold set:至少覆盖重复页眉、跨页表格、脚注、中文/英文混排和代码。
自测
- 我能区分显式结构与推断结构。
- 我能为任一元素保存稳定身份、顺序和可解释位置。
- 我知道派生表格文本不能替代原结构。
- 我会单独评测阅读顺序、层级和关键单元格。
参考资料与下一步
来源获取日期:2026-07-22。下一步:PDF 与 OCR 边界。