source 来自YouTube的图片链接
在之前的一篇文章中,我们探讨了Anthropic的上下文检索技术,这是一种他们用于增强RAG系统上下文的技术。但是还有一种叫做长上下文嵌入模型中的延迟片段处理的技术,我认为这更加有趣且具有重要意义。
嵌入是任何检索系统中极为关键的组成部分之一,但它们经常被忽视或误用。在选择嵌入模型时,您需要考虑两个非常重要的参数。一个是最大标记数,即上下文窗口大小,另一个是嵌入维度,即嵌入向量的输出大小。
你可能已经注意到一些最新的嵌入模型具有非常大的最大标记数,但这些模型有一个主要问题。在标准的RAG流程中,无论片段的大小如何,嵌入向量的输出大小都将保持不变。这意味着无论你嵌入的是五个标记还是5000个标记,输出都将完全相同。这表明这些嵌入模型在处理长输入片段时会压缩大量的信息。
在大多数情况下,使用较小的片段通常更为合适,但这也有自己的问题。为了更好地理解这一点,让我们来看一个例子:这里有一段关于突尼斯的小段落:
来自作者的图片
如果你采用句子级别的分块策略,每个句子基本上会变成一个独立的分块。你会发现,如果分别嵌入这些不同的分块,你将会失去上下文信息。例如,“the country”指的是突尼斯这个国家,但如果这个分块单独存在,它就会失去这个上下文。
上下文检索方法试图总结文档,同时为每个分块添加上下文信息,但是有一个更好的方法,那就是延迟分块。
我们先来看看“常规”的分块是怎么工作的。
常规的分块和嵌入流程传统的分块方法是,文本首先被分割成更小的块,然后每个块通过一个神经网络,即Transformer模型。该过程的输出是每个块中词元的嵌入。这些词元的上下文信息仅限于它们所在的块。生成词元嵌入后,通过均值池化计算最终输出结果。这保留了每个块中的上下文信息,但这些信息仅限于每个块,并与其他块无关。
后分块方法与此相反。这种方法不是先将文档分成块再计算嵌入,而是首先用一个Transformer模型处理整个文档文本。这为每个标记生成嵌入表示,这些标记现在包含的上下文信息不仅限于单个块,而是覆盖了整个文档。之后,再将文本分割成块,并使用这些标记计算均值池化,以获得最终表示。
由于分块处理是在后期阶段进行的,这种方法称为“晚期分块处理”。
source (来源:Jina AI的新闻链接)
最佳的:检索方式
晚期分块的方法直接与另一种名为晚期交互的方法相关,这是一种基于COBERT的方案。这可能是检索方法中的最佳选择,但会增加存储需求。在这种情况下,到最后一步时,你不再进行池化步骤,而是直接存储单个标记的嵌入。
这篇文章的来源:这篇博客文章
一篇来自 weaviate 团队的博客文章显示,如果你用相同数量的嵌入来嵌入大约 100,000 个文档,一种简单的分块方法需要大约 160 万向量,即大约 5GB。然而,如果你采用延迟交互或基于 COBERT 的多向量表示方法,则需要大约 2.5TB(约2.5太字节),这非常庞大。原因是你需要为每个 token 单独存储这些嵌入。
另一方面,晚期分块方法则提供了两种方法的最佳组合。它不仅在最终的分块过程中保留了上下文,而且还与朴素的分块相比几乎具有相同的存储需求。这使得晚期分块在效率和实用性上优于晚互动或基于COBERT的方法,后者则需要更多的存储空间。
延迟片段化是由Jina引入的,他们有自己的嵌入模型。从表中的数据显示,与其它方法结合使用时,延迟片段化在各种基准中表现优异。这表明,这种方法在各种基准测试中表现出了有前景的性能。
选择嵌入模型非常重要,这里展示的结果可能需要其他独立来源的进一步验证。
这个新想法的背后团队准备了一个非常简单的笔记本文件[(点击访问 https://github.com/jina-ai/late-chunking/tree/main)],介绍了如何在自己的应用和管道中实现这种延迟分组的简单步骤。虽然我们不会详细讲解这个笔记本,但还是让我来简单介绍一下结果。
在笔记本中,他们计算了“柏林”作为单独的词元与某些词嵌入的相似度。在第一句话中,它直接提及柏林并提到“柏林”,无论使用传统还是晚期的分块方法,都会给出非常接近的相似度结果。
similarity_new → 晚期分块给出 → 0.849546
similarity_trad → 常规分块 → 0.84862185
相似度("柏林", "柏林是德国的首都,也是德国面积最大和人口最多的直辖市。"): 0.849546
相似度("柏林", "柏林是德国的首都,也是德国面积最大和人口最多的直辖市。"): 0.84862185
然而,在第二个句子中,“它有超过385万的居民……”间接指的是柏林,而没有直接提到它。在这种情况下,采用晚期切块法,相似度约为82%,而采用传统切块法则相似度下降到约70。
similarity_new("柏林", "它拥有超过385万的居民,以城市边界内居民人口计算,它是欧盟人口最多的城市。"): 0.82489026
similarity_trad("柏林", "它拥有超过385万的居民,以城市边界内居民人口计算,它是欧盟人口最多的城市。"): 0.7084338
同样,例如,在第三句中,将柏林称为“这个城市”时,对于较晚的分块方法相似度较高(0.84),而传统分块方法的相似度则低得多(0.75)。
similarity_new("柏林", "柏林也是德国的一个州,而且是德国面积第三小的州。"): 0.84980094
similarity_trad("柏林", "柏林也是德国的一个联邦州,而且是德国面积第三小的州。"): 0.7534553
现在,这是一个简单例子,但如果这些块更大,与他们提出的晚期切分方法相比,直接切分的方法会丢失大量信息。另一个需要注意的地方是,晚期切分是双向的。如果某些信息在某个块之前,这些信息仍会被保留下来。由于它是双向的,在整个文档嵌入时,一个块依然会保留与其相关的信息,不论这些信息是在该块之前还是之后。
这双向特性让模型更强大,说明长上下文对LLMs和嵌入同样重要。
最后的结论你知道,经过仔细阅读这篇文章中的所有细节和例子之后,我不得不说,在长上下文嵌入模型这一领域,这种后期分块处理的方式真的非常有趣且有前景,似乎有很大潜力。
这里的关键见解是,传统上将文档分成小块,然后分别嵌入每个小块,会导致大量的上下文和重要信息丢失。通过先整体嵌入整个文档,捕捉广泛上下文,然后再分块,你就能保留更多的相关细节。
正如示例所示,当你处理像“柏林”这样的实体的直接和间接引用时,延迟分块技术这种方式能够保持更强的语义理解,相比传统的分块和嵌入管道。而且由于它的双向特性,可以从每个分块的前后提取上下文,因此这使其更加强大。
这里有一些链接 Google Colab编辑 长文档中的晚期分段技术分块长文档以保留上下文信息是具有挑战性的。我们提出了“晚期分段”方法……了解更多详情请参阅jina.ai 什么是Late Chunking,以及它不是什么:第二部分在第二部分中,我们将深入探讨Late Chunking,探讨为什么它是嵌入片段的最佳方法……jina.ai 延迟分块:在长上下文检索中平衡精度和成本 | Weaviate 了解如何使用延迟分块在您的长上下文检索中平衡成本与性能……weaviate.io 上下文检索介绍Anthropic是一家致力于构建可靠、易于理解且易于控制的人工智能安全与研究的公司……www.anthropic.com 了解更多 GitHub - jina-ai/late-chunking: 用于解释和评估延迟切块(延迟分块操作)的代码 - jina-ai/late-chunking共同学习,写下你的评论
评论加载中...
作者其他优质文章