RAG的5种切分策略 [译]

以下是典型的RAG应用工作流程:

RAG:将额外信息存储为向量,将传入的查询与这些向量匹配,并将最相似的信息与查询一起传递给大语言模型(LLM)。

由于额外的文档可能非常大,第1步还需要进行切分操作,将大文档分割成较小、易于管理的部分。

这一步至关重要,它确保文本能够适应嵌入模型的输入大小。此外,它提高了检索步骤的效率和准确性,这直接影响生成响应的质量。

以下是RAG的五种切分策略:

让我们今天来了解它们!

注:昨天我们讨论了如何构建依赖于成对内容相似性的强大NLP系统(RAG是其中之一)。如果错过了,可以阅读这里:句对相似性评分的双编码器和交叉编码器 - 第1部分

1)固定大小切分

最直观的切分方法是根据预定的字符数、单词数或Token数量将文本均匀分割成若干段落。

由于直接切分可能会破坏语义流畅性,建议在连续段落间保留一些重叠(如上图的蓝色部分)。

这种方法易于实现,而且所有段落大小相同,有助于简化批处理。

但它存在一个大问题:通常会在句子(或想法)中途切分,导致重要信息可能分散在不同段落中。

2)语义切分

概念很简单。

  • 根据句子、段落或主题部分等有意义的单元来切分文档。

  • 接着,为每个段落生成嵌入。

  • 假设从第一个段落及其嵌入开始。

    • 如果第一个段落的嵌入与第二个段落的嵌入余弦相似度较高,则两个段落组成一个切片。

    • 这个过程持续进行,直到余弦相似度显著下降。

    • 一旦下降,我们就开始一个新切片并重复此过程。

输出可能如下所示:

这种方式与固定大小切片不同,能够保持语言的自然流畅性,并保留完整的思想。

由于每个切片语义更为丰富,它提高了检索准确度,进而使LLM生成的响应更加连贯且相关。

一个小问题是,确定余弦相似度下降的阈值在不同文档间可能有所不同。

3)递归切分

这个方法也非常简单。

首先,基于内在的分隔符(如段落或章节)进行切分。

然后,如果某个切片的大小超过预定义的切片大小限制,就将其进一步分割。如果切片符合大小限制,则不再进行切分。

输出结果可能如下所示:

如上所示:

  • 首先,我们定义了两个切片(紫色的两个段落)。

  • 接下来,第1段被进一步分割成较小的切片。

与固定大小的切片不同,这种方法也保持了语言的自然流畅性,并保留了完整的思想。

不过,在实现和计算复杂性方面有一些额外的开销。

4)基于文档结构的切分

这是一种直观的方法。

利用文档内在的结构(如标题、章节或段落)定义切片边界。

这种方式能保持文档的结构完整性,确保切片与文档的逻辑部分对齐。

该方法假设文档结构清晰,但这可能并非总是如此。此外,切片长度可能不同,甚至超过模型的Token限制。可以尝试与递归切分结合使用。

输出结果可能如下所示:

5)基于LLM的切分

由于每种方法都有其优缺点,为什么不让LLM来生成切片呢?

LLM可以通过提示词生成语义隔离且有意义的切片。

显然,这种方法确保了高语义准确性,因为LLM能理解上下文和意义,远超简单的启发式方法。

唯一的问题是,这种方式的计算成本是五种方法中最高的。

此外,由于LLM通常有上下文窗口限制,需要对此加以处理。

每种技术都有各自的优劣。

我发现语义切分在许多情况下效果不错,但仍然需要测试。

最终的选择将取决于内容的性质、嵌入模型的能力和计算资源等。

我们很快会进行这些策略的实际操作演示。