Configurar la búsqueda vectorial con Private Service Connect

Private Service Connect permite el consumo privado de servicios en redes de VPC que pertenecen a diferentes grupos, equipos, proyectos y organizaciones. Puedes publicar y consumir servicios mediante direcciones IP que definas y que sean internas de tu red de VPC, así como para que los endpoints de búsqueda vectorial realicen búsquedas de similitud vectorial.

Habilitar Private Service Connect en un punto final de búsqueda vectorial es adecuado para los casos prácticos que cumplen los siguientes requisitos:

  1. Requiere una latencia baja y una conexión segura con los back-ends de servicio de búsqueda de vectores.
  2. Tener un espacio de IP limitado para la reserva exclusiva de emparejamiento de VPC.
  3. Necesitas acceder a los back-ends de servicio desde varias redes de VPC de usuarios.

Para obtener más información sobre cómo configurar Private Service Connect, consulta el artículo Descripción general de Private Service Connect de la documentación sobre la nube privada virtual (VPC).

Crear el endpoint de índice

Debes habilitar Private Service Connect al crear el endpoint. Este procedimiento es similar al de crear otros endpoints en Vertex AI.

REST

  • PROJECT: el ID del proyecto de servicio en el que vas a crear recursos de Vertex AI.

  • REGION: la región de la red.

  • DISPLAY_NAME: nombre visible que se asignará al endpoint. Este nombre se usa para crear un ID del endpoint y no se puede actualizar más adelante.

  • VPC_PROJECTS: en la configuración de la VPC compartida, se trata de una lista separada por comas de proyectos host de VPC. En el caso de la configuración de VPC independiente, es lo mismo que PROJECT.

PROJECT=PROJECT_ID
VPC_PROJECT=VPC_PROJECT_ID
REGION=us-central1
VERTEX_ENDPOINT=REGION-aiplatform.googleapis.com
curl -H "Content-Type: application/json" \
  -H "Authorization: Bearer `gcloud auth print-access-token`" \
  https://REGION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/REGION/indexEndpoints \
  -d '{
     "displayName": "DISPLAY_NAME",
     "privateServiceConnectConfig": {
       "enablePrivateServiceConnect": true,
       "projectAllowlist": [ "VPC_PROJECT_1", "VPC_PROJECT_2", "VPC_PROJECT_N"]
     }
   }

Consola

Para crear tu endpoint, sigue estos pasos:

  1. Haga clic en el siguiente botón para ir a la búsqueda vectorial en la Google Cloud consola. Aparecerá una lista con tus índices activos.

    Ir a Vector Search

  2. Selecciona la pestaña Endpoints de índice. Aparecerán los endpoints de índice.

  3. Haz clic en Crear endpoint. Se abrirá el panel Create a new index endpoint (Crear un nuevo endpoint de índice).

  4. En Nombre visible, introduce un nombre visible para el endpoint del índice. Este nombre se usa para crear un ID del endpoint y no se puede actualizar más adelante.

  5. Selecciona una región en el menú desplegable Región.

  6. En Acceso, haz clic en Private Service Connect (vista previa).

  7. Aparecerá un campo de texto en el que podrá especificar qué proyectos de VPC quiere usar. Añade los IDs o números de los proyectos de VPC que quieras usar.

  8. Haz clic en Crear.

Acerca de las opciones de implementación de índices

.

Puedes implementar tu índice con conectividad de servicio automática o manual.

  • Implementar con la automatización de Private Service Connect: configura una política de conexión de servicio e implementa tus índices. Configurar una política de conexión de servicio te permite implementar en una red específica sin tener que crear una dirección de cálculo y una regla de reenvío cada vez.
  • Despliega con conexión manual: despliega tu índice y crea manualmente una dirección de cálculo y una regla de reenvío. Puedes elegir esta opción si necesitas usar varias direcciones IP para el mismo URI de adjunto de servicio, aunque no es un caso de uso habitual.

Implementar con la automatización de Private Service Connect

Puedes configurar una política de conexión de servicio para no tener que crear manualmente una dirección de cálculo y una regla de reenvío después de cada implementación de índice.

  1. En primer lugar, cree una política de conexión de servicio que especifique la red, la clase de servicio y la región en las que se van a implementar los índices. Esta es una configuración que solo se realiza una vez. Si ya lo has hecho, ve al siguiente procedimiento.
  2. Implementa el índice.

Limitaciones

La automatización solo permite una dirección IP por proyecto y por red. Si necesitas usar varias direcciones IP, consulta Implementar el índice manualmente.

Crear una política de conexión de servicio

Debes ser administrador de la red para crear una política de conexión de servicio que automatice la implementación de índices.

