נתונים לבינה מלאכותית גנרטיבית באמצעות Spanner ו-Vertex AI Imagen API

1. מבוא

בשיעור ה-Codelab הזה, תפתחו מחולל מבוסס-AI ליצירת תרגילים באמצעות Java, Spring Boot, Cloud Spanner ו-Vertex AI Imagen API. המשתמש יזין הנחיה והאפליקציה תיצור תנוחה על סמך ההנחיה הזו. נשתמש גם בנתונים ממסד הנתונים Spanner שחשוף כ-API ל-REST. זוהי דרך כיפית ומלמדת להדגים את היכולות של בינה מלאכותית גנרטיבית באמצעות Spring Boot ב-Google Cloud.

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

  1. Cloud Spanner
  2. Vertex AI Imagen API
  3. Cloud Run

תרשים זרימה ברמה גבוהה

60192bcbff4c39de.png

מה תפַתחו

היצירה שלך

  • אפליקציית Java Spring Run לנתוני Spanner כ-API של שירות
  • אפליקציית Java Spring Boot לתרחיש לדוגמה של יצירת תמונות באמצעות Imagen
  • ממשק משתמש אינטראקטיבי לקלט ולתשובה של הנחיות

2. דרישות

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

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

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

במסוף Cloud, לוחצים על Activate Cloud Shell בפינה הימנית העליונה:

51622c00acec2fa.png

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

gcloud config set project <YOUR_PROJECT_ID>
  1. כדי להתחיל, עוברים לדף Cloud Spanner עם הפרויקט הפעיל ב-Google Cloud.

3. הכנת הנתונים באמצעות Spanner

לפני יצירת האפליקציה, עליך להשלים את ההגדרה של מסד הנתונים על ידי יצירת מכונה, מסד נתונים וטבלה של Cloud Spanner. בבלוג הזה מופיע מידע מפורט יותר על תכונות של Cloud Spanner, DDL, DML ועוד. אפשר לבצע את השלבים הבאים כדי ליצור את האובייקטים של מסד הנתונים הנדרשים בפרויקט הזה:

  1. כדי ליצור מכונה, לוחצים על CREATE INSTANCE בדף המכונות.
  2. מזינים את הפרטים כמו שמוצג בתמונה הבאה ולוחצים על 'יצירה':

f869fcbb922027a5.png

  1. אחרי שיוצרים את האובייקט, לוחצים על CREATE DATABASE בדף הסקירה הכללית של המכונה.
  2. מזינים את שם מסד הנתונים כ-'first-spanner-db' מזינים את ה-DDL הבא בקטע 'תבניות של DDL' ולוחצים על 'שליחה':
CREATE TABLE Yoga_Poses(
  Pose_Id   INT64 NOT NULL,
  Name  STRING(1024),
  Breath STRING(1024),
  Description STRING(1024)
) PRIMARY KEY(Pose_Id);

צריך ליצור את מסד הנתונים והטבלה כתוצאה מהשלב האחרון. עכשיו נוסיף כמה שורות לטבלה Yoga_Poses, כדי שנוכל לבנות את אפליקציית Spring Boot.

  1. לוחצים על Spanner Studio בחלונית 'מסד נתונים' שבצד ימין ופותחים כרטיסייה חדשה של עורך השאילתות, כפי שמוצג בתמונה למטה:

c86774e8fd32eca0.png

  1. מריצים את שאילתות ה-INSERT הבאות:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE', 
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE', 
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE', 
'SIT ON THE FLOOR LEGS CROSSED');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE', 
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE', 
'PLANK WITH ELBOWS ON MAT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE', 
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE', 
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE', 
'CURL, PRESS AND WORK YOUR BICEPS');

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

4. פיתוח API ל-REST באמצעות Spring Boot ו-Spanner לנתוני מיקום

כדי להכיר את Spring Boot ומסוף Google Cloud, מומלץ לעיין בבלוג הזה.

  1. אתחול אפליקציית Springboot כדי להפעיל את האפליקציה הזו מאפס, צריך לעקוב אחר הבלוג הזה. כדי לשכפל מהמאגר ולהתחיל לפעול, מריצים את הפקודה הבאה בטרמינל של Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

