Statystyki generatywne za pomocą BigQuery SQL i Vertex AI

1. Wprowadzenie

W tym ćwiczeniu utworzymy aplikację do prognozowania i rekomendowania ocen filmów za pomocą zapytań BigQuery SQL i interfejsu Vertex AI PaLM API. Model używany do generowania tekstu to text-bison, który jest hostowany jako funkcja zdalna w BigQuery.

Lista używanych usług:

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

Co utworzysz

Utworzysz

  • zbiór danych BigQuery, w którym będzie przechowywany model;
  • Model BigQuery ML, który prognozuje ocenę sukcesu filmu na podstawie atrybutów GENRE i RUNTIME.
  • Model BigQuery, który hostuje interfejs Vertex AI PaLM API jako funkcję zdalną
  • połączenie zewnętrzne, które umożliwia połączenie BigQuery z Vertex AI;

2. Wymagania

  • przeglądarka, np. Chrome lub Firefox;
  • projekt Google Cloud z włączonymi płatnościami;

Zanim zaczniesz

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie włączone są płatności
  3. Upewnij się, że wszystkie niezbędne interfejsy API (BigQuery API, Vertex AI API, BigQuery Connection API) są włączone.
  4. Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq. Informacje o poleceniach gcloud i sposobie ich używania znajdziesz w dokumentacji.

W konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu:

51622c00acec2fa.png

Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:

gcloud config set project <YOUR_PROJECT_ID>
  1. Otwórz konsolę BigQuery, wpisując w przeglądarce ten adres URL: https://console.cloud.google.com/bigquery

3. Przygotowywanie danych

W tym przypadku użyjemy zbioru danych o filmach pochodzącego ze źródła movielens.

  1. Utwórz zbiór danych:

Zbiór danych BigQuery to zbiór tabel. Wszystkie tabele w zbiorze danych są przechowywane w tej samej lokalizacji danych. Możesz też dołączyć niestandardowe ustawienia kontroli dostępu, aby ograniczyć dostęp do zbioru danych i jego tabel.

W Cloud Shell użyj polecenia bq mk, aby utworzyć zbiór danych o nazwie „movie_insights”.

bq mk --location=us-central1 movie_insights
  1. Sklonuj plik źródłowy na maszynę Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Przejdź do nowego katalogu projektu utworzonego na maszynie Cloud Shell:
cd movie_score_genai_insights
  1. Użyj polecenia bq load, aby wczytać plik CSV do tabeli BigQuery (pamiętaj, że możesz też przesłać go bezpośrednio z interfejsu 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. Możesz wykonać zapytanie dotyczące próbki, aby sprawdzić, czy w zbiorze danych utworzono tabelę movie_score i dane:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Dane do uczenia maszynowego

Utwórzmy model klasyfikacji, który będzie prognozować ocenę sukcesu filmu na podstawie atrybutów GENRE i RUNTIME. Aby utworzyć i wytrenować model regresji logistycznej, użyjemy instrukcji CREATE MODEL z opcją „LOGISTIC_REG”.

Uruchom poniższe zapytanie w sekcji EDYTOR ZAPYTAŃ w obszarze roboczym SQL w konsoli 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';

Szczegóły zapytania:

  1. Instrukcja CREATE MODEL trenuje model przy użyciu danych treningowych w instrukcji SELECT.
  2. Klauzula OPTIONS określa typ modelu i opcje trenowania. W tym przypadku opcja LOGISTIC_REG określa typ modelu regresji logistycznej. Nie musisz określać modelu binarnej regresji logistycznej ani modelu wieloklasowej regresji logistycznej: BigQuery ML może określić, który model wytrenować, na podstawie liczby unikalnych wartości w kolumnie etykiety.
  3. data_split_method=‘NO_SPLIT' wymusza trenowanie BQML na danych zgodnie z warunkami zapytania (data_cat = ‘TRAIN'). Pamiętaj też, że w tym przypadku lepiej jest użyć opcji ‘AUTO_SPLIT', aby umożliwić platformie (lub usłudze w tym przypadku) losowe dzielenie zbiorów danych na zbiory do trenowania i testowania.
  4. Opcja input_label_cols określa, która kolumna w instrukcji SELECT ma być używana jako kolumna etykiet. W tym przypadku kolumna etykiety to „score”, więc model nauczy się, która z 10 wartości kolumny „score” jest najbardziej prawdopodobna na podstawie innych wartości w każdym wierszu.
  5. Opcja „auto_class_weights=TRUE” równoważy etykiety klas w danych treningowych. Domyślnie dane treningowe nie mają wagi. Jeśli etykiety w danych treningowych są niezrównoważone, model może nauczyć się w większym stopniu przewidywać najpopularniejszą klasę etykiet.
  6. Instrukcja SELECT wysyła zapytanie do tabeli, do której załadowaliśmy dane z pliku CSV. Klauzula WHERE filtruje wiersze w tabeli wejściowej, tak aby na tym etapie wybierany był tylko zbiór danych TRAIN.
  7. Poniższe konstrukcje są OPCJONALNE, dzięki czemu BigQuery ML może je jawnie zarejestrować w Vertex AI Model Registry. Więcej informacji na ten temat znajdziesz na tym blogu. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Po utworzeniu w sekcji SCHEMA w obszarze roboczym SQL BigQuery pojawi się:

