在 Azure AI 搜索中将窄数据类型分配给矢量字段

减少矢量大小的一种简单方法是以较小的数据格式存储嵌入内容。 大多数嵌入模型输出 32 位浮点数。 但是,如果将向量量化或使用原生支持量化的嵌入模型,输出可能为 float16、int16 或 int8,这明显小于 float32。 可以通过向量字段分配较窄的数据类型来容纳这些较小的矢量大小。 在向量索引中,窄数据类型消耗较少的存储。

数据类型分配给索引定义中的字段。 可以使用 Azure 门户、 搜索 REST API 或提供该功能的 Azure SDK 包。

先决条件

  • 一个嵌入模型,用于输出小型数据格式,例如文本嵌入-3 或 Cohere V3 嵌入模型。

支持的窄数据类型

  1. 查看 用于矢量字段的数据类型 以供推荐使用:

    • Collection(Edm.Single) 32 位浮点(默认值)
    • Collection(Edm.Half) 16 位浮点数(精简)
    • Collection(Edm.Int16) 16 位有符号整数(窄)
    • Collection(Edm.SByte) 8 位有符号整数(窄)
    • Collection(Edm.Byte) 8 位无符号整数(仅允许使用打包的二进制数据类型)
  2. 在该列表中,确定哪个数据类型对嵌入模型的输出或接受自定义量化的矢量有效。

    下表提供了多个嵌入模型的链接,这些模型可以使用窄数据类型 (Collection(Edm.Half)),而无需进行额外的量化。 你可以从 float32 强制转换为 float16(使用 Collection(Edm.Half)),无需额外工作。

    嵌入模型 本机输出 在 Azure AI 搜索中分配此类型
    text-embedding-ada-002 Float32 Collection(Edm.Single)Collection(Edm.Half)
    text-embedding-3-small Float32 Collection(Edm.Single)Collection(Edm.Half)
    text-embedding-3-large Float32 Collection(Edm.Single)Collection(Edm.Half)
    使用具有 int8 embedding_type 的 Cohere V3 嵌入模型 Int8 Collection(Edm.SByte)

    如果模型以较小的数据格式发出嵌入内容,或者具有将向量转换为较小格式的自定义量化,则可以使用其他窄数据类型。

  3. 请确保了解窄数据类型的权衡。 Collection(Edm.Half) 信息较少,导致分辨率较低。 如果数据是同质或密集的,则丢失额外的详细信息或细微差别可能会导致查询时无法接受的结果,因为可用于区分附近向量的详细信息较少。

分配数据类型

定义并生成索引。 可以使用 Azure 门户、 创建或更新索引(REST API)或 Azure SDK 包执行此步骤。

此字段定义使用一种窄数据类型 Collection(Edm.Half),该类型可以接受存储为 float16 格式的 float32 嵌入。 对于所有向量字段,dimensionsvectorSearchProfile 都已设置。 vectorSearchProfile的具体内容对于数据类型来说是无关紧要的。

如果要直观检查字段的值,建议设置 retrievablestored 设置为 true。 在后续重新生成时,可以将这些属性更改为 false,以降低存储要求。

{
    "name": "nameEmbedding",
    "type": "Collection(Edm.Half)",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false,
    "key": false,
    "indexAnalyzer": null,
    "searchAnalyzer": null,
    "analyzer": null,
    "synonymMaps": [],
    "dimensions": 1536,
    "vectorSearchProfile": "myHnswProfile"
}

回想一下,矢量字段不可筛选、可排序或可分面。 它们不能用作键,也不能使用分析器或同义词映射。

处理生产索引

创建新字段时,会为其分配数据类型。 不能更改现有字段的数据类型,并且不能在不 重新生成索引的情况下删除字段。 对于已在生产环境中建立的索引,通常通过创建具有所需修订的新字段,然后在计划内索引重新生成期间删除过时的字段来解决此问题。

检查结果

  1. 验证字段内容是否与数据类型匹配。 如果矢量字段标记为 retrievable,使用 搜索浏览器搜索 - POST 返回矢量字段内容。

  2. 若要检查矢量索引大小,请参阅 >“搜索管理索引”页上的矢量索引大小列。 或者,可以使用 GET 索引统计信息(REST API) 或等效的 Azure SDK 方法。

注释

字段的数据类型用于创建物理数据结构。 如果以后要更改数据类型, 请删除并重新生成索引 ,或使用新定义创建第二个字段。