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

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

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

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

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

מה תפַתחו

בשיעור ה-Lab הזה (חלק 2):

  1. פיתוח סוכן של Vertex AI Agent Builder
  2. משלבים את הכלי AlloyDB עם הנציג

דרישות

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

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

זרימת נתונים: בואו נסתכל מקרוב על האופן שבו הנתונים עוברים במערכת שלנו:

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

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

Analytics Engine:

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

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

אימות Gemini:

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

יצירת תגובות:

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

השלבים שלמעלה כבר כלולים בחלק 1 של שיעור ה-Lab.

דיברנו על הפרטים הטכניים של יצירת מנוע ניתוח נתונים שמבוסס על ידע, שמפעיל את העוזר הדיגיטלי שלנו לשופינג. ועכשיו נראה איך אנחנו משתמשים בקסם של Agent Builder כדי להפיח חיים במנוע בממשק שיחה. לפני שמתחילים חלק 2, חשוב לוודא שכתובת ה-URL של נקודת הקצה מוכנה. השלב הבא הוא הנושאים שנלמד בשיעור ה-Lab הזה:

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

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

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

יצירת פרויקט

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

תמונת הלחצן של Activate 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 היא דרך המסוף, באמצעות חיפוש כל מוצר או באמצעות הקישור הזה.

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

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

הערה חשובה: בנוסף, כדי להשלים זאת, עליכם לוודא שהשלמתם את חלק 1 בשיעור ה-Lab.

4. יצירת סוכן

נעים להכיר: Agent Builder

Agent Builder הוא כלי פשוט ויעיל שמאפשר לנו ליצור נציגים לשיחות במהירות וביעילות. הוא מייעל את התהליך של עיצוב תהליכים דיאלוגיים, שילוב מאגרי ידע והתחברות לממשקי API חיצוניים. במקרה שלנו, נשתמש ב-Agent Builder כדי להתחבר באופן חלק לנקודת הקצה של הפונקציה של Cloud Functions שפיתחנו בחלק 1. כך העוזר הדיגיטלי שלנו יוכל לגשת למאגר הידע שלנו בתחום הקמעונאות ולהגיב לשאילתות של לקוחות בצורה חכמה.

בניית הנציג

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

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

462bb48664e9a14e.png

  1. הקצר הזה. התשובות שלך יעזרו לנו להשתפר. צריך לתת לנציג שם תיאורי כמו "עוזר דיגיטלי לשופינג" ולהגדיר את האזור כ-us-central1

10eceef44b1600d1.png

  1. מזינים את הפרטים של הנציג:
  2. משנים את שם הסוכן ל"סוכן קמעונאי".
  3. מוסיפים את ה'יעד' הבא:
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.

537a87a842aae897.png

  1. כדאי לשמור אותו בשלב הזה ולהשאיר את ההוראות ריקות.
  2. בתפריט הניווט, לוחצים על Tools (כלים) ולוחצים על CREATE (יצירה).

2ffae953bbad38e5.png

צריך להזין את שם הכלי: כלי שופינג קמעונאי

הזנת תיאור הכלי:

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.

משאירים את ערכי ברירת המחדל בשאר ההגדרות ולוחצים על 'שמירה'.

  1. חוזרים לנציג בשלב הזה כי אנחנו רוצים להוסיף את 'הכלי'. לפי ההוראות של הסוכן. מוסיפים את הפריטים הבאים ל-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 (נציג תצוגה מקדימה) שבו אפשר לבדוק את הנציג.

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

63ac3ef6d1f0f614.png

זו תגובת ה-JSON:

acf3cb0e2be2ed91.png

זוהי התוצאה הגולמית של JSON מהפונקציה של Cloud Functions שמעבדת את חיפוש הדמיון של AlloyDB. זהו! הכול מוכן עכשיו מול הנציג.

6. תהליך לדוגמה של שיחה

בשלב הזה תוכלו לבדוק את התהליך של סוכן הדו-שיח (שיחה) ולחזור על התהליך:

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!

הנחיות מעטות

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

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

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

  1. מקלידים את הפרטים הבאים בשדה 'הזנת קלט משתמש' :

dc8c010c36400e64.png

תראו תגובה כזו:

e31d9f53bf5564c8.png

ניתן גם לראות את מערך ה-JSON שמוחזר על ידי נקודת הקצה ל-API.

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

1e0a9f6815f63bf9.png

  1. שומרים את השיחה עם השם המוצג 'תגובה עם תמונות'. או משהו דומה, ואז לוחצים על 'יצירה'.
  2. עכשיו צריך לעבור לכרטיסיית התגובה המודגשת עם סימן וי שחור בתמונה שלמעלה ולהחליף את הטקסט "אני רואה. מנסה למצוא סנדלים צהובים. זה נכון?" עם:
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>
  1. לוחצים על 'שמירה' למעלה.

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

עכשיו אפשר לבדוק את זה בעזרת קלט של משתמשים:

450166a929645353.png

תגובות מסוגים אחרים:

be8908c99cd33730.png

זה הכול. יצרנו נציג תמיכה אנושי ובדקנו אותו עבור האפליקציה הקמעונאית שלנו.

7. פריסה ושילוב

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

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

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

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

9. מזל טוב

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