Insight Generatif dengan BigQuery SQL dan Vertex AI

1. Pengantar

Dalam codelab ini, kita akan membangun aplikasi resep dan prediksi Rating Keberhasilan Film dengan kueri BigQuery SQL dan Vertex AI PaLM API. Model yang digunakan untuk membuat teks adalah text-bison dan dihosting sebagai fungsi jarak jauh di BigQuery.

Daftar layanan yang digunakan adalah:

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

Yang akan Anda build

Anda akan membuat

  • Set data BigQuery untuk menampung model
  • Model ML BigQuery yang memprediksi skor keberhasilan film berdasarkan atribut GENRE dan RUNTIME film
  • Model BigQuery yang menghosting PaLM API Vertex AI sebagai fungsi jarak jauh
  • Koneksi eksternal untuk membuat koneksi antara BigQuery dan Vertex AI

2. Persyaratan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud yang mengaktifkan penagihan

Sebelum memulai

  1. Di Konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan diaktifkan pada sebuah project
  3. Pastikan semua API yang diperlukan (BigQuery API, Vertex AI API, BigQuery Connection API) diaktifkan
  4. Anda akan menggunakan Cloud Shell, yakni lingkungan command line yang berjalan di Google Cloud dan telah dilengkapi dengan bq. Lihat dokumentasi untuk mengetahui perintah dan penggunaan gcloud

Dari Cloud Console, klik Activate Cloud Shell di pojok kanan atas:

51622c00acec2fa.pngS

Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:

gcloud config set project <YOUR_PROJECT_ID>
  1. Buka konsol BigQuery secara langsung dengan memasukkan URL berikut di browser Anda: https://console.cloud.google.com/bigquery

3. Menyiapkan data

Dalam kasus penggunaan ini, kita akan menggunakan set data film yang berasal dari sumber movielens.

  1. Membuat set data:

Set data BigQuery adalah kumpulan tabel. Semua tabel dalam set data disimpan di lokasi data yang sama. Anda juga dapat melampirkan kontrol akses kustom untuk membatasi akses ke set data dan tabelnya.

Di Cloud Shell, gunakan perintah bq mk untuk membuat set data bernama "movie_insights"

bq mk --location=us-central1 movie_insights
  1. Buat clone file sumber ke Mesin Cloud Shell Anda:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Buka direktori project baru yang dibuat di Mesin Cloud Shell Anda:
