Generazione autonoma di embedding

Questo documento descrive come utilizzare la generazione autonoma di embedding per i tuoi dati, che consente a BigQuery di gestire una colonna di embedding in una tabella in base a una colonna di origine. Quando aggiungi o modifichi i dati nella colonna di origine, BigQuery genera o aggiorna automaticamente la colonna di embedding per questi dati utilizzando un modello di embedding di Vertex AI. Questa funzionalità è utile se vuoi consentire a BigQuery di gestire gli embedding quando i dati di origine vengono aggiornati regolarmente.

Gli embedding sono utili per le moderne applicazioni di AI generativa come la Retrieval Augmented Generation (RAG), ma possono essere complessi da creare, gestire ed eseguire query. Puoi utilizzare la generazione autonoma di embedding per semplificare il processo di creazione, gestione ed esecuzione di query sugli embedding da utilizzare nelle ricerche di somiglianza e in altre applicazioni di AI generativa.

Ad esempio, puoi utilizzare query simili alle seguenti per creare una tabella con la generazione autonoma di embedding abilitata, inserire i dati ed eseguire una ricerca semantica:

CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(description, connection_id => 'us.example_connection',
        endpoint => 'text-embedding-005'))
    STORED OPTIONS( asynchronous = TRUE ));

# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
  ('Super slingers', 'An exciting board game for the whole family'), ...;

SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', 'A really fun toy');

Prima di iniziare

Per abilitare la generazione autonoma di embedding in una tabella, devi disporre delle autorizzazioni e della connessione necessarie e abilitare l'API Vertex AI per il tuo progetto.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per abilitare la generazione autonoma di embedding, chiedi all'amministratore di concederti i seguenti ruoli IAM:

  • Per utilizzare una risorsa di connessione: Utente connessioni BigQuery (roles/bigquery.connectionUser) nella connessione
  • Per creare una tabella: Editor dati BigQuery (roles/bigquery.dataEditor) nella tabella
  • Concedi al account di servizio della connessione il seguente ruolo in modo che possa accedere ai modelli ospitati negli endpoint Vertex AI: Utente Vertex AI (roles/aiplatform.user) nel progetto che contiene la connessione

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Crea una connessione e concedi l'autorizzazione a un account di servizio

Per abilitare la generazione autonoma di embedding in una tabella, devi creare una connessione alle risorse Cloud. Quindi, concedi il ruolo Utente Vertex AI (roles/aiplatform.user) al account di servizio creato quando hai creato la connessione.

Crea una tabella con la generazione autonoma di embedding

Puoi utilizzare la generazione autonoma di embedding per generare embedding utilizzando la AI.EMBED funzione in un' CREATE TABLE istruzione.

CREATE TABLE DATASET_ID.TABLE (
  [COLUMN, ...]
  STRING_COL STRING,
  EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        STRING_COL,
        connection_id => CONNECTION_ID,
        endpoint => ENDPOINT)
    )
    STORED OPTIONS (asynchronous = TRUE)
);

Sostituisci quanto segue:

  • DATASET_ID: il nome del set di dati in cui vuoi creare la tabella.
  • TABLE: il nome della tabella su cui creare la generazione autonoma di embedding.
  • COLUMN, ...: tutte le colonne che la tabella deve contenere oltre alla colonna di cui vuoi eseguire automaticamente l'embedding.
  • STRING_COL: il nome della colonna STRING di cui vuoi eseguire automaticamente l'embedding.
  • EMBEDDING_COL_NAME: il nome della colonna di embedding generata automaticamente.
  • CONNECTION_ID: un valore STRING che contiene il nome di una connessione da utilizzare, ad esempio my_project.us.example_connection. Devi concedere il ruolo Utente Vertex AI al account di servizio della connessione nel progetto in cui crei la tabella.
  • ENDPOINT: un valore STRING che specifica un endpoint del modello di embedding di testo Vertex AI supportato da utilizzare per il modello di embedding di testo. Il valore dell'endpoint specificato deve includere la versione del modello, ad esempio text-embedding-005. Se specifichi il nome del modello anziché un URL, BigQuery ML identifica automaticamente il modello e utilizza l'endpoint completo del modello.