הפעולה הזו הייתה אמורה ליצור את spanner-springb במכונה של Cloud Shell. כדי להבין את רכיבי האפליקציה, כדאי לקרוא את הבלוג.

  1. בואו נבנה ונריץ את האפליקציה כדי לעשות זאת, מריצים את הפקודות הבאות מטרמינל של Cloud Shell:
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. פורסים את האפליקציה ב-Cloud Run כך שתהיה זמינה לאפליקציה ליצירת התנוחת התנוחה. כדי לעשות זאת, מריצים את הפקודה הבאה מהטרמינל של Cloud Shell:
gcloud run deploy –source .

מעבירים את הפרמטרים הנדרשים ומוודאים שהאפליקציה פרוסה. בכתובת ה-URL של השירות שנוצרת צריכה להיות אפשרות לראות את הנתונים שנוצרו ב-Spanner.

5. אתחול אפליקציית מחולל תווי פוזה באמצעות Spring Boot, Spanner ו-Imagen

בשלב הזה השלמנו את החלק העליון של תרשים הזרימה, כלומר הפיכת נתוני Spanner לזמינים כשירות (API ל-REST). עכשיו ניצור אפליקציית לקוח שמפעילה את נתוני מפתח הברגים, קוראת ל-IMAGEN API עם הנחיה ומחזירה את המחרוזת בקידוד Base64 כתמונה לממשק המשתמש.

  1. בשלב הזה אתם כבר מכירים את מבנה פרויקט Springboo ואת המשמעות שלו. לכן דלגו במהירות ישירות אל השכפול של ה-repo למכונת ה-Cloud Shell על ידי הרצת הפקודה הבאה בטרמינל של Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

הפעולה הזו הייתה אמורה ליצור את הפרויקט genai-posegen במכונה של Cloud Shell. מבנה הפרויקט המשוכפל מוצג כך בעורך המעטפת של הענן:

b19a94f895f74c62.png

מחלקת Java PromptController כוללת את הפעלת שירות מסד הנתונים, הטמעת הלוגיקה העסקית והפעלת ה-API הגנרטיבי של Imagen. הכיתה מקיימת אינטראקציה עם תבניות Thymeleaf שמטפלות בשילוב נתונים בממשק המשתמש. יש 3 שיטות שירות במחלקה הזו – 1) לקבלת ההנחיה לקלט 2) לעיבוד הבקשה ולהפעלת ה-Imagen API ו-3) לעיבוד תגובה של imagen.

Prompt ו-Yoga הן מחלקות POJO שמכילות את השדות, getters ו-Setters שיש בממשק עם ה-API של שרת הנתונים Imagen ו-Spanner, בהתאמה.

קובצי ה-HTML של אינדקס ו-getImage בתיקיית התבניות מכילים את התבניות לממשק המשתמש, ויש בהם יחסי תלות של סקריפטים של JS ו-CSS בתיקיות המתאימות.

שילוב API של Vertex AI Imagen בתרחיש לדוגמה של יצירת תמונות אנחנו משתמשים ב-Imagen API של Vertex AI בפורמט הבא:

https://<<region>>- aiplatform.googleapis.com/v1/projects/<<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict

מידע נוסף על היכולות של Imagen זמין כאן. היא מחזירה את התגובה בפורמט מחרוזת בקידוד Base64. כדי להמיר אותו לתמונה, השתמשנו בשיטת JavaScript setattribute (בקובץ getImage.js) באובייקט התמונה, באופן הבא בקובץ getImage.HTML:

poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);

הרשאה כדי לגשת ל-Imagen API צריך להפעיל אימות של אסימון למוכ"ז. במקרה שלנו, השתמשתי בגישת JSON של Application Default Credentials. כדי להטמיע אותו, מריצים את הפקודה הבאה מהטרמינל של Cloud Shell ופועלים לפי ההוראות בטרמינל:

gcloud auth application-default login

