在 Azure AI 搜索中为了矢量搜索解决方案而对大型文档进行分块

本文介绍了对大型文档进行分块的几种方法,以便你可以生成用于矢量搜索的嵌入项。 仅当源文档对于模型施加的最大输入大小来说太大时,才需要进行分块。

注意

本文适用于矢量搜索的正式发布版,该版本假定应用程序代码调用执行数据分块的外部库。 目前预览版中的一项名为“集成矢量化”的新功能提供了嵌入式数据分块。 集成矢量化依赖于索引器、技能组和文本拆分技能。

为什么分块很重要?

用于生成嵌入矢量的模型对作为输入提供的文本片段施加了最大限制。 例如,Azure OpenAI 嵌入模型的输入文本的最大长度为 8,191 个标记。 鉴于常见 OpenAI 模型的每个标记约为 4 个文本字符,此最大限制相当于大约 6000 个文本单词。 如果使用这些模型来生成嵌入项,则输入文本保持在限制以内至关重要。 将内容划分为块可确保数据能够由用于索引和查询的大型语言模型 (LLM) 进行处理。

分块如何适应工作流

由于 Azure AI 搜索或 Azure OpenAI 中都没有原生分块功能,因此如果有大型文档,则必须在索引和查询工作流中插入分块步骤来分解大型文本。 一些提供分块功能的库包括:

这两个库都支持针对固定大小、可变大小或其组合的常见分块技术。 你还可以指定重叠百分比,在每个区块中复制少量内容以保留上下文。

常用分块技术

下面是一些常用分块技术(从最广泛使用的方法开始):

  • 固定大小的块:定义一个足以容纳语义上有意义的段落(例如 200 个单词)并允许一定程度的重叠(例如内容的 10-15%)的固定大小就可以生成良好的块,作为嵌入向量生成器的输入。

  • 基于内容的可变大小的区块:根据内容特征(例如句尾标点符号、行尾标记或使用自然语言处理 (NLP) 库中的功能)对数据进行分区。 Markdown 语言结构也可以用来拆分数据。

  • 对上述技术之一进行自定义或迭代。 例如,在处理大型文档时,可以使用可变大小的区块,但也可以将文档标题附加到文档中间的区块中,以防止上下文丢失。

内容重叠注意事项

对数据进行分块时,在区块之间重叠少量文本有助于保留上下文。 建议从大约 10% 的重叠开始。 例如,如果固定区块大小为 256 个标记,则一开始可以使用 25 个标记的重叠进行测试。 实际重叠程度因数据类型和具体用例而异,但我们发现 10-15% 适用于许多场景。

数据分块的因素

涉及到数据分块时,请考虑以下因素:

  • 文档的形状和密度。 如果需要完整的文本或段落,则那些保留句子结构的较大区块和可变区块可以产生更好的结果。

  • 用户查询:较大区块和重叠策略有助于保留针对特定信息的查询的上下文和语义丰富性。

  • 大型语言模型 (LLM) 有针对区块大小的性能准则。 你需要设置一个最适合正在使用的所有模型的区块大小。 例如,如果将模型用于摘要和嵌入项,请选择适用于两者的最佳区块大小。

简单示例:如何用句子创建区块

本部分使用一个示例来演示通过句子创建区块的逻辑。 对于本示例,假设如下:

  • 标记等同于单词。
  • 输入 = text_to_chunk(string)
  • 输出 = sentences(list[string])

示例输入

"Barcelona is a city in Spain. It is close to the sea and /n the mountains. /n You can both ski in winter and swim in summer."

  • 句 1 包含 6 个单词:"Barcelona is a city in Spain."
  • 句 2 包含 9 个单词:"It is close to the sea /n and the mountains. /n"
  • 句 3 包含 10 个单词:"You can both ski in winter and swim in summer."

方法 1:“无重叠”的句子分块

给定最大数量的标记,循环访问句子并连接句子,直到达到最大标记长度。 如果一个句子大于最大块数,则截断到最大标记数处,将其余内容放入下一个区块中。

注意

这些示例忽略换行符 /n,因为它不是标记,但如果包或库检测到换行符,那么你会在此处看到这些换行符。

示例:最大标记数 = 10

Barcelona is a city in Spain.
It is close to the sea /n and the mountains. /n
You can both ski in winter and swim in summer.

示例:最大标记数 = 16

Barcelona is a city in Spain. It is close to the sea /n and the mountains. /n
You can both ski in winter and swim in summer.

示例:最大标记数 = 6

Barcelona is a city in Spain.
It is close to the sea /n
and the mountains. /n
You can both ski in winter
and swim in summer.

方法 2:“10% 重叠”的句子分块

遵循相同的逻辑,不使用重叠方法,只不过你根据一定的比例在区块之间创建重叠。 最大标记数为 10 时,10% 的重叠就是一个标记。

示例:最大标记数 = 10

Barcelona is a city in Spain.
Spain. It is close to the sea /n and the mountains. /n 
mountains. /n You can both ski in winter and swim in summer.

尝试一下:分块和矢量嵌入生成示例

固定大小的分块和嵌入生成示例演示了使用 Azure OpenAI 嵌入模型生成分块和矢量嵌入。 此示例使用 Power Skills 存储库中的 Azure AI 搜索自定义技能来包装分块步骤。

此示例基于 LangChain、Azure OpenAI 和 Azure AI 搜索而构建。