Late-Chunking
一句话定义
Late-Chunking 是一种文档切分策略,先对整个文档进行编码(生成 token 级别的向量),再根据需要切分为片段,从而保留跨片段的上下文信息,解决传统切分导致的上下文碎片化问题。
摘要
传统文档切分(Early Chunking)是先切分再编码:将文档按固定长度或语义边界切分为片段,然后对每个片段独立编码为向量。这种方式的问题是每个片段的编码不包含其他片段的信息,导致上下文丢失。例如,一个跨两段的答案可能因为切分而被割裂。
Late-Chunking 的核心思想是”先编码再切分”:先用长上下文模型对整个文档进行 token 级别编码,然后根据切分点对编码结果进行池化(pooling),生成每个片段的向量。由于编码阶段考虑了整个文档的上下文,每个片段的向量都包含了跨片段的语义信息。根据 Jina AI 的实验,Late-Chunking 比 Early Chunking 在检索任务上提升约 5-10% 的准确率。
详情
起源与背景
Late-Chunking 由 Jina AI 在 2024 年提出,作为改进文档切分质量的技术方案。其动机是解决传统切分导致的上下文碎片化问题。随着长上下文模型(如 Jina Embeddings v2 支持 8K tokens)的出现,对整个文档进行编码成为可能。这一方法的核心价值在于保留了跨片段的语义信息,对于需要理解上下文的检索任务效果显著。
核心机制 / 工作原理
Early Chunking 流程(传统方式):
文档 → 切分 → [片段1, 片段2, ...] → 独立编码 → [向量1, 向量2, ...]
问题:每个向量只包含该片段内的信息
Late-Chunking 流程(新方式):
文档 → 长上下文编码 → [token向量序列] → 按切分点池化 → [向量1, 向量2, ...]
优势:每个向量包含整个文档的上下文信息
池化方式:
- 对切分范围内的 token 向量取平均(mean pooling)
- 或使用 attention pooling 加权平均
- 切分点可以是固定长度、语义边界、或自定义规则
为什么有效?
- 编码阶段:模型看到了整个文档,理解了跨片段的语义关系
- 池化阶段:将全局理解"压缩"到每个片段的向量中
- 结果:片段向量既包含局部信息,也包含全局上下文
实验结果
根据 Jina AI 的实验结果:
- 在检索任务上,Late-Chunking 比 Early Chunking 提升约 5-10% 的准确率
- 在长文档问答任务上,提升更为显著(约 15-20%)
- 计算成本增加约 20-30%(取决于文档长度)
- 对于短文档(<1K tokens),提升效果不明显
应用 / 使用场景
- 长文档的向量化(如论文、报告、技术文档)
- 需要保留跨片段上下文的场景(如跨段落的答案)
- 对检索质量要求高的 RAG 系统
- 多语言文档的向量化
- 法律文档和技术规范的检索
实现注意事项
实现 Late-Chunking 的关键点:
- 选择支持长上下文的 Embedding 模型
- 合理设置切分点(语义边界优于固定长度)
- 池化方式的选择影响最终效果
- 需要处理超长文档的分段编码和合并
局限与争议
- 需要支持长上下文的编码模型(如 Jina Embeddings v2 支持 8K tokens)
- 编码整个文档的计算成本高于独立编码片段,不适合实时场景
- 对于超长文档(如整本书),可能超出模型上下文窗口,需要分段处理
- 池化过程可能损失部分信息,尤其是对于信息密度高的片段
- 需要预先知道文档的切分点,对于动态切分场景不够灵活
与其他实体的关系
- RAG —— Late-Chunking 是 RAG 系统的一种文档切分策略