Genera incorporamenti vettoriali per i dati di testo in blocco utilizzando DML partizionato

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

Prerequisiti

Devi avere una tabella nel database Spanner che contenga dati testuali (STRING o JSON). Per ulteriori informazioni sull'importazione dei dati, consulta la panoramica dell'importazione e dell'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 NOT NULL,
  name STRING(MAX),
  description STRING(MAX)
) PRIMARY KEY(product_id);

PostgreSQL

CREATE TABLE Products (
  product_id INT8 NOT NULL,
  name TEXT,
  description TEXT,
  PRIMARY KEY(product_id)
);

Il tuo obiettivo è generare incorporamenti vettoriali per la colonna description in questa per trovare articoli simili da consigliare ai clienti per migliorare i loro acquisti con la ricerca vettoriale.

Registra un modello di incorporamento

GoogleSQL

Registra un modello di incorporamento con Vertex AI Endpoint textembedding-gecko nel tuo database Spanner:

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

PostgreSQL

Nel dialetto PostgreSQL, non è necessario registrare il modello. Devi passare il nome dell'endpoint direttamente alla chiamata di funzione spanner.ML_PREDICT_ROW.

Per le best practice, considera quanto segue:

  • Per mantenere l'isolamento delle quote, utilizza un endpoint in un progetto diverso generare ed eseguire il backfill degli incorporamenti rispetto all'endpoint di produzione. Prenota di produzione per gestire il traffico di produzione.
  • Assicurati che l'endpoint del modello supporti il valore di 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 sui Limite di default_batch_size per ogni regione; consulta Ottieni 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 potrebbe variare a seconda della versione del modello utilizzato; quale è per questo che vuoi evitare di utilizzare versioni del modello diverse per generare incorporamenti. nello stesso set di dati. Inoltre, l'aggiornamento della versione nel modello l'istruzione di definizione non aggiorna gli incorporamenti già generati con questo modello. Un modo per gestire la versione del modello per gli incorporamenti è crea una colonna aggiuntiva nella tabella in cui è archiviata la versione del modello.
  • I modelli textembedding-gecko ottimizzati personalizzati non sono supportati con GoogleSQL ML.PREDICT e PostgreSQL spanner.ML_PREDICT_ROW.

Testa l'integrazione end-to-end del modello degli incorporamenti

Puoi eseguire una query per verificare che il modello di incorporamento sia configurato correttamente, e gli incorporamenti. Ad esempio, esegui questa query:

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

PostgreSQL

SELECT spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
FROM Products
LIMIT 10;

Sostituisci quanto segue:

  • 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

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

Quindi, aggiorna lo schema della tabella di origine in modo da includere una colonna aggiuntiva dell'attributo 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

PostgreSQL

ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME real[];

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>;

PostgreSQL

ALTER TABLE Products
ADD COLUMN desc_embed real[];

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

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;

PostgreSQL

ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT8;

Aumenta la quota per Vertex AI

Potresti dover aumentare la quota dell'API Vertex AI per textembedding-gecko nella regione che utilizza il modello. A Per richiedere un aumento, consulta la sezione Aumenti delle quote di Vertex AI.

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

Incorporamenti di backfill

Infine, esegui la seguente istruzione UPDATE utilizzando un file DML partizionato generare incorporamenti per la colonna di dati testuali e archiviare gli incorporamenti nel tuo database. Puoi archiviare la versione del modello insieme agli incorporamenti. Me consigliamo di eseguire questa query durante una finestra di traffico ridotto nel tuo per configurare un 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: il numero massimo di righe per RPC
  • EMBEDDING_VERSION_COLUMN: la colonna che gestisce la versione del modello di incorporamento textembedding-gecko utilizzata per il backfill degli incorporamenti
  • MODEL_VERSION: la versione del modello di incorporamento textembedding-gecko
  • FILTER_CONDITION: una condizione di filtro partizionabile che vuoi applicare

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

PostgreSQL

UPDATE TABLE_NAME
SET 
  EMBEDDING_COLUMN_NAME = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION', 
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', DATA_COLUMN_NAME)))
  ) /*@ remote_udf_max_rows_per_rpc=MAX_ROWS */ ->'predictions'->0->'embeddings'->'values'),
  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
  • 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
  • MAX_ROWS: il numero massimo di righe per RPC
  • EMBEDDING_VERSION_COLUMN: la colonna che gestisce la versione del modello di incorporamento textembedding-gecko utilizzata per il backfill degli incorporamenti
  • FILTER_CONDITION: una condizione di filtro partizionabile che vuoi applicare

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.description AS content)
    ) @{remote_udf_max_rows_per_rpc=200}
  ),
  products.desc_embed_model_version = 3
WHERE products.desc_embed IS NULL;

PostgreSQL

UPDATE products
SET
  desc_embed = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@003', 
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description)))
  ) /*@ remote_udf_max_rows_per_rpc=200 */ ->'predictions'->0->'embeddings'->'values'),
  desc_embed_model_version = 3
WHERE desc_embed IS NULL;

Per le best practice, considera quanto segue:

  • Il timeout gRPC predefinito per l'API Spanner è di un'ora. A seconda della quantità di incorporamenti di cui esegui il backfill, potresti dover aumenta questo timeout per assicurarti che il DML partizionato UPDATE abbia per il completamento. Per ulteriori informazioni, vedi Configura timeout e nuovi tentativi personalizzati.

Rendimento e altre considerazioni

Considera quanto segue per ottimizzare il rendimento durante il backfill dell'incorporamento e i dati di Google Cloud.

Numero di nodi

Il DML partizionato esegue l'istruzione DML specificata su partizioni diverse parallelo. Per istanze con un numero elevato di nodi, potresti osservare la quota durante l'esecuzione di una DML partizionata. Se Vertex AI Le richieste API sono limitate a causa dei limiti di quota dell'API Vertex AI, Spanner ritenta questi errori nel modalità di transazione DML partizionata per un massimo di 20 volte. Se noti un tasso elevato di errori di quota in Vertex AI e aumenta la quota per Vertex AI. Puoi anche ottimizzare il parallelismo utilizzando il suggerimento a livello di dichiarazione @{pdml_max_parallelism=DESIRED_NUMBER} mentre utilizzi Google SQL. Le seguenti esempio imposta il parallelismo su "5":

GoogleSQL

@{pdml_max_parallelism=5} 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;

Dimensione del testo nella colonna di dati

Il modello di incorporamento di Vertex AI prevede dei limiti al numero massimo di token per ogni input di testo. Versioni diverse del modello hanno token diversi limiti. Ogni richiesta di Vertex AI può avere più testo di input ma esiste un limite al numero massimo di token presenti in un'unica richiesta. Per i database GoogleSQL, se rilevi un INVALID_ARGUMENT errore con la dicitura "La richiesta è troppo grande" prova a ridurre la dimensione del batch per evitare l'errore. Per farlo, puoi configurare default_batch_size oppure utilizza il suggerimento per query @{remote_udf_max_outstanding_rpcs} quando registri il modello.

Numero di richieste API inviate a Vertex AI

Puoi utilizzare il suggerimento per le query @{remote_udf_max_outstanding_rpcs} per aumentare di ridurre il numero di richieste inviate a Vertex AI Spanner. Tieni presente che l'aumento di questo limite può aumentare e utilizzo della memoria dell'istanza Spanner. Per GoogleSQL l'utilizzo di questo suggerimento per query sostituisce il 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 Vertex AI da Spanner utilizzando dashboard degli insight sul sistema.

Passaggi successivi