父子检索如何工作,为什么在 RAG 中使用?

考查重点:小块匹配与父段扩展。小子块用于精准匹配,命中后按 parent_id 取完整父段,去重并限制扩展预算,兼顾定位与完整上下文

本题目录

参考答案

核心回答

父子检索把用于匹配的小块与用于阅读的较大上下文分开。入库时保存父段或章节,并把其中的子块写入检索索引,记录子块到父对象的关联;查询先命中子块,再按关联取回相应父段,去重后组织成生成上下文。

这样做是为缓解粒度矛盾:小块主题集中,便于定位具体内容,但可能缺少标题、前置条件或相邻说明;父段能补足这些背景。它适合答案经常跨段、上下文依赖强的文档,但父块过大会增加噪声与成本,因此仍要控制范围、版本、权限和总预算。

怎样建立并使用关联

先根据标题、章节或业务记录形成有意义的父对象,再在父对象内切出子块。父对象保存正文、版本与原文位置,子块保留 parent_id、自己的位置及检索所需内容;向量索引主要负责找到子块,文档存储负责取回父内容。

查询命中多个子块后,收集父标识并合并重复父段,同时保留命中位置。四个子块可能只对应两个父段,返回量不能简单沿用子块 TopK;父段总长度也要受上下文预算约束。

例如文档某节前面规定适用型号,后面给出故障处理步骤。用户问其中一个具体操作时,子块可定位步骤,返回这一节父段则能补回适用条件,避免把别的型号流程混用。父对象可以是一个段落组或章节,不必整份文件。

与相邻块扩展有什么区别

相邻块扩展沿同一文档中的顺序位置补前后内容;父子检索沿预先建立的层次关系取上一级对象。一个窗口可能跨主题边界,而一个父段由结构定义范围。两者可以组合,但不是所有“多取一些上下文”都属于父子检索。

也有按命中的子节点比例决定是否向上合并的变体,例如 LlamaIndex 的 Auto Merging Retriever。它不是每命中一个子块就无条件返回整篇原文,采用时需要理解具体合并规则。

什么条件下会适得其反

父段过大或主题混杂,会把大量无关内容一并带入。此时可以重划父段、只取命中区域的必要背景,或比较先重排子块再扩展与先扩展再筛选的成本和质量。

父子关联还需随文档更新保持一致。新子块引用旧父段,可能补回过期条件;父段删除后子索引残留,会出现悬空关联。查询和更新应按文档版本维护关系,并保留定位信息。

子块能访问不等于父文档全部可访问。父对象取回后检查实际可见范围,必要时只返回授权部分。相关性分数也不会因为扩展就自动变成整个父段的可信分数。

怎样验证值得引入

使用相同文档与问题,比较仅返回子块、相邻扩展和父子返回,观察跨段证据是否完整、答案限定条件是否正确、引用能否定位,以及上下文 Token、读取延迟和重复率。小块并非天然更准,父段也并非越大越好,优势要落在当前问题集上。

参考资料

核心回答

父子检索把用于匹配的小块与补充完整语义的父段分开。WeKnora 在入库时保存文本父子关系,检索服务按 ParentChunkID 补取上下文,聊天合并阶段再把命中结果展开为父正文;图片的 OCR、描述子块也能沿关系找到正文和更大的父段。这样可以在命中具体文字或图意后,补回解释它所需的条件。

父块按层次关联补取,邻块按文档顺序补取,关联块按已保存的关系补取,三者共同服务上下文组装。服务层返回结果和完整聊天链路还经过不同处理,不能把其中一处补取或过滤等同于最终交给模型的内容。

上下文扩展前,混合检索分别收集向量与关键词列表,通过可配置权重的 RRF 按名次融合,并按 ChunkID 合并候选;两路结果都为空时返回空,存储检索出错时返回错误。只剩一路时走该路的去重和分数处理,不能当作两路仍在融合。后续父子补取负责扩展阅读上下文,不因此产生父段独立参与检索的相关性评分。候选融合入口、单路处理与加权 RRF、按块融合。

入库时怎样建立父子关系?

开启 EnableParentChild 后,文档先分成较大父块,再分成较小文本块。父块以 parent_text 类型保存到数据库,子块以 text 类型保存,通过 ParentChunkID 指向父块;进入文本检索索引的是子块,父块用于后续扩展。父子都保留原文范围和来源定位,便于回到原文。父子切分、父块保存和子块关联。

图片还会产生另一层子块:非空识别文字保存为 image_ocr,描述保存为 image_caption,它们的 ParentChunkID 指向所在的文本块,同时保存 ImageInfo 和 SourceLocators。因此可能形成“图片子块 → 文本块 → 大父段”的两级关系。图片子块写入。

命中后怎样补齐并避免重复?

