你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
注释
Azure AI 搜索可通过Azure门户、REST API 和Azure SDK获取。 它也是 Foundry IQ 的基础;Foundry IQ 是一个托管式知识层,可将企业内容转化为供 Microsoft Foundry 门户中的智能体使用的、可复用且具备权限感知能力的知识库。
嵌入或异类内容的数字表示形式是矢量搜索工作负载的基础。 但是,嵌入的大小使它们难以缩放和处理成本高昂。 重要的研究和产品化产生了多种解决方案,用于提高规模并减少处理时间。 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 和字节(二进制),在内存和磁盘上占用的空间更少。 但是,必须具有一个嵌入模型,该模型以窄数据格式输出向量。 或者,必须具有输出小型数据的自定义量化逻辑。 需要较少工作量的第三个用例是将大多数模型生成的本机 float32 嵌入内容重新转换为 float16。 有关二进制向量的信息,请参阅 索引二进制向量。 |
| 消除可检索矢量的可选存储 | 查询响应中返回的向量与查询执行期间使用的向量分开存储。 如果不需要返回向量,可以关闭可检索的存储,以将每个字段的总磁盘存储减少多达 50%。 |
在空索引上定义所有这些选项。 若要实现其中任何一项,请使用Azure门户、REST API 或面向该 API 版本的Azure SDK包。
定义索引后,可以按单独的步骤加载和索引文档。
示例:通过矢量压缩技术确定矢量大小
使用 Python 进行矢量量化和存储选项是一个 Python 代码示例,它创建了多个搜索索引,这些索引用因矢量存储量化、窄数据类型和存储属性而异。
此代码为每个矢量存储优化选项创建和比较存储和矢量索引大小。 从这些结果中,可以看到 量化 会减少矢量大小最多,但如果使用多个选项,则可实现最大的存储节省。
| 索引名称 | 存储大小 | 矢量大小 |
|---|---|---|
| 压缩测试-基线 | 21.3613 MB | 4.8277 MB |
| 压缩测试-标量压缩 | 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 在索引级别报告存储和矢量大小,因此必须比较索引,而不是字段。 使用 Indexes - 获取统计信息(REST API)或Azure SDK中的等效 API 以获取矢量大小。