Ottimizzare i costi delle funzioni AI

Questo documento descrive come utilizzare la modalità ottimizzata per le funzioni AI gestite in BigQuery. Questa modalità consente di elaborare set di dati su larga scala contenenti migliaia o addirittura miliardi di righe con un consumo di token del modello linguistico di grandi dimensioni (LLM) e una latenza delle query notevolmente ridotti rispetto all'inferenza LLM standard per riga.

L'esempio seguente mostra come utilizzare la funzione AI.CLASSIFY con la modalità ottimizzata per classificare gli articoli di notizie, utilizzando text-embedding-005 come modello di incorporamento:

SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other'],
    embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
    -- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
    optimization_mode => 'MINIMIZE_COST'
   ) AS category
FROM
  `bigquery-public-data.bbc_news.fulltext`;

L'argomento optimization_mode => 'MINIMIZE_COST' attiva la modalità ottimizzata. Questa è l'impostazione predefinita quando vengono forniti gli incorporamenti, quindi puoi omettere questo argomento.

Per questo esempio, gli embedding vengono generati al volo. In pratica, ti consigliamo di materializzare gli incorporamenti in modo che possano essere riutilizzati.

Come funziona la modalità ottimizzata

Le funzioni AI gestite, AI.IF e AI.CLASSIFY, in genere chiamano un LLM remoto per ogni riga del tuo set di dati. Quando utilizzi la modalità ottimizzata, BigQuery addestra automaticamente un modello leggero e distillato durante l'esecuzione della query.

La procedura funziona nel seguente modo:

Workflow della funzione AI quando è attivata la modalità ottimizzata

  • Campionamento ed etichettatura: BigQuery seleziona un piccolo campione rappresentativo dei tuoi dati e chiama Gemini per fornire le etichette.
  • Addestramento del modello distillato: un modello distillato locale viene addestrato just-in-time utilizzando le etichette LLM e gli incorporamenti di dati come funzionalità.
  • Controllo qualità: BigQuery valuta l'accuratezza del modello distillato rispetto ai risultati del LLM. Per impostazione predefinita, se il modello distillato non soddisfa la soglia di qualità richiesta, la query non va a buon fine e viene visualizzato un errore che spiega perché il modello è stato scartato. Se il modello è di qualità accettabile, BigQuery potrebbe comunque ricorrere all'LLM remoto per righe specifiche per mantenere una qualità coerente o per righe prive di incorporamenti validi.
  • Inferenza: il modello distillato elabora la maggior parte delle righe, riducendo significativamente il numero di chiamate a Gemini.

Limitazioni

La modalità ottimizzata presenta le seguenti limitazioni:

  • Numero minimo di righe: l'input della funzione AI deve contenere circa 3000 righe per garantire dati sufficienti per l'addestramento del modello.
  • Tipi di dati: per i prompt che fanno riferimento a più colonne, per l'ottimizzazione sono supportate solo le colonne di tipo stringa.
  • Classificazione multi-etichetta: AI.CLASSIFY con output_mode => 'multi' non è supportato in modalità ottimizzata.
  • Supporto delle funzioni: solo le funzioni AI.IF e AI.CLASSIFY supportano la modalità ottimizzata.
  • Rapporto errori: l'argomento max_error_ratio non è supportato in modalità ottimizzata.

Prima di iniziare

Per ottenere le autorizzazioni necessarie per eseguire le funzioni di AI gestite in BigQuery, consulta Impostare le autorizzazioni per le funzioni di AI generativa che chiamano i LLM di Vertex AI.

Scegliere un modello di incorporamento

Per utilizzare la modalità ottimizzata, devi calcolare gli incorporamenti per i tuoi dati e fornirli alla funzione AI. Affinché le colonne di input abbiano incorporamenti associati, tutte le righe devono avere dimensioni di incorporamento coerenti ed essere generate dallo stesso modello di incorporamento.

Per ottenere costi, qualità e scalabilità ottimali, ti consigliamo di calcolare gli incorporamenti per i tuoi dati utilizzando un modello di incorporamento, ad esempio text-embedding-005 o gli incorporamenti Gemini per attività in inglese o multilingue. Per i dati multimodali (testo e immagini), utilizza un modello di embedding multimodale come multimodalembedding@001.

Genera embedding

Puoi calcolare gli incorporamenti per i tuoi dati utilizzando la generazione autonoma gestita da BigQuery o creando manualmente le colonne di incorporamento. Le sezioni seguenti descrivono come utilizzare entrambi gli approcci con le funzioni AI.CLASSIFY e AI.IF.

Generazione autonoma di embedding

Se utilizzi la generazione autonoma di incorporamenti, BigQuery utilizza automaticamente gli incorporamenti quando vengono chiamati AI.IF o AI.CLASSIFY. Questo è l'approccio consigliato, ma è limitato a una colonna di incorporamento per tabella.

Il seguente esempio crea una tabella con una colonna di embedding generata autonomamente, utilizzando text-embedding-005 come modello di embedding, quindi utilizza la funzione AI.CLASSIFY per classificare i dati:

-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
  title STRING,
  body STRING,
  body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        body,
        connection_id => '<my_connection_id>',
        task_type => 'CLASSIFICATION',
        endpoint => 'text-embedding-005')
    ) STORED
    OPTIONS(asynchronous = TRUE)
);

-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other']
  ) AS category
FROM
  my_dataset.bbc_news;

Specifica manuale delle colonne

Se hai una colonna di incorporamento esistente, specificala nell'argomento embeddings di AI.IF o AI.CLASSIFY. Puoi generarlo utilizzando la funzione AI.EMBED.

