welclaiAI·TREND·DIGEST
教程

为检索把文档切好块

检索的好坏取决于它的块。这是如何切分文档,让正确的段落能完整、带着上下文地被取回。

tutorials2026-04-29 19:38 KST·主编·7 分钟

当一个检索系统失败时,原因往往不是模型或搜索算法,而是块。块(chunk)是你索引和检索的单元——文档中那一块拿去与查询匹配、并作为上下文递给模型的部分。如果你的块切得糟糕,即便完美的检索也只会返回一些片段:要么小得没用,要么大得不相关,要么正好从答案中间被切开。把切块做对并不光鲜,它却决定了下游的一切运转得有多好。

为什么块大小决定了下游的一切

你通常无法为每个查询都把整份文档喂给模型——这很浪费,而且把相关段落埋在一页页无关文本里只会让答案更糟,而非更好。于是你把文档切成块,嵌入每一块,只检索那些匹配查询的块。因此块既是搜索的单元,也是上下文的单元。它的大小和边界决定了模型能看到什么。

这个双重角色制造了张力。一个小到足以成为精确搜索匹配的块,可能小到承载不了足够的上下文供模型作答。一个大到能自成一体的块,可能宽到无法干净地匹配一个具体查询,因为它混入了好几个主题、稀释了信号。好的切块,就是化解这一张力的手艺——做出既具体到能准确检索、又完整到能据以作答的块。

尊重文档的结构

最糟的切块方式,是不管内容、每 N 个字符就切一刀。那保证了边界会落在句子中途、表格中途、思路中途——把一个答案切成跨两块,结果哪一块都装不下它的整体。更好的默认做法,是沿着文档自身的结构来切:段落、章节、标题、列表项。这些边界之所以存在,是因为作者已经把相关的想法归到了一起,而一个尊重它们的块,往往是一个连贯的意义单元。

不同的文档有不同的自然接缝。文章在段落和章节处干净地断开。代码在函数或逻辑块处断开。一份 FAQ 在每个问答对处断开。表格和列表想要保持完整,因为半张表通常毫无用处。原则在所有这些上都是一样的:让文档告诉你关节在哪,在关节处切,而不是在任意的偏移处切。结构感知的块就是连贯的块。

按问题来定块大小,而非定一个固定数

不存在一个普适的正确块大小,因为正确的大小取决于你预期的问题类型。如果用户问的是狭窄、事实层面的问题,更小的块检索得更精确——匹配的段落不会被周围的材料稀释。如果用户问的是需要综合整个章节的宽泛问题,块就需要大到能承载那份广度,否则模型拿到一个片段、抓不住要点。

实际的做法,是去想一个完整答案需要什么,并把块的大小定得能装下它。一个块理想上应当含有足够的周边上下文,使其单独读起来也讲得通——一个完全依赖于上一句、而那一句又落在另一个块里的段落,检索得会很糟、作答得更糟。瞄准那些对你实际收到的问题而言自足的意义单元,让这个来引导大小,而不是挑一个整数然后碰运气。

用重叠来避免把答案切成两半

即便有了结构感知的边界,一个答案有时仍会横跨边界——问题的上下文在一个块的末尾,而它的结论在下一个块的开头。重叠是标准的补救:让相邻的块在它们的边缘共享一点文本,这样一个靠近边界的段落就会完整地至少出现在一个块里。一点小小的重叠,是防止答案被从中间切开的廉价保险。

别做过头。沉重的重叠会撑大你的索引,对同一个查询返回近乎重复的块,并把上下文预算浪费在重复上。目标只是足够保持跨边界答案完整的那点共享文本——带进下一块的一截不长的尾巴,而不是一大片冗余的窗口。和块大小一样,正确的量取决于你的内容;原则是用能阻止答案被切成两半的最小重叠。

保留一个块讲得通所需的上下文

一个被从文档里撕出来的块,丢失了文档隐含提供的信息:它来自哪个章节、文档讲的是什么、三段之上那个"它"指的是什么。当那个块被孤立地检索出来时,模型看到了文本却看不到框架,答案因此受损。把那个框架的一点点随每个块一起带上——文档标题、章节标题、一句关于这块讲什么的简短说明——就能恢复被切割丢掉的上下文。

这对检索准确率、以及对含糊的段落最为要紧。一个写着"上限被提高到先前值的两倍"的块,在不知道是什么上限、什么先前值的情况下几乎毫无用处;一个带着自己章节标题的块,给了模型和搜索索引一个可以锚定之物。这个修复很小——一行表头,或一句附在每块上的上下文——而它持续地改善着被检索到什么、以及模型拿它做什么。

拿真实查询来评测切块

你无法靠盯着块来判断你的切块好不好。你只能靠跑真实查询、并检查正确的段落是否完整可用地返回来判断。收集一组有代表性的、你知道正确源段落的问题,跑检索,并审视返回了什么:相关的块浮现了吗?它完整,还是被切开了?无关的块把它挤掉了吗?

把切块当成一个你针对那组问题去调的参数,而不是一个一次定下的决定。改变边界策略、目标大小或重叠,然后跑同一批查询,比较哪种设置更频繁地检索出正确、完整的段落。对你的语料而言最好的切块策略是一个经验问题,而答案因文档类型和查询风格而异。那些检索奏效的团队,是去测量的团队,而不是猜一个块大小就翻篇的团队。

总结

检索的成败系于它的块。沿着文档自身的结构来切,而非在任意偏移处,把块的大小定得能装下对你实际收到的问题的一个完整答案,并用适度的重叠让靠近边界的答案保持完整。随每个块带上一点上下文——标题、表头——好让它孤立时也讲得通。然后拿有已知答案的真实查询来检验整件事,并凭经验去调边界、大小和重叠。好的切块在奏效时是隐形的,在出问题时则是病根;把你的力气花在这里,流水线的其余部分都会变得更轻松。

#chunking#retrieval#rag#search