פיתוח Assistant חכמה לשופינג באמצעות AlloyDB ו-Vertex AI Agent Builder – חלק 1

1. סקירה כללית

בסביבת הקמעונאות המהירה של היום, חשוב מאוד לספק שירות לקוחות מעולה תוך מתן אפשרות לחוויות קניות מותאמות אישית. נלמד אתכם איך יוצרים אפליקציית צ'אט מבוססת-ידע, שנועדה לענות על שאלות של לקוחות, לעזור להם לגלות מוצרים ולהתאים אישית את תוצאות החיפוש. הפתרון החדשני הזה משלב את העוצמה של AlloyDB לאחסון נתונים, מנוע ניתוח נתונים פנימי להבנה לפי הקשר, Gemini (Large Language Model) לאימות הרלוונטיות ו-Agent Builder של Google ליצירה מהירה של עוזרת שיחה חכמה.

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

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

מה תפַתחו

כחלק משיעור ה-Lab הזה (חלק 1), תלמדו:

  1. יצירת מכונה של AlloyDB וטעינה של מערך נתונים של מסחר אלקטרוני
  2. הפעלת התוספים pgvector ו-AI גנרטיבי ב-AlloyDB
  3. יצירת הטמעות (embeddings) מתיאור המוצר
  4. ביצוע חיפוש בזמן אמת של דמיון קוסינוס לטקסט החיפוש של המשתמש
  5. פריסת הפתרון ב-Cloud Run Functions ללא שרת

בחלק השני של הסדנה נסביר על השלבים ב-Agent Builder.

דרישות

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

2. ארכיטקטורה

תעבורת הנתונים: נבחן לעומק איך הנתונים עוברים במערכת שלנו:

הטמעת נתונים:

השלב הראשון הוא הטמעת נתוני הקמעונאות (מלאי, תיאורי מוצרים, אינטראקציות עם לקוחות) ב-AlloyDB.

Analytics Engine:

אנחנו נשתמש ב-AlloyDB כמנוע הניתוח כדי לבצע את הפעולות הבאות:

  1. חילוץ הקשר: המנוע מנתח את הנתונים ששמורים ב-AlloyDB כדי להבין את הקשרים בין מוצרים, קטגוריות, התנהגות לקוחות וכו', לפי הצורך.
  2. יצירת הטמעה: הטמעות (ייצוגים מתמטיים של טקסט) נוצרות גם לשאילתה של המשתמש וגם למידע שנשמר ב-AlloyDB.
  3. חיפוש וקטורי: המנוע מבצע חיפוש דמיון, ומשויך את הטמעת השאילתה לטמעות של תיאורי מוצרים, ביקורות ונתונים רלוונטיים אחרים. כך מזהים את 25 'השכנים הקרובים ביותר' הרלוונטיים ביותר.

אימות של Gemini:

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

יצירת תגובה:

התשובות המאושרות מובנות במערך JSON, והמנוע כולו ארוז בפונקציה ללא שרת ב-Cloud Run שנקראת מ-Agent Builder.

אינטראקציה בשיחה:

הכלי ליצירת סוכני תמיכה מציג את התשובות למשתמש בפורמט של שפה טבעית, ומאפשר לנהל דיאלוג הדדי. החלק הזה ייכלל בשיעור Lab נוסף.

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

יצירת פרויקט

  1. בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
  3. נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud ומגיעה עם bq טעון מראש. לוחצים על Activate Cloud Shell בחלק העליון של מסוף Google Cloud.

תמונה של לחצן הפעלת Cloud Shell

  1. אחרי שמתחברים ל-Cloud Shell, בודקים שכבר בוצע אימות ושהמזהה של הפרויקט מוגדר כפרויקט באמצעות הפקודה הבאה:
gcloud auth list
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה gcloud מכירה את הפרויקט.
gcloud config list project
  1. אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
gcloud config set project <YOUR_PROJECT_ID>
  1. מפעילים את ממשקי ה-API הנדרשים.
gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

האפשרות החלופית לפקודה gcloud היא דרך מסוף, על ידי חיפוש של כל מוצר או באמצעות הקישור הזה.

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

במסמכי העזרה מפורטות הפקודות של gcloud והשימוש בהן.

4. הגדרת מסד נתונים

