🧑💻 面试官:做 RAG 时,为什么有人把文档切成小片段去搜索,找到以后,却把更大的段落交给模型?
🙋♂️ 我:小片段的主题比较集中,方便匹配问题;大段落能提供更完整的上下文。
🧑💻 面试官:那直接把切块长度调大,不就省了一次回查?
🙋♂️ 我:块变大以后,可能包含很多不同内容,反而不容易找到问题对应的那一处。
🧑💻 面试官:如果搜到三个片段,都属于同一段规定,要发三遍吗?规定更新了,子片段还是旧的,又怎么办?
父子检索要解决的,是“方便找到”和“足够回答”不一定需要同样大小的文本。真正落地时,还得把两者正确地连起来。
面试速答(60 秒版)
父子检索 会把检索和回答使用的文本,分成两种粒度。
入库时,先保留较完整的父段落,再从里面切出较小的子片段。子片段用来建立检索索引,同时记录自己属于哪个父段落。
用户提问以后,系统先搜索子片段,再根据父段落 ID 取回对应内容,交给模型回答。例如,子片段找到了“可以取消预订”,父段落还能补上“必须提前多久取消”。
这样既能利用小片段定位问题,也能减少条件被切开的情况。不过,父段落不是越大越好,回查时还需要去重、检查版本和权限,并控制输入长度。
判断效果时,不能只看有没有搜到关键词,还要看模型是否拿到了完整依据,最终回答有没有漏掉限制条件。

知识点详解:搜到一句“可以”,为什么仍然不够回答?
先把漏掉的那半句话找出来
假设咱们在做公司的会议室问答助手,制度里有这样一段话:
员工可以在预订页面取消会议室。普通会议室须提前 30 分钟取消;大型培训室须提前 1 天取消。超过规定时间,请联系行政处理。
用户问:“培训室预订还能自己取消吗?”
如果系统只检索出第一句,模型就可能回答:“可以,去预订页面取消就行。”
它看到了制度原文,却没拿到决定答案的时间限制。这里不是模型凭空编了一个入口,而是输入缺少了后面的条件。
当然,可以把每个片段都切得很长。但如果一块里同时放了预订、设备借用、访客登记等内容,检索时又会遇到另一个问题:用户只问取消,块里却混了很多别的话题。
父子检索就是在这里做拆分:用于搜索的内容可以小一些,用于理解规则的内容保留完整一些。
父段落和子片段,是怎么存起来的?
先把前面那整段取消规定保存为父段落,比如 ID 是 P-12。再从里面切出若干子片段:
| 子片段 | 文本示意 | 所属父段落 |
|---|---|---|
| C-1 | 员工可以在预订页面取消会议室 | P-12 |
| C-2 | 普通会议室须提前 30 分钟取消 | P-12 |
| C-3 | 大型培训室须提前 1 天取消 | P-12 |
这里是为了讲清关系,按句子举例,不是规定项目中必须一句一块。
子片段进入搜索索引,可以做向量检索,也可以结合关键词。父段落的完整文字则保存在能按 ID 读取的位置。它们不一定是两台数据库,重点是保存了两种内容,以及两者之间的对应关系。
LangChain 的 ParentDocumentRetriever就使用了这种方式:检索小块,再按照父 ID 取回较大的文档。这里的“父文档”也可以只是原文中的一个较大段落,不要求是整份文件。
如果文档有版本,还应把版本一起关联。例如本次索引中的 C-3,对应的是 P-12 的第 2 版,不能只记一个永远不变的名字,回查时却随意拿另一版正文。
搜索命中以后,还要走哪些步骤?
用户发来问题,检索返回了 C-2 和 C-3。系统发现它们都指向 P-12,就只取回一次父段落,而不是把同一段话发给模型两遍。MultiVectorRetriever 的实现里,可以看到按父 ID 去重、再读取文档的过程。
拿到内容以后,还要确认它仍然有效,并且当前用户有权查看。父子检索只是找资料的方法,不会自动解决权限问题。
最后,模型看到的是用户问题、完整取消规则和对应出处。此时它才有依据回答:培训室需要提前 1 天;如果已经超过期限,就不能只让用户去页面操作,而应说明联系行政。
如果用户没有说距离使用还有多久,模型也可以把条件讲出来,或者继续询问。拿到了完整规则,不代表系统自动知道用户尚未提供的信息。
在这个例子里,真正的改进不是“发给模型的字更多了”,而是发过去的文字补齐了决定答案的条件。

父段落多大才合适?
先按内容边界判断,再看长度。
一段完整的取消规则,通常比“取消规则加后面三页食堂说明”更有用。父段落应尽量保留同一个问题需要的对象、条件、例外和出处,而不是固定把子片段前后各拼几千字。
检索命中很多父段落时,还要控制最终输入。可以先去重,再按相关性选取必要内容,或者在保留关键条件的前提下进一步整理。不要因为叫“父子检索”,就把所有命中父块都塞进去。
验证时,可以专门准备一组答案依赖相邻条件的问题,比较两种方案:只用子片段,和命中以后回查父段落。
除了最终答案是否正确,还要检查限制条件有没有覆盖、父段落是否重复、输入 Token 增加多少。有些问题用短片段就能答清楚,回查并不一定有收益,这也是需要评测的部分。
面试官继续追问
父段落更新了,只替换父段落可以吗?
不能一概而论。如果正文修改影响了子片段,就要同步重建对应索引和映射。
可以按版本准备新父段落与新子索引,确认齐全后切换有效版本,再清理旧版本。否则可能用旧句子命中,却拿到已经改了规则的新正文,检索记录和回答依据对不上。
给每个子片段补上标题,也能解决问题吗?
能解决一部分。例如补上“培训室取消规定”,能让子片段更容易被理解和找到。
但标题不能代替具体期限和例外。可以把标题增强与父子检索结合,也可以先用较简单的标题增强做对照,看主要问题是否已经解决。
父段落里既有公开内容,又有内部内容怎么办?
应重新划分内容边界,或在服务端组装经过授权的证据。不能因为用户有权看到一个子片段,就默认可以看到整个父段落。
检索过滤和回查检查要配合。权限不同的内容如果长期混在一个父块里,后续维护也会越来越难。
面试速记卡
- 子片段:负责把问题定位到相关位置。
- 父段落:补齐回答需要的条件、例外和上下文。
- 连接方式:子片段记录父 ID,命中后去重并回查。
- 工程边界:版本要对应,权限要检查,父块不能无限变大。
- 验证重点:完整证据是否进入输入,答案是否少漏了限制条件。
