解答RAG分块中的常见问题

2025年3月1日

来源:Cohere 博客

随着企业利用其庞大的知识库来发挥生成性 AI 的潜力,掌握分块 这一关键技能已成为优化检索增强生成 (RAG) 系统的必要条件。

以下是我们团队从客户那里收到的一些关于分块的常见问题的解答。让我们深入探讨。

什么是分块,为什么它如此重要?

分块 是将大量信息分解为更易于管理和富有上下文的分块 的过程。这使得 AI 系统更容易处理、搜索和检索最相关的信息。

从本质上讲,分块将信息组织成更小、更具语义一致性的单元,从而提高 AI 模型定位和检索最相关答案的能力。分块 通常发生在预处理阶段,在此阶段,大型文档被分解为更小的部分,例如段落或句子。

分块 通过提高嵌入的质量来工作,嵌入是 GenAI 模型可以理解和使用的数据的数值表示。当每个分块 专注于特定的信息时,它使嵌入模型更容易创建更准确和详细的数据数值表示,这些数据存储在向量数据库中。高质量的嵌入可以决定一个 RAG 系统是否能够达到或超出预期,或者是否会落后于预期。

何时应该考虑分块?

对于任何需要从大型文档和数据存储中提取和处理信息的组织来说,分块是一个有价值的步骤,作为 GenAI 解决方案的一部分。将内容拆分成更小、更易于管理的部分,可以提高检索结果的相关性和准确性。

由于分块 导致发送到 LLM 的文档部分减少,因此它还降低了成本和延迟。分块在 RAG 系统中的成功在于找到分块 大小与检索精度之间的正确平衡。

我应该使用多大尺寸的上下文窗口?

上下文窗口是模型在给定时间内可以处理的最大文本量。上下文窗口以 tokens 测量,tokens 是文本的基本构建块,例如单词或符号,大多数大型语言模型都有一个上限。

分块是为了适应模型的上下文窗口而创建的。为特定用例设置合适的上下文窗口对于最大化 RAG 系统的有效性至关重要,这在确定结果的准确性和相关性以及模型的整体性能方面发挥着关键作用。

如果设置得太小,组块s 将无法与文档的其余部分建立足够的语义联系,从而使模型无法理解其含义。如果设置得太大,模型将缺乏足够的特异性来检索最相关和准确的信息以生成响应。

限制上下文窗口的大小,然后根据检索性能进行调整是推荐的方法。例如,Cohere Embed 的最大分块 大小为 512 个标记。如果您嵌入的文档段落长度约为 200 个单词,那么 250 个单词的分块 大小可能是合适的。

这种重叠或“滑动窗口”方法有助于确保您从前后文本中收集一些上下文。一般来说,较小的上下文窗口(100-300 个单词)更好,以便模型能够更准确地捕捉文本的语义含义。

Cohere的研究和实验发现,性能在几百个标记时大致达到优化,并在大约 500 个标记后显著下降。

不同的文本分块的方法有哪些?

对于大多数公司来说,分块策略需要包括多种不同的数据类型。对于非结构化文本,以下是我们看到的一些对企业客户来说稳健的常见方法:

固定大小

内容被划分为预定的分块大小。例如,您可能选择将所有文档划分为 512 个 token 的片段。这种方法简单且具有成本效益,但可能会丢失上下文,并且不适合较小的文档。

句子级别。 文本被分解为单独的句子,从而允许更细致的分析。这提供了对每个句子语义的详细理解,而不考虑其余文本的上下文。因此,它非常适合较短的查询或当重点放在特定句子而不是更广泛主题时。

段落级别

这种方法保留了比句子级分块 更多的上下文信息。它更适合于跨越多个句子或段落的较长查询,因为它可能在寻找更广泛的语义理解。这种方法不需要与之前的分块 重叠以获取语义。