Para automatizar la implementación del índice, sigue estos pasos:

  1. Crea tu política de conexión de servicio.

    • PROJECT: El proyecto de servicio en el que vas a crear recursos de Vertex AI.

    • VPC_PROJECT: el proyecto en el que se encuentra tu VPC de cliente. En el caso de una configuración de una sola VPC, es el mismo que $PROJECT. En la configuración de la VPC compartida, este es el proyecto host de la VPC.

    • NETWORK_NAME: nombre de la red en la que se va a implementar, con el formato projects//global/networks/.

    • REGION: la región de la red.

    • PSC_SUBNETS: las subredes de Private Service Connect que se van a usar.

    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. Consulta tu política de conexión de servicio.

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

Para obtener más información sobre las políticas de conexión de servicios, consulta el artículo Configurar políticas de conexión de servicios.

Implementar el índice

REST

  • PROJECT: El proyecto de servicio en el que vas a crear recursos de Vertex AI.

  • VPC_PROJECT: proyecto en el que se encuentra tu VPC de cliente. En la configuración de VPC compartida, se trata del proyecto host de la VPC.

  • DISPLAY_NAME: nombre visible que se asignará al endpoint. Este nombre se usa para crear un ID del endpoint y no se puede actualizar más adelante.

  • NETWORK_NAME: nombre de la red en la que se va a implementar, con el formato projects//global/networks/.

  • REGION: la región de la red.

  • PSC_SUBNETS: la subred de Private Service Connect que se va a usar.

PROJECT=PROJECT
VPC_PROJECTS=VPC_PROJECTS
REGION=REGION
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
-H "Content-Type: application/json; charset=utf-8" "https://LOCATIONAL_ENDPOINT.googleapis.com/v1/projects/PROJECT_NUMBER/locations/REGION/indexEndpoints/INDEX_ENDPOINT_ID:deployIndex"
-d '{
  "deployedIndex": {
    "id": "DEPLOYED_INDEX_ID",
    "index": "projects/PROJECT/locations/us-central1/indexes/INDEX_ID ",
    "displayName": "DISPLAY_NAME",
    "psc_automation_configs": [
      { "project_id": "PROJECT_1", "network": "NETWORK_NAME_1" },
      { "project_id": "PROJECT_2", "network": "NETWORK_NAME_2" },
      { "project_id": "PROJECT_N", "network": "NETWORK_NAME_N" }]
    }
}'

Consola

Para desplegar tu endpoint, sigue estos pasos:

  1. Haz clic en el siguiente botón para ir a Búsqueda vectorial en la Google Cloud consola. Aparecerá una lista con tus índices activos.

    Ir a Vector Search

  2. Haz clic en el botón Implementar del endpoint de búsqueda vectorial habilitado para Private Service Connect que quieras implementar. Aparecerá el panel desplegable Implementar índice.

  3. En Nombre visible, introduce un nombre visible para el índice implementado. Este nombre se usa para crear el ID y no se puede actualizar más adelante.

  4. Haz clic en Endpoint (Punto final) y elige el endpoint de índice en el que quieras realizar el despliegue.

  5. También puedes hacer clic en Tipo de máquina para elegir manualmente el tipo de máquina en el que quieres implementar el índice. De forma predeterminada, el tipo de máquina se selecciona automáticamente en función del tamaño del fragmento del índice.

Ahora debe añadir configuraciones de automatización de Private Service Connect. Para ello:

  1. En la sección Configuraciones de automatización de PSC, haz clic en Añadir nueva configuración.

  2. Introduce el nombre del proyecto de VPC al que te quieres conectar.

  3. Introduce el nombre de la red del proyecto de VPC al que te quieras conectar. Debe tener el formato projects/<project_number>/global/networks/<network_name>.

  4. Opcionalmente, haz clic en Añadir nueva configuración y sigue añadiendo configuraciones de automatización de Private Service Connect.

  5. Haz clic en Implementar para terminar.

Eliminar una política de conexión de servicio

Si necesitas eliminar la política de conexión de servicio, ejecuta el siguiente comando:

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

Para obtener más información sobre las políticas de conexión de servicios, consulta el artículo Configurar políticas de conexión de servicios.

Implementar con conexión manual

Implementa el índice y crea una regla de reenvío en tu proyecto de VPC.

Implementar el índice

Ahora que el índice está listo, en este paso, lo implementarás en el endpoint que has creado con Private Service Connect habilitado.

gcloud

