Generative Insights עם BigQuery SQL ו-Vertex AI

1. מבוא

ב-Codelab הזה ניצור אפליקציה לחיזוי דירוג הצלחה של סרטים ולהמלצות על סרטים באמצעות שאילתות BigQuery SQL ו-Vertex AI PaLM API. המודל שמשמש ליצירת טקסט הוא text-bison, והוא מתארח כפונקציה מרוחקת ב-BigQuery.

רשימת השירותים שנעשה בהם שימוש:

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

מה תפַתחו

תצרו

  • מערך נתונים ב-BigQuery שיכיל את המודל
  • מודל BigQuery ML שמנבא את ציון ההצלחה של סרט על סמך מאפייני הז'אנר ומשך ההפעלה של הסרט
  • מודל BigQuery שמארח את Vertex AI PaLM API כפונקציה מרוחקת
  • חיבור חיצוני כדי ליצור את החיבור בין BigQuery ל-Vertex AI

2. דרישות

  • דפדפן, כמו Chrome או Firefox
  • פרויקט ב-Google Cloud שהחיוב בו מופעל

לפני שמתחילים

  1. ב-מסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
  3. מוודאים שכל ממשקי ה-API הנדרשים (BigQuery API, ‏ Vertex AI API, ‏ BigQuery Connection API) מופעלים.
  4. תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud וכוללת את bq. אפשר לעיין במאמרי העזרה בנושא פקודות gcloud ושימוש בהן.

בפינה הימנית העליונה של Cloud Console, לוחצים על 'הפעלת Cloud Shell':

51622c00acec2fa.png

אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:

gcloud config set project <YOUR_PROJECT_ID>
  1. אפשר לעבור ישירות למסוף BigQuery על ידי הזנת כתובת ה-URL הבאה בדפדפן: https://console.cloud.google.com/bigquery

3. הנתונים בשלבי הכנה

בתרחיש השימוש הזה, נשתמש במערך הנתונים של סרטים שמקורו בmovielens.

  1. יוצרים מערך נתונים:

מערך נתונים ב-BigQuery הוא אוסף של טבלאות. כל הטבלאות במערך נתונים מאוחסנות באותו מיקום. אפשר גם לצרף אמצעי בקרת גישה מותאמים אישית כדי להגביל את הגישה למערך נתונים ולטבלאות שלו.

ב-Cloud Shell, משתמשים בפקודה bq mk כדי ליצור מערך נתונים בשם movie_insights.

bq mk --location=us-central1 movie_insights
  1. משכפלים את קובץ המקור למכונת Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. עוברים לספריית הפרויקט החדשה שנוצרה במכונת Cloud Shell:
cd movie_score_genai_insights
  1. משתמשים בפקודה bq load כדי לטעון את קובץ ה-CSV לטבלה ב-BigQuery (אפשר גם להעלות ישירות מממשק המשתמש של 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. אפשר להריץ שאילתה על דוגמה כדי לבדוק אם הטבלה movie_score והנתונים נוצרו במערך הנתונים:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. נתונים ללמידת מכונה

בואו ניצור מודל סיווג לחיזוי ציון ההצלחה של הסרט על סמך התכונות GENRE ו-RUNTIME. נשתמש בהצהרה CREATE MODEL עם האפשרות LOGISTIC_REG כדי ליצור ולאמן מודל רגרסיה לוגיסטית.

מריצים את השאילתה הבאה בקטע QUERY EDITOR (עורך השאילתות) ב-SQL Workspace (סביבת עבודה של SQL) במסוף 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';

פרטי השאילתה:

  1. ההצהרה CREATE MODEL מאמנת מודל באמצעות נתוני האימון בהצהרת SELECT.
  2. הפסקה OPTIONS מציינת את סוג המודל ואת אפשרויות ההדרכה. בדוגמה הזו, האפשרות LOGISTIC_REG מציינת סוג של מודל רגרסיה לוגיסטית. אין צורך לציין מודל רגרסיה לוגיסטית בינארית לעומת מודל רגרסיה לוגיסטית מרובת-סיווגים: BigQuery ML יכול לקבוע איזה מודל לאמן על סמך מספר הערכים הייחודיים בעמודת התווית.
  3. ‫data_split_method=‘NO_SPLIT' מאלץ את BQML להתאמן על הנתונים בהתאם לתנאי השאילתה (data_cat = ‘TRAIN'). חשוב גם לציין שעדיף להשתמש באפשרות ‘AUTO_SPLIT' כדי לאפשר למסגרת (או לשירות במקרה הזה) להקצות באופן אקראי את החלוקה של נתוני האימון והבדיקה.
  4. האפשרות input_label_cols מציינת איזו עמודה בהצהרת SELECT תשמש כעמודת התווית. כאן, עמודת התווית היא score, ולכן המודל ילמד איזה מבין 10 הערכים של score הוא הסביר ביותר על סמך הערכים האחרים שמופיעים בכל שורה.
  5. האפשרות auto_class_weights=TRUE מאזנת את תוויות הסיווג בנתוני האימון. כברירת מחדל, נתוני האימון לא משוקללים. אם התוויות בנתוני האימון לא מאוזנות, יכול להיות שהמודל ילמד לחזות את הסוג הכי פופולרי של תוויות בצורה משמעותית יותר.
  6. הצהרת SELECT מבצעת שאילתה בטבלה שטענו אליה את נתוני ה-CSV. הפסוקית WHERE מסננת את השורות בטבלת הקלט כך שבשלב הזה נבחר רק מערך הנתונים TRAIN.
  7. הקונסטרוקציות הבאות הן אופציונליות, כך ש-BigQuery ML יכולה לרשום אותן באופן מפורש במרשם המודלים של Vertex AI. מידע נוסף על הנושא זמין בבלוג. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