processSearchResults() 先批量读取原始命中块,并保存其分数、匹配类型和原始命中内容。未设置 SkipContextEnrichment 时,再由 collectEnrichmentChunkIDs() 收集三类 ID:

  • 当前块的 ParentChunkID。
  • RelationChunks 中保存的关联块。
  • 有前后链接的 text 块对应的 PreChunkID、NextChunkID。

processedIDs 同时记录原始命中与已经安排补取的 ID,避免多个命中重复拉取同一块。若原始结果包含图片子块,第一轮可以找到其文本父块,随后再用 collectParentChunkIDs() 补取文本块的大父段;第二轮只沿父关系继续,不重复扩展所有邻块和关联块。批量补取与图片第二轮、关联收集与去重。

聊天链路怎样真正展开父正文?

聊天的 PluginMerge.OnEvent() 会在选取检索或重排结果、初步去重后调用 resolveParentChunks()。它直接按父 ID 批量读取块,不经过检索服务的结果类型过滤:

  • text → parent_text:将大父段正文与命中子块内容合并到结果的 Content,标记 ContentRewritten,并保留子块标识。
  • image_ocr、image_caption 等图片命中:先找文本父块,有大父段时再向上一层读取,将父正文、文本正文和原识别内容合并。图片信息按命中的文本子块限定,父正文中的图片引用也据此清理,避免把同一大父段中其他位置的图片一并带入。

随后聊天层继续合并连续或重叠正文、补短上下文、做最终去重,并建立引用来源。例如用户问接线图中某个端子的含义,图片识别结果负责定位,父正文补充接线条件,原识别文字仍被保留,不会因替换成父正文而丢失。聊天合并顺序、父关系批量解析、文本与图片展开。

补充块的分数和顺序怎样理解?

在检索服务的补取记录中,新补取的父块沿用触发它的子块分数,并标记为 MatchTypeParentChunk;关联块和邻块若没有分数,组装时使用 0。这个父块分数是关联传递的记录,不是父段独立参与原始检索得到的相关性分数。 多个子块指向同一父块,也不是在这里重新计算父段的相关性。聊天层展开正文同样不会因此产生一次新的父段相关性评分。

检索服务组装结果时,原始命中按输入顺序加入,补充块随后追加;这里没有对所有新增上下文做一次统一重排。显式重排入口则先对未扩展的候选进行重排,再补上下文并保留原始命中项的重排结果,扩展本身仍是另一阶段。分数传递、结果组装、重排后扩展。

当前实现有哪些取舍与缺口?

共享检索服务有一个需要注意的边界:processSearchResults() 补取大父块后,组装调用的 isSearchableChunk() 没有允许 parent_text,所以该父块不会作为独立结果返回。聊天链路仍能通过上述 resolveParentChunks() 直接取父块并展开正文,不能据此说整个项目无法返回父上下文。 如果调用方只消费共享检索接口,就要单独验证父段是否已进入返回内容;完善该接口时,应区分可直接检索的块与可用于上下文扩展的块。大父块类型、组装阶段的类型过滤、允许类型。

扩展还会增加数据库读取和上下文长度。使用时应比较关闭扩展、仅补父关系、补父关系加邻块等方案,在相同文档与问题集上观察证据完整性、重复内容、上下文用量和回答条件是否正确。服务层的 processedIDs 只按块 ID 去重,聊天层还另做内容签名和部分重叠去重;即使去重完成,也不能把“大量补回正文”直接当成准确率提升。

参考资料

相关面经

7 篇

阿里巴巴

AI Agent 算法
一面
查看原面经 →
**面试官:** RAG为什么需要设计父子索引?检索小文本块、返回大父文档能解决什么问题?
追问
**面试官追问:** 这样设计有什么代价?

字节跳动

AI Agent 开发工程师
校招秋招一面
查看原面经 →
RAG 的召回率一般从哪些角度去提?父子文档索引解决啥?

上海九云数智

大模型应用开发工程师(RAG 方向)
查看原面经 →
你了解这个父子检索吗(Parent-Child Retrieval)

虾皮

Agent 开发工程师
秋招一面
查看原面经 →
RAG系统为什么需要设计父子索引?检索较小文本块、返回完整父文档能够解决什么问题?

快手

AI Agent 开发
一面
查看原面经 →
为什么引入父子索引?
展开剩余 2 篇面经

字节跳动

AI Agent
秋招一面
查看原面经 →
RAG 流程中为什么要引入父子索引?BM25 和向量检索如何融合?

快手

AI Agent
实习一面
查看原面经 →
为什么引入父子索引?

收录题集

3 个来源,共5 份题集

检索增强生成

AMIT SHEKHAR · ai-engineering-interview-questions · 1 条原题

查看题集 →

RAG 与检索系统:从 chunk 设计到多路召回

Onefly · zero2Agent · 2 条原题

查看题集 →

Agent_RAG与混合检索工程

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

阿里巴巴问答汇编

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

字节跳动高频面试题

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

相关题目

4 题