מזינים 'Y'. כדי לבצע אימות באמצעות החשבון שלכם. מאשרים גישה ומעתיקים את קוד ההרשאה שמוצג בחלון הקופץ. מיד אחר כך יופיעו פרטי הכניסה של האפליקציה שמוגדרים כברירת מחדל בקובץ ה-JSON שנשמר במיקום שדומה לזה: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.

מורידים את הקובץ או מעתיקים את התוכן של קובץ ה-JSON על ידי הרצת פקודת cat (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) ומשתמשים בו באפליקציה בשיטת callImagen() של המחלקה PromptController.Java. מידע נוסף על אימות זמין כאן.

ממשק משתמש השתמשנו ב-Thymeleaf כמנוע התבנית כדי לנתח ולעבד נתונים בקובצי התבנית של ממשק המשתמש, ולהוסיף עיצוב אלגנטי לממשק המשתמש. היא דומה ל-HTML אבל תומכת במאפיינים נוספים שיעבדו עם נתונים שעברו רינדור. קובץ ה-index.html מכיל את רכיבי העיצוב של דף הנחיתה והוא מאפשר למשתמש לבחור את הנושא ולהוסיף הנחיה מחליפה כדי ליצור את התמונה הרצויה.

6. פיתוח ופריסה

אחרי ששכפולם את הקוד, והחלפתם את הערכים של ה-placeholders בהתאם למה שרלוונטי לפרויקט, לאזור ולפרטי הכניסה, נתקדם לבנייה ולפריסה של האפליקציה. מנווטים לתיקיית הפרויקט בטרמינל של Cloud Shell באמצעות הפקודה, ה-build ולאחר מכן פורסים לבדיקה מקומית במכונה של Cloud Shell באמצעות 3 הפקודות הבאות, אחת אחרי השנייה:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

פריסת האפליקציה ב-Cloud Run כך שתהיה זמינה בענן. כדי לעשות את זה, מריצים את הפקודה הבאה מהטרמינל של Cloud Shell שבתיקיית הפרויקט:

gcloud run deploy –source .

מעבירים את הפרמטרים הנדרשים ומוודאים שהאפליקציה פרוסה.

7. הדגמה (דמו)

אחרי שהאפליקציה פרוסה, כתובת ה-URL של השירות אמורה להופיע בטרמינל. לוחצים על הקישור ורואים את האפליקציה ליצירת תמונת מיקום פועלת ב-Google Cloud ללא שרת (serverless).

92bdb22109b2f756.gif

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

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

  1. במסוף Google Cloud, נכנסים לדף Manage resources:
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete (מחיקה).
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down
  4. אם לא רוצים למחוק את הפרויקט, מוחקים את המופע של Spanner: עוברים למכונה שיצרתם כרגע בפרויקט ולוחצים על DELETE INSTANCE בפינה הימנית העליונה של דף הסקירה הכללית של המכונה.
  5. אפשר גם להיכנס לדף השירותים של Cloud Run ולבחור את השירותים שנוצרו בפרויקט הזה, וללחוץ על לחצן המחיקה כדי למחוק את השירותים.

9. מזל טוב

בבלוג הזה הצלחנו להביא את אפליקציית Spring Boot המשלימה שמאחסנת נתונים ומטפלת בהם ב-Cloud Spanner, כדי ליצור מיקומים באמצעות Imagen API של Google Cloud Vertex AI באפליקציית לקוח אינטראקטיבית שנפרסה ב-Cloud Run. בקטע של תרשים הארכיטקטורה בבלוג הזה, אתם רואים את רכיב Cloud Functions (Java) שמעולם לא היינו צריכים לעשות? כאן אפשר למצוא את כולם אם ברצונך להוסיף תוכן. אפשר להטמיע שתי פונקציות Java Cloud Functions כדי לבצע את שתי השיטות שניתן למצוא בקובץ getimage.html: שמירת התנוחה למסד הנתונים והעלאת שיטות התמונה. אתם יכולים לעיין במסמכי התיעוד של Imagen ב-Vertex AI כדי לקבל מידע נוסף על המודל.