בשיעור ה-Lab הזה נשתמש ב-AlloyDB כמסד הנתונים שיאחסן את נתוני הקמעונאות. הוא משתמש באשכולות כדי לאחסן את כל המשאבים, כמו מסדי נתונים יומנים. לכל אשכול יש מכונה ראשית שמספקת נקודת גישה לנתונים. הטבלאות יכללו את הנתונים בפועל.

נלמד ליצור אשכול, מכונה וטבלה ב-AlloyDB שבהם ייטען מערך הנתונים של המסחר האלקטרוני.

יצירת אשכול ומכונה

  1. נכנסים לדף AlloyDB במסוף Cloud. דרך קלה למצוא את רוב הדפים במסוף Cloud היא לחפש אותם באמצעות סרגל החיפוש במסוף.
  2. בוחרים באפשרות CREATE CLUSTER (יצירת אשכול) בדף הזה:

f76ff480c8c889aa.png

  1. יוצג מסך כמו זה שבהמשך. יוצרים אשכול ומכונה עם הערכים הבאים:
  • מזהה האשכולות: shopping-cluster
  • סיסמה: "alloydb"
  • תאימות ל-PostgreSQL 15
  • אזור: 'us-central1'
  • רשתות: "default"

538dba58908162fb.png

  1. כשבוחרים את רשת ברירת המחדל, מופיע מסך כמו זה שבהמשך. בוחרים באפשרות 'הגדרת חיבור'.
    7939bbb6802a91bf.png
  2. לאחר מכן, בוחרים באפשרות 'שימוש בטווח IP שהוקצה באופן אוטומטי' וממשיכים. אחרי שבודקים את המידע, בוחרים באפשרות 'יצירת חיבור'. 768ff5210e79676f.png
  3. אחרי שהרשת מוגדרת, אפשר להמשיך ליצור את האשכולות. לוחצים על CREATE CLUSTER כדי להשלים את הגדרת האשכולות, כפי שמתואר בהמשך:

e06623e55195e16e.png

חשוב לשנות את מזהה המכונה ל-'shopping-instance"'.

לתשומת ליבכם: יצירת האשכולות תימשך כ-10 דקות. בסיום, אמור להופיע מסך שנראה כך:

24eec29fa5cfdb3e.png

5. הטמעת נתונים

עכשיו הגיע הזמן להוסיף טבלה עם הנתונים על החנות. עוברים אל AlloyDB, בוחרים את האשכול הראשי ואז את AlloyDB Studio:

847e35f1bf8a8bd8.png

יכול להיות שתצטרכו להמתין עד לסיום יצירת המכונה. לאחר מכן, נכנסים ל-AlloyDB באמצעות פרטי הכניסה שיצרתם כשיצרתם את האשכולות. משתמשים בנתונים הבאים כדי לבצע אימות ב-PostgreSQL:

  • שם משתמש : "postgres"
  • מסד נתונים : 'postgres'
  • סיסמה : "alloydb"

אחרי שתבצעו אימות ב-AlloyDB Studio, תוכלו להזין פקודות SQL בעורך. אפשר להוסיף כמה חלונות של הכלי באמצעות סמל הפלוס שמשמאל לחלון האחרון.

91a86d9469d499c4.png

מזינים פקודות ל-AlloyDB בחלונות העריכה, באמצעות האפשרויות 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) );

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

908e33bbff58a6d.png

הטמעת נתונים

בשיעור ה-Lab הזה יש לנו נתוני בדיקה של כ-200 רשומות בקובץ ה-SQL הזה. הוא מכיל את id, category, sub_category, uri, image ו-content. השדות האחרים ימולאו בהמשך הסדנה.

מעתיקים משם את 20 השורות/הצהרות ההוספה, מדביקים את השורות האלה בכרטיסייה ריקה של העורך ובוחרים באפשרות 'הפעלה'.

כדי לראות את תוכן הטבלה, מרחיבים את הקטע 'כלי המחקר' עד שמופיעה הטבלה apparels. לוחצים על סמל הנקודות השלושה (⋮) כדי להציג את האפשרות לשלוח שאילתה לטבלה. תנאי SELECT ייפתח בכרטיסייה חדשה ב-Editor.

b31ece70e670ab89.png

מתן הרשאה

מריצים את ההצהרה הבאה כדי להעניק למשתמש postgres זכויות הפעלה על הפונקציה embedding:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

