Approfondimenti generativi con BigQuery SQL e Vertex AI

1. Introduzione

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

Ecco l'elenco dei servizi utilizzati:

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

Cosa creerai

Creerai

  • Un set di dati BigQuery per contenere il modello
  • Un modello di ML di BigQuery che prevede il punteggio di successo di un film in base agli attributi Genere 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 Google Cloud con fatturazione abilitata

Prima di iniziare

  1. Nella pagina del selettore dei progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come controllare se la fatturazione è abilitata su 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 su Google Cloud in cui è precaricato bq. Consulta la documentazione per i comandi e l'utilizzo di gcloud

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

51622c00acec2fa.png

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

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

3. Preparazione dei dati in corso…

In questo caso d'uso, utilizzeremo il set di dati dei film derivato dalla fonte movielens.

  1. Crea un set di dati:

Un set di dati BigQuery è una raccolta di tabelle. Tutte le tabelle di un set di dati sono archiviate nella stessa località dei dati. Puoi anche collegare controlli di 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 chiamato "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. Passa alla nuova directory del progetto creata nella macchina Cloud Shell:
cd movie_score_genai_insights
  1. Usa il comando bq load per caricare il file CSV in una tabella BigQuery (tieni presente che puoi anche caricarlo direttamente dalla UI 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 esempio 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. Dai dati al machine learning

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

Esegui la query seguente 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 della query:

  1. L'istruzione CREATE MODEL addestra un modello utilizzando i dati di addestramento contenuti nell'istruzione SELECT.
  2. La clausola OPTIONS specifica il tipo di modello e le opzioni di addestramento. In questo caso, l'opzione LOGISTIC_REG specifica un tipo di modello di regressione logistica. Non è necessario specificare un modello di regressione logistica binaria anziché 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&#39; obbliga BQML ad eseguire l'addestramento sui dati in base alle condizioni della query (data_cat = "TRAIN"). Tieni inoltre presente che è meglio usare il parametro "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 quale colonna dell'istruzione SELECT utilizzare come colonna dell'etichetta. In questo caso, la colonna dell'etichetta indica il punteggio, quindi il modello apprende quale dei 10 valori del punteggio è più probabile in base agli altri valori presenti in ogni riga.
  5. Il parametro "auto_class_weights=TRUE" bilancia le etichette della 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 in modo più massiccio la classe di etichette più popolare.
  6. L'istruzione SELECT esegue query sulla tabella che abbiamo caricato 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 esplicitamente nel registro dei modelli di Vertex AI. Puoi scoprire di più in questo blog. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Una volta creato, il codice seguente viene visualizzato nella sezione SCHEMA dell'area di lavoro SQL di BigQuery:

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 MODEL:

7f2dc168bac0ac1a.png

Riepilogo delle metriche principali:

Precisione: in che percentuale le identificazioni positive erano effettivamente corrette? Precisione = veri positivi / (veri positivi + falso positivo) richiamo: qual è la percentuale di positivi effettivi identificata correttamente? Richiamo = vero positivo / (vero positivo + falso negativo) Accuratezza - Una metrica per valutare i modelli di classificazione, è la frazione di previsioni che il nostro modello ha effettivamente ottenuto in modo corretto Accuratezza = numero di previsioni corrette / numero totale di previsioni

5. Previsione del punteggio del film mediante il modello

È il momento della previsione!!! La seguente query prevede il punteggio di ogni film nel set di dati classificato come "TEST" e i dati di Google Cloud.

Esegui la query seguente 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 sarà simile al seguente:

c719844860ce7c27.png

Il risultato del modello mostra il punteggio_previsto del film su una scala da 1 a 10 (classificazione). Forse 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 ognuna in ordine decrescente.

Analizza i risultati previsti e il modello:

Per comprendere i risultati puoi eseguire due ottime fasi di analisi con la previsione:

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

Per ulteriori informazioni su questi passaggi, consulta la documentazione.

6. Dai dati all'IA generativa

Osserviamo insight sul set di dati dei film chiedendo all'LLM (Large Language Model) il riepilogo dei fattori che influenzano il punteggio del film in modo che sia maggiore di 5. L'IA generativa utilizza il modello text-bison (più recente) di Vertex AI utilizzando solo query SQL

  1. Anche la tabella che abbiamo creato movie_score 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 da remoto da Vertex AI.

7. Crea una connessione esterna

Se non l'hai già fatto, abilita l'API BQ Connection e prendi nota dell'ID dell'account di servizio nei dettagli di configurazione della connessione:

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

8a87802ab0846a6.png

  1. Dopo aver creato la connessione, prendi nota dell'account di servizio generato dai dettagli di configurazione della connessione

Concedi autorizzazioni

In questo passaggio concederemo le autorizzazioni all'account di servizio per accedere al servizio Vertex AI:

Apri IAM e aggiungi l'account di servizio che hai copiato dopo aver creato la connessione esterna come entità, quindi seleziona "Utente Vertex AI" Ruolo

ff8e1d730879f972.png

8. crea un modello ML remoto

Crea il modello remoto che rappresenta un modello linguistico di grandi dimensioni 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 dal modello di generazione di testo in formato JSON che contiene sia contenuti che attributi di sicurezza: a. Il contenuto rappresenta il risultato di testo generato (b. Gli attributi di sicurezza rappresentano il filtro per i contenuti integrato con una soglia regolabile che è abilitata nell'API Vertex AI Palm per evitare risposte non intenzionali o impreviste dal modello LLM. La risposta viene bloccata se viola la soglia di sicurezza

ML.GENERATE_TEXT è il costrutto che utilizzi in BigQuery per accedere all'LLM 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, mentre 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: minore è la temperatura, migliore è il risultato in termini di pertinenza

Max_output_tokens è il numero di parole che vuoi nella risposta

La risposta alla query ha il seguente aspetto:

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 il codice JSON in modo esplicito 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 semplice comprensibile estratto dalla risposta JSON.

La risposta alla query ha il seguente aspetto:

1aaa0c514fccab59.png

11. Esegui la pulizia

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

12. Complimenti

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