Actualiza y vuelve a compilar un índice activo

Descripción general

Con búsqueda grandes, es importante que actualices los índices para tener siempre la información más precisa. Ahora puedes actualizar los índices de Vector Search mediante una actualización por lotes, lo que te permite insertar y borrar datos a través de una programación por lotes, o con una actualización de transmisión, que te permite actualizar y consultar el índice dentro de lo siguiente: unos segundos.

Además, puedes usar UpdateIndex para actualizar tus campos de metadatos importantes, como display_name, description y labels. También puedes agregar etiquetas opcionales a tu índice para ayudar a diversificar los resultados o filtrar las consultas previas al índice.

Actualiza un índice por lotes

Para actualizar el contenido de un Index existente, usa el método IndexService.UpdateIndex.

Para reemplazar el contenido existente de un Index, haz lo siguiente:

  • Configura Index.metadata.contentsDeltaUri como el URI de Cloud Storage que incluye los vectores que deseas actualizar.
  • Establecer isCompleteOverwrite como verdadero.

Si configuras el campo contentsDeltaUri cuando llamas a IndexService.UpdateIndex, tampoco se puede actualizar ningún otro campo de índice (como displayName, description o userLabels) como parte de la misma llamada.

gcloud

  1. Actualiza tu archivo de metadatos de índice.
  2. Usa el comando gcloud ai indexes update.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • LOCAL_PATH_TO_METADATA_FILE: La ruta de acceso local al archivo de metadatos.
  • INDEX_ID: Es el ID del índice.
  • LOCATION: la región en la que usas Vertex AI.
  • PROJECT_ID: El ID del proyecto de Google Cloud.

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

gcloud ai indexes update INDEX_ID \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --region=LOCATION \
    --project=PROJECT_ID

Windows (PowerShell)

gcloud ai indexes update INDEX_ID `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --region=LOCATION `
    --project=PROJECT_ID

Windows (cmd.exe)

gcloud ai indexes update INDEX_ID ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • INPUT_DIR: Es la ruta de acceso del directorio de Cloud Storage del contenido del índice.
  • INDEX_ID: Es el ID del índice.
  • LOCATION: la región en la que usas Vertex AI.
  • PROJECT_ID: El ID del proyecto de Google Cloud.
  • PROJECT_NUMBER: el número de proyecto de tu proyecto generado de forma automática.

HTTP method and URL:

PATCH http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID

Cuerpo JSON de la solicitud:

{
 "metadata": {
   "contentsDeltaUri": "INPUT_DIR",
   "isCompleteOverwrite": true
 }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-01-12T23:56:14.480948Z",
     "updateTime": "2022-01-12T23:56:14.480948Z"
   }
 }
}

Console

Usa estas instrucciones para actualizar el contenido de un índice por lotes.

  1. En la sección de Vertex AI de la consola de Google Cloud, ve a la sección Implementación y uso. Elige Vector Search

    Ir a Búsqueda de vectores

  2. Selecciona el índice que deseas actualizar. Se abrirá la página Index info.
  3. Selecciona Edit Index. Se abrirá un panel de edición de índice.
  4. En el campo Cloud Storage, busca y elige la carpeta de Cloud Storage en la que se almacenan tus datos vectoriales.
  5. Marca la casilla de reemplazo completo si deseas reemplazar todos los datos existentes (opcional).
  6. Haz clic en Actualizar
  7. Haz clic en Listo para cerrar el panel.

Si el Index tiene implementaciones asociadas (consulta el campo Index.deployed_indexes), cuando se realicen ciertos cambios en el Index original, DeployedIndex se actualizará automáticamente de forma asíncrona en segundo plano para reflejar estos cambios.

Para verificar si se propagó el cambio, compara la hora de finalización de la operación de actualización del índice y el valor DeployedIndex.index_sync_time.

Actualiza un índice de transmisión

Con las actualizaciones de transmisión, puedes actualizar y consultar tu índice en unos segundos. En este momento, no puedes usar actualizaciones de transmisión en un índice de actualización por lotes existente, debes crear un índice nuevo. Si quieres obtener más información, consulta Crea un índice para la actualización de transmisión.

Se te cobra $0.45 por GB que se use para las actualizaciones de transmisión. Para obtener más información sobre los precios, consulta la página de precios de Vertex AI. Las actualizaciones de transmisión se aplican directamente a los índices implementados en la memoria para que se reflejen en los resultados de la consulta después de una breve demora.