2e43087f914aa466.png

Po utworzeniu modelu oceń jego skuteczność za pomocą funkcji ML.EVALUATE. Funkcja ML.EVALUATE porównuje prognozowane wartości z rzeczywistymi danymi.

Na stronie MODEL możesz też wyświetlić wskaźniki oceny modelu:

7f2dc168bac0ac1a.png

Kluczowe dane w skrócie:

Precyzja – jaki odsetek pozytywnych identyfikacji był w rzeczywistości prawidłowy? Precyzja = Wyniki prawdziwie pozytywne / (Wyniki prawdziwie pozytywne + Wyniki fałszywie pozytywne) Czułość – jaki odsetek rzeczywistych wyników pozytywnych został prawidłowo zidentyfikowany? Recall = True Positive / (True Positive + False Negative) Accuracy - A metric for evaluating classification models, it is the fraction of predictions our model actually got right Accuracy = Number of correct predictions / Total number of predictions

5. Prognozowanie oceny filmu za pomocą modelu

Czas prognozy!!!! To zapytanie prognozuje ocenę każdego filmu w zbiorze danych, który jest sklasyfikowany jako dane „TEST”.

Uruchom poniższe zapytanie w sekcji EDYTOR ZAPYTAŃ w obszarze roboczym SQL w konsoli BigQuery:

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

Wynik wygląda tak:

c719844860ce7c27.png

Wynik modelu pokazuje prognozowaną ocenę filmu w skali od 1 do 10 (klasyfikacja). Pewnie zastanawiasz się, dlaczego przy każdym filmie jest kilka wierszy prognoz. Dzieje się tak, ponieważ model zwrócił możliwe przewidywane etykiety i prawdopodobieństwo wystąpienia każdej z nich w kolejności malejącej.

Analizowanie prognozowanych wyników i modelu:

Aby zrozumieć wyniki prognozy, możesz wykonać 2 przydatne czynności analityczne:

  1. Aby dowiedzieć się, dlaczego model generuje takie wyniki prognozowania, możesz użyć funkcji ML.EXPLAIN_PREDICT.
  2. Aby dowiedzieć się, które cechy są najważniejsze przy określaniu przedziału dochodów, możesz użyć funkcji ML.GLOBAL_EXPLAIN.

Szczegółowe informacje o tych krokach znajdziesz w dokumentacji.

6. Dane do generatywnej AI

Uzyskajmy statystyki dotyczące zbioru danych o filmach, prosząc LLM (duży model językowy) o podsumowanie czynników, które wpływają na to, że ocena filmu jest wyższa niż 5. Wykorzystamy do tego generatywną AI w Vertex AI z modelem text-bison (najnowszym) i tylko zapytania SQL.

  1. Tabela movie_score, którą utworzyliśmy, będzie również danymi wejściowymi w tym kroku.
  2. Zostanie utworzone połączenie zewnętrzne, aby umożliwić dostęp między BigQuery ML a usługami Vertex.
  3. Konstrukcja BigQuery GENERATE_TEXT będzie używana do zdalnego wywoływania interfejsu PaLM API z Vertex AI.