הקצאת התפקיד Vertex AI User לחשבון השירות של AlloyDB

נכנסים לטרמינל של 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. הקשר

חוזרים לדף של מכונה של AlloyDB.

כדי ליצור הטמעה, נצטרך context, כלומר את כל המידע שאנחנו רוצים לכלול בשדה יחיד. כדי לעשות זאת, נוצר תיאור מוצר (שנקרא pdt_desc). במקרה שלנו, נשתמש בכל המידע על כל מוצר, אבל כשאתם עושים זאת עם הנתונים שלכם, אתם יכולים לעצב את הנתונים בכל דרך שמשמעותית לעסק שלכם.

מריצים את ההצהרה הבאה מ-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) להקשר

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

כדאי לתאר מיקום על חוף הים. הוא יכול להיקרא 'על המים', 'חוף הים', 'הליכה מהחדר לאוקיינוס', 'sur la mer', 'на берегу океана' וכו'. כל המונחים האלה נראים שונים, אבל המשמעות הסמנטית שלהם, או במונחים של למידת מכונה, ההטמעות שלהם אמורות להיות קרובות מאוד זו לזו.

עכשיו, כשהנתונים וההקשר מוכנים, נריץ את שאילתת ה-SQL כדי להוסיף את הטמעות התיאור של המוצר לטבלה בשדה embedding. יש מגוון מודלים להטמעה שאפשר להשתמש בהם. אנחנו משתמשים ב-text-embedding-004 מ-Vertex AI. חשוב להשתמש באותו מודל הטמעה לאורך כל הפרויקט.

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

UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-004',
   pdt_desc)
WHERE
 TRUE;

בודקים שוב את הטבלה apparels כדי לראות כמה הטמעות. חשוב להריץ מחדש את ביטוי ה-SELECT כדי לראות את השינויים.

SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 apparels;

הפונקציה הזו אמורה להחזיר את וקטור הטמעת הטקסט, שנראה כמו מערך של מספרים שגופים (floats), עבור טקסט לדוגמה בשאילתה, כפי שמוצג בהמשך:

c69c08d085389f74.png

הערה: פרויקטים חדשים ב-Google Cloud שנוצרו ברמת התמחור 'חינם' עשויים להיתקל בבעיות במכסות לגבי מספר הבקשות להטמעה שמותר לשלוח בשנייה למודל ההטמעה. מומלץ להשתמש בשאילתת סינון למזהה, ואז לבחור באופן סלקטיבי 1-5 רשומות וכן הלאה, בזמן יצירת ההטמעה.

8. ביצוע חיפוש Vector

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

נניח שהמשתמש שואל:

"אני רוצה חולצות נשים, חולצות טריקו ורודות, רק כותנה טהורה."

כדי למצוא התאמות לכך, מריצים את השאילתה הבאה:

SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
  'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;

נבחן את השאילתה הזו בפירוט:

בשאילתה הזו,

  1. טקסט החיפוש של המשתמש הוא: "I want womens tops, pink casual only pure cotton".
  2. אנחנו ממירים אותו להטמעות (embeddings) בשיטה embedding() באמצעות המודל: text-embedding-004. השלב הזה אמור להיראות מוכר אחרי השלב האחרון, שבו החלנו את פונקציית ההטמעה על כל הפריטים בטבלה.
  3. הערך '<=>' מייצג את השימוש בשיטת המרחק COSINE SIMILARITY. כל מדדי הדמיון הזמינים מפורטים במסמכי התיעוד של pgvector.
  4. אנחנו ממירים את התוצאה של שיטת ההטמעה לסוג וקטור כדי שהיא תהיה תואמת לווקטורים ששמורים במסד הנתונים.
  5. LIMIT 5 מייצג שאנחנו רוצים לחלץ 5 שכנים קרובים ביותר לטקסט החיפוש.

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

4193a68737400535.png

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

9. אימות התאמה באמצעות LLM

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

מוודאים שהמכונה מוגדרת ל-Gemini

קודם צריך לבדוק אם השילוב של Google ML כבר מופעל באשכול ובמכונה. ב-AlloyDB Studio, מריצים את הפקודה הבאה:

show google_ml_integration.enable_model_support;

אם הערך שמוצג הוא "on", אפשר לדלג על שני השלבים הבאים ולעבור ישירות להגדרת השילוב של AlloyDB עם Vertex AI Model.

  1. עוברים למכונה הראשית של אשכול AlloyDB ולוחצים על 'עריכת המכונה הראשית'.

