1. סקירה כללית
בסביבת הקמעונאות המהירה של היום, חשוב מאוד לספק שירות לקוחות מעולה תוך מתן אפשרות לחוויות קניות בהתאמה אישית. אנחנו נעביר אתכם למסע טכני באמצעות יצירה של אפליקציית צ'אט מבוססת-ידע, שנועדה לענות על שאלות של לקוחות, להנחות את גילוי המוצרים ולהתאמה אישית של תוצאות החיפוש. הפתרון החדשני הזה משלב את העוצמה של AlloyDB לאחסון נתונים, מנוע פנימי לניתוח נתונים להבנה לפי הקשר, Gemini (מודל שפה גדול (LLM) לאימות רלוונטיות, וה-Agent Builder של Google שעוזר לפתח במהירות עוזר דיגיטלי חכם בשיחות.
האתגר: לקוחות קמעונאות מודרניים מצפים לקבל תשובות מיידיות והמלצות למוצרים שמתאימות להעדפות הייחודיות שלהם. לעיתים קרובות, שיטות החיפוש המסורתיות לא מספקות את רמת ההתאמה האישית הזו.
הפתרון: אפליקציית הצ'אט מבוססת-הידע שלנו עומדת באתגר הזה. המערכת משתמשת במאגר ידע עשיר שמבוסס על נתוני הקמעונאות שלכם כדי להבין את כוונת הלקוחות, להגיב בצורה חכמה ולספק תוצאות רלוונטיות במיוחד.
מה תפַתחו
במסגרת שיעור ה-Lab הזה (חלק 2), תלמדו:
- פיתוח סוכן של Vertex AI Agent Builder
- שילוב הכלי של AlloyDB עם הסוכן
דרישות
2. ארכיטקטורה
תעבורת הנתונים: נבחן לעומק איך הנתונים עוברים במערכת שלנו:
הטמעת נתונים:
נתוני קמעונאות (מלאי, תיאורי מוצרים, אינטראקציות עם לקוחות) נטענים ל-AlloyDB באופן רציף.
Analytics Engine:
נשתמש ב- AlloyDB כמנוע ניתוח הנתונים כדי לבצע את הפעולות הבאות:
- חילוץ הקשר: המנוע מנתח את הנתונים ששמורים ב-AlloyDB כדי להבין את הקשרים בין מוצרים, קטגוריות, התנהגות לקוחות וכו', לפי הצורך.
- יצירת הטמעה: הטמעות (ייצוגים מתמטיים של הטקסט) נוצרות גם לשאילתת המשתמש וגם למידע שמאוחסן ב- AlloyDB.
- חיפוש וקטורי: המנוע מבצע חיפוש דמיון ומשווה את הטמעת השאילתה להטמעות של תיאורי מוצרים, ביקורות ונתונים רלוונטיים אחרים. הם מזהים את 25 "השכנים הקרובים" הרלוונטיים ביותר.
אימות של Gemini:
התשובות הפוטנציאליות האלה נשלחות אל Gemini לבדיקה. Gemini קובע אם הם באמת רלוונטיים ובטוחים לשיתוף עם המשתמש.
יצירת תגובה:
התשובות המאושרות מובנות במערך JSON, והמנוע כולו ארוז בפונקציה ללא שרת ב-Cloud Run שנקראת מ-Agent Builder.
השלבים שלמעלה כבר מפורטים בחלק 1 של סדנת ה-Lab.
דיברנו על הפרטים הטכניים של יצירת מנוע ניתוח נתונים שמבוסס על ידע, שמפעיל את העוזר הדיגיטלי שלנו לשופינג. עכשיו נראה איך אנחנו משתמשים בקסם של Agent Builder כדי להפעיל את המנוע הזה בממשק שיחה. לפני שמתחילים את חלק 2, חשוב לוודא שכתובת ה-URL של נקודת הקצה מוכנה. השלב הבא הוא הנושאים שנלמד בשיעור ה-Lab הזה:
אינטראקציה בשיחה:
הכלי Agent Builder מציג את התשובות למשתמש בפורמט של שפה טבעית, וכך מאפשר שיח של אינטראקציה הדדית.
3. לפני שמתחילים
יצירת פרויקט
- במסוף Google Cloud, בדף בורר הפרויקטים, בוחרים או יוצרים פרויקט ב-Google Cloud.
- הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. איך בודקים אם החיוב מופעל בפרויקט
- משתמשים ב-Cloud Shell, סביבת שורת הפקודה שפועלת ב-Google Cloud וכוללת טעינה מראש של bq. לוחצים על Activate Cloud Shell בחלק העליון של מסוף Google Cloud.
- אחרי שמתחברים ל-Cloud Shell, בודקים שכבר בוצע אימות ושהמזהה של הפרויקט מוגדר כפרויקט באמצעות הפקודה הבאה:
gcloud auth list
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט.
gcloud config list project
- אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
gcloud config set project <YOUR_PROJECT_ID>
- מפעילים את ממשקי ה-API הנדרשים. האפשרות החלופית לפקודה gcloud היא דרך מסוף, על ידי חיפוש של כל מוצר או באמצעות הקישור הזה.
אם חסר ממשק API כלשהו, תמיד תוכלו להפעיל אותו במהלך ההטמעה.
במסמכי העזרה מפורטות הפקודות של gcloud והשימוש בהן.
הערה חשובה: כדי להשלים את המשימה הזו, צריך לוודא שסיימתם את חלק 1 של שיעור ה-Lab.
4. יצירת סוכן
נעים להכיר: Agent Builder
Agent Builder הוא כלי פשוט ויעיל שמאפשר לנו ליצור נציגים לשיחות במהירות וביעילות. הוא מייעל את התהליך של עיצוב תהליכים דיאלוגיים, שילוב מאגרי ידע והתחברות לממשקי API חיצוניים. במקרה שלנו, נשתמש ב-Agent Builder כדי להתחבר בצורה חלקה לנקודת הקצה של Cloud Function שיצרנו בחלק 1, וכך לאפשר לעוזרת הקניות לגשת למאגר הידע שלנו בתחום הקמעונאות ולהשיב בצורה חכמה לשאילתות של הלקוחות.
בניית הנציג
נתחיל ליצור את הנציג החדש הזה כדי לענות על שאלות של משתמשים לגבי מוצרי הלבוש.
- כדי להתחיל, צריך להתחבר לפלטפורמה של Agent Builder. אם מופיעה בקשה להפעיל את ה-API, לוחצים על 'המשך והפעלת ה-API'.
- לוחצים על 'יצירת אפליקציה' ונותנים לנציג שם תיאורי (למשל, "קמעונאות בקניות").
- לוחצים על 'סוג האפליקציה' 'סוכן'.
- נותנים לסוכנות שם תיאורי, כמו 'Retail Shopping Assistant', ומגדירים את האזור כ-us-central1.
- מזינים את הפרטים של הנציג:
- משנים את שם הסוכן ל"סוכן קמעונאי".
- צריך להוסיף את ה'יעד' הבא:
You are a shopping assistant agent! Your job is to help the customer search for their ideal apparels, allow them to add items to their cart, remove items from their cart, and review items in their cart. Once a user is done searching, open the search results in a user friendly html page.
- בשלב הזה שומרים את הקובץ ומשאירים את ההוראות ריקות.
- לאחר מכן לוחצים על 'כלים' בתפריט הניווט ואז על 'יצירה'.
Enter Tool Name (הזנת שם הכלי): Retail Shopping Tool (כלי שופינג קמעונאי)
הזנת תיאור הכלי:
This tool refers to the dataset in the backend as the context information for product inventory. It takes as input the user's search text summarized by the agent and matches with the most appropriate list of items and returns as an array of items.
מזינים סכימה — OpenAPI בפורמט YAML:
זה החלק שבו אנחנו משתמשים בנקודת הקצה העורפית כדי להפעיל את הנציג. מעתיקים את המפרט של OpenAPI שבהמשך ומחליפים את ה-placeholder של כתובת ה-URL (מוקף בסוגריים זוויתיים) בנקודת הקצה של הפונקציה של Cloud Functions:
openapi: 3.0.0
info:
title: AlloyDB Product Matcher
description: A Cloud Function to query AlloyDB for product matches based on user search text.
version: 1.0.0
servers:
- url: <<https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/alloy-gem>>
paths:
/:
post:
summary: Find matching products based on search text.
operationId: apparelSearch
requestBody:
description: JSON object containing the search text.
required: true
content:
application/json:
schema:
type: object
properties:
search:
type: string
description: The user's search query for product matching.
responses:
'200':
description: Successful response with a JSON array of matching products.
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: string
description: Product ID.
category:
type: string
description: Product category.
sub_category:
type: string
description: Product sub-category.
uri:
type: string
description: Product URI or URL.
description:
type: string
description: Product description.
literature:
type: object
description: JSON object containing match information from the ML model.
properties:
MATCH:
type: string
description: Whether the product matches the search query (YES/NO).
PERCENTAGE:
type: string
description: Percentage of match.
DIFFERENCE:
type: string
description: Description of differences between the search and product.
'500':
description: Internal server error.
משאירים את ערכי ברירת המחדל בשאר ההגדרות ולוחצים על 'שמירה'.
- בשלב הזה חוזרים אל הסוכן, כי אנחנו רוצים להוסיף את ההגדרה של הכלי ל'הוראות' של הסוכן. מוסיפים את הפריטים הבאים ל-placeholder של ההוראות (חשוב לזכור שכניסות הפיסקה חשובות להגדרת התהליך):
- Greet the user and answer their question to the best of your knowledge.
- Summarize the user's request and ask them to confirm that you understood correctly.
- Check if the request has details like gender, color, material, style and other key apparel details already.
- If not, seek clarifying details.
- If the search request is very broad, then ask the user to narrow down the request with specific details that you believe could be personal preferences.
- Once all the necessary details are met, summarize your final understanding of the request with the user.
- Use ${TOOL: Retail Shopping Tool} to help the user with their task.
- If the request has unrelated input text, gracefully convey that you don't have information on that topic.
- Do not give product availability information outside the source that is provided to you in ${TOOL: Retail Shopping Tool}.
- Do not assist with any information unless you are certain that you know the answer and it is grounded in the source of truth.
- Thank the user for their business and say goodbye.
צריך לוודא שהכלי 'כלי שופינג קמעונאי' נבחר ברשימה 'כלים זמינים' ולאחר מכן לשמור את הנציג שוב.
5. בדיקת הנציג
בחלונית הימנית אמור להופיע הקטע Preview Agent (תצוגה מקדימה של הנציג), שמאפשר לבדוק את הנציג.
כפי שאפשר לראות בצילום המסך שבהמשך, פתחתי את הצ'אט עם הודעה של שלום כמשתמש וביקשתי חולצה לבנה עם הדפסים כחולים:
זו תגובת ה-JSON:
זוהי תוצאת ה-JSON הגולמית מ-Cloud Function שמעבדת את חיפוש הדמיון ב-AlloyDB. זהו! הכול מוכן עכשיו מול הנציג.
6. דוגמה לתהליך שיחה
בשלב הזה אפשר לבדוק את התהליך של נציג ה-Dialog (השיחה) ולבצע בו שיפורים:
User: I'm looking for women's boots for winter.
Agent: (OpenAPI call to Cloud Function that works with AlloyDB Similarity Search)
Cloud Function: (Processes query, returns JSON array)
Agent: Based on your preferences, here are some options: [Product 1, Product 2, Product 3]. Would you like to see more details about any of these?
User: No, That is all. Bye!
Agent: Have a good day!
הנחיות מעטות
עכשיו נניח שאתם רוצים לראות את התוצאה של נציג השיחה בפורמט גרפי מסוים, כולל תמונות וקישורים. נעשה זאת באמצעות דוגמאות לשיחות שנקראות גם 'הנחיות לכמה שוטים'.
כלומר, אנחנו רוצים להוסיף כמה דוגמאות לבונה הסוכנים כדי שהפורמט של התוצאה יהיה עקבי.
באחד מצילומי המסך הקודמים שלנו בקטע בדיקת הנציג, התגובה מהנציג היא "אני רואה. אתם מחפשים חולצה לבנה עם הדפסות כחולות…". נכנסים לתשובה הזו או יוצרים שיחת בדיקה חדשה מהחלונית השמאלית של הנציג:
- מקלידים את הפרטים הבאים בשדה 'הזנת קלט משתמש' :
התגובה שתופיע תהיה דומה לזו:
ניתן גם לראות את מערך ה-JSON שמוחזר על ידי נקודת הקצה ל-API.
- עכשיו לוחצים על שם הנציג (כפי שמוצג בתמונה למטה, מודגש בסימון אדום) בשוליים של קטע התצוגה המקדימה, וכל הכרטיסיות בקטע התצוגה המקדימה של הצ'אט יודגשו. עכשיו לוחצים על "שמירת דוגמה" בפינה השמאלית העליונה בקטע התצוגה המקדימה. הממשק אמור להיראות כך:
- שומרים את השיחה עם השם המוצג 'תגובה עם תמונות'. או משהו דומה, ואז לוחצים על 'יצירה'.
- עכשיו עוברים לכרטיסיית התגובה שמודגשת בסימון וי שחור בתמונה שלמעלה ומחליפים את הטקסט 'אני רואה. מנסה למצוא סנדלים צהובים. זה נכון?", צריך להחליף את הטקסט הזה באפשרות הבאה:
I see you are looking for yellow sandals. Here are a few options for you:
<!DOCTYPE html>
<html>
<body>
<h2>Featured Sandals</h2>
<table style="overflow-x: auto; white-space: nowrap;">
<tr>
<td>
<img src="https://assets.myntassets.com/v1/images/style/properties/d27dbd8e9666b9af2d72fbfde315f76d_images.jpg" alt="Yellow sandals from Estd. 1977" width="300">
</td>
<td>
<img src="https://assets.myntassets.com/v1/images/style/properties/b7a479fe5f56457e930541a789c5df68_images.jpg" alt="Yellow sandals from Gliders" width="300">
</td>
<td>
<img src="https://assets.myntassets.com/v1/images/style/properties/b6c813734b29b89d1055fd000ea50743_images.jpg" alt="Yellow sandals from Rocia" width="300">
</td>
<td>
<img src="https://assets.myntassets.com/v1/images/style/properties/ee0e918c229e76e0e7e61712e9d2ecb3_images.jpg" alt="Yellow flip flops from Numero Uno" width="300">
</td>
<td>
<img src="https://assets.myntassets.com/v1/images/style/properties/5bdd4c9e739205e28ee134ff7849bc60_images.jpg" alt="Yellow flip flops from Numero Uno" width="300">
</td>
</tr>
</table>
</body>
</html>
- לוחצים על 'שמירה' בחלק העליון.
חוזרים על התהליך עם כמה דוגמאות שרוצים, עם וריאציות שונות של התרחישים וההתרחשויות בשיחה.
עכשיו אפשר לבדוק את זה עם קלט של משתמש:
תגובות מסוגים אחרים:
זה הכול. יצרנו ובדקנו סוכן שיחה לאפליקציית הקמעונאות שלנו.
7. פריסה ושילוב
כשתהיו מרוצים מהנציג, תוכלו לפרוס אותו בקלות בערוצים שונים באמצעות השילובים של Agent Builder. אפשר להטמיע אותו באתר, לשלב אותו בפלטפורמות פופולריות של הודעות או אפילו ליצור אפליקציה ייעודית לנייד. אפשר גם להשתמש ב-Agent Builder API ישירות באפליקציות הלקוח שלנו לאינטרנט, כפי שמוסבר בפוסט הזה בבלוג.
8. הסרת המשאבים
כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם בפוסט הזה:
9. מזל טוב
מעולה! על ידי שילוב של המנוע החזק לניתוח נתונים שפיתחנו בהתאמה אישית עם הממשק האינטואיטיבי של Agent Builder, יצרנו עוזר חכם לקנייה בחנויות פיזיות שמספק חוויות מותאמות אישית, עונה על שאלות בצורה מדויקת ובסופו של דבר תורם לשביעות רצון הלקוחות ולמכירות. על ידי שילוב היכולות של AlloyDB, Vertex AI ו-Vector Search, לקחנו צעד אחד קדימה בתהליך להפוך את החיפושים לפי הקשר וחיפוש וקטוריים לנגישים, יעילים, מבוססי-משמעות וסוכנים אמיתיים!