BigQuery SQL ve Vertex AI ile Üretken Analizler

1. Giriş

Bu codelab'de, BigQuery SQL sorguları ve Vertex AI PaLM API ile film başarısı puanını tahmin edip buna uygun öneri veren bir uygulama oluşturacağız. Metin oluşturma için kullanılan model text-bison olup BigQuery'de uzak işlev olarak barındırılır.

Kullanılan hizmetlerin listesi:

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

Ne oluşturacaksınız?

Oluşturacaklarınız

  • Modeli içerecek bir BigQuery veri kümesi
  • Bir filmin başarı puanını, filmin TÜR ve SÜRE özelliklerine göre tahmin eden bir BigQuery ML modeli
  • Vertex AI PaLM API'yi uzak işlev olarak barındıran bir BigQuery modeli
  • BigQuery ile Vertex AI arasında bağlantı oluşturmak için harici bir bağlantı

2. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi

Başlamadan önce

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
  3. Gerekli tüm API'lerin (BigQuery API, Vertex AI API, BigQuery Connection API) etkinleştirildiğinden emin olun.
  4. bq önceden yüklenmiş olarak gelen, Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. gcloud komutları ve kullanımı için belgelere bakın.

Cloud Console'da sağ üst köşedeki Cloud Shell'i etkinleştir'i tıklayın:

51622c00acec2fa.png

Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:

gcloud config set project <YOUR_PROJECT_ID>
  1. Tarayıcınıza şu URL'yi girerek doğrudan BigQuery konsoluna gidin: https://console.cloud.google.com/bigquery

3. Veri hazırlama

Bu kullanım alanında, movielens kaynağından elde edilen movies veri kümesini kullanacağız.

  1. Veri kümesi oluşturma:

BigQuery veri kümesi, tabloların bir koleksiyonudur. Bir veri kümesindeki tüm tablolar aynı veri konumunda depolanır. Ayrıca, bir veri kümesine ve tablolarına erişimi sınırlamak için özel erişim kontrolleri de ekleyebilirsiniz.

Cloud Shell'de, "movie_insights" adlı bir veri kümesi oluşturmak için bq mk komutunu kullanın.

bq mk --location=us-central1 movie_insights
  1. Kaynak dosyayı Cloud Shell makinenize klonlayın:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Cloud Shell makinenizde oluşturulan yeni proje dizinine gidin:
cd movie_score_genai_insights
  1. CSV dosyanızı bir BigQuery tablosuna yüklemek için bq load komutunu kullanın (BigQuery kullanıcı arayüzünden de doğrudan yükleme yapabileceğinizi lütfen unutmayın):
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. movie_score tablosunun ve verilerin veri kümesinde oluşturulup oluşturulmadığını kontrol etmek için bir örnek sorgulayabilirsiniz:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Veri ve makine öğrenimi

TÜR ve SÜRE özelliklerine göre filmin başarı puanını tahmin etmek için bir sınıflandırma modeli oluşturalım. Mantıksal regresyon modeli oluşturmak ve eğitmek için "LOGISTIC_REG" seçeneğiyle CREATE MODEL ifadesini kullanacağız.

Aşağıdaki sorguyu BigQuery Console SQL Çalışma Alanı SORGULAMA DÜZENLEYİCİSİ bölümünde çalıştırın:

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

