Statystyki generatywne za pomocą BigQuery SQL i Vertex AI

1. Wprowadzenie

W ramach tego ćwiczenia w Codelabs utworzymy aplikację do przewidywania sukcesu filmu oraz aplikację na receptę, w której użyjemy zapytań BigQuery SQL i Vertex AI PaLM API. Do generowania tekstu używany jest model text-bison, który jest hostowany jako funkcja zdalna w BigQuery.

Lista wykorzystywanych usług:

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

Co utworzysz

Tworzenie:

  • Zbiór danych BigQuery, w którym ma znaleźć się model
  • Model BigQuery ML, który prognozuje wynik sukcesu filmu na podstawie atrybutów gatunek i RUNTIME.
  • Model BigQuery, który hostuje interfejs Vertex AI PaLM API jako funkcję zdalną
  • Połączenie zewnętrzne w celu nawiązania połączenia między BigQuery a Vertex AI

2. Wymagania

  • przeglądarki, na przykład Chrome lub Firefox;
  • Projekt Google Cloud z włączonymi płatnościami

Zanim zaczniesz

  1. Na stronie selektora projektów w konsoli Google Cloud 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 są włączone płatności.
  3. Upewnij się, że wszystkie niezbędne interfejsy API (BigQuery API, Vertex AI API i BigQuery Connection API) są włączone
  4. Użyjesz Cloud Shell – środowiska wiersza poleceń działającego w Google Cloud, które ma wstępnie zainstalowane narzędzie bq. Więcej informacji o poleceniach i korzystaniu z gcloud znajdziesz w dokumentacji

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

51622c00acec2fa.png

Jeśli Twój projekt nie jest skonfigurowany, ustaw go za pomocą tego polecenia:

gcloud config set project <YOUR_PROJECT_ID>
  1. Przejdź bezpośrednio do konsoli BigQuery, wpisując w przeglądarce ten URL: https://console.cloud.google.com/bigquery

3. Przygotowywanie danych

W tym przypadku użyjemy zbioru danych filmów ze źródła movielens.

  1. Tworzenie zbioru 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 kontrole 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. Skopiuj plik źródłowy na swoją maszynę Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Przejdź do nowego katalogu projektu utworzonego w Twojej 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ż przesyłać dane 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 wysłać zapytanie do przykładu, aby sprawdzić, czy tabela movie_score i dane zostały utworzone w zbiorze danych:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Dane do systemów uczących się

Utwórzmy model klasyfikacji, który przewidzi wynik filmu w oparciu o atrybuty GATUNEK i RUNTIME. Użyjemy instrukcji CREATE MODEL z opcją „LOGISTIC_REG” aby utworzyć i wytrenować model regresji logistycznej.

Uruchom poniższe zapytanie w sekcji EDYTOR ZAPYTAŃ SQL Workspace 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 za pomocą 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, a nie wieloklasowego modelu regresji logistycznej. BigQuery ML może określić, który model ma zostać trenowany, na podstawie liczby unikalnych wartości w kolumnie etykiet.
  3. data_split_method=‘NO_SPLIT&#39; wymusza trenowanie BQML na danych zgodnie z warunkami zapytania (data_cat = „TRAIN”). Pamiętaj też, że lepiej jest użyć funkcji „AUTO_SPLIT” w tej opcji, aby umożliwić platformie (lub w tym przypadku usłudze) randomizację podziału między trenowaniem a testami.
  4. Opcjainput_label_cols określa, która kolumna w instrukcji SELECT ma być używana jako kolumna etykiet. W tym przypadku kolumna etykiet zawiera wynik, więc model uczy się, która z 10 wartości wyniku jest najbardziej prawdopodobna, na podstawie innych wartości obecnych w każdym wierszu.
  5. „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ą nierówne, model może nauczyć się przewidywać najpopularniejszą klasę etykiet.
  6. Instrukcja SELECT wysyła zapytania do tabeli wczytanej z danymi CSV. Klauzula WHERE filtruje wiersze w tabeli wejściowej, tak aby w tym kroku został wybrany tylko zbiór danych TRAIN.
  7. Poniższe konstrukcje są OPCJONALNE, więc 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 BigQuery SQL pojawi się poniższy element:

2e43087f914aa466.png

Po utworzeniu modelu oceń jego wydajność za pomocą funkcji ML.EVALUATE. Funkcja ML.EVALUATE ocenia prognozowane wartości w odniesieniu do danych rzeczywistych.

Wskaźniki oceny modelu możesz też wyświetlić na stronie MODEL:

7f2dc168bac0ac1a.png

Najważniejsze dane w skrócie:

Precyzja – jaka część identyfikacji pozytywnych była prawidłowa? Precyzja = wynik prawdziwie pozytywny / (prawdziwie pozytywny + fałszywie pozytywny) czułość – jaki odsetek rzeczywistych wyników pozytywnych został zidentyfikowany prawidłowo? Czułość = wynik prawdziwie pozytywny / (prawdziwie pozytywny + wynik fałszywie negatywny) – wskaźnik do oceny modeli klasyfikacji. Jest to odsetek prognoz, które nasz model faktycznie uzyskał prawidłowe prognozy Dokładność = liczba poprawnych prognoz / całkowita liczba prognoz

5. Prognozowanie ścieżki dźwiękowej filmu na podstawie modelu

Czas na prognozę!!!! To zapytanie prognozuje wynik każdego filmu w zbiorze danych, który został sklasyfikowany jako „TEST” i skalowalnych danych.

Uruchom poniższe zapytanie w sekcji EDYTOR ZAPYTAŃ SQL Workspace 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 będzie wyglądał tak:

c719844860ce7c27.png

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

Przeanalizuj prognozowane wyniki i model:

Korzystając z prognozy, możesz wykonać 2 ważne kroki analizy, aby zrozumieć wyniki:

  1. Aby dowiedzieć się, dlaczego model generuje te wyniki prognoz, możesz użyć funkcji ML.EXPLAIN_PREDICT.
  2. Aby dowiedzieć się, które funkcje są najważniejsze, możesz użyć funkcji ML.GLOBAL_EXPLAIN.

Szczegółowe informacje na temat tych kroków znajdziesz w dokumentacji.

6. Dane do generatywnej AI

Przedstawmy statystyki dotyczące zbioru danych filmów, prosząc LLM (duży model językowy) o podsumowanie czynników, które wpływają na ocenę filmu większą niż 5. Generatywna AI korzysta z modelu text-bison (najnowszego) Vertex AI korzystającego wyłącznie z zapytań SQL.

  1. Utworzona przez nas tabela movie_score będzie też wkładem do danych dla tego kroku.
  2. Zostanie utworzone połączenie zewnętrzne w celu ustanowienia dostępu między usługami BigQuery ML i Vertex.
  3. Konstrukcja BigQuery GENERATE_TEXT będzie używana do zdalnego wywoływania interfejsu PaLM API z Vertex AI.

7. Utwórz połączenie zewnętrzne

Włącz BQ Connection API, jeśli jeszcze nie zostało to zrobione, i zanotuj identyfikator konta usługi ze szczegółów konfiguracji połączenia:

  1. W panelu Eksplorator BigQuery (po lewej stronie konsoli BigQuery) kliknij przycisk +DODAJ, a potem kliknij „Połączenie z zewnętrznymi źródłami danych”. na liście popularnych źródeł
  2. Jako typ połączenia wybierz „BigLake i funkcje zdalne”, a jako typ lokalizacji podaj „Region”. z wartością „us-central1 (Iowa)”. i „bq_llm_connection” jako identyfikator połączenia

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 Uprawnienia i dodaj konto usługi skopiowane po utworzeniu połączenia zewnętrznego jako podmiot zabezpieczeń i wybierz „Użytkownik Vertex AI” Rola

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

W zbiorze danych movie_insights tworzy model o nazwie llm_model, 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ź z modelu generowania tekstu w formacie JSON, która zawiera zarówno atrybuty treści, jak i atrybuty bezpieczeństwa: a. Treść reprezentuje wygenerowany wynik tekstowy. b. Atrybuty bezpieczeństwa reprezentują wbudowany filtr treści z regulowanym progiem, który jest włączony w Vertex AI Palm API, aby uniknąć niezamierzonych lub nieprzewidzianych odpowiedzi z dużego modelu językowego – odpowiedź jest blokowana, jeśli narusza próg bezpieczeństwa

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 dodaje instrukcję PROMPT i rekord bazy danych

Parametr movie_insights to nazwa zbioru danych, a movie_score to nazwa tabeli, w której znajdują się dane, których użyjemy w projekcie promptów.

Temperatura to parametr promptu służący do kontrolowania losowości odpowiedzi – im mniej, tym lepiej pod względem trafności.

Parametr Max_output_tokens określa liczbę słów, które mają pojawić się w odpowiedzi.

Odpowiedź na zapytanie wygląda tak:

a3691afc0a97e724.png

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

10. Spłaszcz wynik 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** przedstawia wartość logiczną. Jeśli ma wartość prawda, zwracany jest 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 zużyte w tym poście, możesz usunąć punkt końcowy Vertex AI utworzony w ramach kroku dotyczącego systemów uczących się. W tym celu przejdź na stronę punktu końcowego Vertex AI.

12. Gratulacje

Gratulacje! Udało Ci się utworzyć model BQML i przeprowadzić analizy oparte na LLM za pomocą interfejsu Vertex AI API w zbiorze danych filmów tylko przy użyciu zapytań SQL. Więcej informacji o dostępnych modelach znajdziesz w dokumentacji usługi Vertex AI LLM.