Generative Insights עם BigQuery SQL ו-Vertex AI

1. מבוא

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

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

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

מה תפַתחו

היצירה שלך

  • מערך נתונים ב-BigQuery שיכיל את המודל
  • מודל למידת מכונה של BigQuery שחוזה את ציון ההצלחה של סרט על סמך מאפייני GENRE ו-RUNTIME של הסרט
  • מודל 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, לוחצים על Activate 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 כדי לטעון את קובץ ה-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' כדי ליצור ולאמן מודל רגרסיה לוגיסטי.

מריצים את השאילתה הבאה בקטע SQL QUERY EDITOR במסוף 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&#39; ומאלץ את BQML לאמן את הנתונים בהתאם לתנאי השאילתה (data_cat = 'TRAIN'), וגם לשים לב שעדיף להשתמש בפונקציה 'auto_SPLIT' באפשרות הזאת כדי לאפשר למסגרת (או לשירות במקרה הזה) לארגן את המחיצה באקראי של פיצולי רכבת/בדיקה.
  4. האפשרותinput_label_cols מציינת איזו עמודה בהצהרה SELECT תשמש כעמודת התווית. כאן בעמודה של התווית יש ציון, כך שהמודל ילמד איזה מ-10 ערכי הציון הוא שסביר להניח שהוא מבוסס על הערכים האחרים שמופיעים בכל שורה.
  5. הערך 'auto_class_weights=TRUE' מאזנת בין תוויות הכיתה בנתוני האימון. כברירת מחדל, נתוני האימון לא משוקללים. אם התוויות בנתוני האימון לא מאוזנות, המודל עשוי ללמוד לחזות באופן משמעותי יותר את סיווג התוויות הפופולרי ביותר.
  6. בהצהרה SELECT נשלחת שאילתה לטבלה שטענו עם נתוני ה-csv. משפט WHERE מסנן את השורות בטבלת הקלט כך שרק מערך הנתונים TRAIN נבחר בשלב הזה.
  7. המבנים הבאים הם OPTIONAL כדי ש-BigQuery ML יוכל לרשום אותם במפורש במרשם המודלים של Vertex AI. אפשר לקרוא מידע נוסף על הנושא בבלוג הזה. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

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

2e43087f914aa466.png

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

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

7f2dc168bac0ac1a.png

מדדים מרכזיים בקצרה:

דיוק - איזה חלק מהזיהויים החיוביים היה נכון בפועל? Precision = True Positive / (True Positive + False Positive) Recall – איזה שיעור של תוצאות חיוביות בפועל זוהה בצורה נכונה? לזכור = דיוק חיובי אמיתי / (חיובי אמיתי + שלילי שגוי) - מדד להערכת מודלים של סיווג, זהו החלק של החיזויים שהתקבלו במודל שלנו בפועל: דיוק = מספר החיזויים הנכונים / המספר הכולל של החיזויים

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

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

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

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

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

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

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

אפשר לקרוא על השלבים האלה בהרחבה במסמכי התיעוד.

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

כדי לספק תובנות על מערך הנתונים של הסרטים, נבקש מ-LLM (מודל שפה גדול) סיכום של הגורמים שמשפיעים על הציון בסרט להיות גדול מ-5, עם בינה מלאכותית גנרטיבית שמבוססת על מודל הטקסט-ביזון (הטקסט האחרון) של 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 source (חיבור למקורות נתונים חיצוניים'). במקורות הפופולריים שצוינו
  2. בוחרים את סוג החיבור בתור 'BigLake ופונקציות מרוחקות', ומציינים את סוג המיקום בתור Region (אזור) והערך הוא 'us-central1 (איווה)' ו-'bq_llm_connection' כמזהה החיבור

8a87802ab0846a6.png

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

הענקת הרשאות

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

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

ff8e1d730879f972.png

8. יצירת מודל למידת מכונה מרחוק

יוצרים את המודל המרוחק שמייצג מודל שפה גדול (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 שמכיל גם את מאפייני התוכן וגם את מאפייני הבטיחות: a. התוכן מייצג את תוצאת הטקסט שנוצרה ב. מאפייני הבטיחות מייצגים את מסנן התוכן המובנה עם סף מתכוונן שמופעל ב-Vertex AI Palm API, כדי למנוע תגובות לא מכוונות או בלתי צפויות ממודל השפה הגדול (LLM). התגובה תיחסם אם היא מפירה את סף הבטיחות.

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

הפונקציה CONCAT מצרפת את הצהרת PROMPT ואת רשומת מסד הנתונים

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

טמפרטורה היא הפרמטר של ההנחיה לשליטה ברנדומיזציה של התשובה – ככל שתבחינו ברלוונטיות נמוכה יותר, כך היא נמוכה יותר

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 שיצרתם במסגרת השלב של למידת מכונה על ידי מעבר לדף Vertex AI Endpoint.

12. מזל טוב

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