Approfondimenti generativi con BigQuery SQL e Vertex AI

1. Introduzione

In questo codelab creeremo un'app per la previsione e la prescrizione della valutazione del successo di un film con query BigQuery SQL e l'API Vertex AI PaLM. Il modello utilizzato per eseguire la generazione di testo è text-bison ed è ospitato come funzione remota in BigQuery.

L'elenco dei servizi utilizzati è il seguente:

  1. BigQuery ML
  2. API Vertex AI PaLM
  3. Cloud Shell

Che cosa creerai

Creerai

  • Un set di dati BigQuery che contenga il modello
  • Un modello BigQuery ML che prevede il punteggio di successo di un film in base agli attributi GENRE e RUNTIME del film
  • Un modello BigQuery che ospita l'API Vertex AI PaLM come funzione remota
  • Una connessione esterna per stabilire la connessione tra BigQuery e Vertex AI

2. Requisiti

  • Un browser, ad esempio Chrome o Firefox
  • Un progetto cloud Google Cloud con la fatturazione abilitata

Prima di iniziare

  1. Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto
  3. Assicurati che tutte le API necessarie (API BigQuery, API Vertex AI, API BigQuery Connection) siano abilitate
  4. Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud che viene precaricato con bq. Consulta la documentazione per i comandi e l'utilizzo di gcloud

Nella console Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra:

51622c00acec2fa.png

Se il progetto non è impostato, utilizza il seguente comando per impostarlo:

gcloud config set project <YOUR_PROJECT_ID>
  1. Vai direttamente alla console BigQuery inserendo il seguente URL nel browser: https://console.cloud.google.com/bigquery

3. Preparazione dei dati in corso…

In questo caso d'uso, utilizzeremo il set di dati movies derivato dall'origine movielens.

  1. Crea un set di dati:

Un set di dati BigQuery è una raccolta di tabelle. Tutte le tabelle di un set di dati vengono archiviate nella stessa località dei dati location. Puoi anche collegare controlli dell'accesso personalizzati per limitare l'accesso a un set di dati e alle relative tabelle.

In Cloud Shell, utilizza il comando bq mk per creare un set di dati denominato "movie_insights":

bq mk --location=us-central1 movie_insights
  1. Clona il file di origine nella macchina Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Vai alla nuova directory del progetto creata nella macchina Cloud Shell:
cd movie_score_genai_insights
  1. Utilizza il comando bq load per caricare il file CSV in una tabella BigQuery (tieni presente che puoi anche caricare direttamente dall'interfaccia utente di BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
  1. Puoi eseguire una query su un campione per verificare se la tabella movie_score e i dati sono stati creati nel set di dati:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Dati per ML

Creiamo un modello di classificazione per prevedere il punteggio di successo del film in base agli attributi GENRE e RUNTIME. Utilizzeremo l'istruzione CREATE MODEL con l'opzione "LOGISTIC_REG" per creare e addestrare un modello di regressione logistica.

Esegui la query riportata di seguito nella sezione EDITOR DI QUERY dell'area di lavoro SQL della console BigQuery:

CREATE OR REPLACE MODEL
  `movie_insights.model_rating_by_runtime_genre`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    data_split_method='NO_SPLIT',
    model_registry='vertex_ai',   
    vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=['score']
  ) AS
SELECT name, genre,runtime, score
FROM
  movie_insights.movie_score
WHERE
  data_cat = 'TRAIN';