אחרי שיוצרים את הטבלה, היא מופיעה בקטע SCHEMA של סביבת העבודה של BigQuery SQL:

2e43087f914aa466.png

אחרי שיוצרים את המודל, מעריכים את הביצועים שלו באמצעות הפונקציה ML.EVALUATE. הפונקציה ML.EVALUATE מעריכה את הערכים החזויים ביחס לנתונים בפועל.

אפשר גם לראות את מדדי ההערכה של המודל בדף MODEL:

7f2dc168bac0ac1a.png

מדדי מפתח במבט חטוף:

דיוק – איזה חלק מהזיהויים החיוביים היה נכון בפועל? דיוק = חיובי אמיתי / (חיובי אמיתי + חיובי כוזב) היזכרות – איזה חלק מהתוצאות החיוביות בפועל זוהה בצורה נכונה? החזרת תוצאות (Recall) = חיובי אמיתי / (חיובי אמיתי + שלילי כוזב) דיוק (Accuracy) – מדד להערכת מודלים של סיווג. זהו החלק היחסי של התחזיות שהמודל שלנו צדק לגביהן. דיוק = מספר התחזיות הנכונות / מספר התחזיות הכולל

5. חיזוי של ציון הסרט באמצעות המודל

זמן התחזית!!!! השאילתה הבאה מנבאת את הציון של כל סרט במערך הנתונים שמסווג כנתוני TEST.

מריצים את השאילתה הבאה בקטע QUERY EDITOR (עורך השאילתות) ב-SQL Workspace (סביבת עבודה של SQL) במסוף BigQuery:

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

התוצאה נראית כך:

c719844860ce7c27.png

תוצאת המודל מציגה את הניקוד החזוי של הסרט בסולם של 1 עד 10 (סיווג). אולי תהית למה יש כמה שורות של תחזיות לכל סרט. הסיבה לכך היא שהמודל החזיר את התוויות האפשריות שחזיתי ואת ההסתברות להתרחשות של כל אחת מהן בסדר יורד.

ניתוח התוצאות החזויות והמודל:

כדי להבין את התוצאות, אפשר לבצע שני שלבי ניתוח חשובים של התחזית:

  1. כדי להבין למה המודל שלכם יוצר את תוצאות החיזוי האלה, אתם יכולים להשתמש בפונקציה ML.EXPLAIN_PREDICT.
  2. כדי לדעת אילו תכונות הכי חשובות לקביעת קבוצת ההכנסה באופן כללי, אפשר להשתמש בפונקציה ML.GLOBAL_EXPLAIN.

במאמרי העזרה אפשר לקרוא על השלבים האלה בפירוט.

6. נתונים ל-AI גנרטיבי

בואו נשתמש במודל text-bison (העדכני) של Vertex AI כדי להפיק תובנות ממערך הנתונים של הסרטים. לשם כך, נשאל את מודל ה-LLM (מודל שפה גדול) מהם הגורמים שמשפיעים על דירוג הסרט כך שיהיה גבוה מ-5, באמצעות בינה מלאכותית גנרטיבית ושאילתות SQL בלבד.

  1. הטבלה שיצרנו movie_score תשמש גם כקלט בשלב הזה.
  2. ייווצר חיבור חיצוני כדי לאפשר גישה בין BigQuery ML לבין שירותי Vertex.
  3. הקונסטרוקציה BigQuery GENERATE_TEXT תשמש להפעלת PaLM API מרחוק מ-Vertex AI.

