父子块检索是什么
父子块检索解决的是「切得细才召回准、切得粗才上下文完整」这对矛盾:子块粒度小、语义聚焦,负责被检索到;父块是章节或整段,负责喂给模型。做法是子块入向量库,并在元数据里存 parent_id,命中后按 id 批量取回父块,去重之后放进上下文。常见变体是句子窗口检索:命中某个句子后,把它前后若干句一起返回。代价是实现与维护复杂度上升,尤其是增量更新时父子关联容易被打断。
基本信息
| 子块职责 | 短、语义聚焦,负责被检索到 |
|---|---|
| 父块职责 | 章节或整段,负责喂给模型 |
| 关联方式 | 子块元数据存 parent_id |
| 常见变体 | 句子窗口检索:命中句取前后 N 句 |
| 收益 | 同时缓解切太碎丢上下文与切太粗召回不准 |
| 风险 | 增量更新打断父子关联,命中后取不到父块 |
典型使用场景
- 技术文档问答:用行级小块命中定位,返回整节内容供生成
- 条款类材料:按条命中,返回该条完整上下文避免断章取义
- 工单知识库:命中具体问法,返回整段处理流程
- 会议记录检索:命中一句话,返回该议题的完整讨论段
- 评测调优:对比不同粒度组合对答案完整度的影响
父子关联结构示意
父子关联结构示意
// 子块:入向量库,字段精简以提升检索精度
{
"id": "p12-c03",
"text": "缓存命中按折扣计费,未命中的输入按原价计算",
"parent_id": "p12",
"section": "计费 > 缓存"
}
// 父块:单独存储,命中后按 parent_id 批量取回
{
"id": "p12",
"text": "(整节原文,含缓存的定义、命中条件与计费规则)"
}
// 生成时使用父块文本;同一父块被多个子块命中时先去重粒度方案对比
| 方案 | 召回精度 | 上下文完整性 |
|---|---|---|
| 小块单粒度 | 高 | 低,命中片段常缺前提与结论 |
| 大块单粒度 | 低,噪声多 | 高,但相关性判断吃力 |
| 父子块 | 高 | 高,代价是实现复杂度上升 |
| 句子窗口 | 高 | 中,取决于前后句窗口大小 |
父子块与重排是互补的:重排决定取哪几条,父子块决定取回多大的上下文。两者一起用时要控制最终进上下文的字符总量。
去重是父子块的必要步骤:同一父块常被多个子块命中,不去重会把同样的内容重复灌进上下文,既浪费预算又稀释重点。