你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

选择用于优化矢量存储和处理的方法

嵌入(即异类内容的数字表示形式)是矢量搜索工作负载的基础,但嵌入的大小使其难以缩放,并且处理成本高昂。 大量的研究和产品化产生了多种解决方案,用于改进规模和缩短处理时间。 Azure AI 搜索利用这些功能实现了更快、更廉价的矢量工作负载。

本文枚举了 Azure AI 搜索中的所有优化技术,这些技术可帮助减少矢量大小和缩短查询处理时间。

矢量优化设置在搜索索引的矢量字段定义中指定。 本文中所述的大多数功能都已在 2024-07-01 REST API 和针对该版本的 Azure SDK 包中正式发布。 如果使用了 text-embedding-3-large 或 text-embedding-3-small 来进行矢量化,则最新的预览版还将增加对截断维度的支持。

评估选项

查看 Azure AI 搜索中用于减少矢量字段所使用的存储量的方法。 这些方法不是相互排斥的,可以组合来实现矢量大小的最大减少

我们建议使用内置量化,因为它会尽量压缩内存和磁盘中的矢量大小,并且往往在大多数情况下提供最大的好处。 相比之下,窄类型(float16 除外)需要特意创建,stored 可以节省磁盘上的存储空间,而存储空间不像内存那么昂贵。

方法 为什么使用此选项
添加标量或二进制量化 使用量化将本机 float32 或 float16 嵌入内容压缩到 int8(标量)或字节(二进制)。 此选项可以减少内存和磁盘上的存储,而不会降低查询性能。 Int8 或 Byte 等较小的数据类型生成的矢量索引,其内容的丰富程度不如较大嵌入的矢量索引。 为了弥补信息丢失,内置压缩包括使用未压缩嵌入和过采样进行查询后处理的选项,以返回更相关的结果。 重新排序和过采样是 float32 或 float16 字段内置量化的特定功能,不能用于经过自定义量化的嵌入。
为支持 MRL 的 text-embedding-3 模型截断维度(预览版) 通过运用该方案,可以在 text-embedding-3 模型中使用更少的维度。 在 Azure OpenAI 上,这些模型在俄罗斯套娃表示法学习 (MRL) 技术上进行了重新训练,该技术可以在不同的压缩级别上生成多个矢量表示形式。 此方法可以更快地进行搜索并降低存储成本,同时最大限度地减少语义信息丢失。 在 Azure AI 搜索中,MRL 支持补充标量和二进制量化。 使用任一量化方法时,还可以在矢量字段上指定 truncateDimension 属性以减少文本嵌入的维度。
将较小的基元数据类型分配给向量字段 窄数据类型(例如 float16、int16、int8 和 Byte [二进制])在内存和磁盘上消耗的空间更少,但必须具有嵌入模型,该模型以窄数据格式输出向量。 或者,必须有输出小数据的自定义量化逻辑。 需要较少工作量的第三个用例是大多数模型生成到 float16 的重新生成本机 float32 嵌入。 有关二进制矢量的详细信息,请参阅索引二进制矢量
消除可检索向量的可选存储 查询响应中返回的向量与查询执行期间使用的向量分开存储。 如果不需要返回向量,则可以关闭可检索存储,从而将每个字段的总体磁盘存储减少高达 50%。

所有这些选项都是在空索引上定义的。 若要实现其中任何一项,请使用 Azure 门户、REST API 或面向该 API 版本的 Azure SDK 包。

定义索引后,可以单独加载文档和索引。

示例:按矢量压缩技术排列的矢量大小

代码示例:使用 Python 的矢量量化和存储选项是一个 Python 代码示例,它可创建多个搜索索引,这些索引对矢量存储量化、窄数据类型以及存储属性的使用各不相同。

此代码为每个矢量存储优化选项分别创建和比较存储空间和矢量索引大小。 从这些结果中可以看到,量化减少的矢量大小最多,但如果使用多个选项,可实现最大的存储空间节省。

索引名称 存储大小 矢量大小
compressiontest-baseline 21.3613MB 4.8277MB
compressiontest-scalar-compression 17.7604MB 1.2242MB
compressiontest-narrow 16.5567MB 2.4254MB
compressiontest-no-stored 10.9224MB 4.8277MB
compressiontest-all-options 4.9192MB 1.2242MB

搜索 API 在索引级别报告存储和矢量大小,因此索引和字段不能是比较的基础。 在 Azure SDK 中使用 GET 索引统计信息或等效的 API 来获取矢量大小。

另请参阅