滑动窗口。 该技术使用一个“窗口”在整个文档中滑动,捕捉和处理一定数量的连续句子。与段落级别的分块不同,这种方法通常会与之前的组块s产生重叠,以确保语义的一致性。这是一种有效处理较长查询的方法,因为它保持了更广泛的上下文,以捕捉文档中的语义意义和关系。

递归分块。 文本在自然断点处被拆分成更小的部分,例如句子或段落的结尾,而不是在固定的间隔处切割。这使得文本更易于阅读和理解,并保留了其含义。但它的设置更复杂,并且由于创建不同大小的组块,管理起来可能会比较棘手。

如何对像表格这样的结构化文档进行分块?

结构化文档格式,例如PDF文件中的表格,可能会带来不同的分块挑战。表格行或列中的每个值在没有其相关标题或相邻条目的情况下可能毫无意义。如果未能正确对大型表格进行分块,将导致语义连接的丧失,最终检索结果可能会失去上下文或产生误导。

如果块仅包含表格的中间部分,例如,模型将难以理解列条目与标题之间的关系。可以部署一种专门的分块策略,以一种保留每个块的标题的方式对表格进行分段,以便在检索时能够重建整个表格。将尽可能多的元数据(例如表头、关键词和日期)包含在块中是至关重要的。这使得RAG系统能够更准确地理解每个块的上下文,并根据其元数据与查询的相关性进行缩小。

对大量公司数据进行分块可能是一项繁重、耗时且复杂的任务。因此,能够使用工具来加快准备文档以进行分块以及实施分块本身的过程是非常有帮助的。例如,像Unstructured、LangChain和LlamaIndex这样的工具使您能够根据其结构类型提取数据并适当地进行分块。

以存储为PDF文件的研究报告为例,该文件包含大量文本以及多个表格。该工具可以从PDF中提取数据,并为文本和表格分配不同的标签,以便进行更有针对性和高效的分块。

大规模数据的初步处理可能需要几个小时到几天的时间,这取决于计算资源。然而,后续的更新可以更快地处理,这些工具能够在几秒钟或几分钟内提取和分块新文档。这些工具旨在横向扩展,允许分布式处理以应对更大的工作负载。

如何优化我的分块策略?

分块需要一个持续的测试和迭代不同策略的过程,以查看哪种策略最符合您基于用例和数据类型的独特需求。为了优化分块,有必要评估分块如何影响搜索性能,并相应地调整和完善您的策略。

作为起点,可以根据响应特定查询时检索到的块的相关性手动评估模型的性能。但重要的是要实施更详细的指标以进行全面评估。Recall@k 和 Precision@k 是用于衡量分块性能的最常见指标。

用于 Recall@k 的公式衡量检索到的相关块的数量,而 Precision@k 衡量检索到的块中有多少是相关的。然后可以计算一个 F-1 分数,以平衡精确度和召回率的性能。

另一个关键指标是平均精度均值(Mean Average Precision, MAP),它提供了多个查询的排名质量的整体视图。归一化折扣累积增益(Normalized Discounted Cumulative Gain, NDCG)在评估排名检索结果的质量时特别有用,因为它考虑了相关块的位置。

通过系统地跟踪这些指标,您可以更深入地了解您的分块策略的有效性,并识别需要改进的领域。这在扩展到大型生产环境时尤其有用,因为性能特征可能会发生变化。

根据这些指标,您可以调整您的方法,例如,增加或减少组块的大小或每个组块的滑动窗口,并测量对检索结果的影响。您可能需要包含更多或不同类型的元数据。

正确进行分块对许多组织来说都是一个挑战。分块的完美通常在第一次尝试时很难实现。最佳策略将取决于使用案例、模型能力和所使用数据的类型,并需要在保留文档上下文与优化检索效率之间取得平衡。

将存储在数十种不同文件类型中的庞大内部数据分解为小块可能看起来是一项艰巨的任务。但只要有合适的工具、专业知识和合作伙伴,这一切都不必如此。