En este ejemplo se usa el comando gcloud ai index-endpoints deploy-index.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • INDEX_ENDPOINT_ID: ID del endpoint de índice.
  • DEPLOYED_INDEX_ID: cadena especificada por el usuario para identificar de forma única el índice implementado. Debe empezar por una letra y solo puede contener letras, números o guiones bajos. Consulta las directrices de formato de DeployedIndex.id.
  • DEPLOYED_INDEX_ENDPOINT_NAME: Nombre visible del endpoint de índice implementado.
  • INDEX_ID: ID del índice.
  • LOCATION: la región en la que usas Vertex AI.
  • PROJECT_ID: tu Google Cloud ID de proyecto.

Ejecuta el siguiente comando:

Linux, macOS o 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

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • INDEX_ENDPOINT_ID: ID del endpoint de índice.
  • DEPLOYED_INDEX_ID: cadena especificada por el usuario para identificar de forma única el índice implementado. Debe empezar por una letra y solo puede contener letras, números o guiones bajos. Consulta las directrices de formato de DeployedIndex.id.
  • DEPLOYED_INDEX_ENDPOINT_NAME: Nombre visible del endpoint de índice implementado.
  • INDEX_ID: ID del índice.
  • LOCATION: la región en la que usas Vertex AI.
  • PROJECT_ID: tu Google Cloud ID de proyecto.
  • PROJECT_NUMBER: el número de proyecto que se genera automáticamente.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

{
 "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"
 }
}

Terraform

En el siguiente ejemplo se usa el recurso de Terraform vertex_ai_index_endpoint_deployed_index para crear un endpoint de índice implementado.

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

provider "google" {
  region = "us-central1"
}

resource "google_vertex_ai_index_endpoint_deployed_index" "default" {
  depends_on        = [google_vertex_ai_index_endpoint.default]
  index_endpoint    = google_vertex_ai_index_endpoint.default.id
  index             = google_vertex_ai_index.default.id
  deployed_index_id = "deployed_index_for_psc"
}

resource "google_vertex_ai_index_endpoint" "default" {
  display_name = "sample-endpoint"
  description  = "A sample index endpoint with Private Service Connect enabled"
  region       = "us-central1"
  private_service_connect_config {
    enable_private_service_connect = true
    project_allowlist = [
      data.google_project.project.project_id,
    ]
  }
}

data "google_project" "project" {}

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

# Create a Cloud Storage bucket
resource "google_storage_bucket" "bucket" {
  name                        = "vertex-ai-index-bucket-${random_id.default.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

Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API Python.

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)

Consola

Sigue estas instrucciones para desplegar tu índice.

  1. En la sección Vertex AI de la Google Cloud consola, ve a la sección Desplegar y usar. Selecciona Búsqueda vectorial.

    Ve a Vector Search. Se muestra una lista de tus índices activos.

  2. Selecciona el nombre del índice que quieras implementar. Se abrirá la página de detalles del índice.
  3. En la página de detalles del índice, haz clic en Implementar en endpoint. Se abrirá el panel de implementación de índices.
  4. Introduce un nombre visible. Este nombre actúa como un ID y no se puede actualizar.
  5. En el menú desplegable Endpoint, selecciona el endpoint en el que quieras implementar este índice. Nota: El endpoint no está disponible si el índice ya se ha implementado en él.
  6. Opcional: En el campo Tipo de máquina, selecciona Estándar o Alta memoria.
  7. Opcional. Selecciona Habilitar el autoescalado para cambiar automáticamente el tamaño del número de nodos en función de las demandas de tus cargas de trabajo. El número predeterminado de réplicas es 2 si el autoescalado está inhabilitado.
  8. Haz clic en Desplegar para desplegar el índice en el endpoint. Nota: El proceso de implementación tarda unos 30 minutos.

Crear una regla de reenvío en el proyecto de VPC

Una vez que se haya completado la implementación del índice, el endpoint del índice devolverá un URI de adjunto de servicio en lugar de una dirección IP. Debes crear una dirección de cálculo, así como una regla de reenvío en el proyecto de VPC que tenga como destino el adjunto de servicio mediante la dirección de cálculo creada. Para crear una dirección de cálculo, usa el siguiente ejemplo:

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

Para crear una regla de reenvío que tenga como destino el URI de la vinculación de servicio con la dirección de cálculo creada, utiliza el siguiente ejemplo:

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:?}

(Opcional) Crear un registro DNS para la dirección IP

Si quieres conectarte y cargar contenido sin memorizar la dirección IP real, puedes crear un registro DNS. Este paso es opcional.

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:?}

Enviar consultas al endpoint del índice

Ahora que has creado un endpoint con Private Service Connect y has creado el índice, puedes empezar a ejecutar consultas.

Para consultar tu índice, consulta Consultar índices para obtener los elementos más cercanos.

Siguientes pasos