Il seguente esempio mostra come creare una tabella con una colonna di incorporamento, utilizzando text-embedding-005 come modello di incorporamento, e poi utilizzare questa colonna in una query AI.CLASSIFY:

-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
  title,
  body,
  AI.EMBED(
    body,
    endpoint => 'text-embedding-005',
    task_type => 'CLASSIFICATION'
  ).result AS body_embedding
FROM
  `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other'],
    embeddings => body_embedding,
  ) AS category
FROM
  my_dataset.bbc_news;

Se il prompt fa riferimento a più colonne, fornisci un elenco dei nomi delle colonne e i relativi incorporamenti nell'argomento embeddings. Ad esempio: embeddings => [('body', body_embedding), ('title', title_embedding)].

Monitorare l'ottimizzazione delle query

Per verificare il numero di righe ottimizzate durante l'esecuzione della query, puoi visualizzare le statistiche di esecuzione nella Google Cloud console o tramite l'API:

Console

Per visualizzare il numero di righe ottimizzate e i messaggi di sistema sullo stato dell'ottimizzazione:

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel menu di navigazione, fai clic su Esplora job.

  3. Fai clic sull'ID job per visualizzare il riquadro Dettagli job.

  4. Fai clic sulla scheda Informazioni job e visualizza le metriche e lo stato nel campo Ottimizzazioni delle funzioni AI generativa.

    Campo Ottimizzazioni delle funzioni AI generativa nella scheda Informazioni sul job

API

Controlla FunctionGenAiCostOptimizationStats nell'oggetto GenAIFunctionStats dei metadati del job. Questo oggetto include il numero di righe dedotte tramite il flusso di lavoro ottimizzato e i messaggi generati dal sistema che forniscono approfondimenti sullo stato di ottimizzazione.

Risoluzione dei problemi

Le sezioni seguenti spiegano come diagnosticare e risolvere i problemi comuni relativi all'utilizzo della modalità ottimizzata.

La dimensione dei dati è troppo piccola

Problema: dati insufficienti per l'addestramento del modello. Potresti visualizzare il seguente messaggio di errore: Fail to apply cost optimization because the data size is too small.

Soluzione: aumenta le dimensioni dell'input a circa 3000 righe e verifica che gli incorporamenti validi siano stati generati correttamente per tutte le righe.

Pochi o nessun campione in alcune classi

Problema: numero insufficiente di campioni per determinate categorie durante la fase di campionamento, il che impedisce l'addestramento del modello. Potresti visualizzare il seguente messaggio di errore: Fail to apply cost optimization because some classes have few or no samples.

Soluzione:

  • Rimuovi le categorie rare dalla chiamata di funzione AI.CLASSIFY.
  • Combina più categorie rare in una categoria più ampia per aumentare le dimensioni del campione nella categoria combinata. Ad esempio, combina più categorie rare in una categoria OTHER.

Gli incorporamenti hanno dimensioni incoerenti

Problema: incoerenze tra le dimensioni di incorporamento nelle righe. Potresti visualizzare il seguente messaggio di errore: Fail to apply cost optimization because the embeddings have inconsistent dimensions.

Soluzione: verifica che gli incorporamenti siano generati dallo stesso modello e abbiano la stessa lunghezza del vettore di incorporamento. Puoi utilizzare una query SQL simile alla seguente per verificare che gli incorporamenti in una colonna abbiano la stessa lunghezza:

SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;

La complessità del prompt è troppo elevata

Problema: il modello distillato non riesce a raggiungere una soglia di precisione elevata. Potresti visualizzare il seguente messaggio di errore: Fail to apply cost optimization because the prompt complexity is too high.

Soluzione:

  • Utilizza categorie che si escludono a vicenda.

    • Evita categorie sovrapposte in cui un input potrebbe appartenere a più categorie contemporaneamente. Ad esempio, evita categorie come ['terrible', 'bad', 'okay', 'good', 'excellent'].
    • Fornisci descrizioni delle categorie per aiutare l'LLM a risolvere l'ambiguità tra le categorie. Ad esempio:

      AI.CLASSIFY(
        review,
        categories => [
          ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'),
          ('bad', 'Review where customer was not happy but suggested improvements to the product'),
          ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'),
          ('good', 'Review where customers were happy using this product but had minor critiques'),
          ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')],
        embeddings => review_embeddings)
      
  • Prova modelli di embedding più avanzati come text-embedding-005 o multimodalembedding.

  • Contatta bqml-feedback@google.com per ulteriore assistenza per il debug.

Numero imprevisto di righe elaborate dal modello LLM

Problema: le statistiche di esecuzione delle query mostrano che un numero inaspettatamente elevato di righe è stato elaborato dall'LLM remoto anziché dal modello distillato. Ciò potrebbe essere dovuto ai seguenti motivi:

  • L'addestramento del modello distillato è stato completato, ma in alcune righe mancano incorporamenti. Queste righe vengono elaborate dal modello LLM remoto.
  • Il modello distillato non è stato applicato a ogni riga ed è stato necessario ricorrere all'LLM remoto per mantenere una qualità coerente.

Soluzione: verifica che gli embedding siano generati correttamente e siano validi per tutte le righe dei dati. Se il problema persiste, contatta bqml-feedback@google.com per il debug.

Colonna di incorporamento autonomo non rilevata

Problema: BigQuery non riesce a rilevare una colonna di incorporamento autonomo. Ciò può verificarsi se lo script utilizza una tabella temporanea e il riferimento alla tabella originale viene perso.

Soluzione: utilizza il parametro embeddings per trasmettere esplicitamente una colonna di incorporamento autonoma, ad esempio embeddings => content_embedding.result, che attiva l'ottimizzazione dei costi.

Passaggi successivi