Ottimizza i costi delle funzioni AI con la distillazione dei modelli

Questo documento descrive come utilizzare la modalità ottimizzata per le funzioni AI gestite in BigQuery. Puoi utilizzare la modalità ottimizzata per elaborare set di dati su larga scala contenenti migliaia o persino 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. Questa ottimizzazione si applica solo alle funzioni AI.IF e AI.CLASSIFY.

Se vuoi impostare un limite al consumo totale di token per evitare sforamenti del budget, anziché ottimizzare l'efficienza dei token delle query, consulta Controlla i costi con le quote di token.

Per comprendere meglio il consumo di token, puoi visualizzare il numero di token utilizzati da una query nella consoleGoogle Cloud . Per stimare questo utilizzo prima di eseguire una query, utilizza la funzione AI.COUNT_TOKENS.

L'esempio seguente mostra come utilizzare la funzione AI.IF con la modalità ottimizzata per identificare articoli su disastri naturali, utilizzando text-embedding-005 come modello di embedding:

SELECT
  title,
  body,
  AI.IF(
    ('The following news story is about a natural disaster: ', body),
    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 is_natural_disaster
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 embedding, quindi puoi omettere questo argomento.

Per questo esempio, gli embedding vengono generati on-the-fly. In pratica, ti consigliamo di materializzare gli embedding 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 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 la modalità ottimizzata è attiva

  • 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 embedding dei dati come caratteristiche.
  • Controllo di qualità: BigQuery valuta l'accuratezza del modello sottoposto a distillazione rispetto ai risultati dell'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 utilizzare l'LLM remoto per righe specifiche per mantenere una qualità coerente o per righe prive di embedding validi.
  • Inferenza: il modello distillato elabora la maggior parte delle righe, riducendo in modo significativo 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.
  • Supporto delle funzioni: solo le funzioni AI.IF e AI.CLASSIFY supportano la modalità ottimizzata. Tuttavia, quando utilizzi la modalità ottimizzata con AI.CLASSIFY, le query possono non riuscire se la qualità del modello distillato non è sufficiente.
  • Rapporto di errore: l'argomento max_error_ratio non è supportato in modalità ottimizzata.

Prima di iniziare

Per ottenere le autorizzazioni necessarie per eseguire funzioni AI gestite in BigQuery, consulta Imposta le autorizzazioni per le funzioni di AI generativa che chiamano gli LLM di Gemini Enterprise Agent Platform.

Scegli un modello di embedding

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

Per ottenere il miglior rapporto qualità-prezzo e la massima scalabilità, ti consigliamo di calcolare gli embedding per i tuoi dati utilizzando un modello di embedding, come text-embedding-005 o gli embedding di Gemini per attività in inglese o multilingue. Per i dati multimodali (testo e immagini), ti consigliamo di utilizzare un modello di embedding multimodale come Gemini Embedding 2 (gemini-embedding-2).

Genera embedding

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

Generazione di embedding autonomi

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

L'esempio seguente 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 categorizzare 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 embedding esistente, specificala nell'argomento embeddings di AI.IF o AI.CLASSIFY. Puoi generarlo utilizzando la funzione AI.EMBED.

L'esempio seguente mostra come creare una tabella con una colonna di embedding, utilizzando text-embedding-005 come modello di embedding, e poi utilizzare la 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 di nomi di colonne e i relativi embedding corrispondenti nell'argomento embeddings. Ad esempio: embeddings => [('body', body_embedding), ('title', title_embedding)].

Monitora l'ottimizzazione delle query

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

Console

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

  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 workflow ottimizzato e i messaggi generati dal sistema che forniscono insight sullo stato dell'ottimizzazione.

Risoluzione dei problemi

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

Le dimensioni dei dati sono troppo piccole

Problema: dati insufficienti per l'addestramento del modello. Potresti visualizzare un messaggio di errore: Fail to apply cost optimizations because the number of rows to process is too small.

Soluzione: aumenta le dimensioni dell'input almeno fino al numero di righe mostrato nel messaggio di errore e verifica che gli embedding validi siano stati generati correttamente per tutte le righe.

Pochi o nessun campione in alcune classi

Problema: numero insufficiente di esempi per determinate categorie o casi durante la fase di campionamento, il che impedisce l'addestramento del modello.

  • Per la funzione AI.CLASSIFY, potresti visualizzare un messaggio di errore: Failed to apply cost optimizations because the random training sample did not contain enough examples of all categories.
  • Per la funzione AI.IF, potresti visualizzare un messaggio di errore: Failed to apply cost optimizations because the random training sample did not include enough examples of both true/false cases.

Soluzione:

  • Per AI.CLASSIFY:
    • Rimuovi le categorie rare o vuote dalla chiamata di funzione AI.CLASSIFY.
    • Raggruppa le categorie rare in una più ampia per aumentare le dimensioni del campione. Puoi utilizzare una categoria OTHER per raggruppare gli elementi non coperti da categorie più specifiche. Tuttavia, non aggiungere OTHER se l'elenco delle categorie è già completo, poiché questo termine è ambiguo e potrebbe causare confusione.
  • Per AI.IF: aggiorna la condizione di filtro del prompt in modo che i casi true e false siano ben rappresentati nelle righe di input. Questo errore può essere causato da una condizione che corrisponde a quasi tutte le righe o a quasi nessuna riga.

Gli embedding hanno dimensioni incoerenti

Problema: incoerenze tra le dimensioni degli embedding nelle righe. Potresti visualizzare un messaggio di errore: Failed to apply cost optimizations because the embeddings have inconsistent dimensions.

Soluzione: verifica che tutti gli embedding siano generati dallo stesso modello e abbiano la stessa lunghezza del vettore di embedding. Puoi utilizzare una query SQL simile alla seguente per verificare che gli embedding 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 accuratezza elevata. Potrebbe essere mostrato uno dei seguenti messaggi di errore:

  • Fail to apply cost optimizations because the distilled model does not approximate LLM behavior well enough for some categories.
  • Fail to apply cost optimization because the prompt complexity is too high.

Soluzione:

  • Se il messaggio di errore elenca categorie con punteggi F1 bassi, concentrati prima su queste categorie. Perfeziona i nomi e le descrizioni in modo che siano chiaramente distinti dalle altre categorie.

  • Utilizza un insieme di categorie che formano una partizione. Assicurati che le categorie abbiano una sovrapposizione minima e coprano tutti i possibili input.

    • Evita categorie sovrapposte in cui un input potrebbe appartenere a più categorie contemporaneamente. Ad esempio, evita categorie come ['terrible', 'bad', 'okay', 'good', 'excellent'].
    • Evita lacune in cui non si applicano categorie. Ad esempio, l'elenco delle categorie ['bad', 'average'] non copre una recensione che esprime elogi.
    • 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 gemini-embedding-2.

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

Numero imprevisto di righe elaborate dall'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. Le cause potrebbero essere:

  • Il modello distillato è stato addestrato correttamente, ma in alcune righe mancavano gli embedding. Queste righe vengono elaborate dall'LLM remoto.
  • Non è stato possibile applicare il modello distillato per ogni riga ed è stato necessario tornare all'LLM remoto per mantenere una qualità costante.

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

Colonna di embedding autonomo non rilevata

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

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

Passaggi successivi