Parent-Child Chunk 分层索引

快速回顾

项目 内容
核心思路 子块定位,父块补全;兼顾检索精度与条款完整性
处理链路 子块召回 → RRF → 子块重排 → 按父块去重 → 预算内补全上下文
调参参考 子块约 200~400 tokens;父块约 800~1500 tokens
存储分工 MySQL 保存正文与关系;全文索引保存子块文本;Milvus 保存子块向量

面试主回答

Parent-Child Chunk 把用于检索的片段和交给模型的上下文分开处理。先按章节、条款等文档结构划分较大的父块,再在父块内部划分较小的子块。子块记录 parentId、文档版本和页码,检索时先用子块定位相关内容,命中后再回溯父块,补充回答需要的上下文。

例如,一份养老补贴政策的“申请条件”包含年龄要求、失能等级、户籍限制和例外情况,可以把这一节作为父块,再把具体条件划成子块。用户问“外地户籍的老人能不能申请”,先召回户籍要求对应的子块,再补回父块,让模型同时看到其他申请条件和例外条款,避免只凭一句话下结论。

选择这个方案是为了兼顾检索精度和条款完整性。固定切块过大时,一块混合多个主题,相关内容容易被其他信息稀释;切块过小时,又可能把适用范围、前置条件和例外说明分开。养老政策和机构制度对这些限制条件比较敏感,所以我们先对较小的子块做 BM25 和向量召回,经过 RRF 融合及 BGE Reranker 重排,再根据命中的子块回溯父块,补充完整依据。

回溯时按 parentId 去重,同一个父块只保留一次,并根据上下文预算控制补充范围,避免重复内容和过长上下文。父块尽量沿用章节或完整条款边界,不把互不相关的内容拼在一起。

原理与选型

为什么不直接用固定切块加 overlap?

面试回答

固定切块加 overlap 可以补偿切分边界附近的信息,但政策的适用范围和例外说明可能相隔比较远,只增加相邻重叠,不一定能把这些条件一起带回来。overlap 过大还会增加重复文本,让相似片段占用召回名额。

所以我采用父子分块,让较小、主题集中的子块负责精确召回和重排,命中后再按父子关系补回完整条款。这样既能定位用户问的具体条件,也能让模型看到同一条款的前置条件和例外。子块仍然可以保留适量 overlap,两种方法配合使用,只是补充上下文的范围更多依据文档结构来确定。

实现细节

父子分块需要维护 parentId 与版本关系,并控制回溯预算。选择该方案的业务依据是政策、制度具有章节与条款结构,且遗漏限制条件会影响答案适用性。

方案 主要作用 需要注意
固定切块 控制片段长度,便于建立索引 可能拆开条件与例外,或混合多个主题
增加 overlap 补偿切分边界附近的信息 增加重复内容,未必覆盖远处附注
Parent-Child 子块精确定位,父块补齐结构化上下文 需维护父子关系并控制回溯预算

实现与调参

父块和子块分别多大?怎么确定?

面试回答

我们优先按文档结构切分,再设置长度上限。父块尽量对应一个完整条款或章节中的独立主题,子块再沿段落、句子边界细分,保证检索时主题集中。调参参考范围是子块约 200 到 400 tokens,父块约 800 到 1500 tokens,具体仍要结合条款结构。

选择大小时,我同时看检索效果和回答完整性。子块太大可能混入无关主题,太小又可能失去必要指代;父块太大则会增加上下文成本。我们通过离线测评比较不同粒度下的召回、排序、适用条件覆盖以及 token 开销,再选择合适的切分配置。

实现细节

表中是调参参考范围。过长章节仍需继续拆分,不能为了保持章节完整而无限扩大父块。中文字符数与 token 数不等价,长度检查采用对应模型的 tokenizer,并保留标题和必要指代信息。

对象 调参参考范围 切分与检查重点
子块 约 200~400 tokens 按段落和句子边界,主题集中且可独立理解
父块 约 800~1500 tokens 尽量覆盖完整条款、适用条件和例外
参数选择 参考范围,结合文档与评测确定 比较召回、排序、条件完整性和上下文成本

面试回答

这套方案里,MySQL 保存文档版本、父子块正文和关联关系,子块上记录 parentId、章节路径和页码。用于检索的是子块,全文索引保存子块文本供 BM25 使用,Milvus 保存 BGE-M3 编码后的子块向量和必要过滤字段。

检索、融合和重排确定子块后,再根据文档版本和 parentId 从 MySQL 回查父块,补充完整上下文。父块读取走关联关系,不需要再做一遍父块向量检索。回查时还会核对当前版本和权限,避免索引更新滞后时,把已失效或无权访问的正文交给模型。

实现细节

正文与父子关系以 MySQL 记录为准,全文索引和向量索引承担召回职责。父块回溯时同时使用文档版本与 parentId,防止不同版本之间错误关联。

组件 保存内容 主要用途
MySQL 文档版本、父子块正文、parentId、章节及页码 回查正文、关系与当前状态
全文索引 子块文本及过滤字段 BM25 关键词检索
Milvus BGE-M3 子块向量及过滤字段 语义召回
父块读取 按文档版本与 parentId 回查 补齐上下文,不另做一次父块向量检索

重排在回溯父块之前还是之后?为什么?

面试回答

