Jina AI 2024年12月13日
卷起来了!长文本向量模型分块策略大比拼
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了长文本向量模型中的分块策略,对比了不分块、朴素分块和迟分三种方法。不分块适用于主题单一、关键信息集中的文本,但可能导致信息稀释和丢失。朴素分块适合主题多样、需要检索特定信息的场景,但可能忽略上下文。迟分方法通过先编码全文再分块池化,能保留上下文信息,适用于主题连贯的长文本。实验表明,最佳策略取决于具体任务和数据特点,需要根据实际情况选择最合适的分块大小和方法。

💧 不分块策略:将整篇文章直接编码成单一向量,适用于主题单一、关键信息集中的短文本,但可能导致信息稀释,长文本中关键信息在中间或结尾时效果不佳。

✂️ 朴素分块策略:将文本分成多个文本块,分别进行向量化,适用于主题多样,需要检索特定信息的情况,能够更精准地定位到包含答案的文本块,但可能因为切断了上下文而丢失全局信息。

💡 迟分策略:先编码全文,保留完整上下文信息,再根据分块边界对token向量进行平均池化,生成每个文本块的向量,适用于主题连贯的长文本,能够更好地理解每个部分的意义和关联,但如果文章里夹杂着很多和主题无关的内容,性能会下降。

📊 分块大小选择:最佳的分块大小取决于具体的数据集和任务,对于迟分方法,较小的分块能更好地抓住上下文信息,对于朴素分块,大一些的分块有时效果会更好,但有时信息又太杂乱,降低检索准确性。需要根据实际情况调整。

原创 Jina AI 2024-12-13 09:00 日本

?分块策略选不对,模型性能两行泪。

长文本向量模型能够将十页长的文本编码为单个向量,听起来很强大,但真的实用吗?

很多人觉得... 未必。

直接用行不行?该不该分块?怎么分才最高效?本文将带你深入探讨长文本向量模型的不同分块策略,分析利弊,帮你避坑。

长文本向量化的问题

首先,让我们看看将整篇文章压缩成单一向量会存在哪些问题。

以构建文档搜索系统为例,单篇文章可能包含多个主题。 比如这篇关于 ICML 2024 参会报告的博客,就包含会议介绍、Jina AI 的工作展示 (jina-clip-v1) 以及其他研究论文总结。如果将整篇文章向量化成单一向量,该向量将混合三个不同主题的信息:

这会导致以下问题:

1. 表示稀释(Representation Dilution)

表示稀释会削弱文本向量的精度。虽然博客文章包含了多个主题,但用户的搜索查询往往只关注其中一个用单个向量表示整篇文章,相当于将所有主题信息压缩到向量空间中的一个点。随着更多文本添加到模型的输入中,这个向量会逐渐代表文章的整体主题,稀释特定段落或主题的细节。这就像把多种颜料混合成了一种颜色,用户想找到某种特定颜色时,就很难从混合色中识别出来。

2. 容量有限

模型生成的向量维度是固定的,长文本包含大量信息,转化过程中必然会导致信息损失。就好比把高清地图压缩成邮票,很多细节都看不清了。

3. 信息丢失

很多长文本模型最多只能处理 8192 token。更好的文本得截断一部分,通常是截断后面的内容,要是关键信息在文档末尾,就可能导致检索失败了。

4. 分块需求

有些应用只需要对文本的特定片段做向量化处理,比如问答系统,只需提取包含答案的段落进行向量化。这种情况下,还是需要对文本进行分块处理。

3 种长文本处理策略

在实验开始之前,为了避免概念混淆,我们首先定义三个分块的策略:

1. 不分块(No Chunking):将整个文本直接编码成单一向量。

2. 朴素分块(Naive Chunking):先将文本分成多个文本块,并分别进行向量化。常用的方法有固定大小分块,将文本分割成固定 token 数量的块;基于句子的分块: 以句子为单位进行分块;基于语义的分块: 根据语义信息进行分块。在本次实验,使用的是固定大小分块。

