Late Chunking:一种改进的文本块嵌入方法
Late Chunking:一种改进的文本块嵌入方法
Late Chunking是一种新颖的文本块嵌入方法,通过在Transformer模型之后、均值池化之前进行分块,使得块嵌入能够捕捉完整的上下文信息。这种方法在各种检索任务中取得了更好的结果,而无需额外的训练。
摘要
许多应用场景需要检索较小的文本片段,而基于密集向量的检索系统在处理较短文本片段时通常表现更好,因为语义在嵌入中不容易被 “过度压缩” 。因此,开发者通常会将文本文档分割成更小的块,并分别进行编码。然而,这种方式创建的块嵌入可能会丢失周围块的上下文信息,从而导致表示效果不理想。在本文中,作者提出了一种称为 “late分块” 的新方法,该方法利用长上下文嵌入模型首先嵌入长文本的所有token,然后在 Transformer 模型之后、均值池化之前进行分块。这样得到的块嵌入能够捕捉完整的上下文信息,从而在各种检索任务中取得更好的结果,而无需额外的训练。此外,作者的方法足够通用,可以应用于任何长上下文嵌入模型。
1. 引言
近年来,神经信息检索领域因引入文本嵌入模型[Reimers and Gurevych, 2019]而受到关注,这些模型利用基于 Transformer 的预训练语言模型 [Devlin et al., 2019] 将文档的潜在语义捕捉为密集向量,通过余弦相似度对文本的相似性和相关性进行建模。检索增强生成(Retrieval Augmented Generations,RAG) [Lewis et al., 2020] 是最著名的应用之一。它需要将文档集合分割成较小的文本块。这些块通常存储在向量数据库中,由文本嵌入模型创建向量表示。在运行时,相同的嵌入模型将查询文本编码为向量表示,用于识别相关的存储文本块。然后,这些块被传递给大语言模型(LLM),LLM根据检索到的文本生成对查询的响应。然而,这种方法对长距离上下文依赖性(即:当相关信息分布在多个块上且脱离上下文使文本段变得毫无意义时)的处理特别差。图 1 展示了一篇被分割成句子块的 Wikipedia 文章。可以看到,例如,像 “its” 和 “the city” 这样的短语引用仅在第一句话中提及的 “Berlin” 时,嵌入模型很难将其链接到相应的实体以生成高质量的嵌入表示。
图 1 上下文丢失问题的说明。一篇关于 Berlin 的 Wikipedia文章被分成几块,从中可以看到像 “its” 和 “the city” 这样的短语引用了 “Berlin” ,而“Berlin” 仅在第一句中被提到。这让嵌入模型很难将这些引用链接到正确的实体,所以生成质量较低的向量表示。
为了克服这些限制,作者提出了一种称为 “late分块” 的新方法。该方法利用最近发布的开源模型(如jina-embeddings-v2 [Günther et al., 2023])的长文本嵌入功能,首先对文档的所有token进行编码,然后在均值池化之前进行分块。这允许块嵌入捕捉整个文本的信息,正如作者在第 4.1 节的定性分析中所展示的。此外,与传统分块方法相比,它在所有检索基准测试中表现出更优的结果,如第4.2节所示。
late分块无需额外训练,适用于任何长上下文文本嵌入模型。为了使作者的结果具有可重复性,作者将代码发布在 GitHub 上。
本文的其余部分从第 2 节开始总结相关工作。第 3 节解释方法,第 4 节进行评估,第 5 节给出结论。
2. 相关工作
大多数现代文本嵌入模型都是使用 [Reimers and Gurevych,2019] 提出的方法,在基于 Transformer 的架构上进行训练 [Devlin et al., 2019]。其中,模型配备了一个池化运算符,它将 transformer 生成的 token 嵌入转换为单一向量表示。特别是均值池化因 [Reimers and Gurevych, 2019] 的实验中显示其在各种方法中表现最佳而受到欢迎。虽然原始的 transformer 使用绝对位置编码,但像 AliBi [Press et al., 2022] 和 RoPE [Su et al., 2024]这种编码相对位置的方法,允许对具有更长上下文长度的嵌入模型(如:jina-embeddings-v2 [Günther et al., 2023])进行有效训练。为了解决有限的上下文长度并克服处理长文本嵌入的实际问题,通常会在嵌入文本之前进行分块。虽然简单的分块方法使用固定长度或将文本分割成句子或段落等单元,但可以使用更复杂的方法,例如 [Kamradt,2024] 的语义分块方法,该方法利用相邻句子嵌入向量的相似性来检测分割点。研究的另一个分支提出了嵌入模型,该模型能够对每个token进行编码和索引嵌入。像 ColBERT [Khattab and Zaharia, 2020, Jha et al., 2024] 这样的模型使用了一种称为 “late 交互” 的方法,该方法将查询的每个token嵌入与文档的每个token嵌入进行比较,并通过这种方式计算更准确的相关性分数。然而,与作者的 late分块方法相比,这会导致向量搜索过程需要更多的计算开销。
3. 方法
为了解决上下文丢失的问题,作者利用了最近嵌入模型可以处理的长输入序列。这些模型支持更长的输入文本,例如,jina-embeddings-v2-small能处理 8192 个token,约为十页标准文本。这种大小的文本段不太可能具有只用更大上下文来解决的上下文依赖。然而,作者仍然需要对更小的文本块进行向量表示。原因可能是多方面的,例如,LLM 在提供更长的上下文时效率会变得更低,而单个短嵌入向量表示的信息容量有限。
naive分块方法(图2左侧)在处理文本,使用句子或段落之前进行分块,然后使用嵌入模型来生成结果块。相反,late分块首先将嵌入模型中的transformer部分应用到整个文本或其可能的最大部分。这会为每个token生成一系列的向量表示,其中包含整个文本的文本信息。为了生成文本的单个嵌入,许多嵌入模型对这些 token 表示进行均值池化,以输出一个单一的向量。相反,late分块对 token 向量序列的较小片段进行均值池化,为每个块生成考虑到整个文本的嵌入。需要强调的是,late分块仍然需要边界提示。这些提示在输入的token化过程中确定,但仅在获得token级嵌入后才使用——因此在其命名中使用词语 “late” 。
图 2 naive分块策略(左)和late分块策略(右)的说明。late分块首先将嵌入模型的transformer层应用于整个文本或尽可能多的文本。这会为每个token生成一系列的向量表示,其中包含整个文本的文本信息。随后,将均值池化应用于该token向量序列的每个块,为每个块生成考虑整个文本上下文的嵌入。与生成独立且同分布 (i.i.d.) 块嵌入的naive编码方法不同,late分块创建一组块嵌入,其中每个块嵌入都以前一个嵌入为 “条件” ,从而为每个块编码更多上下文信息。
4. 评估
作者首先进行了一项小规模的定性评估,以展示late分块如何能够将上下文信息从块范围之外的文本值传递到其嵌入表示中。为了证明这种方法的实际有效性,作者随后对检索任务进行了定量评估。
4.1 定性分析
为了研究存在上下文问题时late分块的影响,作者使用两种分块方法对图 1 中的示例进行编码,并使用jina-embeddings-v2-small计算与词语 “Berlin” 的相似度。表 1 显示,使用naive分块方法时,不包含词语 Berlin 的文本值得到低得多的相似性得分,因为像 “the city” 和 “Its” 这种引用不能链接。
Text | Sim.Naive | Sim.Late |
---|---|---|
Berlin is the capital and largest city of Germany, both by area and by population. | 0.8486 | 0.8495 |
Its more than 3.85 million inhabitants make it the European Union’s most populous city, as measured by population within city limits. | 0.7084 | 0.8249 |
The city is also one of the states of Germany, and is the third smallest state in the country in terms of area. | 0.7535 | 0.8498 |
表 1 使用余弦相似度将词语 “Berlin” 的嵌入与有关 Berlin 的文章中的各个句子进行比较。“Sim.naive” 列显示 “Berlin” 的查询嵌入与使用 naive 分块方法的嵌入之间的相似度值,而 “Sim.late” 表示使用 late分块方法的结果。
4.2 检索任务评估
作者还在 BeIR 基准 [Thakur et al.] 的小型检索任务上测试了late分块。这些检索任务由查询集、文本文档语料库和 QRels 文件组成,其中 QRels 文件存储与每个查询相关的文档 ID 的信息。为了识别与查询相关的文档,可以对文档进行分块,将它们编码到嵌入索引中,并为每个查询嵌入确定与其归一化向量表示的 k-最近邻 (kNN) 相对应的块。由于每个块对应一个文档,因此可以将块的 kNN 排名转换为文档的 kNN 排名(对于在排名中出现多次的文档,仅保留其第一次出现)。之后,可以将结果排名与真实 QRels 文件对应的排名进行比较,并计算检索指标,例如 nDCG@10。作者使用 naive分块、新的late分块方法对各种 BeIR 数据集进行了评估,并公布了无分块时获得的分数。为了将文本分割成块,作者选择了一种直接的方法,将文本分割成 256 个token的字符串(参考实现位于首页脚注中提到的 GitHub 仓库中)。所有的方法都使用jina-embeddings-v2-small模型。
表 2 中的结果显示,late分块总是优于 naive分块。只有在 Quora 上,两种方法才能获得相同的 nDCG 分数,因为这些文档仅包含一个块。此外,文档的平均长度越大,late分块相对于传统分块所实现的改进也越大。
Dataset | Length | Naive | Late | Full |
---|---|---|---|---|
SciFact | 1498.4 | 64.20% | 66.10% | 63.89% |
TRECCOV | 1116.7 | 63.36% | 64.70% | 65.18% |
FiQA2018 | 767.2 | 33.25% | 33.84% | 33.43% |
NFCorpus | 1589.8 | 23.46% | 29.98% | 30.40% |
Quora | 62.2 | 87.19% | 87.19% | 87.19% |
表 2 检索任务中naive分块、late分块和无分块的 nDCG@10。长度是文档中的平均字符数。
5. 结论与未来工作
在本文中,作者提出了一种使用嵌入模型对文本块进行编码的新方法,称为 “late分块” 。作者展示了它如何解决上下文依赖问题,并证明它在各种检索任务中能够提升文本嵌入的效果。这种方法不需要额外的训练,并且可以适用于各种嵌入模型。
目前,作者的评估仅限于非常具体的设置。作者计划进行更全面的评估,包括更多的模型和分块方法。此外,作者相信,通过对模型进行late分块的微调,可以进一步提升检索任务的性能。
论文链接:https://arxiv.org/abs/2409.04701
项目地址:https://github.com/jina-ai/late-chunking
参考文章:https://blog.csdn.net/Jina_AI/article/details/141578551