Aggiornare e ricreare un indice attivo

Panoramica

Per le query di ricerca di grandi dimensioni, l'aggiornamento degli indici è importante per avere sempre le informazioni più accurate. Oggi puoi aggiornare gli indici di Vector Search utilizzando un aggiornamento batch, che ti consente di inserire ed eliminare punti dati tramite una pianificazione batch o con l'aggiornamento di flussi di dati, che ti consente di aggiornare ed eseguire query sull'indice in pochi secondi.

Inoltre, puoi utilizzare UpdateIndex per aggiornare i campi dei metadati importanti, come display_name, description e labels. Puoi anche aggiungere tag facoltativi all'indice per diversificare i risultati o filtrare la query precedente all'indice.

Aggiorna un indice batch

Per aggiornare i contenuti di un elemento Index esistente, usa il metodo IndexService.UpdateIndex.

Per sostituire i contenuti di un elemento Index esistente:

  • Imposta Index.metadata.contentsDeltaUri sull'URI Cloud Storage che include i vettori da aggiornare.
  • Imposta isCompleteOverwrite su true. Se il valore è impostato su true, l'intero indice viene sovrascritto completamente con il nuovo file di metadati da te fornito.

Se imposti il campo contentsDeltaUri durante la chiamata a IndexService.UpdateIndex, nessun altro campo dell'indice (ad esempio displayName, description o userLabels) potrà essere aggiornato nell'ambito della stessa chiamata.

gcloud

  1. Aggiorna il file dei metadati dell'indice.
  2. Usa il comando gcloud ai indexes update.

Prima di utilizzare qualsiasi dato di comando riportato di seguito, effettua le seguenti sostituzioni:

  • LOCAL_PATH_TO_METADATA_FILE: il percorso locale del file dei metadati.
  • INDEX_ID: l'ID dell'indice.
  • LOCATION: la regione in cui stai utilizzando Vertex AI.
  • PROJECT_ID: il tuo ID progetto Google Cloud.

Esegui questo seguente 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

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • INPUT_DIR: il percorso della directory Cloud Storage dei contenuti dell'indice.
  • INDEX_ID: l'ID dell'indice.
  • LOCATION: la regione in cui stai utilizzando Vertex AI.
  • PROJECT_ID: il tuo ID progetto Google Cloud.
  • PROJECT_NUMBER: il numero di progetto generato automaticamente per il tuo progetto.

Metodo HTTP e URL:

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

Corpo JSON della richiesta:

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

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

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

Utilizza queste istruzioni per aggiornare i contenuti di un indice batch.

  1. Nella sezione Vertex AI della console Google Cloud, vai alla sezione Deployment e utilizzo. Seleziona Vector Search (Ricerca vettoriale).

    Vai a Vector Search

  2. Seleziona l'indice da aggiornare. Si apre la pagina Informazioni indice.
  3. Seleziona Modifica indice. Si apre un riquadro di modifica dell'indice.
  4. Nel campo Cloud Storage, cerca e seleziona la cartella Cloud Storage in cui sono archiviati i tuoi dati vettoriali.
  5. (Facoltativo) Seleziona la casella di sovrascrittura completa se vuoi sovrascrivere tutti i dati esistenti.
  6. Fai clic su Aggiorna.
  7. Fai clic su Fine per chiudere il riquadro.

Se Index è associato a deployment (vedi il campo Index.deployed_indexes), quando vengono apportate determinate modifiche al Index originale, il DeployedIndex viene aggiornato automaticamente in modo asincrono in background per riflettere queste modifiche.

Per verificare se la modifica è stata propagata, confronta l'ora di fine dell'operazione di aggiornamento dell'indice e il valore DeployedIndex.index_sync_time.

Aggiorna un indice di flussi di dati

Con gli aggiornamenti in modalità flusso, puoi aggiornare l'indice ed eseguire query in pochi secondi. Al momento non puoi utilizzare gli aggiornamenti in modalità flusso su un indice di aggiornamento batch esistente, devi creare un nuovo indice. Per saperne di più, consulta Creare un indice per l'aggiornamento dei flussi di dati.

Ti vengono addebitati 0,45 $per ogni GB utilizzato per gli aggiornamenti in streaming. Per scoprire di più sui prezzi, consulta la pagina dei prezzi di Vertex AI. Gli aggiornamenti in modalità flusso vengono applicati direttamente in memoria agli indici di cui è stato eseguito il deployment, che poi si riflettono nei risultati della query dopo un breve ritardo.

Punti dati upsert

Utilizza questi esempi per vedere come eseguire l'upsert di un punto dati. Ricorda che upsert-datapoints accetta JSON solo in formato 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

Il limite della quota di velocità effettiva si riferisce alla quantità di dati inclusi in un upsert. Se l'ID punto dati esiste nell'indice, l'incorporamento viene aggiornato, altrimenti viene aggiunto un nuovo incorporamento.

  
  DATAPOINT_ID_1=
  DATAPOINT_ID_2=
  curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${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: [...]}]}'
  
  

