SH

Soloharness

概念 · 辨析 · Agent

← 返回概念辨析

Concept Contrast Fable

分块和父子分块:一个是切豆腐,一个是切完豆腐还留着原来的那盘菜

做 RAG 系统时,分块和父子分块被写在同一行配置里,很多人以为父子分块只是分块的一种参数设置。分块是决定把文档切成多大、怎么切;父子分块是在切割的同时保留原块和子块之间的对应关系,让检索时能用大块定位、小块精答。少了一层对应,召回准确率差一个量级。

寓言

档案馆的两种编号方式

市档案馆做了一次数字化改造。第一批资料是会议纪要——每份三十页,按决议编号归档。技术组决定每五页切成一个文件包,理由是检索速度更快。他们把三十页的纪要切成了六个独立包,每个包都有独立编号,存进系统。检索时输入关键词,系统返回若干个五页包,工作人员从里面找答案。

问题出在年度总结。有人查询“去年通过了哪些环保决议”,系统返回了两个五页包——分别包含了某次会议的第十一页到第十五页,和另一次会议的第六页到第十页。两个包里都有“环保”“决议”这些词,但工作人员打开一看,前一个讨论的是污水处理预算,后一个是公园扩建。缺少原始纪要的上下文,两个碎片凑不出任何可用的结论。

档案室的老主任提了一个方案:每份会议纪要仍然切块,但额外保留一份全量版。检索的时候,系统先用全量版定位到相关纪要的编号,再从那个编号底下调出最匹配的那几页切片。全量版负责判断“这份纪要在讲什么”,切片负责回答“具体哪几页讲到了关键细节”。

技术组照做了。他们把每份纪要存成两份:一份叫父块,是完整的纪要,用来做语义匹配和定位;另一份叫子块,是五页切片,用来返回精确段落。检索流程变成两步:先拿用户的问题去父块里找最相关的几份纪要,再在这些纪要的子块里挑出最贴切的段落。

效果立竿见影。同样的查询“去年通过了哪些环保决议”,系统先定位到三份相关纪要,然后从每份纪要下各自提取了最相关的两三段。工作人员看到的是带原始编号和上下文的精确摘录,而不是一堆孤立的碎片。

后来有人问主任,这和原来只切块的区别到底在哪。主任在白板上画了两层:第一层是“怎么切”——块大小、重叠度、分隔符,这是分块策略。第二层是“切完之后谁跟谁有关系”——父块和子块之间那条索引线,这是父子分块。他说只做第一层,检索结果是一堆散装豆腐块。做了第二层,每块豆腐都带了它原本属于哪盘菜的标签。

档案系统改造完后,主任把配置表贴在了机房门口:chunk_size 管的是子块切多大,parent_chunk_size 管的是父块拿多大去匹配语义。两行参数各管各的,但缺了父块那一行,子块再精准也只能在断章取义中打转。

分块

把长文档按一定策略切成更小的段落或文本块,决定块的大小、重叠方式和分隔规则,是 RAG 系统的基础预处理步骤。

父子分块

分块的一种特定实现方式:保留较大的父块用于语义匹配和定位,同时维护较小的子块用于返回精确内容,两者之间通过索引关联。

故事对应

  • 每五页切一个独立包:单纯的分块策略,碎片化检索
  • 额外保留全量版作为定位锚:引入父块概念
  • 先找纪要编号再调切片:父子分块的检索流程——父块定位,子块精答
  • 散装豆腐 vs 每块豆腐带菜盘标签:分块和父子分块的核心区别在于有无层级归属

落到 RAG 系统设计里

配置分块参数时,把 chunk_size 和 parent_chunk_size 当成两个独立决策。chunk_size 决定返回给 LLM 的段落精度,parent_chunk_size 决定语义匹配的范围。先把父块设得足够大以捕获完整语义,再把子块设得足够小以保证答案不冗余。仅调 chunk_size 等于放弃了父块这一层检索精度杠杆。