7. Tworzenie połączenia zewnętrznego

Włącz interfejs BQ Connection API, jeśli nie został jeszcze włączony, i zanotuj identyfikator konta usługi z informacji o konfiguracji połączenia:

  1. W panelu eksploratora BigQuery (po lewej stronie konsoli BigQuery) kliknij przycisk +DODAJ i w sekcji popularnych źródeł kliknij „Połączenie ze źródłami danych zewnętrznych”.
  2. Jako typ połączenia wybierz „BigLake i funkcje zdalne”, jako typ lokalizacji podaj „Region”, a jako wartość „us-central1 (Iowa)”. Jako identyfikator połączenia podaj „bq_llm_connection”.

8a87802ab0846a6.png

  1. Po utworzeniu połączenia zanotuj konto usługi wygenerowane na podstawie szczegółów konfiguracji połączenia.

Przyznawanie uprawnień

W tym kroku przyznamy kontu usługi uprawnienia dostępu do usługi Vertex AI:

Otwórz IAM i dodaj skopiowane po utworzeniu połączenia zewnętrznego konto usługi jako podmiot zabezpieczeń, a następnie wybierz rolę „Użytkownik Vertex AI”.

ff8e1d730879f972.png

8. Tworzenie zdalnego modelu ML

Utwórz model zdalny, który reprezentuje hostowany duży model językowy Vertex AI:

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');

Tworzy model o nazwie llm_model w zbiorze danych movie_insights, który wykorzystuje interfejs CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API Vertex AI jako funkcję zdalną. Wykonanie polecenia może potrwać kilka sekund.

9. Generowanie tekstu za pomocą modelu ML

Po utworzeniu modelu możesz go używać do generowania, podsumowywania lub kategoryzowania tekstu.

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));

**Wyjaśnienie:

ml_generate_text_result** to odpowiedź modelu generowania tekstu w formacie JSON, która zawiera zarówno treść, jak i atrybuty bezpieczeństwa: a. Treść reprezentuje wygenerowany tekst b. Atrybuty bezpieczeństwa to wbudowany filtr treści z regulowanym progiem, który jest włączony w interfejsie Vertex AI PaLM API, aby uniknąć niezamierzonych lub nieprzewidzianych odpowiedzi z dużego modelu językowego. Jeśli odpowiedź narusza próg bezpieczeństwa, jest blokowana.

ML.GENERATE_TEXT to konstrukcja, której używasz w BigQuery, aby uzyskać dostęp do modelu LLM Vertex AI i wykonywać zadania generowania tekstu.

Funkcja CONCAT dołącza instrukcję PROMPT i rekord bazy danych.

movie_insights to nazwa zbioru danych, a movie_score to nazwa tabeli zawierającej dane, których użyjemy w projekcie prompta.

Temperatura to parametr promptu, który kontroluje losowość odpowiedzi. Im niższa wartość, tym lepsza trafność.

Max_output_tokens to liczba słów, które mają się znaleźć w odpowiedzi.

Odpowiedź na zapytanie wygląda tak:

a3691afc0a97e724.png

Jak widać, odpowiedź jest zagnieżdżona i nieformatowana.

10. Spłaszczanie wyniku zapytania

Spłaszczmy wynik, aby nie trzeba było jawnie dekodować kodu JSON w zapytaniu:

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));

**Wyjaśnienie:

Flatten_json_output** to wartość logiczna, która po ustawieniu na „true” zwraca płaski, zrozumiały tekst wyodrębniony z odpowiedzi JSON.

Odpowiedź na zapytanie wygląda tak:

1aaa0c514fccab59.png

11. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby użyte w tym poście, możesz usunąć punkt końcowy Vertex AI utworzony w ramach kroku ML. W tym celu otwórz stronę punktu końcowego Vertex AI.

12. Gratulacje

Gratulacje! Udało Ci się utworzyć model BQML i przeprowadzić analizę opartą na LLM za pomocą interfejsu Vertex AI API na zbiorze danych o filmach, używając tylko zapytań SQL. Więcej informacji o dostępnych modelach znajdziesz w dokumentacji produktu Vertex AI LLM.