Con la ricerca ibrida, che è un'anteprima pubblica, sono supportate rappresentazioni sparse e dense di emebdding per un punto dati. In un'operazione upsert, l'omissione di un incorporamento denso elimina la rappresentazione densa, mentre l'omissione di un incorporamento sparso elimina la rappresentazione sparsa.

Questo esempio aggiorna sia gli incorporamenti densi che quelli sparsi.

  
    curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
  
  

Questo esempio aggiorna gli incorporamenti densi e rimuove quelli sparsi.

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

Questo esempio aggiorna gli incorporamenti sparsi e rimuove quelli densi.

    
      curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111",  "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
    
  

Console

Console

Segui queste istruzioni per aggiornare i contenuti in un indice di streaming.

  1. Nella console Google Cloud, vai alla pagina Vector Search.

    Vai a Vector Search

  2. Seleziona l'indice da aggiornare. Si apre la pagina Informazioni indice.
  3. Fai clic su Modifica indice. Si apre un riquadro di modifica dell'indice.
  4. Dal riquadro, seleziona la scheda Punto dati upsert per aggiungere contenuti.
  5. Inserisci l'ID del punto dati.
  6. Inserisci almeno un tipo di incorporamento:
    • Incorporamento denso: inserisci un array di valori in virgola mobile separati da virgole. Il numero di valori deve corrispondere alle dimensioni dell'indice.
    • Incorporamento sparso (anteprima pubblica):
      1. Inserisci dimensioni di incorporamento sparso come array di numeri interi separati da virgole. Il numero di valori non deve necessariamente corrispondere alle dimensioni dell'indice.
      2. Inserisci i valori sotto forma di array di valori con rappresentazione in virgola mobile separati da virgole. Il numero di valori deve corrispondere al numero di dimensioni di incorporamento sparse.
  7. (Facoltativo) Per attivare il filtro in base alle limitazioni del token in questo punto dati, fai clic su Aggiungi limitazione token, quindi inserisci uno spazio dei nomi e stringhe separate da virgole come token.
  8. (Facoltativo) Per attivare il filtro per limitazioni numeriche in questo punto dati, fai clic su Aggiungi limitazione numerica, inserisci uno spazio dei nomi, seleziona un tipo di numero e inserisci un valore.
  9. (Facoltativo) Per evitare molti risultati simili, inserisci una stringa tag di crowding.
  10. Fai clic su Upsert.
  11. Fai clic su Fine per chiudere il riquadro.

Il limite della quota di velocità effettiva si riferisce alla quantità di dati inclusi in un upsert. Se l'ID punto dati esiste nell'indice, l'incorporamento viene aggiornato, altrimenti viene aggiunto un nuovo incorporamento.

Aggiorna metadati dinamici

Esistono molti motivi per cui potresti dover aggiornare le restrizioni relative al flusso di dati o le restrizioni numeriche. Ad esempio, quando si gestiscono dati ad alto volume e in rapido movimento, potresti voler dare la priorità a determinati stream di dati. L'aggiornamento diretto delle limitazioni o delle restrizioni numeriche ti consente di perfezionare l'attenzione in tempo reale, assicurandoti che i dati più importanti vengano elaborati o evidenziati immediatamente.

Puoi aggiornare direttamente le restrizioni dei punti dati e le limitazioni numeriche all'interno di un indice di flussi di dati senza il costo di compattazione dell'aggiornamento completo.

Per eseguire questi aggiornamenti solo per i metadati, devi aggiungere il campo update_mask alla richiesta. Il valore di update_mask deve essere impostato su all_restricts. I valori di limitazione e limitazione numerica impostati nei punti dati devono corrispondere ai nuovi valori da applicare nell'aggiornamento.

L'esempio seguente mostra come aggiungere limitazioni a due punti dati esistenti.

DATAPOINT_ID_1=
DATAPOINT_ID_2=

curl -H "Content-Type: application/json" -H "Authorization: Bearer gcloud auth print-access-token" https://${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"}'

Rimuovi punti dati

Potrebbe essere necessario rimuovere i punti dati dall'indice di flussi di dati. Puoi eseguire questa operazione utilizzando curl o dalla console Google Cloud.

Un caso d'uso chiave per eliminare un punto dati da un indice è mantenere la parità tra l'indice e la sua origine reale. Prendi in considerazione un rivenditore che utilizza un incorporamento vettoriale per rappresentare il proprio inventario dei libri a scopo di ricerca e suggerimento. Quando un libro è esaurito o non è più disponibile, l'eliminazione del punto dati corrispondente dall'indice garantisce che i risultati di ricerca e i suggerimenti siano sempre precisi e aggiornati.

Curl


curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://{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

Utilizza queste istruzioni per eliminare un punto dati dall'indice di flussi di dati.

  1. Nella sezione Vertex AI della console Google Cloud, vai alla sezione Deployment e utilizzo. Seleziona Vector Search (Ricerca vettoriale).

    Vai a Vector Search

  2. Seleziona l'indice di streaming che vuoi aggiornare. Si apre la pagina Informazioni indice.
  3. Seleziona Modifica indice. Si apre un riquadro di modifica dell'indice.
  4. Dal riquadro, seleziona la scheda Rimuovi punti dati.
  5. Aggiungi fino a 20 punti dati fornendo un elenco di ID punti dati delimitato da virgole
  6. Fai clic su Rimuovi.
  7. Fai clic su Fine per chiudere il riquadro.

