结构化与语义切分

本节目标

你将学会优先利用可信文档结构,分别处理标题、表格、代码和列表;理解 parent-child 与检索上下文;最后判断语义切分、Late Chunking 和层次摘要何时值得实验,而不是把“更智能”当成默认更好。

结构感知切分:先尊重作者留下的边界

[[Knowledge/AI Agent Engineer/docs-CN/文档解析/00-目录|文档解析]]通常已经产出 element 类型、section path、页/行位置和阅读顺序。Chunking 应消费这些信息,而不是重新把所有元素压成一个大字符串。

一个稳健的基础流程是:

  1. 按 source、revision 和 ACL 分区;
  2. 按 section 与内容 family(正文、代码、表格)形成候选组;
  3. 在 hard max 内合并相邻完整 elements;
  4. 单 element 超长时才使用该 family 的兜底窗口;
  5. 生成 element spans、标题路径、哈希与策略版本;
  6. 验证所有来源单位被覆盖且没有越过安全边界。

Unstructured 当前的 chunking 也是先组合解析元素,只有单个元素超过上限才继续拆;其 by_title 策略额外保留 section 边界。具体参数会变化,原则仍要用目标语料验证。

不同内容需要不同规则

标题与正文

标题本身通常不是完整证据。可把标题路径放入 retrieval_text,正文仍保留原始 text。这样既能检索“API 指南 > 重试”,又不会在引用中把派生前缀冒充原文。

是否允许跨 section 合并取决于语料:

  • 法规、操作手册:标题往往代表强边界,默认不跨;
  • 每节只有一句的 FAQ:可以在同 parent 下合并,但要保留每个 element span;
  • 页码不是语义 section:不要仅因换页就切,也不要无条件跨页合并。

表格

表格的列名决定每个单元格含义。建议:

  • 小表尽量作为整体;
  • 超长表按完整行分片;
  • 每个行片段的检索文本重复表题和表头;
  • 可引用正文只保留真实行,不把重复表头伪装成行内容;
  • 跨页表先由解析阶段确认是否真是同一张表;
  • 合并单元格、脚注与单位应保留结构 metadata。

“production | 4 | SRE”脱离“环境 | 副本数 | 审批”就容易失去语义。本库项目专门测试了表头只进入 retrieval context 的分支。

代码、JSON 与日志

代码优先按文件 → 类/函数 → 语法块;超长函数再按语句或 token 窗口兜底。保留语言、符号名、文件路径和行号。不要在字符串常量或多行注释中用普通换行规则硬切。

JSON/YAML 优先按完整 object/array entry,并保存 JSON Pointer 或等价路径。日志可按事件/trace/session 分组,但必须设置最大事件大小和脱敏规则。

列表与定义

一个列表项可能依赖前导句“仅以下情况允许重试”。切分时可:

  • 将前导句与后续列表项放在同一块;
  • 或把前导句作为受控 retrieval context 附加到每个子项;
  • 仍保留各自的来源 span,避免引用不存在的拼接文本。

Parent-child 检索

Parent-child 模式把两个粒度分开:

  • 索引较小的 child,提高匹配聚焦度;
  • child 命中后返回较大的 parent,补齐定义、标题或相邻条件。

需要维护 child_id -> parent_id,并解决三个风险:

  1. 权限:检索和展开 parent 前都要授权;最简单的安全基线是只在完全相同 ACL 内建 parent。
  2. 版本:child 与 parent 必须属于同一 source revision,避免新旧拼接。
  3. 成本:多个 child 命中同一 parent 时去重,否则重复发送整段。

LlamaIndex 的 Node Parser 当前文档展示了节点与关系组织方式;具体类和默认值属于动态 API,应在使用时查官方版本文档。

语义切分是什么

一种常见方案是先把相邻句子或段落向量化,计算相邻表示的余弦相似度:

当相似度显著下降时,把位置视为候选主题边界。也可以让模型判断边界,但会增加成本、延迟、随机性和版本依赖。

