在自然语言处理和人工智能领域,分块(chunking)是一项至关重要的技术,它将大块文本分解成更小、更易于管理的片段。 在使用大型语言模型 (LLM) 和语义检索系统时,此过程尤其重要,因为它直接影响从这些模型获得的结果的相关性和准确性。 在这篇博文中,我们将深入探讨分块的概念,探讨其在 LLM 相关应用程序中的重要性,并分享我们自己对不同分块大小的实验的见解。
分块(chunking):解释
分块(chunking)是将大型文本数据语料库划分为较小的、具有语义意义的单元的过程。 通过这样做,我们可以确保每个块都包含噪音最小的相关信息,使 LLMs 更容易处理和理解内容。 这些块的大小可能会根据特定用例和系统所需的结果而变化。
当涉及语义检索时,分块在确定检索结果的相关性方面起着至关重要的作用。 LLMs 的上下文窗口有限,这意味着他们一次只能处理一定数量的文本。 通过将数据分成更小的部分,我们可以确保每个块都适合 LLM 的上下文窗口,从而使其能够更有效地处理和理解信息。 当使用检索到的结果来增强 LLMa 的知识时,这一点尤其重要,因为它直接影响生成输出的质量和准确性。
然而,找到最佳块大小并不总是那么简单。 如果块太小,它们可能缺乏必要的上下文来捕获文本的完整含义。 另一方面,如果块太大,它们可能包含多个想法或主题,从而削弱块与特定查询的相关性。 这就是实验和评估发挥作用的地方,因为即使使用相同的查询,不同的块大小也可能导致不同的检索结果。
了解块 (chunk) 表示和检索
为了更好地理解块大小如何影响语义检索结果,了解块的数学表示方式以及用户查询如何与这些表示交互非常重要。
在语义检索系统中,通常使用词嵌入或基于转换器的模型等技术将每个文本块转换为密集向量表示。 这些向量表示捕获高维空间中文本的语义。
将文本块转换为向量嵌入后,它们几乎总是在向量数据库中建立索引,以便轻松高效地使用。
存储文本块向量嵌入的过程
这意味着你不能即时调整块大小;而是需要调整块大小。 它需要返回原始文本,再次运行嵌入模型,并存储新的嵌入以供使用。 此过程可确保向量数据库针对快速相似性搜索和检索进行优化。
当用户提交查询时,查询本身也会使用相同的技术转换为密集向量。 然后,语义检索系统使用诸如余弦相似度之类的相似性度量,将查询向量与数据库中所有块的向量表示进行比较。 然后检索相似度得分最高的前 k 个块并将其呈现给用户。
块的大小会影响向量表示,从而影响相似度分数。 较小的块可能具有更集中的表示,而较大的块可能具有捕获更广泛上下文的更复杂的表示。
块大小影响检索结果
块大小很重要,不仅因为 LLMs 的上下文限制,还因为它会影响检索结果的相关性。 即使我们有一个具有大上下文窗口的模型,也并不一定意味着我们应该始终使用大块文本。
使用大块的一个缺点是它过于依赖 LLMs 精确定位和使用块中最相关信息的能力。 研究表明,当前的模型可能存在问题,特别是当最相关的内容位于大块的中间时。
在使用语义检索系统时,另一个问题变得显而易见,即即使使用相同的查询,不同的块大小也会检索到不同的结果。 这是因为块的语义可能会根据它的大小和它包含的上下文而改变。
例如,当你搜索 "retrieval augmented generation" 并比较 200 和 400 块的结果时,你会注意到不同的结果。 在大多数情况下,如上所示,200 和 400 的结果差异可能不会很大。 上面的屏幕截图显示了典型的情况:大多数相同的相关信息可能会出现在两种情况下,但是,结果的相似度分数和排名可能会有所不同。 这是预期的,因为较小的块将具有更集中的上下文,而较大的块将包含可能与用户的查询相关或不相关的附加信息。
太大的块
当块太大时,它们可能包含多个不同的想法或主题。 这可能会削弱该块与特定查询的相关性,因为该块可能涵盖广泛的信息,其中一些信息可能与用户的搜索不直接相关。
在检索增强生成的背景下,当你根据相似性分数检索前 K 个结果时,较大的块可能会导致结果不太集中且相关性较低。 这是因为相似度分数是基于整个块计算的,如果块包含多个想法,则分数可能无法准确反映块内最重要信息的相关性(产生幻觉的潜在原因)。
通过使用更小、更集中的块,前 K 个结果更有可能与用户的查询直接相关,因为每个块通常涵盖一个主要想法或主题。 这可以为检索增强生成应用程序带来更准确和有用的结果。
在不增加块大小的情况下嵌入更多上下文
在语义检索中包含更多上下文而不增加块大小的一种方法是嵌入周围的上下文(通常称为 "从小到大")。
在这种方法中,你不仅嵌入块本身,还嵌入块的周围上下文(例如,前面和后面的块)。 这使得语义检索系统能够考虑更广泛的块上下文,而无需实际增加 LLM 正在处理的块的大小。
具有扩展上下文的前 K 个结果
例如,假设你的块大小为 200 个单词。 你不仅可以嵌入 200 个单词的块,还可以嵌入该块之前的 200 个单词和之后的 200 个单词。 这样,你就可以有效地考虑 600 个单词的上下文,同时仍将实际块大小保持在 200 个单词。
当块应该执行更细粒度的搜索时,"从小到大" 技术特别有用。 通过嵌入周围的上下文,可以捕获有关每个块的更详细的信息,而无需更改块大小(也称为语义表示)本身。
最佳块大小
似乎没有一种放之四海而皆准的最佳块大小。 理想的块大小取决于特定的用例和系统所需的结果。
例如,如果目标是创建一个系统来查找大型文本语料库中特定主题的所有相关提及,则较小的块大小可能更合适。 较小的块允许更集中的搜索,并有助于确保捕获主题的简短提及。
另一方面,如果系统设计为优先考虑汇总和决策,则较大的块大小可能更合适。 更大的块提供更多的背景,可以帮助 LLM 生成更连贯和信息丰富的总结或回应。
有趣的是,流行的向量数据库表明,在单个数据库中具有不同的片段长度可能会改善结果。 通过合并短块和长块,数据库可以捕获更广泛的上下文和信息,更灵活地适应不同类型的查询。
最终,为你的特定应用程序找到最佳块大小需要仔细考虑你的用例、内容的性质以及你选择的嵌入模型的功能。 试验不同的块大小并评估其性能可以帮助你在粒度和上下文之间取得适当的平衡,确保你的语义检索系统提供最相关和最准确的结果。
结论
在考虑特定用例的最佳块大小时,问自己几个关键问题很重要:
- 被索引的内容的性质是什么? 你正在处理研究论文等长篇内容,还是社交媒体帖子等更短、更简洁的内容? 这将影响最适合你的应用程序的嵌入模型和分块策略。
- 你使用哪种嵌入模型,它在什么块大小上表现最好? 不同的模型具有不同的最佳块大小,因此了解所选模型的功能和限制至关重要。
- 你对用户查询的长度和复杂性有何预期? 它们会简短而集中,还是更加开放和详尽? 定制分块方法以符合预期的查询样式可以带来更相关的结果。
- 检索到的结果将如何在你的应用程序中使用? 它们是用于语义搜索、问答、摘要还是其他目的? 如果结果需要输入另一个具有 token 限制的 LLM,你需要仔细考虑块大小,以确保最相关的信息包含在这些限制内。
通过花时间仔细考虑这些因素并尝试不同的块大小,你可以开发一个语义检索系统,该系统可以有效满足应用程序的独特需求,并向用户提供最相关和最准确的结果。
更多阅读: