为矢量搜索编制二进制矢量索引
Azure AI 搜索支持打包的二进制类型 Collection(Edm.Byte)
,以进一步减少矢量数据的存储和内存占用情况。 你可以将此数据类型用于模型(例如 Cohere 的 Embed v3 二进制嵌入模型)的输出。
为二进制矢量配置索引有三个步骤:
- 添加指定汉明距离进行二进制矢量比较的矢量搜索算法
- 添加指向算法的矢量配置文件
- 将矢量配置文件添加到二进制字段定义
本文假设你已熟悉如何在 Azure AI 搜索中创建索引。 它使用 REST API 来演示每个步骤,但你也可以在 Azure 门户中将二进制字段添加到索引。
二进制数据类型从 API 版本 2024-07-01 开始正式发布,使用“创建索引”或“创建或更新索引 API”分配给字段。
提示
如果正在调查二进制矢量对更小内存占用空间的支持,你还可以考虑 Azure AI 搜索中的矢量量化和存储缩减功能。 输入是 float32 或 float16 嵌入。 输出是以更小的格式存储的数据。 有关详细信息,请参阅“通过量化、窄数据类型和存储选项来减小矢量大小”。
先决条件
- 二进制矢量,每个维度 1 位,打包在 uint8 值中,每个值 8 位。 要获取这些矢量,可以使用直接生成“打包二进制”矢量的模型,或者在编制索引和搜索过程中将矢量量化为二进制矢量客户端。
限制
- “导入和矢量化数据”向导中不支持 Azure 门户。
- 不支持 AML 技能中的二进制字段,该技能用于 Azure AI Studio 模型目录中的模型的集成矢量化。
添加矢量搜索算法和矢量配置文件
矢量搜索算法用于在索引编制过程中创建查询导航结构。 对于二进制矢量字段,将使用汉明距离指标执行矢量比较。
若要将二进制字段添加到索引,请使用 REST API 或 Azure 门户设置
Create or Update Index
请求。在索引架构中,添加一个指定配置文件和算法的
vectorSearch
部分。添加一个或多个具有
hamming
相似性指标的矢量搜索算法。 通常使用分层可导航小世界 (HNSW),但也可以使用汉明距离与详尽的 K 最近的邻域。添加一个或多个指定算法的矢量配置文件。
以下示例演示了基本 vectorSearch
配置:
"vectorSearch": {
"profiles": [
{
"name": "myHnswProfile",
"algorithm": "myHnsw",
"compression": null,
"vectorizer": null
}
],
"algorithms": [
{
"name": "myHnsw",
"kind": "hnsw",
"hnswParameters": {
"metric": "hamming"
}
},
{
"name": "myExhaustiveKnn",
"kind": "exhaustiveKnn",
"exhaustiveKnnParameters": {
"metric": "hamming"
}
}
]
}
将二进制字段添加到索引
索引的字段集合必须包含文档键字段、矢量字段以及混合搜索方案所需的任何其他字段。
二进制字段的类型为 Collection(Edm.Byte)
,包含打包形式的嵌入。 例如,如果原始嵌入维度为 1024
,则打包的二进制矢量长度为 ceiling(1024 / 8) = 128
。 通过在字段上设置 vectorEncoding
属性,可以获得打包形式的数据。
- 将字段添加到字段集合,并为其命名。
- 将数据类型设置为
Collection(Edm.Byte)
。 - 将
vectorEncoding
设置为packedBit
,以进行二进制编码。 - 将
dimensions
设置为1024
。 指定原始(未打包)矢量维度。 - 将
vectorSearchProfile
设置为在上一步中定义的配置文件。 - 使字段可搜索。
以下字段定义是应设置的属性的示例:
"fields": [
. . .
{
"name": "my-binary-vector-field",
"type": "Collection(Edm.Byte)",
"vectorEncoding": "packedBit",
"dimensions": 1024,
"vectorSearchProfile": "myHnswProfile",
"searchable": true
},
. . .
]
另请参阅
azure-search-vector-samples 存储库中的代码示例演示了包括架构定义、矢量化、索引编制和查询在内的端到端工作流。
有可参阅的 Python、C# 和 JavaScript 的演示代码。