Sorgu Ayrıntıları:

  1. CREATE MODEL ifadesi, SELECT ifadesindeki eğitim verilerini kullanarak bir modeli eğitir.
  2. OPTIONS ifadesi, model türünü ve eğitim seçeneklerini belirtir. Burada, LOGISTIC_REG seçeneği bir mantıksal regresyon modeli türünü belirtir. İkili mantıksal regresyon modeli ile çok sınıflı mantıksal regresyon modeli arasında seçim yapmanız gerekmez: BigQuery ML, etiket sütunundaki benzersiz değerlerin sayısına göre hangisinin eğitileceğini belirleyebilir.
  3. data_split_method=‘NO_SPLIT', BQML'nin sorgu koşullarına (data_cat = ‘TRAIN') göre veriler üzerinde eğitim yapmasını zorlar. Ayrıca, bu seçenekte "AUTO_SPLIT" kullanmanın, çerçeveye (veya bu durumda hizmete) eğitim/test bölümlerinin rastgele dağıtılmasına izin vermek için daha iyi olduğunu unutmayın.
  4. input_label_cols seçeneği, SELECT ifadesinde hangi sütunun etiket sütunu olarak kullanılacağını belirtir. Burada etiket sütunu puan olduğundan model, her satırda bulunan diğer değerlere göre puanın 10 değerinden hangisinin en olası olduğunu öğrenir.
  5. "auto_class_weights=TRUE" seçeneği, eğitim verilerindeki sınıf etiketlerini dengeler. Varsayılan olarak, eğitim verileri ağırlıksızdır. Eğitim verilerindeki etiketler dengesizse model, en popüler etiket sınıfını daha fazla tahmin etmeyi öğrenebilir.
  6. SELECT ifadesi, CSV verileriyle yüklediğimiz tabloyu sorgular. WHERE ifadesi, giriş tablosundaki satırları filtreleyerek bu adımda yalnızca TRAIN veri kümesinin seçilmesini sağlar.
  7. Aşağıdaki yapılar İSTEĞE BAĞLIDIR. Bu nedenle BigQuery ML, bunları Vertex AI Model Registry'ye açıkça kaydedebilir. Bu konu hakkında daha fazla bilgiyi blogumuzda bulabilirsiniz.. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Oluşturulduktan sonra, BigQuery SQL Çalışma Alanı'nın ŞEMA bölümünde aşağıdakiler görünür:

2e43087f914aa466.png

Modelinizi oluşturduktan sonra ML.EVALUATE işlevini kullanarak modelin performansını değerlendirin. ML.EVALUATE işlevi, tahmin edilen değerleri gerçek verilerle karşılaştırarak değerlendirir.

Modelinizin değerlendirme metriklerini MODEL sayfasından da görüntüleyebilirsiniz:

7f2dc168bac0ac1a.png

Temel metriklere genel bakış:

Kesinlik: Pozitif tanımlamaların ne kadarı aslında doğruydu? Hassasiyet = Gerçek Pozitif / (Gerçek Pozitif + Yanlış Pozitif) Geri çağırma: Gerçek pozitiflerin ne kadarı doğru şekilde tanımlandı? Geri çağırma = Doğru Pozitif / (Doğru Pozitif + Yanlış Negatif) Doğruluk: Sınıflandırma modellerini değerlendirmek için kullanılan bir metriktir. Modelimizin gerçekten doğru yaptığı tahminlerin oranıdır. Doğruluk = Doğru tahmin sayısı / Toplam tahmin sayısı

5. Modeli kullanarak film puanını tahmin etme

Tahmin Zamanı!!!! Aşağıdaki sorgu, veri kümesindeki "TEST" verisi olarak sınıflandırılan her filmin puanını tahmin eder.

Aşağıdaki sorguyu BigQuery Console SQL Çalışma Alanı SORGULAMA DÜZENLEYİCİSİ bölümünde çalıştırın:

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

Sonuç şu şekilde görünür:

c719844860ce7c27.png

Model sonucu, filmin 1 ile 10 arasındaki bir ölçekte tahmin edilen puanını (sınıflandırma) gösterir. Her film için neden birden fazla tahmin satırı olduğunu merak ediyor olabilirsiniz. Bunun nedeni, modelin olası tahmin edilen etiketleri ve her birinin gerçekleşme olasılığını azalan sırada döndürmesidir.

Tahmin edilen sonuçları ve modeli analiz etme:

Sonuçları anlamak için tahminle ilgili iki harika analiz adımı gerçekleştirebilirsiniz:

  1. Modelinizin neden bu tahmin sonuçlarını oluşturduğunu anlamak için ML.EXPLAIN_PREDICT işlevini kullanabilirsiniz.
  2. Genel olarak gelir aralığını belirlemek için en önemli özelliklerin hangileri olduğunu öğrenmek istiyorsanız ML.GLOBAL_EXPLAIN işlevini kullanabilirsiniz.

Bu adımlar hakkında ayrıntılı bilgiyi dokümanlarda bulabilirsiniz.

6. Veri ile Üretken Yapay Zeka

Yalnızca SQL sorgularını kullanarak Vertex AI'ın text-bison (en yeni) modelini kullanan üretken yapay zeka ile LLM'ye (büyük dil modeli) film puanını 5'ten yüksek etkileyen faktörlerin özetini sorarak film veri kümesi hakkında analizler sunalım.

  1. movie_score adlı tablomuz bu adımda da giriş olarak kullanılacak.
  2. BigQuery ML ve Vertex hizmetleri arasında erişim oluşturmak için harici bağlantı oluşturulur.
  3. BigQuery GENERATE_TEXT yapısı, PaLM API'yi Vertex AI'dan uzaktan çağırmak için kullanılır.

7. Harici bağlantı oluşturma

Henüz yapılmadıysa BQ Connection API'yi etkinleştirin ve bağlantı yapılandırma ayrıntılarından hizmet hesabı kimliğini not edin:

  1. BigQuery Explorer bölmesinde (BigQuery konsolunun solunda) +EKLE düğmesini ve listelenen popüler kaynaklarda "Harici veri kaynaklarına bağlantı"yı tıklayın.
  2. Bağlantı türünü "BigLake ve uzak işlevler" olarak seçin, konum türünü "Bölge" olarak, değeri "us-central1 (Iowa)" olarak ve bağlantı kimliğini "bq_llm_connection" olarak girin.

8a87802ab0846a6.png

  1. Bağlantı oluşturulduktan sonra, bağlantı yapılandırma ayrıntılarından oluşturulan hizmet hesabını not edin.

İzin verme

Bu adımda, hizmet hesabına Vertex AI hizmetine erişim izni vereceğiz:

IAM'yi açın ve harici bağlantıyı oluşturduktan sonra kopyaladığınız hizmet hesabını asıl kullanıcı olarak ekleyin ve "Vertex AI Kullanıcısı" rolünü seçin.

ff8e1d730879f972.png

8. Uzak ML modeli oluşturma

Barındırılan bir Vertex AI büyük dil modelini temsil eden uzak modeli oluşturun:

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

movie_insights veri kümesinde llm_model adlı bir model oluşturur. Bu model, Vertex AI'ın CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API'sini uzak işlev olarak kullanır. Bu işlemin tamamlanması birkaç saniye sürer.

9. Makine öğrenimi modelini kullanarak metin oluşturma

Model oluşturulduktan sonra metin oluşturmak, özetlemek veya sınıflandırmak için modeli kullanın.

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

**Açıklama:

**ml_generate_text_result**, hem içerik hem de güvenlik özelliklerini içeren, JSON biçimindeki metin üreten modelin yanıtıdır: a. İçerik, oluşturulan metin sonucu b'yi temsil eder. Güvenlik özellikleri, büyük dil modelinden istenmeyen veya öngörülemeyen yanıtlar gelmesini önlemek için Vertex AI Palm API'de etkinleştirilen, ayarlanabilir eşiğe sahip yerleşik içerik filtresini temsil eder. Güvenlik eşiğini ihlal eden yanıtlar engellenir.

ML.GENERATE_TEXT, metin oluşturma görevlerini gerçekleştirmek için Vertex AI LLM'ye erişmek üzere BigQuery'de kullandığınız yapıdır.

CONCAT, PROMPT ifadesini ve veritabanı kaydını ekler.

movie_insights, veri kümesinin adı; movie_score ise istem tasarımında kullanacağımız verileri içeren tablonun adıdır.

Sıcaklık, yanıtın rastgeleliğini kontrol etmek için kullanılan istem parametresidir. Alaka düzeyi açısından ne kadar düşük olursa o kadar iyidir.

Max_output_tokens, yanıtta istediğiniz kelime sayısıdır.

Sorgu yanıtı şu şekilde görünür:

a3691afc0a97e724.png

Gördüğünüz gibi, yanıt iç içe yerleştirilmiş ve biçimlendirilmemiş.

10. Sorgu sonucunu düzleştirme

Sorguda JSON'u açıkça kod çözmemek için sonucu düzleştirelim:

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

**Açıklama:

Flatten_json_output**, boole değerini temsil eder. Bu değer doğru olarak ayarlanırsa JSON yanıtından çıkarılan düz ve anlaşılır bir metin döndürülür.

Sorgu yanıtı şu şekilde görünür:

1aaa0c514fccab59.png

11. Temizleme

Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız Vertex AI uç noktası sayfasına giderek makine öğrenimi adımının bir parçası olarak oluşturduğunuz Vertex AI uç noktasını silebilirsiniz.

12. Tebrikler

Tebrikler! Yalnızca SQL sorgularını kullanarak film veri kümenizde bir BQML modeli oluşturup Vertex AI API'yi kullanarak LLM tabanlı analizler gerçekleştirdiniz. Mevcut modeller hakkında daha fazla bilgi edinmek için Vertex AI LLM ürün dokümanlarına göz atın.