Genera collettivamente incorporamenti vettoriali per dati testuali utilizzando DML partizionato

Questo documento spiega come generare e eseguire il backfill di incorporamenti vettoriali in blocco per i dati testuali (STRING o JSON) archiviati in Spanner utilizzando SQL e il modello textembedding-gecko di Vertex AI.

Prerequisiti

Nel database Spanner deve essere presente una tabella contenente dati di testo (STRING o JSON). Per saperne di più sull'importazione dei dati, consulta la panoramica su importazione ed esportazione di Spanner.

Caso d'uso di esempio

Supponi di avere una tabella in Spanner con il seguente schema. Questa tabella contiene milioni di record.

GoogleSQL

CREATE TABLE Products (
  product_id INT64,
  name STRING(MAX),
  description STRING(MAX)
) PRIMARY KEY(product_id);

Il tuo obiettivo è generare incorporamenti vettoriali per la colonna description di questa tabella al fine di trovare articoli simili da consigliare ai clienti per migliorare la loro esperienza di acquisto utilizzando la ricerca vettoriale.

Registra un modello di incorporamento

Innanzitutto, devi registrare un modello di incorporamento con l'endpoint textembedding-gecko Vertex AI nel tuo database Spanner:

GoogleSQL

CREATE MODEL MODEL_NAME
INPUT(
  content STRING(MAX)
)
OUTPUT(
  embeddings STRUCT<values ARRAY<FLOAT32>>
)
REMOTE OPTIONS(
    endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
  default_batch_size = 5
)

Sostituisci quanto segue:

  • MODEL_NAME: il nome del modello di incorporamento
  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento textembedding-gecko

Per le best practice, tieni presente quanto segue:

  • Per mantenere l'isolamento delle quote, utilizza un endpoint in un progetto diverso per generare e eseguire il backfill di incorporamenti rispetto all'endpoint di produzione. Prenotare l'endpoint di produzione per gestire il traffico di produzione.
  • Assicurati che l'endpoint del modello supporti il valore default_batch_size. Puoi eseguire l'override di default_batch_size con il suggerimento per la query @{remote_udf_max_rows_per_rpc=NEW_NUMBER}. Per informazioni sul limite default_batch_size per ogni regione, consulta Ottenere incorporamenti di testo per uno snippet di testo.
  • Definisci l'endpoint con una versione specifica del modello (ad es. @003) anziché @latest. Questo perché i vettori di incorporamento generati per la stessa porzione di testo potrebbero variare a seconda della versione del modello che utilizzi. È per questo che conviene evitare di utilizzare versioni di modelli diverse per generare incorporamenti nello stesso set di dati. Inoltre, l'aggiornamento della versione del modello nell'istruzione di definizione del modello non comporta l'aggiornamento degli incorporamenti già generati con questo modello. Un modo per gestire la versione del modello per gli incorporamenti è creare una colonna aggiuntiva nella tabella in cui è archiviata la versione del modello.
  • I modelli textembedding-gecko ottimizzati personalizzati non sono supportati con la funzione ML.PREDICT di GoogleSQL.

Testare l'integrazione end-to-end del modello di incorporamenti

Dopo aver registrato un modello di incorporamento, puoi eseguire una query utilizzando il modello textembedding-gecko definito con ML.PREDICT per verificare che il modello di incorporamento sia stato configurato correttamente e che gli incorporamenti vengano recuperati. Ad esempio, esegui la query seguente:

GoogleSQL

SELECT embeddings.values
FROM SAFE.ML.PREDICT(
      MODEL MODEL_NAME, (
        SELECT description AS CONTENT FROM products LIMIT 10)
      );

Sostituisci quanto segue:

  • MODEL_NAME: il nome del modello di incorporamento

Aggiorna la tabella di origine in modo da includere colonne aggiuntive per archiviare gli incorporamenti

A questo punto, aggiorna lo schema della tabella di origine in modo da includere una colonna aggiuntiva del tipo di dati ARRAY<FLOAT32> per archiviare gli incorporamenti generati:

GoogleSQL

ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;

Sostituisci quanto segue:

  • TABLE_NAME: il nome della tabella di origine
  • EMBEDDING_COLUMN_NAME: il nome della colonna in cui vuoi aggiungere gli incorporamenti generati

Ad esempio, utilizzando l'esempio di tabella products, esegui:

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;

Puoi aggiungere un'altra colonna per gestire la versione del modello di incorporamento.

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;

Aumenta la quota per Vertex AI

Potrebbe essere necessario aumentare la quota dell'API Vertex AI per textembedding-gecko nella regione che utilizza il modello. Per richiedere un aumento, consulta Aumenti di quota di Vertex AI.

Per maggiori informazioni, consulta Quote e limiti di Vertex AI.

Incorporamenti backfill

