长文本分块的新策略——后期分块(Late Chunking),让RAG应用"又准又高效"

文摘   2024-09-07 19:13   北京  
你是否曾经为了在海量文档中找到关键信息而苦恼不已?在AI时代,这个问题似乎已经不再是难题。但是,当我们面对特别长的文本时,检索系统往往会陷入两难:要么牺牲精确度,要么付出高昂的成本。最近,JinaAI提出了一个叫后期分块(Late Chunking)[1]的新方法,声称可以解决这个难题。
今天,我们就来一探究竟,看看这个新技术到底有什么神奇之处。

后期分块:颠覆传统的新思路

想象一下,你在整理一大堆文件。传统的方法是先把文件分成小堆,然后再逐一处理。而后期分块却反其道而行之:先对整个文件进行全面处理,然后再进行分类整理。这听起来可能有点反直觉,但在AI的世界里,这种方法却显示出了惊人的效果。
具体来说,后期分块是这样工作的:
  1. 先用一个长上下文嵌入模型(比如 jina-embeddings-v2-small-en,具有 8K 上下文长度)"读懂"整个文档
  2. 然后再把这个"理解"切成小块
传统方法涉及使用句子、段落或最大长度限制来预先分割文本。之后,会反复应用嵌入模型到这些结果块中。为了为每个块生成一个嵌入,许多嵌入模型会在这些词级别嵌入上使用均值池化,以输出一个单一的嵌入向量。

而“后期分块”方法首先将嵌入模型的转换层应用于整个文本或尽可能多的文本。这为文本中的每个标记生成了一个包含整个文本信息的向量表示序列。随后,对这个标记向量序列的每一部分应用平均池化,产生考虑整个文本上下文的每个部分的嵌入。与生成独立同分布(i.i.d.)分块嵌入的简单编码方法不同,后期分块创建了一组分块嵌入,其中每个嵌入都“依赖于”之前的嵌入,从而为每个分块编码了更多的上下文信息。

这就好比你先通读了一本书,理解了整体内容,然后再给每一章写摘要,而不是仅仅看了每章的标题就开始总结。

传统方法和后期分块的对比:

方法步骤优点缺点
传统方法1.分块 2.理解计算效率高可能丢失上下文信息
后期分块1.理解 2.分块理解更全面需要更强大的AI模型

以此为例:爱丽丝有一天在树林里散步,途中她发现了一样东西。她看到一棵大树底部有一个兔子洞。她掉进了洞里,发现自己来到了一个陌生的新世界。如果我们将这个段落分句,我们会得到:

1.爱丽丝有一天在树林里散步,她在散步中发现了一些东西。

2.她在一棵大树的底部看到了一个兔子洞。

3.她掉进了洞里,发现自己在一个陌生的新世界里。

现在想象一下,用户已经将多个文档、书籍的段落甚至多本书填充到他们的向量数据库中。如果他们问“爱丽丝在哪里掉下去的”,作为人类,我们能直观地理解句子 3 中的“她”指的是句子 1 中的爱丽丝。然而,由于这些嵌入是独立创建的,模型对句子 3 的表示无法考虑到与名字爱丽丝的关系。

后期分块的过人之处

  1. 保留上下文:就像你读完整本书再总结,而不是只看目录就下结论,后期分块能更好地理解文章的整体意思[1]。

  2. 存储更高效:比起其他高级方法,后期分块既能保留文章的整体意思,又不会占用太多存储空间[1]。

打个比方:
假设我们用一个超级AI处理10万份长文档(传统方法文本采用固定分块策略为 512 个token,被分成 512 个token的分块,单独嵌入。存储需求的计算基于 32 位浮点精度,向量维度大小为 768):
方法每个文档的嵌入数量总嵌入数量存储空间
后期交互8,0008亿约2.46 TB
传统方法(在推理之前进行切片)16 ( 8,000 / 512 )160万约4.9 GB
后期分块16 ( 8,000 / 512 )160万约4.9 GB