Il job di generazione di embedding in background viene avviato poco dopo la creazione della tabella o dopo l'aggiornamento dei dati nella colonna di origine.

Per monitorare l'avanzamento della generazione di embedding, puoi utilizzare una query simile alla seguente:

SELECT
  COUNT(*) AS total_num_rows,
  COUNTIF(description_embedding IS NOT NULL
          AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
  PROJECT_ID.DATASET_ID.TABLE;

Dopo aver creato la tabella con gli embedding, puoi creare un indice vettoriale nella colonna STRUCT che contiene l'embedding generato automaticamente.

Esempio

Supponiamo che tu sia un grande rivenditore che vende molti prodotti diversi. Hai una tabella di nomi e descrizioni dei prodotti e vuoi aiutare i clienti a trovare i prodotti che stanno cercando. Le seguenti query mostrano come configurare la generazione autonoma di embedding per facilitare la ricerca semantica delle descrizioni dei prodotti.

Innanzitutto, crea un set di dati:

CREATE SCHEMA mydataset;

Quindi, crea una tabella con la generazione autonoma di embedding abilitata per contenere le informazioni sui prodotti. La colonna generata automaticamente si chiama description_embedding e si basa sulla colonna description.

# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (AI.EMBED(
      description,
      connection_id => 'us.example_connection',
      endpoint => 'text-embedding-005'
    ))
    STORED OPTIONS( asynchronous = TRUE )
);

La seguente query inserisce alcuni nomi e descrizioni dei prodotti nella tabella. Non specificare un valore per description_embedding perché viene generato automaticamente.

# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Lounger chair", "A comfortable chair for relaxing in."),
  ("Super slingers", "An exciting board game for the whole family."),
  ("Encyclopedia set", "A collection of informational books.");

Facoltativamente, puoi creare un indice vettoriale nella tabella per velocizzare la ricerca. Un indice vettoriale richiede più di tre righe, quindi la seguente query presuppone che tu abbia inserito dati aggiuntivi. Ogni volta che inserisci i dati, la colonna description_embedding viene aggiornata automaticamente.

CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');

Infine, puoi utilizzare la AI.SEARCH funzione per eseguire una ricerca semantica dei tuoi prodotti per trovare un giocattolo divertente:

# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

/*------------------+----------------------------------------------+----------------------+
 | name             | description                                  | distance             |
 +------------------+----------------------------------------------+----------------------+
 | Super slingers   | An exciting board game for the whole family. | 0.80954913893618929  |
 | Lounger chair    | A comfortable chair for relaxing in.         | 0.938933930620146    |
 | Encyclopedia set | A collection of informational books.         | 1.1119297739353384   |
 +------------------+----------------------------------------------+----------------------*/

Ottieni informazioni sulle colonne di embedding generate automaticamente

Per verificare che una colonna sia una colonna di embedding generata automaticamente, esegui una query sulla visualizzazione the INFORMATION_SCHEMA.COLUMNS view.

La seguente query mostra informazioni su tutte le colonne di embedding generate automaticamente:

SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';

Il campo generation_expression mostra la chiamata alla funzione AI.EMBED utilizzata per generare gli embedding nella colonna.

Utilizza la tua prenotazione

Per impostazione predefinita, BigQuery utilizza gli slot on demand per gestire l'elaborazione necessaria per gestire la colonna di embedding generata. Per garantire prestazioni prevedibili e coerenti, puoi facoltativamente creare una prenotazione e impostare job_type su BACKGROUND. Quando è presente una prenotazione in background, BigQuery la utilizza per gestire la colonna di embedding generata.

Risoluzione dei problemi

La colonna di embedding generata contiene due campi: result e status. Se si verifica un errore quando BigQuery tenta di generare un embedding per una determinata riga della tabella, il campo result è NULL e il campo status descrive l'errore. Ad esempio, se la colonna di origine è NULL allora l'embedding result è anche NULL e lo stato è NULL value is not supported for embedding generation.

Un errore più grave può bloccare la generazione di embedding. In questo caso, puoi eseguire una query sulla INFORMATION_SCHEMA.JOBS visualizzazione per il job in background e consultare le informazioni nel campo error_result. L'ID job di un job di embedding in background ha il prefisso gc_. Ad esempio, la seguente query estrae tutti i job in background il cui risultato di errore non è NULL:

SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
  SELECT 1
  FROM unnest(j.referenced_tables) t
  WHERE
    j.project_id = 'PROJECT_ID'
    AND t.dataset_id = 'DATASET_ID'
    AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;

Monitora i costi

La generazione autonoma di embedding invia richieste a Vertex AI, che può comportare costi. Per monitorare i costi di Vertex AI sostenuti dai job di embedding in background:

  1. Visualizza i report sulla fatturazione in Fatturazione Cloud.
  2. Utilizza i filtri per perfezionare i risultati.

    Per i servizi, seleziona Vertex AI.

  3. Per visualizzare gli addebiti per un job specifico, filtra per etichetta.

    Imposta la chiave su bigquery_ml_job e il valore sull' ID job del job di embedding. Tutti i job di embedding in background hanno il prefisso gc_.

Potrebbero essere necessarie fino a 24 ore prima che alcuni addebiti vengano visualizzati in Fatturazione Cloud.

Limitazioni

  • Ogni tabella supporta al massimo una colonna di embedding generata automaticamente.
  • Le operazioni DML simultanee possono causare ritardi ed errori temporanei nella generazione di embedding. Per migliorare il rendimento e ridurre i costi, ti consigliamo di inserire i dati in batch ed evitare aggiornamenti DML frequenti.
  • Se utilizzi l'API BigQuery Storage Write per l'importazione dei dati, potrebbero verificarsi alcuni ritardi prima dell'avvio della generazione di embedding.
  • Non è indicato che una colonna viene generata automaticamente quando visualizzi lo schema di una tabella utilizzando la console, il comando bq show o il campo ddl della visualizzazione INFORMATION_SCHEMA.TABLES. Google Cloud
  • Non puoi aggiungere colonne di embedding generate a una tabella esistente utilizzando ALTER TABLE ADD COLUMN.
  • Se crei una copia, un clone o uno snapshot di una tabella con una colonna di embedding generata, vengono copiati solo i dati. La configurazione di generazione non si applica alla nuova tabella e gli aggiornamenti alla colonna di origine della nuova tabella non generano nuovi embedding.
  • Se ripristini da uno snapshot una tabella per cui era abilitata la generazione autonoma di embedding, la configurazione di generazione di embedding non viene ripristinata.
  • Puoi creare colonne di embedding generate solo utilizzando SQL. Non puoi utilizzare i comandi bq mk o bq update per creare colonne di embedding generate.
  • La colonna di origine della colonna generata deve essere una colonna STRING.
  • Dopo aver creato la colonna di embedding generata, si applicano le seguenti limitazioni:

    • Non puoi eliminare o rinominare la colonna di origine, ma puoi comunque eliminare o rinominare la colonna di embedding generata. Se elimini la colonna di embedding, puoi eliminare o rinominare la colonna di origine.
    • Non puoi modificare il tipo di dati della colonna di origine o della colonna di embedding generata.
  • Non puoi specificare valori predefiniti per le colonne di embedding generate automaticamente.

  • Non puoi scrivere direttamente nelle colonne di embedding generate utilizzando questi metodi:

    • DML
    • Scritture di streaming
    • bq insert
    • bq copy -a
  • Le tabelle con colonne di embedding generate non supportano le policy di sicurezza a livello di colonna, come i tag di policy.

  • Quando chiami una funzione di ricerca, ad esempio VECTOR_SEARCH o AI.SEARCH, le righe con embedding mancanti nella tabella di base vengono ignorate durante la ricerca.

  • Non puoi creare un indice vettoriale partizionato in una tabella per cui è abilitata la generazione autonoma di embedding.

  • Se crei un indice vettoriale nella colonna di embedding generata automaticamente, l'addestramento dell'indice inizia dopo che è stato generato l'embedding per almeno l'80% delle righe. Puoi utilizzare la seguente query per verificare la percentuale di embedding generati nella tabella:

    SELECT
      COUNTIF(description_embedding IS NOT NULL
      AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent
    FROM PROJECT_ID.DATASET_ID.TABLE;
    

Passaggi successivi