Infine, esegui la seguente istruzione UPDATE utilizzando un codice DML partizionato per generare incorporamenti per la colonna di dati testuali e archiviare gli incorporamenti nel tuo database. Puoi archiviare la versione del modello insieme agli incorporamenti. Ti consigliamo di eseguire questa query durante una finestra di traffico ridotto nel tuo database.

GoogleSQL

UPDATE TABLE_NAME
SET TABLE_NAME.EMBEDDING_COLUMN_NAME =(
      SELECT embeddings.values
      FROM SAFE.ML.PREDICT(MODEL MODEL_NAME, (
            SELECT TABLE_NAME.DATA_COLUMN_NAME AS CONTENT)
            )
          @{remote_udf_max_rows_per_rpc=MAX_ROWS}
),
TABLE_NAME.EMBEDDING_VERSION_COLUMN = MODEL_VERSION
WHERE FILTER_CONDITION;

Sostituisci quanto segue:

  • TABLE_NAME: il nome della tabella con i dati testuali
  • EMBEDDING_COLUMN_NAME: il nome della colonna in cui vuoi aggiungere gli incorporamenti generati
  • DATA_COLUMN_NAME: il nome della colonna con i dati testuali
  • MODEL_NAME: il nome del modello di incorporamento
  • MAX_ROWS: numero massimo di righe per RPC
  • EMBEDDING_VERSION_COLUMN: la colonna che gestisce la versione del modello di incorporamento textembedding-gecko utilizzato per il backfill degli incorporamenti
  • MODEL_VERSION: la versione del modello di incorporamento textembedding-gecko
  • FILTER_CONDITION: una condizione di filtro partizionabile da applicare

L'utilizzo di SAFE.ML.PREDICT restituisce NULL per le richieste non riuscite. Puoi anche utilizzare SAFE.ML.PREDICT in combinazione con un filtro WHERE embedding_column IS NULL per eseguire nuovamente la query senza calcolare gli incorporamenti per i campi già calcolati.

Esempio di query di backfill per la tabella products:

GoogleSQL

UPDATE products
SET products.desc_embed =(
  SELECT embeddings.values
  FROM SAFE.ML.PREDICT(MODEL gecko_model, (
        SELECT products.value AS CONTENT
        )
  )
      @{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 003
WHERE products.desc_embed IS NULL;

Per le best practice, tieni presente quanto segue:

  • Il timeout gRPC predefinito per l'API Spanner è di un'ora. A seconda della quantità di incorporamenti di cui esegui il backfill, potrebbe essere necessario aumentare questo timeout per assicurarti che il DML partizionato UPDATE abbia un tempo sufficiente per il completamento. Per maggiori informazioni, consulta Configurare timeout e nuovi tentativi personalizzati.
  • Puoi utilizzare un codice DML partizionato solo per archiviare gli incorporamenti generati nella stessa tabella dei dati di origine.

Prestazioni e altre considerazioni

Valuta quanto segue per ottimizzare le prestazioni durante il backfill dei dati di incorporamento.

Numero di nodi

Un codice DML partizionato esegue l'istruzione DML specificata su diverse partizioni in parallelo. Per le istanze con un numero elevato di nodi, potresti notare errori di quota durante l'esecuzione di DML partizionato. Se le richieste API Vertex AI vengono limitate a causa dei limiti di quota dell'API Vertex AI, Spanner riprova a questi errori nella modalità di transazione DML partizionata per un massimo di 20 volte. Se noti un'elevata percentuale di errori di quota in Vertex AI, aumenta la quota per Vertex AI.

Dimensioni del testo nella colonna di dati

Il modello di incorporamento di Vertex AI prevede dei limiti per il numero massimo di token per ogni input di testo. Versioni diverse del modello hanno limiti di token diversi. Ogni richiesta di Vertex AI può avere più campi di testo di input, ma esiste un limite al numero massimo di token presenti in una singola richiesta. Per i database GoogleSQL, se si verifica un errore INVALID_ARGUMENT con un messaggio "La richiesta è troppo grande", prova a ridurre le dimensioni del batch per evitare l'errore. A questo scopo, puoi configurare default_batch_size o utilizzare il suggerimento per le query remote_udf_max_rows_per_rpc durante la registrazione del modello.

Numero di richieste API inviate a Vertex AI

Puoi utilizzare il suggerimento per le query @{remote_udf_max_outstanding_rpcs} per aumentare o diminuire il numero di richieste inviate a Vertex AI da Spanner. Tieni presente che l'aumento di questo limite può aumentare l'utilizzo di CPU e memoria dell'istanza Spanner. Per i database GoogleSQL, l'utilizzo di questo suggerimento per le query esegue l'override del valore default_batch_size configurato per il modello.

Monitora l'avanzamento del backfill

Puoi monitorare il numero di richieste, la latenza e i byte di rete inviati a Vertex AI da Spanner utilizzando la dashboard degli insight di sistema.

Passaggi successivi