结构化与语义切分
本节目标
你将学会优先利用可信文档结构,分别处理标题、表格、代码和列表;理解 parent-child 与检索上下文;最后判断语义切分、Late Chunking 和层次摘要何时值得实验,而不是把“更智能”当成默认更好。
结构感知切分:先尊重作者留下的边界
[[Knowledge/AI Agent Engineer/docs-CN/文档解析/00-目录|文档解析]]通常已经产出 element 类型、section path、页/行位置和阅读顺序。Chunking 应消费这些信息,而不是重新把所有元素压成一个大字符串。
一个稳健的基础流程是:
- 按 source、revision 和 ACL 分区;
- 按 section 与内容 family(正文、代码、表格)形成候选组;
- 在 hard max 内合并相邻完整 elements;
- 单 element 超长时才使用该 family 的兜底窗口;
- 生成 element spans、标题路径、哈希与策略版本;
- 验证所有来源单位被覆盖且没有越过安全边界。
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,并解决三个风险:
- 权限:检索和展开 parent 前都要授权;最简单的安全基线是只在完全相同 ACL 内建 parent。
- 版本:child 与 parent 必须属于同一 source revision,避免新旧拼接。
- 成本:多个 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 + rerank | Gold 证明不足后试层次摘要 |
常见错误与排查
- 每个标题都单独成块:产生无法回答问题的孤立标题。
- 表格按字符切:数据行失去列名,数值语义不可解释。
- 代码与正文混合:向量主题被污染,引用行号也难以恢复。
- LLM 边界不校验:输出位置不存在、重叠或超过 hard max。
- 语义模型升级未重建版本:同一策略名对应不同边界。
- parent 权限比 child 宽:命中一个授权 child 后泄露同 parent 中其他内容。
- 把研究方法写成通用最佳实践:缺少目标数据上的复现证据。
练习
- 为一篇含三级标题、跨页表格、代码块和列表的教程画 element → child chunk → parent 的映射。
- 标出哪些边界“绝不能跨”(source/revision/ACL),哪些“默认不跨”(section/family),哪些可经评测放宽。
- 为语义切分实验写出固定变量、唯一自变量、gold 边界/检索指标和回滚条件。
- 设计一个错误的 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、元数据与上下文]]。
参考资料
- Unstructured: Chunking
- LlamaIndex Node Parser
- Anthropic: Contextual Retrieval
- Late Chunking: Contextual Chunk Embeddings Using Long-Context Embedding Models
- RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval
来源获取日期:2026-07-14。论文方法的工程可用性需结合具体实现与模型重新验证。返回 [[Knowledge/AI Agent Engineer/docs-CN/Chunking策略/00-目录|Chunking 策略目录]]。