Compattazione

Periodicamente, l'indice viene ricreato per tenere conto di tutti i nuovi aggiornamenti dall'ultima ricreazione. Questa ricreazione, o "compattazione", migliora le prestazioni e l'affidabilità delle query. Le compattazioni avvengono sia per gli aggiornamenti dei flussi di dati sia per gli aggiornamenti in batch.

  • Aggiornamento del flusso di dati: Vector Search utilizza metriche basate sull'euristica per determinare quando attivare la compattazione. Se i dati non compatti meno recenti risalgono a cinque giorni prima, la compattazione viene sempre attivata. Il costo per la ricreazione dell'indice ti viene addebitato alla stessa tariffa di un aggiornamento batch, oltre ai costi di aggiornamento dei flussi.

  • Aggiornamento batch: si verifica quando la dimensione incrementale del set di dati è maggiore del 20% rispetto alla dimensione del set di dati di base.

Ricrea ed esegui query sull'indice

Puoi inviare richieste di corrispondenza o di corrispondenza in batch come di consueto con l'interfaccia a riga di comando grpc, la libreria client o l'SDK Vertex AI per Python. Quando ricrei la query, puoi aspettarti di vedere gli aggiornamenti in pochi secondi. Per informazioni su come eseguire query su un indice, consulta Eseguire query sugli indici per ottenere i vicini più prossimi.

Campi facoltativi

Quando crei un indice, esistono alcuni campi facoltativi che puoi utilizzare per ottimizzare le query.

Esegui upsert con limitazioni

L'upsert dell'indice e l'aggiunta di una limitazione sono un modo per taggare i punti dati in modo che siano già identificati per essere filtrati al momento della query. Potresti voler aggiungere tag di limitazione per limitare i risultati visualizzati sui dati prima dell'invio di una query. Ad esempio, un cliente vuole eseguire una query su un indice, ma vuole assicurarsi che nei risultati vengano visualizzati solo gli elementi che corrispondono a "rosso" nella ricerca di calzature. Nell'esempio seguente, l'indice viene sottoposto all'upsert e filtra tutte le scarpe rosse, ma rifiuta quelle blu. In questo modo vengono garantiti i filtri di ricerca nelle migliori opzioni specifiche da un indice ampio e vario prima dell'esecuzione.

Oltre alle limitazioni dei token, l'esempio utilizza limitazioni numeriche. In questo caso, il punto dati è associato a un prezzo di 20, una lunghezza di 0,3 e una larghezza di 0,5. Al momento della query, puoi utilizzare queste limitazioni numeriche per filtrare i risultati e limitare i risultati della query ai valori di prezzo, lunghezza e larghezza. Ad esempio, questo punto dati verrebbe visualizzato in una query che applica un filtro per prezzo > 25, lunghezza < 1 e larghezza < 1.

Per scoprire di più sui filtri, consulta la sezione Ricerca vettoriale per l'indicizzazione.

Python

# Upsert datapoints
_TEST_DATAPOINT_1 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="3",
    feature_vector=[0.00526886899, -0.0198396724],
    restricts=[
        aiplatform_v1.types.index.IndexDatapoint.Restriction(namespace="Color", allow_list=["red"])
    ],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_int=1,
        )
    ],
)
_TEST_DATAPOINT_2 =  aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="4",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_double=0.1,
        )
    ],
    crowding_tag=aiplatform_v1.types.index.IndexDatapoint.CrowdingTag(crowding_attribute="crowding"),
)
_TEST_DATAPOINT_3 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="5",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)

_TEST_DATAPOINTS = [_TEST_DATAPOINT_1, _TEST_DATAPOINT_2, _TEST_DATAPOINT_3]

my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=_TEST_DATAPOINTS)

# Dynamic metadata update
_TEST_DATAPOINT_4 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="-2",
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)
my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=[_TEST_DATAPOINT4], update_mask=["all_restricts"])

curl

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${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}]
  }
]}'

Esegui upsert con affollamento

Il crowding tag limita risultati simili migliorando la diversità dei risultati. Il crowding è un vincolo di un elenco di vicini generato dalla ricerca del vicino più prossimo che richiede che non più di un certo valore di un gruppo di risultati restituiscano lo stesso valore di crowding_attribute. Per esempio, supponiamo che tu sia di nuovo tornato a comprare scarpe online. Vuoi vedere un'ampia varietà di colori nei risultati, ma potresti volerli utilizzare in un unico stile, ad esempio per gli scarpini da calcio. Puoi richiedere che vengano restituite non più di 3 paia di scarpe dello stesso colore impostando per_crowding_attribute_num_neighbors = 3 nella query, supponendo che imposti crowding_attribute sul colore delle scarpe durante l'inserimento del punto dati.

Questo campo rappresenta il numero massimo consentito di corrispondenze con lo stesso tag di crowding.

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${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"},
  }
]}'

Passaggi successivi