以下部分介绍了如何配置、创建、列出和删除索引。
索引概览
索引是由嵌入向量组成的一个或多个文件。这些向量由您要使用 Vector Search 部署和查询的大量数据组成。借助 Vector Search,您可以创建两种类型的索引,具体取决于您计划使用数据更新索引的方式。您可以创建为批量更新设计的索引,或为流式更新设计的索引。
如果您要使用在设定的时间内存储的数据(例如每周或每月处理的系统)批量更新索引,则可以使用批量索引。如果您希望在有新数据添加到数据存储区时更新索引数据,则可以使用流式索引,例如,您有一家书店,希望尽快在线显示新的库存。您选择的类型很重要,因为设置和要求不同。
配置索引参数
在创建索引之前,请为索引配置参数。
例如,创建一个名为 index_metadata.json
的文件:
{ "contentsDeltaUri": "gs://BUCKET_NAME/path", "config": { "dimensions": 100, "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "shardSize": "SHARD_SIZE_MEDIUM", "algorithm_config": { "treeAhConfig": { "leafNodeEmbeddingCount": 5000, "leafNodesToSearchPercent": 3 } } } }
您可以在索引配置参数中找到其中每个字段的定义。
创建索引
索引大小
索引数据被拆分成相等的部分(称为分片)以进行处理。创建索引时,您必须指定要使用的分片大小。支持的大小如下:
SHARD_SIZE_SMALL
:每个分片 2 GiB。SHARD_SIZE_MEDIUM
:每个分片 20 GiB。SHARD_SIZE_LARGE
:每个分片 50 GiB。
可用于部署索引的机器类型(使用公共端点或使用 VPC 端点)取决于索引的分片大小。下表显示了每种机器类型支持的分片大小:
机器类型 | SHARD_SIZE_SMALL |
SHARD_SIZE_MEDIUM |
SHARD_SIZE_LARGE |
---|---|---|---|
n1-standard-16 |
|||
n1-standard-32 |
|||
e2-standard-2 |
(默认) | ||
e2-standard-16 |
(默认) | ||
e2-highmem-16 |
(默认) | ||
n2d-standard-32 |
如需了解分片大小和机器类型如何影响价格,请参阅 Vertex AI 价格页面。
创建索引以进行批量更新
按照以下说明创建和部署索引。如果您尚未准备好嵌入,则可以跳到创建空批量索引。如果使用此选项,在创建索引时不需要嵌入数据。
如需创建索引,请执行以下操作:
gcloud
在使用下面的命令数据之前,请先进行以下替换:
- LOCAL_PATH_TO_METADATA_FILE:元数据文件的本地路径。
- INDEX_NAME:索引的显示名称。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud ai indexes create \ --metadata-file=LOCAL_PATH_TO_METADATA_FILE \ --display-name=INDEX_NAME \ --region=LOCATION \ --project=PROJECT_ID
Windows (PowerShell)
gcloud ai indexes create ` --metadata-file=LOCAL_PATH_TO_METADATA_FILE ` --display-name=INDEX_NAME ` --region=LOCATION ` --project=PROJECT_ID
Windows (cmd.exe)
gcloud ai indexes create ^ --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^ --display-name=INDEX_NAME ^ --region=LOCATION ^ --project=PROJECT_ID
您应该会收到类似如下所示的响应:
You can poll for the status of the operation for the response to include "done": true. Use the following example to poll the status. $ gcloud ai operations describe 1234567890123456789 --project=my-test-project --region=us-central1
如需详细了解 describe
命令,请参阅 gcloud ai operations。
REST
在使用任何请求数据之前,请先进行以下替换:
- INPUT_DIR:索引内容的 Cloud Storage 目录路径。
- INDEX_NAME:索引的显示名称。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- PROJECT_NUMBER:自动生成的项目编号。
HTTP 方法和网址:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes
请求 JSON 正文:
{ "display_name": "INDEX_NAME", "metadata": { "contentsDeltaUri": "INPUT_DIR", "config": { "dimensions": 100, "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "algorithm_config": { "treeAhConfig": { "leafNodeEmbeddingCount": 500, "leafNodesToSearchPercent": 7 } } } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateIndexOperationMetadata", "genericMetadata": { "createTime": "2022-01-08T01:21:10.147035Z", "updateTime": "2022-01-08T01:21:10.147035Z" } } }
Terraform
以下示例使用 google_vertex_ai_index
Terraform 资源为批量更新创建索引。
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
Python
如需了解如何安装或更新 Python,请参阅安装 Python 版 Vertex AI SDK。如需了解详情,请参阅 Python API 参考文档。
控制台
按照以下说明为批量更新创建索引。
- 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search
- 点击 创建新索引以打开索引窗格。系统会显示创建新索引窗格。
- 在显示名称字段中,提供一个可唯一标识索引的名称。
- 在说明字段中,提供索引用途的说明。
- 在区域字段中,从下拉列表选择一个区域。
- 在 Cloud Storage 字段中,搜索并选择存储向量数据的 Cloud Storage 文件夹。
- 在算法类型下拉列表中,选择 Vector Search 用于高效搜索的算法类型。如果您选择 treeAh 算法,请输入近似相邻项数量。
- 在维度字段中,填写输入向量的维度数量。
- 在更新方法字段中,选择批量。
- 在分片大小字段中,从下拉列表选择所需的分片大小。
- 点击创建。新索引准备就绪后,便会显示在索引列表中。注意:构建时间最多可能需要一个小时才能完成。
创建空批量索引
如需立即创建和部署索引,您可以创建空批量索引。如果使用此选项,在创建索引时不需要嵌入数据。
如需创建空索引,该请求与为批量更新创建索引几乎完全相同。不同之处在于,需要移除 contentsDeltaUri
字段,因为您没有关联数据位置。下面是一个空批量索引示例:
空索引请求示例
{ "display_name": INDEX_NAME, "indexUpdateMethod": "BATCH_UPDATE", "metadata": { "config": { "dimensions": 100, "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "algorithm_config": { "treeAhConfig": { "leafNodeEmbeddingCount": 500, "leafNodesToSearchPercent": 7 } } } } }
为流式更新创建索引
按照以下说明创建和部署流式索引。如果您尚未准备好嵌入,请跳到为流式更新创建空索引。如果使用此选项,在创建索引时不需要嵌入数据。
REST
在使用任何请求数据之前,请先进行以下替换:
- INDEX_NAME:索引的显示名称。
- DESCRIPTION:索引的说明。
- INPUT_DIR:索引内容的 Cloud Storage 目录路径。
- DIMENSIONS:嵌入向量的维度数。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- PROJECT_NUMBER:自动生成的项目编号。
- LOCATION:您在其中使用 Vertex AI 的区域。
HTTP 方法和网址:
POST https://ENDPOINT-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes
请求 JSON 正文:
{ displayName: "INDEX_NAME", description: "DESCRIPTION", metadata: { contentsDeltaUri: "INPUT_DIR", config: { dimensions: "DIMENSIONS", approximateNeighborsCount: 150, distanceMeasureType: "DOT_PRODUCT_DISTANCE", algorithmConfig: {treeAhConfig: {leafNodeEmbeddingCount: 10000, leafNodesToSearchPercent: 2}} }, }, indexUpdateMethod: "STREAM_UPDATE" }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.aiplatform.ui.CreateIndexOperationMetadata", "genericMetadata": { "createTime": "2023-12-05T23:17:45.416117Z", "updateTime": "2023-12-05T23:17:45.416117Z", "state": "RUNNING", "worksOn": [ "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID" ] } } }
控制台
按照以下说明在 Google Cloud 控制台中为流式更新创建索引。
要创建索引以供流式更新使用,需要执行与设置批量更新索引类似的步骤,但需要将 indexUpdateMethod
设置为 STREAM_UPDATE
。
- 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search。
- 点击 创建新索引以打开索引窗格。系统会显示创建新索引窗格。
- 在显示名称字段中,提供一个可唯一标识索引的名称。
- 在说明字段中,提供有关索引用途的说明。
- 在区域字段中,从下拉列表选择一个区域。
- 在 Cloud Storage 字段中,搜索并选择存储向量数据的 Cloud Storage 文件夹。
- 在算法类型下拉列表中,选择 Vector Search 将用于执行搜索的算法类型。如果您选择 treeAh 算法,请输入近似相邻项数量。
- 在维度字段中,输入输入向量的维度数量。
- 在更新方法字段中,选择流式。
- 在分片大小字段中,从下拉列表选择所需的分片大小。
- 点击创建。新索引准备就绪后,便会显示在索引列表中。注意:构建时间最多可能需要一个小时才能完成。
Python
如需了解如何安装或更新 Python,请参阅安装 Python 版 Vertex AI SDK。如需了解详情,请参阅 Python API 参考文档。
为流式更新创建空索引
如需立即创建和部署索引,您可以为流式传输创建空索引。如果使用此选项,在创建索引时不需要嵌入数据。
如需创建空索引,该请求与为流式传输创建索引几乎完全相同。不同之处在于,需要移除 contentsDeltaUri
字段,因为您没有关联数据位置。下面是一个空的流式索引示例:
空索引请求示例
{ "display_name": INDEX_NAME, "indexUpdateMethod": "STREAM_UPDATE", "metadata": { "config": { "dimensions": 100, "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "algorithm_config": { "treeAhConfig": { "leafNodeEmbeddingCount": 500, "leafNodesToSearchPercent": 7 } } } } }
列出索引
gcloud
在使用下面的命令数据之前,请先进行以下替换:
- INDEX_NAME:索引的显示名称。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud ai indexes list \ --region=LOCATION \ --project=PROJECT_ID
Windows (PowerShell)
gcloud ai indexes list ` --region=LOCATION ` --project=PROJECT_ID
Windows (cmd.exe)
gcloud ai indexes list ^ --region=LOCATION ^ --project=PROJECT_ID
您应该会收到类似如下所示的响应:
You can poll for the status of the operation for the response to include "done": true. Use the following example to poll the status. $ gcloud ai operations describe 1234567890123456789 --project=my-test-project --region=us-central1
如需详细了解 describe
命令,请参阅 gcloud ai operations。
REST
在使用任何请求数据之前,请先进行以下替换:
- INDEX_NAME:索引的显示名称。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- PROJECT_NUMBER:自动生成的项目编号。
HTTP 方法和网址:
GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "indexes": [ { "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID", "displayName": "INDEX_NAME", "metadataSchemaUri": "gs://google-cloud-aiplatform/schema/matchingengine/metadata/nearest_neighbor_search_1.0.0.yaml", "metadata": { "config": { "dimensions": 100, "approximateNeighborsCount": 150, "distanceMeasureType": "DOT_PRODUCT_DISTANCE", "featureNormType": "NONE", "algorithmConfig": { "treeAhConfig": { "maxLeavesToSearch": 50, "leafNodeCount": 10000 } } } }, "etag": "AMEw9yNU8YX5IvwuINeBkVv3yNa7VGKk11GBQ8GkfRoVvO7LgRUeOo0qobYWuU9DiEc=", "createTime": "2020-11-08T21:56:30.558449Z", "updateTime": "2020-11-08T22:39:25.048623Z" } ] }
控制台
按照以下说明查看索引列表。
- 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search
- 系统会显示活跃索引列表。
调整索引
调整索引需要设置影响已部署索引的性能的配置参数,尤其是召回率和延迟时间。这些参数是在首次创建索引时设置的。您可以使用暴力索引来衡量召回率。
影响性能的配置参数
以下配置参数可以在创建索引时设置,在使用 Vector Search 时,可能会影响召回率、延迟时间、可用性和费用。本指南适用于大多数情况。但是,请始终对您的配置进行实验,以确保它们适用于您的用例。
如需了解参数定义,请参阅索引配置参数。
参数 | 简介 | 性能影响 |
---|---|---|
shardSize
|
控制每台机器上的数据量。 选择分片大小时,请估算您的数据集将来的大小。如果数据集的大小有上限,请选择适当的分片大小来容纳它。如果没有上限,或者您的使用场景对延迟变化极为敏感,建议您选择较大的分片大小。 |
如果您为数量较多的较小分片进行配置,则系统会在搜索期间处理大量候选结果。使用较多分片可以通过以下方式影响性能:
如果您为少量的较大分片进行配置,则搜索期间会处理较少的候选结果。较少分片可以通过以下方式影响性能:
|
distanceMeasureType
|
确定用于计算数据点和查询向量之间的距离的算法。 |
以下
|
leafNodeEmbeddingCount
|
每个叶节点的嵌入数量。此数默认设置为 1000。
通常,更改 |
增加每个叶节点的嵌入数量可以缩短延迟时间,但会降低召回率质量。它可能在以下方面影响性能:
减少每个叶节点的嵌入数量可能会对性能造成以下影响:
|
使用暴力索引来衡量召回率
如需获得确切的最近邻,请将索引与暴力算法配合使用。暴力算法可提供 100% 召回率,但延迟时间较长。使用暴力索引来衡量召回率通常不是生产服务的理想选择,但您可能会发现,在离线评估各种索引选项的召回率时,这种做法会很有用。
如需创建使用暴力算法的索引,请在索引元数据中指定 brute_force_config
:
curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer `gcloud auth print-access-token`" \ https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/indexes \ -d '{ displayName: "'${DISPLAY_NAME}'", description: "'${DESCRIPTION}'", metadata: { contentsDeltaUri: "'${INPUT_DIR}'", config: { dimensions: 100, approximateNeighborsCount: 150, distanceMeasureType: "DOT_PRODUCT_DISTANCE", featureNormType: "UNIT_L2_NORM", algorithmConfig: { bruteForceConfig: {} } }, }, }'
删除索引
gcloud
在使用下面的命令数据之前,请先进行以下替换:
- INDEX_ID:索引的 ID。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud ai indexes delete INDEX_ID \ --region=LOCATION \ --project=PROJECT_ID
Windows (PowerShell)
gcloud ai indexes delete INDEX_ID ` --region=LOCATION ` --project=PROJECT_ID
Windows (cmd.exe)
gcloud ai indexes delete INDEX_ID ^ --region=LOCATION ^ --project=PROJECT_ID
REST
在使用任何请求数据之前,请先进行以下替换:
- INDEX_ID:索引的 ID。
- LOCATION:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- PROJECT_NUMBER:自动生成的项目编号。
HTTP 方法和网址:
DELETE https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeleteOperationMetadata", "genericMetadata": { "createTime": "2022-01-08T02:35:56.364956Z", "updateTime": "2022-01-08T02:35:56.364956Z" } }, "done": true, "response": { "@type": "type.googleapis.com/google.protobuf.Empty" } }
控制台
按照以下说明删除一个或多个索引。
- 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search
- 系统会显示活跃索引列表。
- 如需删除索引,请前往与该索引位于同一行的 选项菜单,然后选择删除。
后续步骤
- 了解索引配置参数
- 了解如何部署和管理公共索引端点
- 了解如何在 VPC 网络中部署和管理索引端点
- 了解如何更新和重建索引
- 了解如何监控索引