Dettagli query:

  1. L'istruzione CREATE MODEL addestra un modello utilizzando i dati di addestramento nell'istruzione SELECT.
  2. La clausola OPTIONS specifica il tipo di modello e le opzioni di addestramento. Qui, l'opzione LOGISTIC_REG specifica un tipo di modello di regressione logistica. Non è necessario specificare un modello di regressione logistica binaria rispetto a un modello di regressione logistica multiclasse: BigQuery ML può determinare quale addestrare in base al numero di valori univoci nella colonna dell'etichetta.
  3. data_split_method="NO_SPLIT" impone a BQML di addestrare i dati in base alle condizioni della query (data_cat = "TRAIN"). Tieni presente che è preferibile utilizzare "AUTO_SPLIT" in questa opzione per consentire al framework (o al servizio in questo caso) di randomizzare la partizione delle suddivisioni di addestramento/test.
  4. L'opzione input_label_cols specifica la colonna dell'istruzione SELECT da utilizzare come colonna dell'etichetta. In questo caso, la colonna dell'etichetta è score, quindi il modello imparerà quale dei 10 valori di score è più probabile in base agli altri valori presenti in ogni riga.
  5. L'opzione "auto_class_weights=TRUE" bilancia le etichette di classe nei dati di addestramento. Per impostazione predefinita, i dati di addestramento non sono ponderati. Se le etichette nei dati di addestramento non sono bilanciate, il modello potrebbe imparare a prevedere la classe di etichette più popolare in modo più pesante.
  6. L'istruzione SELECT esegue una query sulla tabella caricata con i dati CSV. La clausola WHERE filtra le righe della tabella di input in modo che in questo passaggio venga selezionato solo il set di dati TRAIN.
  7. I seguenti costrutti sono FACOLTATIVI, quindi BigQuery ML può registrarli in modo esplicito in Vertex AI Model Registry. Puoi saperne di più in questo blog. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Una volta creato, nella sezione SCHEMA dell'area di lavoro SQL di BigQuery viene visualizzato quanto segue:

2e43087f914aa466.png

Dopo aver creato il modello, valuta le prestazioni del modello utilizzando la funzione ML.EVALUATE. La funzione ML.EVALUATE valuta i valori previsti rispetto ai dati effettivi.

Puoi anche visualizzare le metriche di valutazione del modello dalla pagina MODELLO:

7f2dc168bac0ac1a.png

Metriche chiave a colpo d'occhio:

Precisione: quale percentuale di identificazioni positive era effettivamente corretta? Precisione = Vero positivo / (Vero positivo + Falso positivo) Richiamo: quale percentuale di positivi effettivi è stata identificata correttamente? Richiamo = Vero positivo / (Vero positivo + Falso negativo) Accuratezza: una metrica per la valutazione dei modelli di classificazione, è la frazione di previsioni che il nostro modello ha effettivamente ottenuto correttamente Accuratezza = Numero di previsioni corrette / Numero totale di previsioni

5. Previsione del punteggio del film utilizzando il modello

È ora di fare previsioni. La query seguente prevede il punteggio di ogni film nel set di dati classificato come dati "TEST".

Esegui la query riportata di seguito nella sezione EDITOR DI QUERY dell'area di lavoro SQL della console BigQuery:

SELECT
  *
FROM
  ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
    (
    SELECT
      *
    FROM
      movie_insights.movie_score
    WHERE
      data_cat= 'TEST'
     )
  );

Il risultato è simile al seguente:

c719844860ce7c27.png

Il risultato del modello mostra il predicted_score del film su una scala da 1 a 10 (classificazione). Ti starai chiedendo perché ci sono diverse righe di previsione per ogni film. Questo perché il modello ha restituito le possibili etichette previste e la probabilità di occorrenza di ciascuna in ordine decrescente.

Analizza i risultati previsti e il modello:

Puoi eseguire due ottimi passaggi di analisi con la previsione per comprendere i risultati:

  1. Per capire perché il modello genera questi risultati di previsione, puoi utilizzare la funzione ML.EXPLAIN_PREDICT.
  2. Per sapere quali sono le funzionalità più importanti per determinare in generale la fascia di reddito, puoi utilizzare la funzione ML.GLOBAL_EXPLAIN.

Puoi leggere questi passaggi in dettaglio nella documentazione.

6. Dati per l'AI generativa

Forniamo approfondimenti sul set di dati movies chiedendo al modello linguistico di grandi dimensioni (LLM) il riepilogo dei fattori che influenzano il punteggio del film in modo che sia superiore a 5, con l'AI generativa utilizzando il modello text-bison (ultima versione) di Vertex AI utilizzando solo query SQL

  1. Anche la tabella movie_score che abbiamo creato sarà l'input per questo passaggio.
  2. Verrà creata una connessione esterna per stabilire l'accesso tra BigQuery ML e i servizi Vertex.
  3. Il costrutto GENERATE_TEXT di BigQuery verrà utilizzato per richiamare l'API PaLM in remoto da Vertex AI.

7. Crea una connessione esterna