关键限制:

  • “下降多少”没有跨语料通用阈值;
  • embedding 模型升级会改变相似度和边界;
  • 句子本身仍可能太长,hard max 兜底不能删除;
  • 相邻段落语义相近不代表可以跨 ACL、来源或结构边界;
  • 边界看起来合理,不等于检索与回答指标更好。

所以语义切分是待验证策略。固定语料、模型、阈值和代码版本,先在弱结构长文上做分层对照。

不要混淆三个“高级”方向

Contextual Retrieval

Anthropic 的 Contextual Retrieval 为每个 chunk 生成或添加文档相关的短上下文,再用于检索。它改变 retrieval_text,不一定改变原始 chunk 边界。派生上下文可能错误,需保存生成方法、版本、哈希,并在引用时回到原文。

Late Chunking

Late Chunking 原始论文提出先利用长上下文编码文档,再对 token 表示按 chunk 聚合,以减少“先切再编码”丢失的全局信息。它依赖支持相应长上下文和 token-level 表示的 embedding 流程,不是把常规 API 调用顺序简单颠倒。是否受益需在目标模型和语料上复现。

RAPTOR

RAPTOR 原始论文构建聚类与摘要树,以不同抽象层次检索。它增加摘要生成、层次更新和错误传播风险,适合需要跨段综合的实验,不应取代简单基线与来源级引用。

策略选择表

语料/查询首选起点何时升级
短 FAQ、条目清晰一问一答或结构 element多问共享背景时试 parent-child
规章、操作手册section 内 element 合并跨段条件漏召回时试 child-parent/上下文前缀
大表格表头 + 行分片需要跨行聚合时加表级 parent
代码库AST/符号边界超长函数再 token 兜底,跨文件问答另建符号关系
无标题长叙事段落/递归基线基线失败后试语义边界
跨章节综合结构 chunks + rerankGold 证明不足后试层次摘要

常见错误与排查

  • 每个标题都单独成块:产生无法回答问题的孤立标题。
  • 表格按字符切:数据行失去列名,数值语义不可解释。
  • 代码与正文混合:向量主题被污染,引用行号也难以恢复。
  • LLM 边界不校验:输出位置不存在、重叠或超过 hard max。
  • 语义模型升级未重建版本:同一策略名对应不同边界。
  • parent 权限比 child 宽:命中一个授权 child 后泄露同 parent 中其他内容。
  • 把研究方法写成通用最佳实践:缺少目标数据上的复现证据。

练习

  1. 为一篇含三级标题、跨页表格、代码块和列表的教程画 element → child chunk → parent 的映射。
  2. 标出哪些边界“绝不能跨”(source/revision/ACL),哪些“默认不跨”(section/family),哪些可经评测放宽。
  3. 为语义切分实验写出固定变量、唯一自变量、gold 边界/检索指标和回滚条件。
  4. 设计一个错误的 contextual prefix,说明为何检索可能改善但引用可信度反而下降。

掌握检查

  • 我先使用解析结构,而不是先丢失结构再猜回来。
  • 表格、代码、列表和正文使用各自边界规则。
  • parent-child 的版本、ACL、去重和成本都有约束。
  • 我能解释语义切分阈值为何不是通用常数。
  • 我能区分语义边界、contextual prefix、Late Chunking 与 RAPTOR。
  • 高级策略只有在基线和 gold set 证明需要时才进入生产候选。

小结与下一步

结构是低成本且可解释的信号;语义方法是可实验的补充,不是正确性的替代。下一步把 overlap、检索上下文、稳定 ID、ACL 与版本放进同一数据契约:[[Knowledge/AI Agent Engineer/docs-CN/Chunking策略/04-Overlap元数据与上下文|Overlap、元数据与上下文]]。

参考资料

来源获取日期:2026-07-14。论文方法的工程可用性需结合具体实现与模型重新验证。返回 [[Knowledge/AI Agent Engineer/docs-CN/Chunking策略/00-目录|Chunking 策略目录]]。