🚀RAG分块技术的本质🚀
原文链接:Chunking: Let's Break It Down\
作者:John Laffey\
译者:倔强青铜三
前言
大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
在采用AI实践时,使数据准备好用于AI的一个更具挑战性的方面是“分块”。分块,顾名思义,是将大段文本分解为较小的片段。每个片段随后会被向量化,存储和索引。任何类型的数据都可以进行分块:文本文档、图像、声音文件。为了清晰起见,我们将坚持讨论文本分块,但理论和过程对任何类型的数据都相同。
分块是将数据向量化的一个必要步骤,原因有很多。较小的数据块占用更少的内存,加速检索时间,启用数据的并行处理,并允许数据库的扩展。将内容分解为更小的部分还可以提高从向量数据库中检索的内容的相关性。检索到的片段会被传递到大型语言模型 (LLM)的提示中。当作为检索增强生成 (RAG)的一部分使用时,分块有助于控制成本,因为可以将更少但更相关的对象传递给LLM。
正如DataStax合作伙伴Unstructured的开发者倡导者Maria Khalusova在最近的博客文章中写道:“分块是任何RAG系统中必不可少的预处理步骤之一。你在设置时所做的选择将影响检索质量,从而影响系统的整体性能。”
文本分块示例
让我们看一个示例。方便的是,这篇博客文章是由文本组成的,因此我们无需从外部引入内容,而是直接使用文章的第一段。记录一下,该段落有72个单词,总共422个字符,不包括空格则为350个字符。我们将标准分块参数设置如下:
chunkSize: 150,
chunkOverlap: 5,
这将告诉我的处理模型创建150个字符的分块,并且有5个字符的重叠。因此,将上述段落分解后,分块将如下所示:
每个生成的分块将作为嵌入向量存储在数据库中并进行索引。chunkOverlap设置定义了从前一个和后一个分块中包含的字符数量。你可以看到第一个和第二个分块之间的重叠值,其中“do”在分块1中被拆分,而分块2中保留了完整的单词“down”,而不是仅保留“wn”。重叠有助于通过保留可能丢失的上下文来提供语义完整性。
分块使LLM能够以小而有意义的单元处理大量数据,这些单元适合LLM的内存,并且仍然保留足够的语义内容,使LLM能够处理和“理解”内容和含义。
插入令牌
虽然向量嵌入的分块是数据存储和检索的方式,但这并不是将其提供给LLM的方式。LLM通过令牌来消耗数据并按令牌收费。令牌是LLM摄入的最小数据量。一个令牌大约是不包括空格和某些控制字符的四个字符;令牌大小取决于LLM提供商,但通常等于一个词的四分之三。
LLM分析令牌以确定它们在语义上的相关性。上述分块使用TikTokenzer分别计算为34、33和32个令牌。不同的LLM对它们可以处理的令牌数量有不同的限制:上下文窗口。控制分块大小可以帮助确保你的数据能够适应LLM的上下文窗口。处理更相关的数据可以提高结果的相关性,并有助于减少幻觉。
什么是最佳的分块方式?
没有一种适用于每个应用程序的明确分块策略。选择分块策略时需要考虑多个因素:
- 数据大小 - 需要考虑源数据的大小。数据是从书籍、即时消息还是博客中导入的?如果分块大小太小,单词之间的语义关系可能会被拆分和丢失。如果分块大小太大且包含过多数据,结果可能会被与查询无关的多余信息稀释。
- 查询复杂性 - 预期用于数据的查询类型也会影响分块大小。查询是简短而具体的吗?较小的分块有助于在没有额外噪声的情况下识别特定关系。更复杂的查询需要更全面的结果,从较大的分块大小中受益,以识别数据中的广泛上下文。将预期的查询大小与分块对齐有助于优化结果。
- LLM考虑因素 - 每个LLM在处理查询和数据方面都有其独特的特性。每个LLM都有一个定义的上下文窗口。根据使用的特定LLM调整分块大小可以通过确保检索到足够的数据来处理查询来提高相关性。通过更改处理的令牌数量,它还可以减少或增加LLM的成本。
- 文本分割器 - 有多种不同的文本分割器可供使用,每种分割器处理文本的方式不同。一些分割器使用简单的字符计数,如上所述,而其他分割器允许你操作文本,在定义的字符处分割,并删除空格和其他不需要的字符。其他分割器支持特定的脚本或编程语言、令牌,甚至语义分割器,尝试为单词和句子建立语义联系,保留分块内的上下文。
选择分块策略
关于确定应用程序最佳分块策略的普遍共识是通过试错。在数据上尝试不同的分块和重叠设置,找到适合你的解决方案。如果这是适合你的方法,Langflow是节省时间和精力的工具。使用Langflow,你可以尝试不同的LLM、不同的分块分割器和不同的分块设置。使用真实数据,你可以轻松测试不同的策略,迭代不同的组合,直到找到最适合你应用程序需求的策略。
如果你是Astra DB用户,有一种更简单的方法。对于Astra DB用户,我们建议分块大小为1024,重叠设置为128。这是一个很好的起点,应该适合许多生成式AI应用程序。虽然可能需要一些实验和调整,但Astra DB用户可以使用这些设置快速入门,并仍然使用Langflow进行任何额外的实验,以获得应用程序的最佳结果。
无论你决定采取哪种方法,重要的是要认识到分块不仅影响应用程序的性能和查询结果的相关性,还影响其运行成本。找到效率和成本之间的最佳平衡将确保你的应用程序能够扩展,而不会降低性能或超出预算。
如果你准备深入研究分块并更好地理解不同分块策略的选项和权衡,请查看🚀RAG中分块的最佳实践🚀这篇文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。