מידע על Codelab זה
1. סקירה כללית
נסו לדמיין אפליקציית אופנה שלא רק עוזרת לכם למצוא את התלבושת המושלמת, אלא גם מספקת טיפים בזמן אמת לגבי סגנון, והכול בזכות השילוב המתקדם של AI גנרטיבי. בסקירה הזו נסביר איך פיתחנו אפליקציה כזו באמצעות יכולות החיפוש לפי וקטור של AlloyDB, בשילוב עם האינדקס ScaNN של Google, שמאפשרים לבצע חיפושים מהירים במיוחד של תלבושות תואמות ולקבל המלצות מיידיות בתחום האופנה.
בנוסף, נרחיב על האופן שבו האינדקס ScaNN של AlloyDB מבצע אופטימיזציה של שאילתות מורכבות כדי ליצור הצעות מותאמות אישית לסגנונות. אנחנו גם נשתמש ב-Gemini וב-Imagen, מודלים חזקים של AI גנרטיבי, כדי לספק השראה לסטיילינג יצירתי ואפילו להציג באופן חזותי את הלוק המותאם אישית שלכם. האפליקציה הזו כולה מבוססת על ארכיטקטורה ללא שרת, שמבטיחה חוויית שימוש חלקה וניתנת להתאמה אישית למשתמשים.
האתגר: האפליקציה מציעה הצעות מותאמות אישית לשילובי בגדים, כדי לעזור לאנשים שהתקשו לקבל החלטות בנושא אופנה. כך גם תוכלו להימנע מעייפות מקבלת החלטות לגבי התלבושת.
הפתרון: אפליקציית ההמלצות על תלבושות פותרת את הבעיה של מתן חוויית אופנה חכמה, מותאמת אישית ומעניינת למשתמשים, תוך הצגת היכולות של AlloyDB, AI גנרטיבי וטכנולוגיות ללא שרת.
מה תפַתחו
במסגרת שיעור ה-Lab הזה תלמדו:
- יצירת מכונה של AlloyDB וטעינה של מערך נתונים של מסחר אלקטרוני
- הפעלת התוספים pgvector ו-AI גנרטיבי ב-AlloyDB
- יצירת הטמעות (embeddings) מתיאור המוצר
- פריסת הפתרון ב-Cloud Run Functions ללא שרת
- מעלים תמונה ל-Gemini ויוצרים הנחיה לתיאור התמונה.
- יצירת תוצאות חיפוש על סמך הנחיות בשילוב עם הטמעות (embeddings) של מערכי נתונים של מסחר אלקטרוני.
- מוסיפים הנחיות נוספות כדי להתאים אישית את ההנחיה וליצור המלצות לסגנון.
- פריסת הפתרון ב-Cloud Run Functions ללא שרת
דרישות
2. ארכיטקטורה
הארכיטקטורה הכללית של האפליקציה היא:
בקטעים הבאים נסביר את הקשר של המדריך:
הטמעת נתונים:
השלב הראשון הוא הטמעת נתוני הקמעונאות (מלאי, תיאורי מוצרים, אינטראקציות עם לקוחות) ב-AlloyDB.
Analytics Engine:
אנחנו נשתמש ב-AlloyDB כמנוע הניתוח כדי לבצע את הפעולות הבאות:
- חילוץ הקשר: המנוע מנתח את הנתונים ששמורים ב-AlloyDB כדי להבין את הקשרים בין מוצרים, קטגוריות, התנהגות לקוחות וכו', לפי הצורך.
- יצירת הטמעה: הטמעות (ייצוגים מתמטיים של טקסט) נוצרות גם לשאילתה של המשתמש וגם למידע שנשמר ב-AlloyDB.
- חיפוש וקטורי: המנוע מבצע חיפוש דמיון, ומשויך את הטמעת השאילתה לטמעות של תיאורי מוצרים, ביקורות ונתונים רלוונטיים אחרים. כך מזהים את 25 'השכנים הקרובים ביותר' הרלוונטיים ביותר.
המלצה של Gemini:
מערך הבייטים של התמונה מועבר למודל Gemini דרך Vertex AI API, יחד עם ההנחיה לבקש תיאור טקסטואלי של הלבוש העליון ועם ההצעות להמלצות על ביגוד תחתון.
חיפוש באמצעות RAG וחיפוש באמצעות וקטורים ב-AlloyDB:
התיאור של הלבוש העליון משמש לשליחת שאילתה למסד הנתונים. השאילתה ממירה את טקסט החיפוש (המלצה מהמודל של Gemini לגבי ביגוד תחתון תואם) להטמעות (embeddings), ומבצעת חיפוש וקטורים בהטמעות ששמורות במסד הנתונים כדי למצוא את השכנים הקרובים ביותר (תוצאות תואמות). כדי לשפר את החזרה (recall), המערכת מוסיפה לאינדקס את הטמעות הווקטורים במסד הנתונים של AlloyDB באמצעות האינדקס ScaNN.
יצירת תמונה של תגובה:
התשובות המאושרות מובנות במערך JSON, והמנוע כולו ארוז בפונקציה ללא שרת ב-Cloud Run שנקראת מ-Agent Builder.
יצירת תמונות באמצעות Imagen:
ההנחיה של המשתמש לגבי סגנון, המלצה שנבחרה על ידי המשתמש וכל בקשות ההתאמה האישית משולבות כדי להציג את Imagen 3 עם תמונה קיימת. התמונה עם העיצוב נוצרת על סמך ההנחיה הזו, באמצעות Vertex AI API.
3. לפני שמתחילים
יצירת פרויקט
- בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud.
- הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
- נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud ומגיעה עם bq טעון מראש. לוחצים על Activate Cloud Shell (
) בחלק העליון של מסוף Google Cloud.
- אחרי שמתחברים ל-Cloud Shell, מוודאים שכבר בוצע אימות ושמזהה הפרויקט מוגדר כפרויקט באמצעות הפקודה הבאה:
gcloud auth list
- מריצים את הפקודה הבאה כדי לוודא שהפקודות הבאות של gcloud יזהו את הפרויקט בצורה נכונה.
gcloud config list project
- אם הפרויקט לא מוגדר, צריך להשתמש בפקודה הבאה כדי להגדיר אותו באופן מפורש:
gcloud config set project <YOUR_PROJECT_ID>
- מפעילים את ממשקי ה-API הנדרשים.
עוקבים אחרי הקישור כדי להפעיל את ממשקי ה-API.
אם שכחתם להפעיל ממשק API כלשהו, תמיד תוכלו להפעיל אותו במהלך ההטמעה.
מידע נוסף על הפקודות של gcloud ועל השימוש בהן זמין במסמכי העזרה.
4. הגדרת מסד נתונים
בשיעור ה-Lab הזה נשתמש ב-AlloyDB כמסד הנתונים לאחסון מערך הנתונים של מסחר אלקטרוני קמעונאי. הוא משתמש באשכולות כדי לאחסן את כל המשאבים, כמו מסדי נתונים יומנים. לכל אשכול יש מכונה ראשית שמספקת נקודת גישה לנתונים. טבלאות הן המשאב בפועל שבו מאוחסנים הנתונים.
נלמד ליצור אשכול, מכונה וטבלה ב-AlloyDB שבהם ייטען מערך הנתונים של המסחר האלקטרוני.
יצירת אשכול ומכונה
- במסוף Google Cloud, מחפשים את AlloyDB. דרך קלה למצוא את רוב הדפים במסוף Cloud היא לחפש אותם באמצעות סרגל החיפוש במסוף.
- לוחצים על CREATE CLUSTER.
- יוצרים אשכול ומכונה עם הערכים הבאים:
- מזהה האשכולות:
shopping-cluster
- סיסמה: "
alloydb
" - תאימות ל-PostgreSQL 15
- אזור: '
us-central1
' - רשתות: "
default
"
- בקטע 'רשת', כשבוחרים את רשת ברירת המחדל, מופיעה האפשרות הבאה. לוחצים על הגדרת חיבור כדי להגדיר רשת ברירת מחדל.
- בוחרים באפשרות שימוש בטווח IP שהוקצה באופן אוטומטי ולוחצים על המשך. אחרי שבודקים את המידע, לוחצים על CREATE CONNECTION (יצירת חיבור).
ממתינים לסיום יצירת רשת ברירת המחדל.
- בקטע Configure your primary instance (הגדרת המכונה הראשית), מגדירים את מזהה המכונה כ-
shopping-instance"
.
- לוחצים על CREATE CLUSTER (יצירת אשכול) כדי להשלים את הגדרת האשכול באופן הבא:
5. הטמעת נתונים
עכשיו הגיע הזמן להוסיף טבלה עם הנתונים על החנות. ממתינים לסיום היצירה של המכונה. אחרי היצירה, תוכלו להיכנס ל-AlloyDB באמצעות פרטי הכניסה שהגדרתם כשיצרתם את האשכולות.
אימות למסד הנתונים של AlloyDB
- נכנסים לדף AlloyDB במסוף Google Cloud. בוחרים את האשכולות הראשי ולוחצים על AlloyDB Studio בתפריט הניווט הימני:
- מזינים את הפרטים הבאים כדי לבצע אימות במסד הנתונים של AlloyDB:
- שם משתמש : "
postgres
" - מסד נתונים : '
postgres
' - סיסמה : "
alloydb
"
אחרי שתבצעו אימות ב-AlloyDB Studio, תוכלו להזין פקודות SQL בכרטיסיות של Editor. אפשר להוסיף כמה חלונות של הכלי באמצעות סמל הפלוס שמשמאל לכרטיסייה הראשונה של הכלי.
מזינים פקודות ל-AlloyDB בחלונות של Editor, באמצעות האפשרויות Run, Format ו-Clear לפי הצורך.
הפעלת תוספים
כדי ליצור את האפליקציה הזו, נשתמש בתוספים pgvector"
ו-google_ml_integration"
.
- התוסף pgvector מאפשר לאחסן ולחפש הטמעות של וקטורים.
- התוסף google_ml_integration מספק פונקציות שמאפשרות לגשת לנקודות קצה של חיזוי ב-Vertex AI כדי לקבל חיזויים ב-SQL.
- כדי להפעיל את התוספים האלה, מריצים את שאילתות ה-DDL הבאות:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- מריצים את פקודת ה-SQL הבאה כדי לוודא שהתוספים מותקנים:
select extname, extversion from pg_extension;
צור טבלה
- יוצרים טבלה באמצעות משפט ה-DDL הבא:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
אם הפקודה שלמעלה תתבצע בהצלחה, אמורה להופיע הטבלה ב-
במסד נתונים. בתמונה הבאה מוצגת דוגמה:
הטמעת נתונים
בשיעור ה-Lab הזה יש לנו נתוני בדיקה של כ-200 רשומות בקובץ ה-SQL הזה. התוצאה כוללת את id, category, sub_category, uri, image
ו-content
. השדות האחרים ימולאו בהמשך הסדנה.
- מעתיקים את 20 השורות/הצהרות ההוספה מקובץ ה-SQL לכרטיסיית עריכה חדשה ב-AlloyDB Studio, ולוחצים על הפעלה.
- מרחיבים את הקטע Explorer עד שרואים את הטבלה בשם
apparels
. - לוחצים על סמל התפריט [⋮] ואז על שאילתה. תנאי SELECT ייפתח בכרטיסייה חדשה ב-Editor.
- לוחצים על Run כדי לוודא שהשורות הוכנסו.
הענקת הרשאה למשתמש
נעניק למשתמש postgres
הרשאה ליצור הטמעות מתוך AlloyDB.
. כדי להעניק למשתמש postgres
הרשאות הפעלה על הפונקציה embedding
, מריצים את ההצהרה הבאה ב-AlloyDB Studio:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
הקצאת התפקיד Vertex AI User לחשבון השירות של AlloyDB
אנחנו נשתמש במודלים של הטמעת טקסט מ-Vertex AI כדי ליצור הטמעות של Vertex AI User ROLE לחשבון השירות של AlloyDB.
במסוף Google Cloud, לוחצים על הסמל של טרמינל Cloud Shell [ ] ומריצים את הפקודה הבאה:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. בניית הקשר
כדי ליצור הטמעה, נצטרך context
, כלומר את כל המידע שאנחנו רוצים לכלול בשדה אחד. כדי לעשות זאת, נוצר תיאור מוצר ונשמור אותו בעמודה pdt_desc
בטבלה apparels
.
במקרה שלנו, נשתמש בכל המידע על כל מוצר, אבל כשאתם עושים את זה עם הנתונים שלכם, אתם יכולים לעצב את הנתונים בכל דרך שמשמעותית לעסק שלכם.
בכרטיסייה 'עורך' של AlloyDB Studio, מריצים את הפקודה הבאה שמעדכנת את השדה pdt_desc
בנתוני הקשר:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
בעזרת ה-DML הזה נוצר סיכום פשוט של ההקשר באמצעות המידע מכל השדות שזמינים בטבלה ומהקשרים אחרים (אם יש כאלה בתרחיש לדוגמה). כדי ליצור מבחר מדויק יותר של מידע והקשר, אתם יכולים לעצב את הנתונים בכל דרך שמשמעותית לעסק שלכם.
7. יצירת הטמעות (embeddings) להקשר
קל הרבה יותר למחשבים לעבד מספרים מאשר לעבד טקסט. מערכת הטמעה ממירה טקסט לסדרה של מספרים בנקודה צפה, שאמורים לייצג את הטקסט, ללא קשר לאופן שבו הוא מנוסח, לשפה שבה הוא כתוב וכו'.
כדאי לתאר מיקום על חוף הים. הוא יכול להיקרא "on the water
, beachfront
, walk from your room to the ocean
, sur la mer
, на берегу океана
וכו'. כל המונחים האלה נראים שונים, אבל המשמעות הסמנטית שלהם, או במונחים של למידת מכונה, ההטמעות שלהם אמורות להיות דומות מאוד זו לזו.
עכשיו, כשהנתונים וההקשר מוכנים, נריץ את שאילתת ה-SQL כדי להוסיף את הטמעות העמודה ((pdt_desc
) של תיאור המוצר לטבלה בשדה embedding
. יש מגוון מודלים להטמעה שאפשר להשתמש בהם. אנחנו משתמשים ב-text-embedding-005
מ-Vertex AI.
- ב-AlloyDB Studio, מריצים את הפקודה הבאה כדי ליצור הטמעות (embeddings) ולעדכן את העמודה
pdt_desc
בהטמעות של הנתונים ששמורים בה:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- מריצים את הפקודה הבאה כדי לוודא שהטמעות נוצרות:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
זו דוגמה למודל הטמעה (embedding) של הטקסט לדוגמה בשאילתה, שנראה כמו מערך של מספרים שגופים (floats):
8. ביצוע חיפוש Vector
עכשיו, כשהטבלה, הנתונים וההטמעות מוכנים, נבצע חיפוש וקטורים בזמן אמת של טקסט החיפוש של המשתמש.
נניח שטקסט החיפוש של המשתמש הוא pink color, casual, pure cotton tops for women
כדי למצוא התאמות לשאילתה הזו, מריצים את שאילתת ה-SQL הבאה:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
נבחן את השאילתה הזו בפירוט:
בשאילתה הזו,
- טקסט החיפוש של המשתמש הוא: "
I want womens tops, pink casual only pure cotton.
" - אנחנו ממירים את טקסט החיפוש הזה להטמעות באמצעות השיטה
embedding()
יחד עם המודל:text-embedding-005
. השלב הזה אמור להיראות מוכר אחרי השלב האחרון, שבו החלנו את פונקציית ההטמעה על כל הפריטים בטבלה. - הערך '
<=>
' מייצג את השימוש בשיטת המרחק COSINE SIMILARITY. כל מדדי הדמיון הזמינים מפורטים במסמכי התיעוד של pgvector. - אנחנו ממירים את התוצאה של שיטת ההטמעה לסוג הנתונים vector כדי שהיא תהיה תואמת לווקטורים שמאוחסנים במסד הנתונים.
- LIMIT 5 מייצגת את הרצון לחלץ 5 שכנים קרובים לטקסט החיפוש.
בהמשך מוצגת דוגמה לתגובה של שאילתת ה-SQL הזו:
כפי שניתן לראות בתוצאות, ההתאמות דומות מאוד לטקסט החיפוש. נסו לשנות את הצבע כדי לראות איך התוצאות משתנות.
אינדקס ScaNN של AlloyDB לשיפור ביצועי השאילתות
עכשיו נניח שאנחנו רוצים לשפר את הביצועים (זמן השאילתה), היעילות וההחזקה (recall) של תוצאת החיפוש בעזרת ScaNN.
אם אתם רוצים להשתמש ב-ScaNN index, תוכלו לנסות את השלבים הבאים:
- מאחר שכבר יצרנו את האשכולות, המכונות, ההקשרים וההטמעות, אנחנו צריכים רק להתקין את התוסף ScaNN באמצעות ההצהרה הבאה:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- יוצרים את האינדקס ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
ב-DDL שלמעלה:
-
apparel_index
הוא שם האינדקס. apparels
הוא שם הטבלה.scann
היא שיטת האינדקס.embedding
היא העמודה בטבלה שרוצים להוסיף לאינדקס.cosine
הוא שיטת המרחק שבה רוצים להשתמש עם האינדקס.54
הוא מספר המחיצות שיש להחיל על האינדקס הזה. הערך יכול להיות כל מספר בין 1 ל-1048576. מידע נוסף על בחירת הערך הזה זמין במאמר התאמת אינדקס ScaNN.
בהתאם להמלצה ב-ScaNN repo, השתמשנו בשורש הריבועי של מספר נקודות הנתונים. כשמחלקים את המרחב, הערך של num_leaves
צריך להיות בערך שורש ריבועי של מספר נקודות הנתונים.
- בודקים אם האינדקס נוצר באמצעות השאילתה:
SELECT * FROM pg_stat_ann_indexes;
- מבצעים חיפוש וקטור באמצעות אותה שאילתה שבה השתמשנו בלי האינדקס:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
השאילתה שלמעלה היא אותה שאילתה שבה השתמשנו בסדנה בשלב 8. עם זאת, עכשיו השדה נוסף לאינדקס באמצעות האינדקס ScaNN.
- בודקים עם שאילתה פשוטה לחיפוש, עם האינדקס וגם בלי האינדקס. כדי לבדוק את האתר בלי הוספה לאינדקס, צריך להסיר את האינדקס:
white tops for girls without any print
טקסט החיפוש שלמעלה בשאילתת החיפוש הווקטורית בנתוני ההטמעה שנוספו לאינדקס מניב תוצאות חיפוש איכותיות ויעילות. היעילות משתפרת בצורה משמעותית (מבחינת זמן הביצוע: 10.37 אלפיות השנייה ללא ScaNN ו-0.87 אלפיות השנייה עם ScaNN) עם האינדקס. מידע נוסף בנושא הזה זמין בפוסט הזה בבלוג.
9. אימות התאמה באמצעות LLM
לפני שנמשיך ונוצר שירות להצגת התאמות מושלמות לאפליקציה, נשתמש במודל AI גנרטיבי כדי לוודא שהתשובות האפשריות האלה רלוונטיות באמת ובטוחות לשיתוף עם המשתמש.
מוודאים שהמכונה מוגדרת ל-Gemini
- מוודאים ש-
google_ml_integration
כבר מופעל באשכולות ובמכונות. ב-AlloyDB Studio, מריצים את הפקודה הבאה:
show google_ml_integration.enable_model_support;
אם הערך שמוצג הוא 'מופעל', אפשר לדלג על 2 השלבים הבאים ולעבור ישירות להגדרה של
השילוב של AlloyDB עם Vertex AI Model.
- עוברים למכונה הראשית של אשכול AlloyDB ולוחצים על EDIT PRIMARY INSTANCE (עריכת המכונה הראשית).
- בקטע Advanced configuration options (אפשרויות הגדרה מתקדמות), מרחיבים את הקטע database flag (דגל מסד נתונים חדש) ומוודאים שהערך של
google_ml_integration.enable_model_support flag
מוגדר ל-on
באופן הבא:
3. אם הערך לא מוגדר כ-
on
, מגדירים אותו כ-on
ולוחצים על UPDATE INSTANCE.
השלב הזה יימשך כמה דקות.
שילוב של AlloyDB עם מודלים של Vertex AI
עכשיו אפשר להתחבר ל-AlloyDB Studio ולהריץ את משפט ה-DML הבא כדי להגדיר גישה למודל Gemini מ-AlloyDB, באמצעות מזהה הפרויקט במקום הנדרש. יכול להיות שתופיע אזהרה על שגיאת תחביר לפני הרצת הפקודה, אבל היא אמורה לפעול בצורה תקינה.
- נכנסים לדף AlloyDB במסוף Google Cloud. בוחרים את האשכולות הראשי ולוחצים על AlloyDB Studio בתפריט הניווט הימני.
- נשתמש ב-
gemini-1.5-pro:generateContent
שזמין כברירת מחדל עם התוסףgoogle_ml_integration
. - אפשר לבדוק את המודלים שהוגדרו לצורך גישה באמצעות הפקודה הבאה ב-AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
- מריצים את הפקודה הבאה כדי להעניק למשתמשים של מסד הנתונים הרשאה להריץ את הפונקציה ml_predict_row כדי להריץ חיזויים באמצעות המודלים של Google Vertex AI:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
בדיקת התשובות
בסוף נשתמש בשאילתה אחת גדולה בקטע הבא, שבו נעבור את האפליקציה ל-Cloud Run. כדי לוודא שהתשובות מהשאילתה יהיו סבירות, יכול להיות שיהיה קשה להבין את השאילתה.
נבחן את הקטעים הנפרדים שמרכיבים את השאילתה הגדולה יותר שבה אנחנו משתמשים בסופו של דבר.
- קודם נשלחת בקשה למסד הנתונים כדי לקבל את 5 ההתאמות הקרובות ביותר לשאילתה של המשתמש. אנחנו כותבים את השאילתה בקוד כדי לשמור על הפשטות, אבל אל דאגה, נוסיף אותה לשאילתה מאוחר יותר.
אנחנו כוללים את תיאור המוצר מהטבלה apparels
ומוסיפים שני שדות חדשים – אחד שמשלב את התיאור עם האינדקס, והשני עם הבקשה המקורית. הנתונים האלה נשמרים בטבלה בשם xyz
, שהוא שם טבלה זמני.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
הפלט של השאילתה הזו יהיה 5 השורות הדוחות ביותר לשאילתת המשתמש. הטיסה
הטבלה החדשה xyz
תכלול 5 שורות, שבכל אחת מהן יופיעו העמודות הבאות:
literature
content
user_text
- כדי לקבוע את מידת התוקף של התשובות, נשתמש בשאילתה מורכבת שבה נסביר איך להעריך את התשובות. השאילתה כוללת את השדות
user_text
ו-content
בטבלהxyz
.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- באמצעות השאילתה הזו, נבדוק את 'האיכות' של התשובות בטבלה
xyz
. כשאנחנו מדברים על איכות, אנחנו מתכוונים לרמת הדיוק של התשובות שנוצרות בהשוואה למה שציפינו לקבל.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- הפונקציה
predict_row
מחזירה את התוצאה שלה בפורמט JSON. הקוד-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
משמש לחילוץ הטקסט בפועל מה-JSON הזה. כדי לראות את ה-JSON בפועל שמוחזר, אפשר להסיר את הקוד הזה. - לבסוף, כדי לקבל את השדה LLM, פשוט מחלצים אותו מטבלת x:
SELECT
LLM_RESPONSE
FROM
x;
- אפשר לשלב את השאילתות האלה בשאילתה אחת באופן הבא:
אזהרה: אם הרצתם את השאילתות שלמעלה כדי לבדוק את התוצאות הביניים,
חשוב לוודא שמוחקים או מסירים את הטבלאות xyz
ו-x
ממסד הנתונים של AlloyDB לפני שמריצים את השאילתה הזו.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
השאילתה הגדולה יותר היא שילוב של כל השאילתות שהרצנו בשלבים הקודמים. התוצאות יציינו אם יש התאמה או לא, מה אחוז ההתאמה ותהיה הסבר כלשהו לגבי הדירוג.
שימו לב שבמודל Gemini, הסטרימינג מופעל כברירת מחדל, כך שהתשובה בפועל מפוזרת על פני כמה שורות:
10. העברת האפליקציה לאינטרנט
עכשיו אנחנו נתארח את האפליקציה הזו כדי שאפשר יהיה לגשת אליה מהאינטרנט.
יצירת פונקציית Cloud Run
- נכנסים לדף Cloud Run Functions במסוף Google Cloud באמצעות הקישור הבא:
https://console.cloud.google.com/run/create?deploymentType=function
- בקטע Configure (הגדרה), מגדירים את Function Name (שם הפונקציה) בתור retail-engine ובוחרים את האזור us-central1.
- בשדה Endpoint URL, בוחרים בסביבת זמן ריצה כ-Java 17.
- בקטע Authentication, בוחרים באפשרות Allow unauthenticated invocations.
- מרחיבים את הקטע Container(s), Volumes, Networking, Security ולוחצים על הכרטיסייה Networking.
- בוחרים באפשרות Connect to a VPC for outbound traffic (התחברות ל-VPC לתנועה יוצאת) ולוחצים על Use Serverless VPC Access connectors (שימוש במחברים של Serverless VPC Access).
- בקטע Network (רשת), לוחצים על Add New VPC Connector (הוספת מחבר VPC חדש). מפעילים את Serverless VPC Access API, אם הוא עדיין לא מופעל.
- ביצירת המחבר, מגדירים את השם כ-
alloydb-test-conn
. - מגדירים את האזור בתור
us-central
. - משאירים את הערך של Network כ-default ומגדירים את Subnet כ-Custom IP Range עם טווח כתובות ה-IP 10.8.0.0 או משהו דומה שזמין.
- מרחיבים את ההגדרות של Show scaling (הצגת התאמה לעומס), ומגדירים את הערך של Minimum instances (מכונות מינימום) ל-2 ואת הערך של Maximum instances (מכונות מקסימום) ל-3.
- בוחרים את סוג המכונה f1-micro. האפשרויות ליצירת מחבר מוצגות בהמשך:
- לוחצים על 'יצירה' כדי ליצור את המחבר.
- בקטע ניתוב תנועה, בוחרים באפשרות ניתוב כל התנועה ל-VPC.
- לוחצים על Create כדי ליצור את הפונקציה.
פריסת האפליקציה
אחרי שיוצרים את הפונקציה, מעדכנים את המקור ופורסים מחדש את האפליקציה.
- ב-Cloud Run, לוחצים על הכרטיסייה Services ואז על הפונקציה retail-engine.
- לוחצים על הכרטיסייה Source (מקור). משאירים את נקודת הכניסה לפונקציה שמוגדרת כברירת מחדל כ-'
gcfv2.HelloHttpFunction
'. - מחליפים את התוכן של הקובץ HelloHttpFunction.java בתוכן מקובץ ה-Java הזה.
- מעדכנים את הפרטים של AlloyDbJdbcConnector בקובץ בהתאם לפרטי המכונה והאשכול של AlloyDB. מחליפים את
$PROJECT_ID
במזהה הפרויקט של האשכולות והמכונות של AlloyDB.
- מחליפים את התוכן של הקובץ pom.xml בתוכן של קובץ ה-XML הזה.
- לוחצים על Save and redeploy כדי לפרוס את הפונקציה.
11. בדיקת האפליקציה של מנוע הקמעונאות
אחרי הפריסה של פונקציית Cloud Functions המעודכנת, נקודת הקצה אמורה להופיע בפורמט הבא:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
אפשר לבדוק את זה בטרמינל של Cloud Shell באמצעות הפקודה הבאה:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
לחלופין, אפשר לבדוק את פונקציית Cloud Run באופן הבא:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
והתוצאה:
עכשיו, אחרי שביצענו חיפוש של וקטורים דומים באמצעות מודל ההטמעה בנתוני AlloyDB, אנחנו יכולים להמשיך ליצירת האפליקציה שמשתמשת בהטמעות האלה יחד עם התמונה שלכם, ומציגה הנחיות ליצירת הצעות לסגנון.
12. הסבר על התהליך של המלצות על תלבושות
אפליקציית ההמלצות על תלבושות היא אפליקציית Sprint Boot שמוגדרת לפעול עם הטמעות (embeddings) שיצרנו באפליקציית מנוע הקמעונאות של AlloyDB, יחד עם Gemini ו-Imagen, כדי ליצור אפשרויות חזותיות של סגנונות לבוש. אפשר גם להוסיף הנחיות בהתאמה אישית ולשנות את ההמלצה באופן מאולתר.
אפשר להסביר את זה כך: אתם מעלים לאפליקציה תמונה של חולצה ורודה לוהטת בארון הבגדים שלכם. כשלוחצים על 'הצגה', האפליקציה יוצרת כמה אפשרויות בהתאם להנחיה שהוגדרה בקוד האפליקציה ולהטמעות במסד הנתונים של AlloyDB, שמתאימות לתמונה המקורית. עכשיו אתם רוצים לראות איך האפשרויות המוצעות ייראו עם שרשרת כחולה, ולכן מוסיפים הנחיה בשורות האלה ולוחצים על סמל העיצוב. נוצרת התמונה הסופית, שמשלבת את התמונה המקורית עם ההמלצות ליצירת תלבושת תואמת.
כדי להתחיל ליצור את האפליקציה להמלצות על תלבושות:
- ב-Cloud Run, פותחים את האפליקציה retail-engine ומתעדים את כתובת ה-URL של האפליקציה. זהו מאגר הטמעות הנתונים (embeddings) שבו נשתמש כדי ליצור הצעות דומות.
- בסביבת הפיתוח המשולבת (IDE), משכפלים את המאגר https://github.com/AbiramiSukumaran/outfit-recommender/. בתרגול הזה, מבצעים את השלבים המוצגים בסביבת הפיתוח המשולבת (IDE) של Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
אלה כמה מהקבצים החשובים בספרייה של האפליקציה:
src/main
: ספריית המקור שבה נמצאים קובצי האפליקציה ו-HTML:HelloWorldApplication.java
: נקודת הכניסה הראשית לאפליקציית Spring Boot.HelloWorldController.java
: בקר REST של Spring Boot שמטפל בבקשות HTTP שקשורות לאפליקציה להמלצות על תלבושות. הקובץ הזה מטפל בבקשות GET ו-POST, מעבד הנחיות למשתמשים, מנתח תמונות, יוצר אינטראקציה עם הטמעות של AlloyDB ומחזיר את התשובה הסופית לממשק המשתמש. הבקר הזה קורא לכיתה GenerateImageSample.GenerateImageSample.java
: מכיל את הכיתה ליצירת תמונות שמתחבר ל-Vertex AI, מעצב את ההנחיה למשתמש, מבצע קריאות API למודל Imagen ומחזיר את התמונה החזויה לכיתה הבקר.Resources
: הספרייה הזו מכילה תמונות וקובצי HTML שנדרשים ליצירת ממשק המשתמש של האפליקציה.Pom.xml
: הגדרת התצורות והתלויות של הפרויקט.
- ב-Visual Studio Code, פותחים את
HelloWorldController.java
ומעדכנים את המופעים של מזהה הפרויקט והמיקום בהתאם למיקום שבו נוצרת מכונה של AlloyDB.
- מעדכנים את
endpoint
בכתובת ה-URL של האפליקציה של מנוע המסחר שתארחתם מקודם.
- פותחים את
GenerateImageSample.java
ומעדכנים את מזהה הפרויקט ואת המיקום בהתאם למיקום שבו נוצרת מכונה של AlloyDB.
- שומרים את כל הקבצים.
עכשיו נפרוס את האפליקציה הזו בסביבת זמן ריצה ללא שרת (serverless) ב-Cloud Run.
13. איך מעבירים את האפליקציה לאינטרנט
עכשיו, אחרי שהוספנו את הפרטים הרלוונטיים של הפרויקט, המיקום והאפליקציה של מנוע הקמעונאות לאפליקציית Spring Boot להמלצות על תלבושות, אנחנו יכולים לפרוס את האפליקציה ב-Cloud Run.
כדי לפרוס את האפליקציה, נשתמש בפקודה gcloud run deploy
במסוף של Visual Code Studio. ב-Visual Studio Code, אפשר להתקין את התוסף Google Cloud Code כדי להתחיל להשתמש ב-CLI של gcloud.
כדי לפרוס את האפליקציה:
- פותחים את הספרייה המשוכפלת בסביבת הפיתוח המשולבת ומפעילים את הטרמינל. ב-Visual Code Studio, לוחצים על Terminal (מסוף) > New Terminal (מסוף חדש).
- כדי להתקין את ה-CLI של gcloud, פועלים לפי ההוראות במסמך הזה.
- אם אתם משתמשים ב-Visual Code Studio, לוחצים על Extensions (תוספים), מחפשים את Google Cloud Code ומתקינים את התוסף.
- בטרמינל של סביבת הפיתוח המשולבת, מריצים את הפקודה הבאה כדי לאמת את חשבון Google:
gcloud auth application-default login
- מגדירים את מזהה הפרויקט לאותו פרויקט שבו נמצאת מכונה של AlloyDB.
gcloud config set project PROJECT_ID
- מתחילים בתהליך הפריסה.
gcloud run deploy
- בשדה
Source code location
, מקישים על Enter כדי לבחור את ספריית GitHub המשוכפלת. - בשדה
Service name
, מזינים שם לשירות, למשל outfit-recommender, ולוחצים על Enter. - בשדה
Please specify a region
, מזינים את המיקום שבו מתארחים מכונה של AlloyDB והאפליקציה retail-engine, למשל 32 עבור us-central1, ומקישים על Enter.
- ב-
Allow unauthenticated invocations to [..]
, מזינים Y ומקישים על Enter.
בתמונה הבאה מוצגת התקדמות הפריסה של האפליקציה:
14. בדיקת האפליקציה להמלצות על תלבושות
אחרי שפרסתם את האפליקציה ב-Cloud Run, תוכלו לראות את השירות במסוף Google Cloud באופן הבא:
- נכנסים לדף Cloud Run במסוף Google Cloud.
- בקטע Services (שירותים), לוחצים על השירות outfit recommender (המלצות על תלבושות) שפרסמתם. אתם אמורים לראות גם את השירות retail-engine וגם את השירות outfit-recommender באופן הבא:
- לוחצים על כתובת ה-URL של האפליקציה כדי לפתוח את ממשק המשתמש של אפליקציית ההמלצות.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
האפליקציה הפרוסה נראית כך:
שימוש באפליקציה
כדי להתחיל להשתמש באפליקציה, פועלים לפי השלבים הבאים:
- לוחצים על העלאה ומעלים תמונה של פריט הלבשה.
- אחרי העלאת התמונה, לוחצים על סגנון. האפליקציה משתמשת בתמונה כהוראות ומפיקה את האפשרויות התחתונות על סמך ההנחיה מאפליקציית מנוע הקמעונאות, שכוללת הטמעות (embeddings) של מערך הנתונים של הקמעונאות.
האפליקציה יוצרת הצעות לתמונות יחד עם הנחיה על סמך התמונה עם המלצות לעיצוב. לדוגמה: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- אפשר להעביר הנחיות נוספות להמלצה הזו על סגנון שנוצרה באופן אוטומטי. לדוגמה:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- לוחצים על Show (הצגה) כדי לראות את הסגנון הסופי.
15. הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת הפוסט הזה, יש לפעול לפי השלבים הבאים:
- נכנסים לדף Manage resources במסוף Google Cloud.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
16. מזל טוב
מעולה! ביצעתם חיפוש דמיון באמצעות AlloyDB, pgvector ו-Vector search, בשילוב עם שימוש בתוצאת החיפוש עם מודל Imagen החזק כדי ליצור המלצות לעיצוב.