cd movie_score_genai_insights
  1. Gunakan perintah bq load untuk memuat file CSV Anda ke dalam tabel BigQuery (perhatikan bahwa Anda juga dapat langsung mengunggah dari UI 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. Anda dapat melakukan kueri sampel untuk memeriksa apakah tabel movie_score dan data dibuat dalam {i>dataset<i}:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Data ke ML

Mari kita buat model klasifikasi untuk memprediksi skor keberhasilan film berdasarkan atribut GENRE dan RUNTIME. Kita akan menggunakan pernyataan CREATE MODEL dengan opsi 'LOGISTIC_REG' untuk membuat dan melatih model regresi logistik.

Jalankan kueri di bawah ini di bagian EDITOR KUERI Workspace SQL konsol 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';

Detail Kueri:

  1. Pernyataan CREATE MODEL melatih model menggunakan data pelatihan dalam pernyataan SELECT.
  2. Klausa OPTIONS menentukan jenis model dan opsi pelatihan. Di sini, opsi LOGISTIC_REG menentukan jenis model regresi logistik. Tidak perlu menentukan model regresi logistik biner versus model regresi logistik multiclass: BigQuery ML dapat menentukan model mana yang akan dilatih berdasarkan jumlah nilai unik dalam kolom label.
  3. data_split_method=‘NO_SPLIT&#39; memaksa BQML untuk melatih data sesuai kondisi kueri (data_cat = ‘TRAIN'), juga perhatikan bahwa lebih baik menggunakan ‘AUTO_SPLIT' dalam opsi ini untuk mengizinkan framework (atau dalam kasus ini layanan) untuk mengacak partisi dari pemisahan pelatihan/pengujian.
  4. Opsi input_label_cols menentukan kolom mana dalam pernyataan SELECT yang akan digunakan sebagai kolom label. Di sini, kolom label adalah skor, sehingga model akan mempelajari mana dari 10 nilai skor yang paling mungkin berdasarkan nilai lain yang ada di setiap baris.
  5. Parameter 'auto_class_weights=TRUE' menyeimbangkan label kelas dalam data pelatihan. Secara default, data pelatihan tidak diberi bobot. Jika label dalam data pelatihan tidak seimbang, model dapat belajar memprediksi kelas label yang paling populer dengan lebih cermat.
  6. Pernyataan SELECT melakukan kueri pada tabel yang kita muat dengan data CSV. Klausa WHERE menyaring baris-baris dalam tabel input sehingga hanya {i>dataset<i} TRAIN yang dipilih pada langkah ini.
  7. Konstruksi berikut bersifat OPSIONAL sehingga BigQuery ML dapat secara eksplisit mendaftarkannya ke Vertex AI Model Registry. Anda dapat membaca selengkapnya di blog ini. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Setelah dibuat, kode di bawah ini akan muncul di bagian SCHEMA pada Workspace SQL BigQuery:

2e43087f914aa466.pngS

Setelah membuat model, evaluasi performa model menggunakan fungsi ML.EVALUATE. Fungsi ML.EVALUATE mengevaluasi nilai prediksi terhadap data sebenarnya.

Anda juga dapat melihat metrik evaluasi model dari halaman MODEL:

7f2dc168bac0ac1a.pngS

Sekilas tentang metrik utama:

Presisi - Berapa proporsi identifikasi positif yang sebenarnya benar? Presisi = Positif Benar / (Positif Benar + Positif Palsu) Penarikan - Berapa proporsi positif aktual yang diidentifikasi dengan benar? Akurasi = Positif Benar / (Positif Benar + Negatif Palsu) - Metrik untuk mengevaluasi model klasifikasi, yaitu pecahan prediksi yang benar-benar didapat model kita Akurasi = Jumlah prediksi benar / Jumlah total prediksi

5. Memprediksi skor film menggunakan model

Waktunya Prediksi!!!! Kueri berikut memprediksi skor setiap film dalam {i>dataset<i} yang dikategorikan sebagai "TEST" layanan otomatis dan data skalabel.

Jalankan kueri di bawah ini di bagian EDITOR KUERI Workspace SQL konsol BigQuery:

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

Hasilnya akan terlihat seperti ini:

c719844860ce7c27.png

Hasil model menunjukkan predicted_score untuk sebuah film dalam skala 1 sampai 10 (klasifikasi). Anda pasti bertanya-tanya mengapa ada beberapa baris prediksi terhadap setiap film. Hal itu karena model telah menampilkan kemungkinan label yang diprediksi dan probabilitas kemunculan masing-masing label dalam urutan menurun.

Analisis hasil yang diprediksi dan modelnya:

Anda dapat melakukan dua langkah analisis yang hebat dengan prediksi untuk memahami hasilnya:

  1. Untuk memahami alasan model Anda menghasilkan hasil prediksi ini, Anda dapat menggunakan fungsi ML.EXPLAIN_PREDICT.
  2. Untuk mengetahui fitur mana yang paling penting untuk menentukan golongan pendapatan secara umum, Anda dapat menggunakan fungsi ML.GLOBAL_EXPLAIN.

Anda dapat membaca langkah-langkah ini secara mendetail di dokumentasi.

6. Data ke AI Generatif

Mari kita berikan insight tentang set data film dengan meminta LLM (Large Language Model) ringkasan faktor-faktor yang memengaruhi skor film menjadi lebih besar dari 5, dengan AI Generatif yang menggunakan model text-bison (terbaru) Vertex AI yang hanya menggunakan kueri sql

  1. Tabel yang kita buat untuk film_score juga akan menjadi input untuk langkah ini.
  2. Koneksi Eksternal akan dibuat untuk membuat akses antara layanan BigQuery ML dan Vertex.
  3. Konstruksi UMTE_TEXT BigQuery akan digunakan untuk memanggil PaLM API dari jarak jauh dari Vertex AI.

7. Membuat Koneksi Eksternal

Aktifkan BQ Connection API jika belum dilakukan dan catat ID Akun Layanan dari detail konfigurasi koneksi:

  1. Klik tombol +ADD pada panel BigQuery Explorer (di sebelah kiri konsol BigQuery), lalu klik "Connection to external data sources" di sumber populer yang tercantum
  2. Pilih Jenis koneksi sebagai "BigLake dan fungsi jarak jauh", berikan jenis lokasi sebagai "Wilayah" dan nilai sebagai "us-central1 (Iowa)" dan "bq_llm_connection" sebagai ID Koneksi

8a87802ab0846a6.pngS

  1. Setelah koneksi dibuat, catat Akun Layanan yang dibuat dari detail konfigurasi koneksi

Memberikan izin

Pada langkah ini, kita akan memberikan izin ke Akun Layanan untuk mengakses layanan Vertex AI:

Buka IAM dan tambahkan Akun Layanan yang Anda salin setelah membuat koneksi eksternal sebagai Principal, lalu pilih "Vertex AI User" {i>Role <i}(Peran)

ff8e1d730879f972.png

8. Membuat model ML jarak jauh

Buat model jarak jauh yang merepresentasikan model bahasa besar (LLM) Vertex AI yang dihosting:

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

Versi tersebut membuat model bernama llm_model dalam set data movie_insights yang memanfaatkan CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API Vertex AI sebagai fungsi jarak jauh. Proses ini akan memerlukan waktu beberapa detik.

9. Membuat teks menggunakan model ML

Setelah model dibuat, gunakan model tersebut untuk membuat, meringkas, atau mengategorikan teks.

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

**Penjelasan:

ml_generate_text_result** adalah respons dari model pembuatan teks dalam format JSON yang berisi atribut konten dan keamanan: a. Konten mewakili hasil teks yang dihasilkan b. Atribut Keamanan merepresentasikan filter konten bawaan dengan batas yang dapat disesuaikan dan diaktifkan di Vertex AI Palm API untuk menghindari respons yang tidak diinginkan atau tidak terduga dari model bahasa besar. Respons akan diblokir jika melanggar batas keamanan

ML.GENERATE_TEXT adalah konstruksi yang Anda gunakan di BigQuery untuk mengakses LLM Vertex AI guna melakukan tugas pembuatan teks

CONCAT menambahkan pernyataan PROMPT dan kumpulan data database

movie_insights adalah nama set data dan movie_score adalah nama tabel yang memiliki data yang akan kita gunakan dalam desain prompt

Temperature adalah parameter perintah untuk mengontrol keacakan respons - semakin kecil semakin baik dalam hal relevansi

Max_output_tokens adalah jumlah kata yang ingin Anda respons

Respons kueri akan terlihat seperti ini:

a3691afc0a97e724.png

Seperti yang dapat Anda lihat, respons disusun bertingkat dan tidak diformat.

10. Meratakan hasil kueri

Mari kita meratakan hasilnya sehingga kita tidak perlu mendekode JSON secara eksplisit dalam kueri:

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

**Penjelasan:

Flatten_json_output** mewakili boolean, yang jika disetel true, akan menampilkan teks datar yang dapat dipahami yang diekstrak dari respons JSON.

Respons kueri akan terlihat seperti ini:

1aaa0c514fccab59.pngS

11. Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam postingan ini, Anda dapat menghapus endpoint Vertex AI yang Anda buat sebagai bagian dari langkah ML, dengan membuka halaman Vertex AI Endpoint.

12. Selamat

Selamat! Anda telah berhasil membuat model BQML dan melakukan analisis berbasis LLM menggunakan Vertex AI API pada set data film hanya menggunakan kueri SQL. Lihat dokumentasi produk LLM Vertex AI untuk mempelajari lebih lanjut model yang tersedia.