管理索引

以下部分介绍了如何配置、创建、列出和删除索引。

索引概览

索引是由嵌入向量组成的一个或多个文件。这些向量由您要使用 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,
        "fractionLeafNodesToSearch": 0.03
      }
    }
  }
}

您可以在索引配置参数中找到其中每个字段的定义。

创建索引

索引大小

索引数据被拆分成相等的部分(称为分片)以进行处理。创建索引时,您必须指定要使用的分片的大小。支持的尺寸如下:

  • 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 命令

# Cloud Storage bucket name must be unique
resource "random_id" "bucket_name_suffix" {
  byte_length = 8
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "bucket" {
  name                        = "vertex-ai-index-bucket-${random_id.bucket_name_suffix.hex}"
  location                    = "us-central1"
  uniform_bucket_level_access = true
}

# Create index content
resource "google_storage_bucket_object" "data" {
  name    = "contents/data.json"
  bucket  = google_storage_bucket.bucket.name
  content = <<EOF
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class", "allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace": "class", "allow": ["dog", "pet"]},{"namespace": "category", "allow": ["canine"]}]}
EOF
}

resource "google_vertex_ai_index" "default" {
  region       = "us-central1"
  display_name = "sample-index-batch-update"
  description  = "A sample index for batch update"
  labels = {
    foo = "bar"
  }

  metadata {
    contents_delta_uri = "gs://${google_storage_bucket.bucket.name}/contents"
    config {
      dimensions                  = 2
      approximate_neighbors_count = 150
      distance_measure_type       = "DOT_PRODUCT_DISTANCE"
      algorithm_config {
        tree_ah_config {
          leaf_node_embedding_count    = 500
          leaf_nodes_to_search_percent = 7
        }
      }
    }
  }
  index_update_method = "BATCH_UPDATE"

  timeouts {
    create = "2h"
    update = "1h"
  }
}

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档

def vector_search_create_index(
    project: str, location: str, display_name: str, gcs_uri: Optional[str] = None
) -> None:
    """Create a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        display_name (str): Required. The index display name
        gcs_uri (str): Optional. The Google Cloud Storage uri for index content
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location, staging_bucket=gcs_uri)

    # Create Index
    index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
        display_name=display_name,
        description="Matching Engine Index",
        dimensions=100,
        approximate_neighbors_count=150,
        leaf_node_embedding_count=500,
        leaf_nodes_to_search_percent=7,
        index_update_method="batch_update",  # Options: stream_update, batch_update
        distance_measure_type=aiplatform.matching_engine.matching_engine_index_config.DistanceMeasureType.DOT_PRODUCT_DISTANCE,
    )

    print(index.name)

控制台

按照以下说明为批量更新创建索引。

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search

    前往 Vector Search

  2. 点击 创建新索引,打开索引窗格。系统会显示创建新索引窗格。
  3. 显示名称字段中,提供一个可唯一标识索引的名称。
  4. 说明字段中,提供该索引的用途说明。
  5. 区域字段中,从下拉列表选择一个区域。
  6. 在 Cloud Storage 字段中,搜索并选择存储向量数据的 Cloud Storage 文件夹。
  7. 算法类型下拉列表中,选择 Vector Search 用于高效搜索的算法类型。如果您选择 treeAh 算法,请输入近似相邻项数量。
  8. 维度字段中,填写输入向量的维度数量。
  9. 更新方法字段中,选择批量
  10. 分片大小字段中,从下拉列表选择所需的分片大小。
  11. 点击创建。新索引准备就绪后,便会显示在索引列表中。注意:构建时间最多可能需要一个小时才能完成。

创建空批量索引

如需立即创建和部署索引,您可以创建空批量索引。如果使用此选项,在创建索引时不需要嵌入数据。

如需创建空索引,该请求与为批量更新创建索引几乎完全相同。不同之处在于,需要移除 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

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search

    前往 Vector Search

  2. 点击 创建新索引,打开索引窗格。系统会显示创建新索引窗格。
  3. 显示名称字段中,提供一个可唯一标识索引的名称。
  4. 说明字段中,提供该索引的用途说明。
  5. 区域字段中,从下拉列表选择一个区域。
  6. 在 Cloud Storage 字段中,搜索并选择存储向量数据的 Cloud Storage 文件夹。
  7. 算法类型下拉列表中,选择 Vector Search 将用于执行搜索的算法类型。如果您选择 treeAh 算法,请输入近似相邻项数量。
  8. 维度字段中,填写输入向量的维度数量。
  9. 更新方法字段中,选择流式
  10. 分片大小字段中,从下拉列表选择所需的分片大小。
  11. 点击创建。新索引准备就绪后,便会显示在索引列表中。注意:构建时间最多可能需要一个小时才能完成。

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档

def vector_search_create_streaming_index(
    project: str, location: str, display_name: str, gcs_uri: Optional[str] = None
) -> None:
    """Create a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        display_name (str): Required. The index display name
        gcs_uri (str): Optional. The Google Cloud Storage uri for index content
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location, staging_bucket=gcs_uri)

    # Create Index
    index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
        display_name=display_name,
        description="Matching Engine Index",
        dimensions=100,
        approximate_neighbors_count=150,
        leaf_node_embedding_count=500,
        leaf_nodes_to_search_percent=7,
        index_update_method="stream_update",  # Options: stream_update, batch_update
        distance_measure_type=aiplatform.matching_engine.matching_engine_index_config.DistanceMeasureType.DOT_PRODUCT_DISTANCE,
    )

    print(index.name)