可以看出,传统方法只需要与延迟交互相比存储资源的 1/500。后期交互,虽然更加精确,但需要显著更多的存储容量。后期分块可以与传统方法一样减少存储需求,同时保留后期交互所提供的上下文信息,既能保留文章的精髓,又不会占用太多空间,简直是鱼与熊掌兼得!

  1. 简单易用:只需稍微调整一下现有的AI系统,就能用上这个新技术,不需要大动干戈,这里是项目地址[2]colab例子[3]

实际效果如何?

Weaviate研究人员做了一系列测试[4],结果相当惊人。我们以weaviate博客文章[5]的一段内容来测试后期分块与朴素分块。
使用固定大小分块策略(token数=128)导致以下句子被分成了两个不同的分块:

Weaviate 的原生、多租户架构为需要在保持快速检索和准确性的同时优先考虑数据隐私的客户提供优势。

如下:

分块内容
chunk1...技术堆栈的演变。这种灵活性,结合易于使用,帮助团队更快地将 AI 原型部署到生产环境中。在架构方面,灵活性也至关重要。不同的应用场景有不同的需求。例如,我们与许多软件公司以及在受监管行业中运营的公司合作。他们通常需要多租户功能来隔离数据并保持合规性。在构建检索增强生成(RAG)应用程序时,使用特定于帐户或用户的数据显示结果的上下文,数据必须保留在为其用户组专用的租户内。Weaviate 的原生、多租户架构对于需要优先考虑此类需求的客户来说表现卓越。
chunk2..在保持数据隐私的同时,实现快速检索和准确性。另一方面,我们支持一些非常大规模的单租户使用案例,侧重于实时数据访问。这些案例中的许多都涉及电子商务和以速度和客户体验为竞争点的行业。

假设有人问:"客户最关心什么?"

方法AI的回答
传统方法1. "产品更新,参加我们的网络研讨会。" (得分: 75.6)
2. "在保证速度和准确性的同时注重数据隐私。我们支持一些大规模单租户用例,主要在电子商务和那些速度和客户体验至关重要的行业。" (得分: 70.1)
后期分块1. "客户需求多样,我们引入了不同的存储层。看到客户的产品越来越受欢迎真是令人惊叹。但随着用户增长,成本可能会急剧上升..." (得分: 74.8)
2. "技术选择至关重要。灵活性和易用性有助于团队更快地实施AI。不同的用例有不同的需求。例如,软件公司和受监管行业通常需要多租户来隔离数据并确保合规。在构建AI应用时,使用特定用户数据来个性化结果很重要。Weaviate的多租户架构在这方面表现出色。" (得分: 68.9)

显然,后期分块方法给出的答案更加全面和贴切,更能抓住问题的核心。

对开发者的启发

  1. 不用再为如何巧妙地切分文本而绞尽脑汁了。
  2. 用更少的钱就能处理更长的文本,性价比杠杠的!
  3. 实现起来超级简单,几十行代码就搞定,不用大改现有系统。
  4. 能给AI提供更精准的信息,让AI回答问题时更加准确高效。

总结

后期分块技术为处理长文本提供了一个既聪明又实惠的新方案。它不仅能更好地理解文章的整体意思,还能大大节省存储和计算成本。对于那些想要构建大规模AI应用的开发者来说,这绝对是一个值得尝试的新方向。随着技术的不断进步,我们有理由相信,后期分块将在未来的AI应用中发挥越来越重要的作用。

参考资料

[1]

后期分块(Late Chunking): https://jina.ai/news/late-chunking-in-long-context-embedding-models/

[2]

项目地址: https://github.com/jina-ai/late-chunking

[3]

colab例子: https://colab.research.google.com/drive/15vNZb6AsU7byjYoaEtXuNu567JWNzXOz?usp=sharing&ref=jina-ai-gmbh.ghost.io

[4]

测试: https://weaviate.io/blog/late-chunking

[5]

文章: https://weaviate.io/blog/launching-into-production

后台回复“进群”入群讨论

AI工程化
专注于AI领域(大模型、MLOPS/LLMOPS 、AI应用开发、AI infra)前沿产品技术信息和实践经验分享。
 最新文章