乐于分享
好东西不私藏

RAG知识库别再乱切文档了!这个叫“延迟分块”的技术,让你的 AI 搜索聪明十倍

RAG知识库别再乱切文档了!这个叫“延迟分块”的技术,让你的 AI 搜索聪明十倍

记得👇关注,加星标

🌟 你好呀,我是羽师,见字欢喜,感恩有你。

你有没有遇到过这种情况:

辛辛苦苦搭了一套 RAG 知识库,把所有文档切成小块,喂给向量数据库。结果用户搜“上次说的那个参数怎么调”,AI 要么找不到,要么答非所问。

你排查了 Embedding 模型,换了更大参数的版本,甚至把 Chunk Size 调了无数遍,效果还是忽好忽坏。

问题很可能不在模型本身,而在你切文档的方式。

今天聊一个能显著提升长文档检索质量的技术:Late Chunking(延迟分块)。读完你会发现,过去很多做法,从一开始就搞错了顺序。


一、传统切块,到底错在哪

我们把文字变成计算机能懂的向量,需要用到 Embedding 模型。

早期模型胃口很小,一次只能吃下 512 个 token。你手里一篇三千字的产品手册,必须切成 A、B、C 好几个小块,然后分别喂进去,每个块独立输出一个向量。

这就是传统做法,我管它叫 Early Chunking:先切块,后编码

问题出在“独立”这两个字上。当模型处理 B 块时,它根本不知道 A 块说过什么,也不知道 C 块即将说什么。

举个例子。文档里有两段话:

张小明昨天买了一辆新车。他非常喜欢它的引擎声。

如果你的切块边界刚好把第二句话单独切出去,那么模型在处理这一块时,眼前只有孤零零的“他非常喜欢它的引擎声”。

“他”是谁?“它”又是什么?没有上下文,模型只能瞎猜。最终生成的向量,携带的信息是残缺的。

跨块的代词指代、因果逻辑、背景铺垫,在编码这一刻就彻底断裂了。后面你再怎么优化检索策略,也弥补不了向量本身的先天不足。


二、反过来做,奇迹就出现了

Late Chunking 的思路很简单:既然问题出在顺序上,那就把顺序倒过来。

先编码,后切块。

第一步,不是切文档,而是把整篇文档原封不动地丢给 Embedding 模型。假设模型支持 8192 token 的长上下文,那就让模型一口气读完。

模型内部有一个叫“注意力机制”的东西,它会让每个 token 在计算自己的向量时,看到全文所有其他 token 的信息。

于是“他”这个 token,因为前面出现过“张小明”,自动带上了“男性、具体是张小明”的含义。“它”也因为前面出现过“车”,明确指向那辆新车。

全文读完,模型会输出每一个 token 的向量。这些向量不再是孤立的词义,而是浸透了整篇文章的上下文。

到这一步,才开始切块。

按照之前定好的块边界,把落在同一个块里的所有 token 向量取出来,求一个平均值。这个平均值,就是这个块最终的向量。

你拿到的 B 块向量虽然只取了最后一句话的几个 token,但每个 token 内部已经融入了前文的信息。所以这个向量天然知道“他”是张小明,“它”是那辆新车。

切开的只是物理边界,上下文血脉依旧畅通。


三、一个比喻,让你彻底记住

传统做法像这样:

你有一本推理小说,要分给三个人去写摘要。你先动手把书撕成三叠,每人只拿着自己那叠去读。读第一章的人永远不知道凶手在第三章才暴露,他写出的摘要自然不可能包含全局线索。

Late Chunking 的做法是:

先让一个人通读全书,并且在每一页的空白处密密麻麻写满批注——这些批注是基于全书理解写下的。等他批注完全书,你才把书按章节裁开。虽然纸裁开了,但每一页的批注仍然保留着整个故事的伏笔。

你再把每章的批注浓缩成一小段总结,这段总结依然带着全局视角。

这就是“延迟”两个字的真正含义:把切块这个动作,从编码前推迟到编码后。


四、一张表看清本质