456ffdf292d3c0e0.png

  1. עוברים לקטע Flags (דגלים) באפשרויות ההגדרה המתקדמות. ומוודאים שהערך של google_ml_integration.enable_model_support flag מוגדר כ-on כפי שמופיע בהמשך:

6a59351fcd2a9d35.png

אם האפשרות לא מוגדרת כ'מופעלת', מגדירים אותה כ'מופעלת' ולוחצים על הלחצן UPDATE INSTANCE (עדכון המכונה). השלב הזה יימשך כמה דקות.

שילוב של AlloyDB עם מודלים של Vertex AI

עכשיו אפשר להתחבר ל-AlloyDB Studio ולהריץ את משפט ה-DML הבא כדי להגדיר גישה למודל Gemini מ-AlloyDB, באמצעות מזהה הפרויקט במקום הנדרש. יכול להיות שתופיע אזהרה על שגיאת תחביר לפני הרצת הפקודה, אבל היא אמורה לפעול בצורה תקינה.

קודם כול, יוצרים את החיבור של מודל Gemini 1.5 כפי שמתואר בהמשך. חשוב לזכור להחליף את $PROJECT_ID בפקודה הבאה במזהה הפרויקט ב-Google Cloud.

CALL
 google_ml.create_model( model_id => 'gemini-1.5',
   model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
   model_provider => 'google',
   model_auth_type => 'alloydb_service_agent_iam');

אפשר לבדוק את המודלים שהוגדרו לצורך גישה באמצעות הפקודה הבאה ב-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;

הערה: אם אתם משתמשים בפרויקט קיים ב-Google Cloud ובאשכול/מכונה קיימים של AlloyDB שנוצרו לפני זמן מה, יכול להיות שתצטרכו לבטל את ההפניות הישנות למודל gemini-1.5 וליצור אותו מחדש באמצעות משפט ה-CALL שלמעלה, ולהריץ שוב את grant execute על הפונקציה ml_predict_row, למקרה שתתקלו בבעיות בהפעלות הבאות של gemini-1.5.

בדיקת התשובות

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

  1. קודם נשלחת בקשה למסד הנתונים כדי לקבל את 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-004',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

הפלט של השאילתה הזו יהיה 5 השורות הדומים ביותר לשאילתה של המשתמש. הטבלה החדשה xyz תכיל 5 שורות, שבכל אחת מהן יופיעו העמודות הבאות:

  • literature
  • content
  • user_text
  1. כדי לקבוע את מידת התוקף של התשובות, נשתמש בשאילתה מורכבת שבה נסביר איך להעריך את התשובות. היא משתמשת בעמודות 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."
  1. באמצעות השאילתה הזו, נבדוק את 'האיכות' של התשובות בטבלה 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;
  1. הפונקציה predict_row מחזירה את התוצאה שלה בפורמט JSON. הקוד -> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" משמש לחילוץ הטקסט בפועל מה-JSON הזה. כדי לראות את ה-JSON בפועל שמוחזר, אפשר להסיר את הקוד הזה.
  2. לבסוף, כדי לקבל את השדה LLM, פשוט מחלצים אותו מטבלת x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. אפשר לשלב את השאילתות האלה בשאילתה אחת הבאה באופן הבא.

אם הרצתם את השאילתות שלמעלה כדי לבדוק את התוצאות הביניים, תצטרכו למחוק או להסיר את הטבלאות 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-004',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

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

שימו לב שבמודל Gemini, הסטרימינג מופעל כברירת מחדל, כך שהתגובה בפועל מפוזרת על פני כמה שורות: 14e74d71293b7b9.png

10. העברת האפליקציה לאינטרנט

