שימוש ב-AI גנרטיבי לקבלת המלצות מותאמות אישית באפליקציית מסחר אלקטרוני

מטרה

במדריך הזה תלמדו איך:

  • שימוש במודלים של AI גנרטיבי ב-Vertex AI שסופקו על ידי Google במסד נתונים של Spanner.
  • שימוש ב-AI גנרטיבי כדי לספק המלצות מותאמות אישית למוצרים באפליקציית מסחר אלקטרוני לדוגמה.

עלויות

במדריך הזה נעשה שימוש ברכיבים של Google Cloudשחלים עליהם חיובים, כולל:

  • Spanner
  • Vertex AI

מידע נוסף על העלויות של Spanner מופיע בדף תמחור של Spanner.

מידע נוסף על העלויות של Vertex AI מופיע בדף התמחור של Vertex AI.

יצירת סכימה לאתר מסחר אלקטרוני

במדריך הזה נשתמש בסכימה ובנתונים הבאים:

CREATE TABLE Products (
  id INT64,
  name STRING(MAX),
  description STRING(MAX),
  category_id INT64,
) PRIMARY KEY(id);

CREATE TABLE Categories (
  id INT64,
  name STRING(MAX)
) PRIMARY KEY(id);

CREATE TABLE Users (
  id INT64,
  age INT64,
  likes STRING(MAX)
) PRIMARY KEY(id);

INSERT INTO Categories (id, name) VALUES
    (1, "Toys"),
    (2, "Tools");

INSERT INTO Products (id, name, description, category_id) VALUES
    (1, "Plush Bear", "Really fluffy. Safe for infants.", 1),
    (2, "Bike", "Bike for teenagers.", 1),
    (3, "Drill", "Cordless.", 2);

INSERT INTO Users (id, age, likes) VALUES
    (1, 30, "DIY"),
    (2, 14, "Toys");

רישום של מודל AI גנרטיבי בסכימה של Spanner

במדריך הזה אנחנו משתמשים במודל text-bison של Vertex AI כדי לספק המלצות מותאמות אישית למוצרים ללקוחות קצה. כדי לרשום את המודל הזה במסד נתונים של Spanner, מריצים את ההצהרה הבאה של DDL:

CREATE MODEL TextBison
INPUT (prompt STRING(MAX))
OUTPUT (content STRING(MAX))
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/text-bison'
);

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT: מזהה הפרויקט
  • LOCATION: האזור שבו אתם משתמשים ב-Vertex AI

אי אפשר לגלות ולבדוק סכימות במודלים של AI גנרטיבי. לכן, אתם צריכים לספק סעיפים של INPUT ושל OUTPUT שתואמים לסכימה של המודל. תוכלו למצוא את הסכימה המלאה של מודל text-bisonבדף הפניית API ב-Vertex AI.

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

כדי לוודא שהמודל נרשם בצורה נכונה, שולחים לו שאילתה באמצעות הפונקציה ML.PREDICT. המודל מצפה לעמודה יחידה בשם STRING.prompt אפשר להשתמש בשאילתת משנה של Spanner כדי ליצור את העמודה prompt. במודל TextBison צריך לציין פרמטר של מודל maxOutputTokens. פרמטרים אחרים הם אופציונליים. מודל text-bison של Vertex AI לא תומך באריזה של בקשות, ולכן צריך להשתמש בפרמטר @{remote_udf_max_rows_per_rpc=1} כדי להגדיר את גודל האריזה ל-1.

SELECT content
FROM ML.PREDICT(
  MODEL TextBison,
  (SELECT "Is 13 prime?" AS prompt),
  STRUCT(256 AS maxOutputTokens, 0.2 AS temperature, 40 as topK, 0.95 AS topP)
) @{remote_udf_max_rows_per_rpc=1};

+--------------------+
| content            |
+--------------------+
| "Yes, 13 is prime" |
+--------------------+

שימוש במודל TextBison כדי לענות על שאלות של לקוחות

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

הערה: חלק מהתשובות לדוגמה נערכו כדי שיהיו תמציתיות יותר.