Inserción y actualización de datos

Usa estas muestras para ver cómo actualizar un dato. Recuerda que upsert-datapoints solo acepta JSON en formato de array.

Python

Python

def stream_update_vector_search_index(
    project: str, location: str, index_name: str, datapoints: Sequence[dict]
) -> None:
    """Stream update an existing vector search index

    Args:
      project (str): Required. The Project ID
      location (str): Required. The region name, e.g. "us-central1"
      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".
      datapoints: Sequence[dict]: Required. The datapoints to be updated. The dict
        element should be of the IndexDatapoint type.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index with stream_update
    # enabled
    my_index = aiplatform.MatchingEngineIndex(index_name=index_name)

    # Upsert the datapoints to the index
    my_index.upsert_datapoints(datapoints=datapoints)

Curl

El límite de cuota de capacidad de procesamiento se relaciona con la cantidad de datos que se incluyen en una inserción o actualización. Si existe el ID de dato en el índice, la incorporación se actualiza, de lo contrario, se agrega una nueva.

  
  DATAPOINT_ID_1=
  DATAPOINT_ID_2=
  curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" http://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
  -d '{datapoints: [{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...]},
  {datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...]}]}'
  
  

Console

Console

Usa estas instrucciones para actualizar el contenido a un índice de transmisión.

  1. En la sección de Vertex AI de la consola de Google Cloud, ve a la sección Implementación y uso. Elige Vector Search

    Ir a Búsqueda de vectores

  2. Selecciona el índice que deseas actualizar. Se abrirá la página Index info.
  3. Selecciona Edit Index. Se abrirá un panel de edición de índice.
  4. En el panel, selecciona Upsert data point para agregar contenido.
  5. Ingresa el ID del dato.
  6. Ingresa los valores del vector de atributos para el dato que quieres actualizar o insertar. Este campo debe incluir números separados por comas (p. ej.: 9.32, 0.12, -2.35).
  7. Ingresa la cadena.
  8. Haz clic en Actualizar o insertar.
  9. Haz clic en Listo para cerrar el panel.

El límite de cuota de capacidad de procesamiento se relaciona con la cantidad de datos que se incluyen en una inserción o actualización. Si existe el ID de dato en el índice, la incorporación se actualiza, de lo contrario, se agrega una nueva.

Actualiza metadatos dinámicos

Hay muchas razones por las que puede ser necesario actualizar las restricciones de transmisión o las restricciones numéricas. Por ejemplo, cuando se trata de datos de gran volumen y que se mueven rápidamente, es posible que desees priorizar ciertas transmisiones de datos. La actualización directa de las restricciones o restricciones numéricas te permite definir mejor el enfoque en tiempo real, lo que garantiza que los datos más importantes se procesen o se destaquen de inmediato.

Puedes actualizar directamente las restricciones de datos y las restricciones numéricas dentro de un índice de transmisión sin el costo de compactación de la actualización completa.

Para realizar estas actualizaciones de solo metadatos, debes agregar el campo update_mask a la solicitud. El valor de update_mask debe establecerse en all_restricts. Los valores de restricción y numéricos de restricción establecidos en los datos deben ser los nuevos valores que deseas aplicar en la actualización.

En el siguiente ejemplo, se muestra cómo agregar restricciones a dos datos existentes.

DATAPOINT_ID_1=
DATAPOINT_ID_2=

curl -H "Content-Type: application/json" -H "Authorization: Bearer gcloud auth print-access-token" http://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
-d '{datapoints:
[{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]},
{datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]}
], update_mask: "all_restricts"}'

Quitar datos

Es posible que debas quitar los datos de tu índice de transmisión. Puedes hacerlo a través de curl o desde la consola de Google Cloud.

Un caso de uso clave para borrar un dato de un índice es mantener la paridad entre el índice y su fuente real. Imagina un vendedor de libros que usa una incorporación de vector para representar su inventario de libros con fines de búsqueda y recomendación. Cuando un libro está agotado o se quita de las existencias, borrar los datos correspondientes del índice garantiza que los resultados de la búsqueda y las recomendaciones permanezcan precisos y actualizados.

Curl


curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" http://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/indexes/{INDEX_ID}:removeDatapoints -d '{datapoint_ids: ["'{DATAPOINT_ID_1}'", "'{DATAPOINT_ID_2}'"]}'

Console

Console

Usa estas instrucciones para borrar un dato del índice de transmisión.

  1. En la sección de Vertex AI de la consola de Google Cloud, ve a la sección Implementación y uso. Elige Vector Search

    Ir a Búsqueda de vectores

  2. Selecciona el índice de transmisión que deseas actualizar. Se abrirá la página Index info.
  3. Selecciona Edit Index. Se abrirá un panel de edición de índice.
  4. En el panel, selecciona la pestaña Remove data points.
  5. Para agregar hasta 20 datos, proporciona una lista delimitada por comas de los IDs de datos.
  6. Haz clic en Quitar.
  7. Haz clic en Listo para cerrar el panel.

Compactación

De manera periódica, tu índice se vuelve a compilar para incluir todas las actualizaciones nuevas desde la última compilación. Esta recompilación, o “compactación”, mejora el rendimiento y la confiabilidad de las consultas. Las compactaciones se producen tanto para las actualizaciones de transmisión como para las actualizaciones por lotes.

  • Actualización de transmisión: Vector Search usa métricas basadas en heurística para determinar cuándo activar la compactación. Si los datos sin compactar más antiguos tienen cinco días de antigüedad, la compactación siempre se activa. Se te factura por el costo de volver a compilar el índice con la misma tarifa de una actualización por lotes, además de los costos de actualización de transmisión.

  • Actualización por lotes: ocurre cuando el tamaño del conjunto de datos incremental es superior al 20% del tamaño del conjunto de datos base.

Vuelve a compilar y consultar tu índice

Puedes enviar solicitudes de coincidencias o coincidencias por lotes, como de costumbre, con grpc cli, la biblioteca cliente o el SDK de Vertex AI para Python. Cuando vuelvas a compilar la consulta, verás las actualizaciones en unos segundos. Si deseas aprender a consultar un índice, visita Consulta índices para obtener los vecinos más cercanos.

Campos opcionales

Cuando creas un índice, existen algunos campos opcionales que puedes usar para ajustar tus consultas.

Inserción y actualización con restricciones

La inserción de un índice y una restricción es una forma de etiquetar los datos para que se identifiquen para filtrarlos en el momento de la consulta. Es posible que quieras agregar etiquetas de restricción para limitar los resultados que se presentan en los datos antes de enviar una consulta. Por ejemplo, un cliente quiere ejecutar una consulta en un índice, pero quiere asegurarse de que los resultados solo muestren elementos que coincidan con “red” en una búsqueda de calzado. En el siguiente ejemplo, el índice se actualiza o inserta y filtra todo el calzado rojo, pero rechaza el azul. Esto garantiza que los filtros de búsqueda tengan las mejores opciones específicas de un índice grande y variado antes de la ejecución.

Además de las restricciones de token, en el ejemplo se usan restricciones numéricas. En este caso, el dato está asociado con un precio de 20, una longitud de 0.3 y un ancho de 0.5. En el momento de la consulta, puedes usar estas restricciones numéricas para filtrar los resultados y limitar los resultados de la consulta según los valores de precio, longitud y ancho. Por ejemplo, este dato aparece en una consulta que filtra por precio > 25, longitud < 1 y ancho < 1.

Si quieres obtener más información sobre el filtrado, consulta Vector Search para la indexación.

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" http://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "color", allow_list: ["red"], deny_list: ["blue"]},
    numeric_restricts: [{namespace: "price", value_int: 20}, {namespace: "length", value_float: 0.3}, {namespace: "width", value_double: 0.5}]
  }
]}'

Inserción y actualización con acumulación

La etiqueta de multiplicidad limita los resultados similares mediante la mejora de la diversidad de resultados. El multitud es una restricción en una lista de vecinos producido por una búsqueda de vecino más cercano que requiere que no más de algún valor, de un grupo de resultados, muestre el mismo valor de crowding_attribute. Como ejemplo, supongamos que regresas a las compras en línea de calzado. Quieres ver una amplia variedad de colores en los resultados, pero tal vez quieras que tengan un solo estilo, como calzado de fútbol. Puedes pedir que no se muestren más de 3 pares de calzado con el mismo color si configuras per_crowding_attribute_num_neighbors = 3 en la consulta, si suponemos que crowding_attribute tiene el color del calzado cuando se insertan los datos.

Este campo representa la cantidad máxima permitida de coincidencias con la misma etiqueta de agrupamiento.

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" http://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "type", allow_list: ["cleats"]}
    crowding_tag: { crowding_attribute: "red-shoe"},
  }
]}'

¿Qué sigue?