为流式更新创建空索引

如需立即创建和部署索引,您可以为流式传输创建空索引。如果使用此选项,在创建索引时不需要嵌入数据。

如需创建空索引,该请求与为流式传输创建索引几乎完全相同。不同之处在于,需要移除 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"
   }
 ]
}

控制台

按照以下说明查看索引列表。

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search

    前往 Vector Search

  2. 系统会显示活跃索引列表。

调整索引

调整索引需要设置影响已部署索引的性能的配置参数,尤其是召回率和延迟时间。这些参数是在首次创建索引时设置的。您可以使用暴力索引来衡量召回率。

影响性能的配置参数

以下配置参数可以在索引创建时设置,并且在使用 Vector Search 时可能会影响召回率、延迟时间、可用性和费用。本指南适用于大多数情况。 但是,请始终对您的配置进行实验,以确保它们适用于您的应用场景。

如需了解参数定义,请参阅索引配置参数

参数 简介 性能影响
shardSize

控制每台机器上的数据量。

选择分片大小时,请估算您的数据集未来的大小。如果数据集的大小有上限,请选择合适的分片大小来满足该上限。如果没有上限,或者您的用例对延迟时间变化极为敏感,建议您选择较大的分片大小。

如果您配置的较小分片数量较多,则在搜索期间会处理更多候选结果。更多分片会对性能产生以下影响:

  • 召回率:增加
  • 延迟时间:可能会延长,变化性更大
  • 可用性:分片故障影响的数据所占百分比较小
  • 费用:如果使用同一机器但用较多分片,则费用可能会增加

如果您配置的子表数量较少且子表较大,则在搜索期间处理的候选结果会更少。较少的分片可能会对性能产生以下影响:

  • 召回率:降低
  • 延迟时间:减少,变化性较小
  • 可用性:分片故障会影响更大比例的数据
  • 费用:如果使用同一机器但用较少的分片,则费用可能会降低
distanceMeasureType

确定用于计算数据点与查询向量之间的距离的算法。

以下 distanceMeasureType 设置有助于缩短查询延迟时间:

  • DOT_PRODUCT_DISTANCE 为减少延迟进行了最大优化
  • 建议使用 DOT_PRODUCT_DISTANCE 并将 FeatureNormType 设置为 UNIT_L2_NORM 以实现余弦相似度
leafNodeEmbeddingCount

每个叶节点的嵌入数量。此数默认设置为 1000。

通常,更改 leafNodeEmbeddingCount 的值比更改其他参数的值影响小。

增加每个叶节点的嵌入数量可以缩短延迟时间,但会降低召回质量。它可能会对性能产生以下影响:

  • 回想:由于搜索不太贴合,回想次数有所下降
  • 延迟时间:缩短,只要值不超过 15k(适用于大多数用例)
  • 可用性:无影响
  • 费用:可能会降低,因为相同 QPS 需要的副本更少

减小每个叶节点的嵌入数量会对性能产生以下影响:

  • 召回率:可能会提高,因为收集了更多有针对性的叶子节点
  • 延迟时间:增加
  • 可用性:无影响
  • 费用:可能会增加,因为相同的 QPS 需要更多副本

使用暴力索引来衡量召回率

如需获得确切的最近邻,请将索引与暴力算法配合使用。暴力算法可提供 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"
  }
}

控制台

按照以下说明删除一个或多个索引。

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,前往部署和使用部分。选择 Vector Search

    前往 Vector Search

  2. 系统会显示活跃索引列表。
  3. 如需删除索引,请前往与该索引位于同一行的  选项菜单,然后选择删除

后续步骤