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 גנרטיבי

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

  1. הטבלה שיצרנו movie_score תשמש גם כקלט בשלב הזה.
  2. ייווצר חיבור חיצוני כדי ליצור גישה בין BigQuery ML לבין שירותי Vertex.
  3. הקונסטרוקציה GENERATE_TEXT של BigQuery תשמש להפעלת 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, שמכילה גם תוכן וגם מאפייני בטיחות: א. התוכן מייצג את תוצאת הטקסט שנוצרת ב. מאפייני הבטיחות מייצגים את מסנן התוכן המובנה עם סף מתכוונן שמופעל ב-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.