对比维度
传统 Early Chunking
Late Chunking
处理顺序
先切后编码
先编码后切
模型看到的
每次只看孤立块
一次性看全文
Token 向量的信息量
只含块内上下文
含全文上下文
跨块指代
丢失
保留
对模型的要求
短窗口即可
必须支持长上下文
计算开销
低,可逐块处理
较高,需保留全量 token 向量

差别一目了然。


五、哪些场景非用 Late Chunking 不可

如果你手里的文档符合以下任何一种特征,Late Chunking 带来的提升会是立竿见影的。

第一类:长文档的精细化搜索

典型如企业知识库、技术手册、故障排查文档。用户常常用口语化、指代性的语言提问,比如“那个报错怎么处理”。传统分块经常把报错现象和解决方案切在不同块里,搜不到。Late Chunking 可以让方案块的向量自动关联上前面描述的现象。

第二类:多跳推理与跨段落实体关联

年报、财报里,前面定义了一个术语,后面直接用“该指标”“上述交易”来指代。Late Chunking 能保证每个块在编码时就带着这些定义的烙印,检索时不会因为指代断裂而漏掉关键信息。

第三类:法律合同、学术论文

几十页的合同,开头是长篇累牍的定义条款。如果先切块再编码,后面所有条款块的向量都会丢失“甲方”“许可范围”的真实指向。Late Chunking 让每一条款在向量空间里都天然带着全局定义。

第四类:叙事型长文本

小说、传记、对话记录,人物关系复杂,同一个人有多个称呼。Late Chunking 能让所有出现的“他”“那位先生”都正确绑定到具体人物,进行人物关系问答时优势巨大。

第五类:无法精确控制切块边界,但又依赖上下文的任务

现实中的文档格式千奇百怪,你永远做不到完美避开语义断裂的切分。Late Chunking 给你更高的容错率,即使切得不理想,每个 token 也早已看过全文,损伤相对小得多。


六、也不是万能药,这些地方别硬用

技术圈从来不缺拿着锤子找钉子的故事。Late Chunking 再好,也有它的能力边界。

短文本场景没必要上。 商品标题、问答对、单句话检索,本身就不怎么切块,或者切了也没有跨块依赖,老老实实用传统编码足够。

文档过长、超出模型窗口时无能为力。 Late Chunking 的前提是一次前向传播吃进全文。如果文档长度超出了模型最大上下文窗口,还是得先切,这时只能配合分层策略,无法完整发挥优势。

资源极度受限的环境要慎重。 保留全文所有 token 的中间向量需要额外显存和计算时间。在一些离线终端或者实时性要求极高的场景,可能会吃不消。

底层模型不支持长上下文,不要硬来。 窗口不够,输入会被截断,反而引入噪音。你得先确认模型能力,比如 Jina 的 jina-embeddings-v2 支持 8192 token,最近一些新模型甚至达到 32k 以上,这种才撑得起 Late Chunking。


七、写在最后

很多人花大量时间调 Chunk Size、调 Overlap、换检索策略,却很少去想:问题可能出在编码阶段就已经丢失了上下文。

Late Chunking 不是一个复杂的算法改进,它只是把处理顺序换了一下。但就是这一个顺序的交换,让每个块的向量从一座孤岛,变成了一张连接着全文信息的大网上的一个节点。

如果你正在做长文档的 RAG 应用,不妨试试:找一篇文档,用传统方式建库,再用 Late Chunking 建库,跑同一批真实用户的 Query,看看召回率的变化。很大概率,你会有惊喜。

技术选型永远不是为了炫技,而是为了解决真实的痛点。当你的文档天然具有跨块语义依赖,当你的用户习惯用指代、上下文提问,Late Chunking 就是你工具箱里不该绕过的那一件。

希望这篇拆解能让你对这个“延迟”二字有更立体的理解。有任何落地过程中的实际问题,欢迎在评论区交流,我们一起把这条路走得更清晰一些。

微信5000好友位将满👇

PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“❤️推荐❤️,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

“❤️推荐❤️”支持羽师,码字原创不易