嵌入或异类内容的数字表示形式是矢量搜索工作负载的基础。 但是,嵌入的大小使它们难以缩放和处理成本高昂。 大量的研究和产品化产生了多种解决方案,用于改进规模和缩短处理时间。 Azure AI 搜索调用这些功能,来更快、更便宜地进行矢量工作负载处理。
本文介绍 Azure AI 搜索中的所有优化技术,可帮助减少矢量大小和查询处理时间。
在搜索索引中的向量字段定义中指定矢量优化设置。 本文中所述的大多数功能通常在面向该版本的最新稳定 REST API 版本和目标该版本的 Azure SDK 包中可用。
评估选项
查看 Azure AI 搜索中用于减少矢量字段所使用的存储量的方法。 这些方法不是相互排斥的,因此你可以将它们组合在一起,以 最大程度地减少矢量大小。
建议使用内置量化,因为它可以尽可能少地压缩内存 和 磁盘中的矢量大小。 此方法往往在大多数方案中提供最大的好处。 相比之下,窄类型(float16 除外)需要特意创建,stored 可以节省磁盘上的存储空间,而存储空间不像内存那么昂贵。
| 方法 | 为何使用此方法 |
|---|---|
| 添加标量或二进制量化 | 将本机 float32 或 float16 嵌入内容压缩到 int8(标量)或字节(二进制)。 此选项可以减少内存和磁盘上的存储,而不会降低查询性能。 较小的数据类型(如 int8 或字节)生成的矢量索引不如具有较大嵌入的索引内容丰富。 为了抵消信息丢失,内置压缩提供查询后处理选项,包括使用未压缩的嵌入和提高采样率,以返回更相关的结果。 重新排序和过采样是 float32 或 float16 字段内置量化的特定功能,不能用于经过自定义量化的嵌入。 |
| 对具备 MRL 功能的 Text Embedding 3 模型的维度进行截断 | 在文本嵌入-3 模型中使用更少的尺寸。 在 Azure OpenAI 上,这些模型在 Matryoshka 表示法学习 (MRL)技术上进行了重新训练,可在不同的压缩级别生成多个矢量表示形式。 此方法可以更快地进行搜索并降低存储成本,同时减少语义信息丢失。 在 Azure AI 搜索中,MRL 支持补充标量和二进制量化。 使用任一量化方法时,还可以在矢量字段上指定 truncateDimension 属性以减少文本嵌入的维度。 |
| 将较小的基元数据类型分配给向量字段 | 窄数据类型,例如 float16、int16、int8 和字节(二进制),在内存和磁盘上占用的空间更少。 但是,必须具有一个嵌入模型,该模型以窄数据格式输出向量。 或者,必须具有输出小型数据的自定义量化逻辑。 需要较少工作量的第三个用例是大多数模型生成到 float16 的重新生成本机 float32 嵌入。 有关二进制向量的信息,请参阅 索引二进制向量。 |
| 消除可检索向量的可选存储 | 查询响应中返回的向量与查询执行期间使用的向量分开存储。 如果不需要返回向量,可以关闭可检索的存储,以将每个字段的总磁盘存储减少多达 50%。 |
在空索引上定义所有这些选项。 若要实现其中任何一项,请使用 Azure 门户、REST API 或面向该 API 版本的 Azure SDK 包。
定义索引后,可以按单独的步骤加载和索引文档。
示例:通过矢量压缩技术确定的矢量大小
使用 Python 的矢量量化和存储选项 是一个 Python 代码示例,它创建多个搜索索引,这些索引因使用矢量存储量化、 窄数据类型和 存储属性而异。
此代码为每个矢量存储优化选项分别创建和比较存储空间和矢量索引大小。 从这些结果中可以看到,量化减少的矢量大小最多,但如果使用多个选项,可实现最大的存储空间节省。
| 索引名称 | 存储大小 | 矢量大小 |
|---|---|---|
| 压缩测试-基线 | 21.3613 MB | 4.8277 MB |
| compressiontest-scalar-compression | 17.7604 MB | 1.2242 MB |
| 压缩测试-窄 | 16.5567 MB | 2.4254 MB |
| 压缩测试-无存储 | 10.9224 MB | 4.8277 MB |
| 压缩测试-全部选项 | 4.9192 MB | 1.2242 MB |
搜索服务 REST API 在索引级别报告存储和矢量大小,因此必须比较索引,而不是字段。 使用 索引 - 获取统计信息 (REST API)或 Azure SDK 中的等效 API 来获取矢量大小。