SELECT product_id, product_name, content
FROM ML.PREDICT(
  MODEL TextBison,
  (SELECT
    product.id as product_id,
    product.name as product_name,
    CONCAT("Is this product safe for infants?", "\n",
        "Product Name: ", product.name, "\n",
        "Category Name: ", category.name, "\n",
        "Product Description:", product.description) AS prompt
   FROM
     Products AS product JOIN Categories AS category
       ON product.category_id = category.id),
  STRUCT(100 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};

-- The model correctly recommends a Plush Bear as safe for infants.
-- Other products are not safe and the model provides justification why.
+------------+-----------------+--------------------------------------------------------------------------------------------------+
| product_id | product_name    | content                                                                                          |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
|          1 | "Plush Bear"    | "Yes, this product is infant safe. [...] "                                                       |
|            |                 | "The product description says that the product is safe for infants. [...]"                       |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
|          2 | "Bike"          | "No, this product is not infant safe. [...] "                                                    |
|            |                 | "It is not safe for infants because it is too big and heavy for them to use. [...]"              |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
|          3 | "Drill"         | "No, this product is not infant safe. [...]"                                                     |
|            |                 | " If an infant were to grab the drill, they could pull it on themselves and cause injury. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+

אפשר להחליף את השאלה המילולית בפרמטר שאילתה, כמו @UserQuestion, אם רוצים לאכלס את הפרמטר ישירות בשאלה של לקוח. כך הלקוחות נהנים מחוויית קנייה אונליין מבוססת-AI.

הצגת המלצות מותאמות אישית למוצרים ללקוחות

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

SELECT product_id, product_name, content
FROM ML.PREDICT(
  MODEL TextBison,
  (SELECT
    product.id as product_id,
    product.name as product_name,
    CONCAT(
        "Answer with YES or NO only: Is this a good fit for me?",
        "My age:", CAST(user.age AS STRING), "\n",
        "I like:", user.likes,  "\n",
        "Product name: ", product.name, "\n",
        "Category mame: ", category.name, "\n",
        "Product description:", product.description) AS prompt,
   FROM
     Products AS product
       JOIN Categories AS category ON product.category_id = category.id
       JOIN Users AS user ON user.id = 1),
  STRUCT(256 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};

-- The model correctly guessed that the user might be interested in a Drill
-- as they are interested in DIY.
+------------+-----------------+-------------+
| product_id | product_name    | content     |
+------------+-----------------+-------------+
|          1 | "Plush Bear"    | "NO"        |
+------------+-----------------+-------------+
|          2 | "Bike"          | "NO"        |
+------------+-----------------+-------------+
|          3 | "Drill"         | "YES"       |
+------------+-----------------+-------------+

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

SELECT product_id, product_name, content
FROM ML.PREDICT(
  MODEL TextBison,
  (SELECT
    product.id as product_id,
    product.name as product_name,
    CONCAT(
        "Answer with YES or NO only: Is this a good fit for me?",
        "\nMy's age:", CAST(user.age AS STRING),
        "\nI like:", user.likes,
        "\nProduct Name: ", product.name,
        "\nCategory Name: ", category.name,
        "\nProduct Description:", product.description) AS prompt,
   FROM
     Products AS product
       JOIN Categories AS category ON product.category_id = category.id
       JOIN Users AS user ON user.id = 2),
  STRUCT(40 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};

-- The model correctly guesses that a teenager is interested in a Bike,
-- but not a plush bear for infants or spicy peppers.
+------------+-----------------+---------+
| product_id | product_name    | content |
+------------+-----------------+---------+
|          1 | "Plush Bear"    | "NO"    |
+------------+-----------------+---------+
|          2 | "Bike"          | "YES"   |
+------------+-----------------+---------+
|          3 | "Spicy peppers" | "NO"    |
+------------+-----------------+---------+

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

השילוב של Spanner עם Vertex AI מאפשר לכם להרכיב הנחיות מורכבות שמכילות נתונים בזמן אמת, ולהשתמש בהן כדי ליצור אפליקציות מבוססות-AI.