7. יצירת חיבור חיצוני

אם עדיין לא עשיתם את זה, מפעילים את BQ Connection API ורושמים את מזהה חשבון השירות מפרטי הגדרת החיבור:

  1. לוחצים על הלחצן +ADD בחלונית BigQuery Explorer (בצד ימין של מסוף BigQuery) ולוחצים על 'Connection to external data sources' (חיבור למקורות נתונים חיצוניים) ברשימת המקורות הפופולריים.
  2. בוחרים באפשרות 'BigLake ופונקציות מרוחקות' בתור סוג החיבור, מציינים 'אזור' בתור סוג המיקום ואת הערך 'us-central1 (איווה)', וגם את הערך 'bq_llm_connection' בתור מזהה החיבור.

8a87802ab0846a6.png

  1. אחרי שיוצרים את החיבור, רושמים את חשבון השירות שנוצר מפרטי הגדרת החיבור.

מתן הרשאות

בשלב הזה ניתן הרשאות לחשבון השירות לגשת לשירות Vertex AI:

פותחים את IAM ומוסיפים את חשבון השירות שהעתקתם אחרי שיצרתם את החיבור החיצוני כ-Principal, ובוחרים בתפקיד Vertex AI User.

ff8e1d730879f972.png

8. יצירת מודל ML מרחוק

יוצרים את המודל המרוחק שמייצג מודל שפה גדול (LLM) שמתארח ב-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');

הפונקציה יוצרת מודל בשם llm_model במערך הנתונים movie_insights, שמסתמך על CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API של Vertex AI כפונקציה מרוחקת. התהליך יימשך כמה שניות.

9. יצירת טקסט באמצעות מודל למידת מכונה

אחרי שיוצרים את המודל, אפשר להשתמש בו כדי ליצור, לסכם או לסווג טקסט.

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

**הסבר:

‫ml_generate_text_result** היא התגובה של מודל יצירת טקסט בפורמט JSON, שמכילה גם תוכן וגם מאפייני בטיחות: א. התוכן מייצג את תוצאת הטקסט שנוצרה b. מאפייני הבטיחות מייצגים את מסנן התוכן המובנה עם סף מתכוונן שמופעל ב-Vertex AI Palm API כדי למנוע תשובות לא מכוונות או בלתי צפויות מהמודל הגדול של השפה – התשובה נחסמת אם היא חורגת מסף הבטיחות.

ML.GENERATE_TEXT הוא מבנה שמשמש ב-BigQuery כדי לגשת למודל שפה גדול (LLM) של Vertex AI ולבצע משימות של יצירת טקסט

CONCAT מוסיף את הצהרת ה-PROMPT ואת רשומת מסד הנתונים

movie_insights הוא שם מערך הנתונים, ו-movie_score הוא שם הטבלה שמכילה את הנתונים שנשתמש בהם בתכנון ההנחיה.

Temperature הוא פרמטר ההנחיה ששולט באקראיות של התשובה – ככל שהערך נמוך יותר, כך התשובה רלוונטית יותר

Max_output_tokens הוא מספר המילים שרוצים בתשובה

התגובה לשאילתה נראית כך:

a3691afc0a97e724.png

כפי שאפשר לראות, התשובה היא מקוננת ולא מעוצבת.

10. השטחת תוצאת השאילתה

נשטח את התוצאה כדי שלא נצטרך לפענח את ה-JSON באופן מפורש בשאילתה:

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

**הסבר:

‫Flatten_json_output** מייצג את הערך הבוליאני, שאם הוא מוגדר כ-True, מחזיר טקסט שטוח וברור שחולץ מתגובת ה-JSON.

התגובה לשאילתה נראית כך:

1aaa0c514fccab59.png

11. הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם בפוסט הזה, אתם יכולים למחוק את נקודת הקצה של Vertex AI שיצרתם כחלק משלב ה-ML. לשם כך, עוברים לדף Vertex AI Endpoint.

12. מזל טוב

מעולה! יצרתם בהצלחה מודל BQML וביצעתם ניתוח מבוסס-LLM באמצעות Vertex AI API על מערך הנתונים של הסרטים, רק באמצעות שאילתות SQL. מידע נוסף על המודלים הזמינים מופיע בתיעוד המוצר Vertex AI LLM.