我们先对子块重排,再回溯父块。子块内容比较集中,Reranker 更容易判断它是否直接回答问题,输入长度和计算成本也比较可控。等相关子块筛选出来后,再补回它所在的完整条款,供后续生成答案使用。

如果先扩展为父块,同一父块可能被多个候选重复带入,正文长度也会明显增加,反而容易把真正相关的内容截断。不过子块也不能完全失去上下文,所以切分时会保留标题、章节路径和必要指代信息,让重排模型能够理解这一段在讲什么。

实现细节

重排输入是问题与候选子块,父块装配服务于后续回答。对子块中“符合上述条件者”一类表述,需要保留足够的标题或上下文信息,避免相关性判断失去依据。

顺序 收益 主要代价或风险
先重排子块,再回溯父块 相关性判断集中,输入较短,成本可控 子块需要保留标题和必要指代信息
先回溯父块,再重排 可直接看到更大范围内容 重复与无关内容增加,相关条款可能被截断

面试回答

我先按文档版本和 parentId 聚合,同一个父块只放进上下文一次,同时保留命中的子块和位置。父块排序主要使用其中相关性最高的子块得分,不把所有子块分数简单相加,避免长章节因为子块多就天然排在前面。

如果同一父块的多个命中分别覆盖问题的不同条件,装配时会保留这些证据范围。重排后的十个子块也可能只对应两个父块,所以去重后还会检查证据是否过于集中,必要时从后续候选中补充不同父块,但仍然受相关性和上下文预算限制。

实现细节

父块去重键包含版本,不能只用标题。保留子块位置既便于围绕命中区域读取,也便于把最终结论引用到实际证据页。补充不同父块时,不为凑数量引入低相关内容。

父块太大,超过上下文预算怎么办?

面试回答

父块过大时,我不会直接从开头截一段,而是围绕命中的子块补充所属条款,优先保留标题、适用条件和例外说明。同一父块中多个相邻或重叠的命中范围先合并,减少重复,不同父块再根据相关性分配 token 预算。

如果回答依赖的必要条件仍然装不下,就通过后续读取或补充检索分步查证,不能为了满足长度限制把关键条件删掉。证据仍不充分时,就缩小当前回答范围。这样控制的是上下文开销,同时保留足以支持结论的完整依据。

实现细节

预算装配需要保留原文位置和版本信息,截取片段后仍能回到原文。跨父块比较时检查问题各维度是否覆盖,不能只按得分把同一维度的相似片段全部装满。

优先级 装配内容 控制方式
先保留 命中片段、所属条款、标题、适用条件与例外 围绕命中位置读取,避免只截取开头
再去重 同一父块内相邻或重叠范围 合并后装配
分配预算 不同父块的相关证据 按相关性分配 token 预算
仍有缺口 回答必须依赖但未读到的内容 补充读取、分步查证或缩小回答范围

PDF 表格、跨页条款怎么切?

面试回答

我按解析后的条款和表格结构切分,页码主要用于引用定位。一个条款即使跨了两页,只要编号、标题和正文是连续的,仍然需要关联起来,同时保留每个片段的来源页码。

表格要保留表名、表头、单位和附注。表格过大需要拆开时,每组数据行都带上必要表头,否则一个金额数字脱离照护等级和每人每月的单位就没有完整含义。跨页表格还要检查列结构和表头是否一致,不能只因为位置相邻就合并。最终引用指向真正支持结论的页面,涉及多页时保留多页来源。

实现细节

结构切分关注条款编号、标题层级、正文连续性以及表格列结构。金额、比例、计量周期和适用对象都属于证据的一部分,不能只索引单元格中的数值。

评测与结果

怎么证明父子分块比原来的方案好?

面试回答

我用控制变量的方式比较。固定同一批文档和版本、同一测评集,以及 embedding、检索和重排配置,主要改变分块与上下文补充方式。检索侧看 Recall@10、MRR@10,回答侧检查适用条件和例外是否遗漏、引用是否支持结论,同时记录上下文 token 数与耗时。

这里使用我们构建的 200 余道题测评集。因为不同分块方案的 chunk ID 会变化,标准证据标到原文条款或范围,再判断各方案有没有找到。简历里 0.71 到 0.89 的 Recall@10、0.62 到 0.78 的 MRR@10 是整套检索改进的结果,父子分块的贡献要看它自己的对照实验,不能直接用整体增幅代替。

实现细节

分块对照固定检索和重排配置,混合检索对照则固定分块。证据命中依据原文范围映射;扩展父块后的条件覆盖与扩展前的检索排序分别观察,避免扩大上下文后混淆指标口径。

比较项 固定条件或观察参数
固定条件 文档及版本、评测集、embedding、检索与重排配置
主要变量 分块方式与上下文补充方式
证据覆盖与排序 Recall@10、MRR@10
回答质量 适用条件是否遗漏、例外是否误用、引用是否支持结论
成本 上下文 token 数与耗时
归因 整体链路提升与父子分块独立收益分开判断

易混点与回答检查

易混点:先重排子块再回溯父块;10 个子块不等于 10 个父块;token 数不等于字符数。

回答检查

补充记录

简历表述:通过子块召回定位相关内容,回溯父块补全条款与上下文。

事实 / 代码依据:待补充。

复盘手记

搜索笔记

输入关键词,搜索所有主题与问答。