使用 Private Service Connect 设置 Vector Search

Private Service Connect 允许跨属于不同群组、团队、项目或组织的 VPC 网络以不公开方式使用服务。您可以使用由您定义且位于您的 VPC 网络内部的 IP 地址发布和使用服务,以便 Vector Search 端点执行向量相似度搜索。

在 Vector Search 端点上启用 Private Service Connect 适用于以下使用场景:

  1. 要求低延迟,并与 Vector Search 服务后端建立安全连接。
  2. 专用 VPC 对等互连预留的 IP 空间有限。
  3. 需要从多个用户 VPC 网络访问服务后端。

如需详细了解如何设置 Private Service Connect,请参阅 Virtual Private Cloud (VPC) 文档中的 Private Service Connect 概览

创建索引端点

如需创建启用 Private Service Connect 的端点,必须在创建端点时定义该端点。这类似于在 Vertex AI 中创建其他端点。

REST

  • PROJECT:要在其中创建 Vertex AI 资源的服务项目。
  • VPC_PROJECT:您的客户端 VPC 所在的项目。对于独立 VPC 设置,这与 $PROJECT 相同。对于共享 VPC 设置,这将是 VPC 宿主项目。
  • PROJECT=<your-service-project>
    VPC_PROJECT=<your-vpc-project>
    REGION=us-central1
    VERTEX_ENDPOINT=$REGION-aiplatform.googleapis.com
    curl -H "Content-Type: application/json" \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      https://$VERTEX_ENDPOINT/v1/projects/$PROJECT/locations/$REGION/indexEndpoints \
      -d '{displayName: "<your-index-endpoint-name>", privateServiceConnectConfig:
      { enablePrivateServiceConnect: true, projectAllowlist: ["'$VPC_PROJECT'", "'$PROJECT'"] }}'
    

    Python

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

    def vector_search_create_index_endpoint_private_service_connect(
        project: str, location: str, display_name: str, project_allowlist: list[str]
    ) -> aiplatform.MatchingEngineIndexEndpoint:
        """Create a vector search index endpoint with Private Service Connect enabled.
    
        Args:
            project (str): Required. Project ID
            location (str): Required. The region name
            display_name (str): Required. The index endpoint display name
            project_allowlist (list[str]): Required. A list of projects from which
                the forwarding rule will be able to target the service attachment.
    
        Returns:
            aiplatform.MatchingEngineIndexEndpoint - The created index endpoint.
        """
        # Initialize the Vertex AI client
        aiplatform.init(project=project, location=location)
    
        # Create Index Endpoint
        index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
            display_name=display_name,
            description="Matching Engine VPC Index Endpoint",
            enable_private_service_connect=True,
            project_allowlist=project_allowlist,
        )
    
        return index_endpoint
    
    

    索引部署选项简介

    您可以通过自动或手动服务连接部署索引。

    使用 Private Service Connect 自动化功能进行部署

    您可以设置服务连接政策,这样就不必在每次部署索引后手动创建计算地址和转发规则。

    1. 首先,创建服务连接政策,指定要部署索引的网络、服务类和区域。此设置是一次性的。如果您已完成此操作,请跳至下一个步骤。
    2. 部署索引

    限制

    Automation 仅允许每个项目每个网络使用一个 IP 地址。如果您需要使用多个 IP 地址,请参阅手动部署索引

    创建服务连接政策

    您必须是网络管理员,才能创建服务连接政策以自动部署索引。

    如需自动部署索引,请按以下步骤操作:

    1. 创建服务连接政策。

      • PROJECT:要在其中创建 Vertex AI 资源的服务项目。
      • VPC_PROJECT:您的客户端 VPC 所在的项目。对于单个 VPC 设置,这与 $PROJECT 相同。对于共享 VPC 设置,这是 VPC 宿主项目。
      • NETWORK_NAME:要部署到的网络的名称,格式为 projects//global/networks/
      • REGION:网络区域。
      • PSC_SUBNETS:要使用的 Private Service Connect 子网。
      gcloud network-connectivity service-connection-policies create <policy_name> \
      --project=<vpc_project> --network=<network_name> # in the format projects/<project_id>/global/networks/<network_name> \
      --service-class=gcp-vertexai --region=<region> --subnets=<psc subnets>
      
    2. 查看您的服务连接政策。

      gcloud network-connectivity service-connection-policies list --project=<vpc_project> -–region=<region>
      

    部署索引

    gcloud

    本示例使用 gcloud ai index-endpoints deploy-index 命令。

    在使用下面的命令数据之前,请先进行以下替换:

    • INDEX_ENDPOINT_ID:索引端点的 ID。
    • DEPLOYED_INDEX_ID:用户指定的字符串,用于唯一标识已部署的索引。必须以字母开头,并且只包含字母、数字或下划线。如需了解格式准则,请参阅 DeployedIndex.id
    • DEPLOYED_INDEX_ENDPOINT_NAME:已部署索引端点的显示名称。
    • INDEX_ID:索引的 ID。
    • LOCATION:您在其中使用 Vertex AI 的区域。
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • NETWORK_1:此索引端点将部署到的 Compute Engine 网络的名称。
    • NETWORK_2:(可选)要部署此端点的其他 Compute Engine 网络名称。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID \
        --deployed-index-id=DEPLOYED_INDEX_ID \
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME \
        --index=INDEX_ID \
        --region=LOCATION \
        --project=PROJECT_ID \
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 \
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    Windows (PowerShell)

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID `
        --deployed-index-id=DEPLOYED_INDEX_ID `
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME `
        --index=INDEX_ID `
        --region=LOCATION `
        --project=PROJECT_ID `
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 `
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    Windows (cmd.exe)

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID ^
        --deployed-index-id=DEPLOYED_INDEX_ID ^
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME ^
        --index=INDEX_ID ^
        --region=LOCATION ^
        --project=PROJECT_ID ^
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 ^
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    REST

    在使用任何请求数据之前,请先进行以下替换:

    • INDEX_ENDPOINT_ID:索引端点的 ID。
    • DEPLOYED_INDEX_ID:用户指定的字符串,用于唯一标识已部署的索引。必须以字母开头,并且只包含字母、数字或下划线。如需了解格式准则,请参阅 DeployedIndex.id
    • DEPLOYED_INDEX_ENDPOINT_NAME:已部署索引端点的显示名称。
    • INDEX_ID:索引的 ID。
    • LOCATION:您在其中使用 Vertex AI 的区域。
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • NETWORK_1:此索引端点将部署到的 Compute Engine 网络的名称。
    • NETWORK_2:(可选)要部署此端点的其他 Compute Engine 网络名称。
    • PROJECT_NUMBER:自动生成的项目编号

    HTTP 方法和网址:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID:deployIndex

    请求 JSON 正文:

    {
     "deployedIndex": {
       "id": "DEPLOYED_INDEX_ID",
       "index": "projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID",
       "displayName": "DEPLOYED_INDEX_ENDPOINT_NAME"
       "psc_automation_configs": [
              {"project_id": "PROJECT_ID", "network": "NETWORK_1"},
              {"project_id": "PROJECT_ID", "network": "NETWORK_2" }]
     }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
     "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID/operations/OPERATION_ID",
     "metadata": {
       "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployIndexOperationMetadata",
       "genericMetadata": {
         "createTime": "2022-10-19T17:53:16.502088Z",
         "updateTime": "2022-10-19T17:53:16.502088Z"
       },
       "deployedIndexId": "DEPLOYED_INDEX_ID"
     }
    }
    

    Python

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

    def vector_search_deploy_psc_automation_index(
        project: str,
        location: str,
        index_name: str,
        index_endpoint_name: str,
        deployed_index_id: str,
        psc_automation_configs: Sequence[Tuple[str, str]],
    ) -> None:
        """Deploy a vector search index to an index endpoint using PSC automation.
    
        Args:
            project (str): Required. Project ID
            location (str): Required. The region name
            index_name (str): Required. The index to update. A fully-qualified index
              resource name or a index ID.  Example:
              "projects/123/locations/us-central1/indexes/my_index_id" or
              "my_index_id".
            index_endpoint_name (str): Required. Index endpoint to deploy the index
              to.
            deployed_index_id (str): Required. The user specified ID of the
              DeployedIndex.
            psc_automation_config (Sequence[Tuple[str, str]]): Required. A list of
              (project_id, network) pairs where PSC endpoints will be setup for the
              deployed index. Example:
              [("123", "{projects/123/global/networks/my-network1"),
              ("123", "{projects/123/global/networks/my-network2")]
        """
        # Initialize the Vertex AI client
        aiplatform.init(project=project, location=location)
    
        # Create the index instance from an existing index
        index = aiplatform.MatchingEngineIndex(index_name=index_name)
    
        # Create the index endpoint instance from an existing endpoint.
        index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
            index_endpoint_name=index_endpoint_name
        )
    
        # Deploy Index to Endpoint with PSC automation enabled.
        index_endpoint.deploy_index(
            index=index,
            deployed_index_id=deployed_index_id,
            psc_automation_configs=psc_automation_configs,
        )
    
    

    删除服务连接政策

    如果您需要删除服务连接政策,请运行以下命令:

    gcloud network-connectivity service-connection-policies delete --project=<vpc_project> –-region=<region> <policy_name>
    

    通过手动连接进行部署

    部署索引并在 VPC 项目中创建转发规则。

    部署索引

    现在索引已准备就绪,在此步骤中,您可以将索引部署到您在启用 Private Service Connect 的情况下创建的端点。

    gcloud

    本示例使用 gcloud ai index-endpoints deploy-index 命令

    在使用下面的命令数据之前,请先进行以下替换:

    • INDEX_ENDPOINT_ID:索引端点的 ID。
    • DEPLOYED_INDEX_ID:用户指定的字符串,用于唯一标识已部署的索引。必须以字母开头,并且只包含字母、数字或下划线。如需了解格式准则,请参阅 DeployedIndex.id
    • DEPLOYED_INDEX_ENDPOINT_NAME:已部署索引端点的显示名称。
    • INDEX_ID:索引的 ID。
    • LOCATION:您在其中使用 Vertex AI 的区域。
    • PROJECT_ID:您的 Google Cloud 项目 ID

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID \
        --deployed-index-id=DEPLOYED_INDEX_ID \
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME \
        --index=INDEX_ID \
        --region=LOCATION \
        --project=PROJECT_ID

    Windows (PowerShell)

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID `
        --deployed-index-id=DEPLOYED_INDEX_ID `
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME `
        --index=INDEX_ID `
        --region=LOCATION `
        --project=PROJECT_ID

    Windows (cmd.exe)

    gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID ^
        --deployed-index-id=DEPLOYED_INDEX_ID ^
        --display-name=DEPLOYED_INDEX_ENDPOINT_NAME ^
        --index=INDEX_ID ^
        --region=LOCATION ^
        --project=PROJECT_ID

    REST

    在使用任何请求数据之前,请先进行以下替换:

    • INDEX_ENDPOINT_ID:索引端点的 ID。
    • DEPLOYED_INDEX_ID:用户指定的字符串,用于唯一标识已部署的索引。必须以字母开头,并且只包含字母、数字或下划线。如需了解格式准则,请参阅 DeployedIndex.id
    • DEPLOYED_INDEX_ENDPOINT_NAME:已部署索引端点的显示名称。
    • INDEX_ID:索引的 ID。
    • LOCATION:您在其中使用 Vertex AI 的区域。
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • PROJECT_NUMBER:自动生成的项目编号

    HTTP 方法和网址:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID:deployIndex

    请求 JSON 正文:

    {
     "deployedIndex": {
       "id": "DEPLOYED_INDEX_ID",
       "index": "projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID",
       "displayName": "DEPLOYED_INDEX_ENDPOINT_NAME"
     }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
     "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID/operations/OPERATION_ID",
     "metadata": {
       "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployIndexOperationMetadata",
       "genericMetadata": {
         "createTime": "2022-10-19T17:53:16.502088Z",
         "updateTime": "2022-10-19T17:53:16.502088Z"
       },
       "deployedIndexId": "DEPLOYED_INDEX_ID"
     }
    }
    

    Python

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

    def vector_search_deploy_index(
        project: str,
        location: str,
        index_name: str,
        index_endpoint_name: str,
        deployed_index_id: str,
    ) -> None:
        """Deploy a vector search index to a vector search index endpoint.
    
        Args:
            project (str): Required. Project ID
            location (str): Required. The region name
            index_name (str): Required. The index to update. A fully-qualified index
              resource name or a index ID.  Example:
              "projects/123/locations/us-central1/indexes/my_index_id" or
              "my_index_id".
            index_endpoint_name (str): Required. Index endpoint to deploy the index
              to.
            deployed_index_id (str): Required. The user specified ID of the
              DeployedIndex.
        """
        # Initialize the Vertex AI client
        aiplatform.init(project=project, location=location)
    
        # Create the index instance from an existing index
        index = aiplatform.MatchingEngineIndex(index_name=index_name)
    
        # Create the index endpoint instance from an existing endpoint.
        index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
            index_endpoint_name=index_endpoint_name
        )
    
        # Deploy Index to Endpoint
        index_endpoint = index_endpoint.deploy_index(
            index=index, deployed_index_id=deployed_index_id
        )
    
        print(index_endpoint.deployed_indexes)
    
    

    控制台

    按照以下说明部署索引。

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

      前往 Vector Search

    2. 系统会显示活跃索引列表。
    3. 选择您要部署的索引的名称。系统会打开索引详情页面。
    4. 在索引详情页面中,点击 部署到端点。系统会打开索引部署面板。
    5. 输入显示名称,此名称充当 ID 且无法更新。
    6. 端点下拉列表中,选择要将此索引部署到的端点。注意:如果索引已部署到该端点,则该端点不可用。
    7. 可选:在机器类型字段中,选择标准内存或高内存。
    8. 可选。选择启用自动扩缩功能,以根据工作负载的需求自动调整节点数量。如果停用自动扩缩,则默认副本数为 2。
    9. 点击部署以将索引部署到端点。注意:部署过程大约需要 30 分钟。

    在 VPC 项目中创建转发规则

    索引部署完成后,索引端点会返回服务连接 URI,而不是 IP 地址。您需要创建计算地址,并在针对服务附件的 VPC 项目中使用创建的计算地址创建转发规则。如需创建计算地址,请使用以下示例:

    gcloud compute addresses create ${ADDRESS_NAME:?} \
        --region=${REGION:?} \
        --subnet=${SUBNET_NAME:?} \
        --project=${VPC_PROJECT:?}
    

    如需使用创建的计算地址创建以服务附件 URI 为目标的转发规则,请使用以下示例:

    SERVICE_ATTACHMENT_URI=`gcloud ai index-endpoints describe {INDEX_ENDPOINT_ID}
    --format="value(deployedIndexes.privateEndpoints.serviceAttachment)"`
    
    gcloud compute forwarding-rules create ${ENDPOINT_NAME:?} \
        --network=${NETWORK_NAME:?} \
        --address=${ADDRESS_NAME:?} \
        --target-service-attachment=${SERVICE_ATTACHMENT_URI:?} \
        --project=${VPC_PROJECT:?} \
        --region=${REGION:?}
    

    (可选)为 IP 地址创建 DNS 记录

    如果您想连接和加载而不记住实际 IP 地址,则可以创建 DNS 记录。这是可选步骤。

    DNS_NAME_SUFFIX=matchingengine.vertexai.goog. # Don't forget the "." in the end.
    DNS_NAME=${INDEX_ENDPOINT_ID:?}.${REGION:?}.${DNS_NAME_SUFFIX:?}
    
    gcloud dns managed-zones create ${DNS_ZONE_NAME:?} \
        --dns-name=${DNS_NAME_SUFFIX:?} \
        --visibility=private \
        --project=${VPC_PROJECT:?} \
        --region=${REGION:?}
    
    gcloud dns record-sets create ${DNS_NAME:?} \
        --rrdatas=${IP_ADDRESS:?} \
        --type=A --ttl=60 \
        --zone=${DNS_ZONE_NAME:?} \
        --project=${VPC_PROJECT:?} \
        --region=${REGION:?}
    

    将查询发送到索引端点

    现在,您已使用 Private Service Connect 创建了端点并创建了索引,可以开始运行查询了。

    如需查询索引,请参阅查询索引以获取最近的邻居

    后续步骤