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:

- 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.IFeAI.CLASSIFYsupportano la modalità ottimizzata. Tuttavia, quando utilizzi la modalità ottimizzata conAI.CLASSIFY, le query possono non riuscire se la qualità del modello distillato non è sufficiente. - Rapporto di errore: l'argomento
max_error_rationon è 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:
Nella console Google Cloud , vai alla pagina BigQuery.
Nel menu di navigazione, fai clic su Esplora job.
Fai clic sull'ID job per visualizzare il riquadro Dettagli job.
Fai clic sulla scheda Informazioni job e visualizza le metriche e lo stato nel campo Ottimizzazioni delle funzioni AI generativa.

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
OTHERper raggruppare gli elementi non coperti da categorie più specifiche. Tuttavia, non aggiungereOTHERse l'elenco delle categorie è già completo, poiché questo termine è ambiguo e potrebbe causare confusione.
- Rimuovi le categorie rare o vuote dalla chiamata di funzione
- Per
AI.IF: aggiorna la condizione di filtro del prompt in modo che i casitrueefalsesiano 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)
- Evita categorie sovrapposte in cui un input potrebbe appartenere a più categorie contemporaneamente. Ad esempio, evita categorie come
Prova modelli di embedding più avanzati come
text-embedding-005ogemini-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
- Scopri di più sull'AI generativa in BigQuery.
- Scopri di più su come controllare i costi dell'AI generativa con le quote giornaliere in BigQuery.
- Consulta la documentazione della funzione
AI.IF. - Consulta la documentazione della funzione
AI.CLASSIFY.