Abilita l'API BigQuery Connection se non l'hai già fatto e annota l'ID del service account dai dettagli di configurazione della connessione:

  1. Fai clic sul pulsante +AGGIUNGI nel riquadro Esplora BigQuery (a sinistra della console BigQuery) e fai clic su "Connessione a origini dati esterne" nelle origini più utilizzate elencate
  2. Seleziona "BigLake e funzioni remote" come tipo di connessione, fornisci "Regione" come tipo di località e "us-central1 (Iowa)" come valore e "bq_llm_connection" come ID connessione

8a87802ab0846a6.png

  1. Una volta creata la connessione, prendi nota del service account generato dai dettagli di configurazione della connessione

Concedi le autorizzazioni

In questo passaggio concederemo le autorizzazioni al service account per accedere al servizio Vertex AI:

Apri IAM e aggiungi il service account che hai copiato dopo aver creato la connessione esterna come entità e seleziona il ruolo "Utente Vertex AI"

ff8e1d730879f972.png

8. Crea un modello ML remoto

Crea il modello remoto che rappresenta un modello linguistico di grandi dimensioni di Vertex AI ospitato:

CREATE OR REPLACE MODEL
  movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');

Crea un modello denominato llm_model nel set di dati movie_insights che utilizza l'API CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 di Vertex AI come funzione remota. Il completamento dell'operazione richiede alcuni secondi.

9. Genera testo utilizzando il modello ML

Una volta creato il modello, utilizzalo per generare, riassumere o classificare il testo.

SELECT
  ml_generate_text_result['predictions'][0]['content'] AS generated_text,
  ml_generate_text_result['predictions'][0]['safetyAttributes']
    AS safety_attributes,
  * EXCEPT (ml_generate_text_result)
FROM
  ML.GENERATE_TEXT(
    MODEL `movie_insights.llm_model`,
    (
 SELECT
      CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
    FROM (
      SELECT
        REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
      FROM (
        SELECT
          *
        FROM
          `movie_insights.movie_score`
        WHERE
          CAST(SCORE AS INT64) > 5
        LIMIT
          50) ) AS MOVIES
    ),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens));

**Spiegazione:

ml_generate_text_result** è la risposta del modello di generazione di testo in formato JSON che contiene sia attributi di contenuti sia di sicurezza: a. I contenuti rappresentano il risultato del testo generato b. Gli attributi di sicurezza rappresentano il filtro dei contenuti integrato con una soglia regolabile abilitata nell'API Vertex AI Palm per evitare risposte non intenzionali o impreviste dal modello linguistico di grandi dimensioni. La risposta viene bloccata se viola la soglia di sicurezza

ML.GENERATE_TEXT è il costrutto che utilizzi in BigQuery per accedere al modello linguistico di grandi dimensioni di Vertex AI per eseguire attività di generazione di testo

CONCAT aggiunge l'istruzione PROMPT e il record del database

movie_insights è il nome del set di dati e movie_score è il nome della tabella che contiene i dati che utilizzeremo nella progettazione del prompt

Temperatura è il parametro del prompt per controllare la casualità della risposta. Più è basso, meglio è in termini di pertinenza

Max_output_tokens è il numero di parole che vuoi nella risposta

La risposta della query è simile alla seguente:

a3691afc0a97e724.png

Come puoi vedere, la risposta è nidificata e non formattata.

10. Appiattisci il risultato della query

Appiattiamo il risultato in modo da non dover decodificare esplicitamente il JSON nella query:

SELECT
  *
FROM
  ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
    (
    SELECT
      CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
    FROM (
      SELECT
        REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
      FROM (
        SELECT
          *
        FROM
          `movie_insights.movie_score`
        WHERE
          CAST(SCORE AS INT64) > 5
        LIMIT
          50) ) AS MOVIES),
    STRUCT( 0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

**Spiegazione:

Flatten_json_output** rappresenta il valore booleano che, se impostato su true, restituisce un testo piatto e comprensibile estratto dalla risposta JSON.

La risposta della query è simile alla seguente:

1aaa0c514fccab59.png

11. Libera spazio

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, puoi eliminare l'endpoint Vertex AI creato nell'ambito del passaggio ML andando alla pagina Endpoint Vertex AI.

12. Complimenti

Complimenti! Hai creato correttamente un modello BQML ed eseguito analisi basate su LLM utilizzando un'API Vertex AI sul set di dati movies utilizzando solo query SQL. Consulta la documentazione del prodotto LLM di Vertex AI per saperne di più sui modelli disponibili.