רוצים להעביר את האפליקציה הזו לאינטרנט? כדי להפוך את מנוע הידע הזה ללא שרת באמצעות Cloud Run Functions:

  1. עוברים אל Cloud Run Functions במסוף Google Cloud כדי ליצור פונקציית Cloud Run חדשה, או משתמשים בקישור: https://console.cloud.google.com/functions/add.
  2. בוחרים את הסביבה כ-פונקציית Cloud Run. נותנים את שם הפונקציה retail-engine ובוחרים את האזור us-central1. מגדירים את האימות לאפשרות 'אישור קריאות לא מאומתות' ולוחצים על הבא. בוחרים ב-Java 17 כסביבת זמן ריצה וב-Inline Editor לקוד המקור.
  3. כברירת מחדל, נקודת הכניסה תוגדר כ-'gcfv2.HelloHttpFunction'. מחליפים את קוד placeholder ב-HelloHttpFunction.java וב-pom.xml של פונקציית Cloud Run בקוד מקובץ Java ומ-XML, בהתאמה.
  4. חשוב לזכור להחליף את ה-placeholder‏ $PROJECT_ID ואת פרטי הכניסה ל-AlloyDB בערכים שלכם בקובץ Java. פרטי הכניסה ל-AlloyDB הם אלה שבהם השתמשנו בתחילת סדנת הקוד הזו. אם השתמשתם בערכים שונים, צריך לשנות אותם בקובץ Java.
  5. לוחצים על פריסת.

לאחר הפריסה, כדי לאפשר ל-Cloud Function לגשת למכונה של מסד הנתונים AlloyDB, נוצר את מחבר ה-VPC.

שלב חשוב:

אחרי שתסיימו את תהליך הפריסה, הפונקציות אמורות להופיע במסוף Cloud Run Functions של Google. מחפשים את הפונקציה שנוצרה (retail-engine), לוחצים עליה ואז על עריכה ומשנים את הפרטים הבאים:

  1. מעבר להגדרות של סביבת זמן ריצה, build, חיבורים ואבטחה
  2. הגדלת הזמן הקצוב לתפוגה ל-180 שניות
  3. עוברים לכרטיסייה CONNECTIONS (חיבורים):

4e83ec8a339cda08.png

  1. בהגדרות Ingress, מוודאים שהאפשרות Allow all traffic (אישור כל התנועה) מסומנת.
  2. בקטע Egress settings (הגדרות תעבורת נתונים יוצאת), לוחצים על התפריט הנפתח Network (רשת) ובוחרים באפשרות Add New VPC Connector (הוספת מחבר VPC חדש). פועלים לפי ההוראות שמופיעות בתיבת הדו-שיח הקופצת:

8126ec78c343f199.png

  1. נותנים שם למחבר VPC ומוודאים שהאזור זהה לאזור של המכונה. משאירים את הערך של Network כברירת מחדל ומגדירים את Subnet כטווח IP מותאם אישית עם טווח ה-IP 10.8.0.0 או משהו דומה שזמין.
  2. מרחיבים את האפשרות SHOW SCALING SETTINGS (הצגת הגדרות התאמה לעומס) ומוודאים שההגדרות מוגדרות בדיוק כך:

7baf980463a86a5c.png

  1. לוחצים על 'יצירה' והמחבר הזה אמור להופיע בהגדרות תעבורת הנתונים היוצאת.
  2. בוחרים את המחבר החדש שנוצר.
  3. בוחרים שכל התנועה תנותב דרך המחבר הזה של VPC.
  4. לוחצים על NEXT ואז על DEPLOY.

11. בדיקת האפליקציה

אחרי הפריסה של פונקציית Cloud Functions המעודכנת, נקודת הקצה אמורה להופיע בפורמט הבא:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine

אפשר לבדוק את זה בטרמינל של 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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
  -H 'Content-Type: application/json' \
  -d '{"search":"I want some kids clothes themed on Disney"}' \
  | jq .

והתוצאה:

88bc1ddfb5644a28.png

זהו! כך פשוט לבצע חיפוש דמיון וקטורי באמצעות מודל הטמעת הנתונים (Embeddings) בנתונים של AlloyDB.

יצירת הסוכן הקולי

הסוכן נוצר בחלק 2 של שיעור ה-Lab הזה.

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

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

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

  1. נכנסים לדף Manage resources במסוף Google Cloud.
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

13. מזל טוב

מעולה! ביצעתם חיפוש דמיון באמצעות AlloyDB, ‏ pgvector ו-Vector search. שילוב היכולות של AlloyDB, Vertex AI ו-Vector Search אפשר לנו לקחת צעד ענק קדימה ביצירת חיפושים לפי הקשר וחיפושים וקטורים שיהיו נגישים, יעילים ומבוססי-משמעות. בחלק הבא של הסדנה נסביר על השלבים ליצירת סוכן.