3. 迟分(Late Chunking):是一种先通读全文再分块的新方法,包含两个主要步骤:

    编码全文:先编码整个文档,得到每个 token 的向量表示,保留完整的上下文信息。

    分块池化:根据分块边界,对同一个文本块的 token 向量进行平均池化,生成每个文本块的向量。由于每个 token 的向量是在全文的语境下生成的,因此迟分可以保留块之间的上下文信息。

迟分与朴素分块的对比

对于超过模型最大输入长度 (例如 8192 tokens) 的超长文本,我们采用 长文本迟分(Long Late Chunking),在迟分的基础上增加了预分割步骤,先将文档分割成多个重叠的宏块,每个宏块的长度都在模型可处理范围内。然后,在每个宏块内部应用标准的迟分策略(编码和池化)。宏块之间的重叠部分用于确保上下文信息的连续性。

迟分具体实现代码https://github.com/jina-ai/late-chunking

在 Notebook 体验https://colab.research.google.com/drive/1iz3ACFs5aLV2O_uZEjiR1aHGlXqj0HY7?usp=sharing

那么,哪种方法最好呢?

为了对比,我们在 5 个数据集上,使用 jina-embeddings-v3 进行了实验,所有长文本都被截断至模型最大输入长度 (8192 Tokens),并按每 64 个 Token 为一个文本块进行分割。

5 个测试数据集也对应 5 种不同的检索任务

下图展示了 3 种方法在不同任务上的表现差异,并没有一种方法在所有情况下都最好,选择哪种方法取决于具体的任务。

不分块 vs 朴素分块 vs 迟分

?‍? 找具体事实,朴素分块好。 

如果需要从文本中提取具体的、局部的事实信息(例如,“谁偷了东西?”),像 QMSum、NarrativeQA 和 2WikiMultiHopQA 这几个数据集,朴素分块比把整个文档向量化表现要好。因为答案通常位于文本的某个特定部分,朴素分块能够更精准地定位到包含答案的文本块,而不会被其他无关信息干扰。

但是朴素分块也会因为切断了上下文,可能丢失全局信息,无法正确解析文本中的指代关系和引用。

?‍? 文章主题连贯,迟分更好。 

如果文章主题很清晰,且篇章结构连贯,迟分方法会更有效。因为迟分考虑了上下文,能更好地理解每个部分的意义和关联,包括长文本里面的指代关系。

但如果文章里夹杂着很多和主题无关的内容,迟分反而会因为考虑了这些“噪音”导致性能回退,准确率下降。像 NarrativeQA、2WikiMultiHopQA,迟分表现不如朴素分块,就是因为这些文章里无关信息太多了。 

分块大小是否有影响?

下图展示了不同分块大小下,朴素分块和迟分方法在不同数据集上的表现:

不同分块大小下朴素分块和迟分的性能对比

从图中我们可以看出,最佳的分块大小其实要看具体的数据集是什么样的。

对于迟分方法,较小的分块能更好地抓住上下文信息,所以效果更好。尤其是,如果数据集里有很多和主题无关的内容(就像 NarrativeQA 数据集那样),过大的上下文反而会引入噪音,损害性能。

对于朴素分块,大一些的分块有时效果会更好,因为包含的信息更全面,损失也更小。但有时候,分块太大,信息又太杂乱,反而降低了检索的准确性。所以,最佳的分块大小,需要根据具体的数据集和任务来调整,没有一个一刀切的答案。

理解了不同分块策略的优缺点后,我们该如何选择合适的策略呢?

1. 全文向量化(不分块)适合哪些情况?

2. 朴素分块(Naive Chunking)适合哪些情况?

3. 迟分(Late Chunking)适合哪些情况?

结论

长文本向量化策略的选择是一个复杂的问题,没有一刀切的最佳方案,需要考虑数据特点和检索目标,包括前面提到的文本长度、主题数量、关键信息位置

本文希望提供一个关于不同分块策略的比较分析框架,并通过实验结果提供了一些参考。在实际应用时,大家可以多对比,选择最适合自己场景的策略。

如果你对长文本向量化感兴趣,jina-embeddings-v3提供了先进的长文本处理能力、多语言支持以及迟分功能,值得尝试。

? https://jina.ai/embeddings

https://huggingface.co/jinaai/jina-embeddings-v3

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

长文本向量化 分块策略 朴素分块 迟分 jina-embeddings-v3
相关文章