Menggunakan AI Generatif untuk mendapatkan rekomendasi yang dipersonalisasi di aplikasi e-commerce

Tujuan

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menggunakan model Generative AI Vertex AI yang disediakan Google dalam database Spanner.
  • Gunakan AI Generatif untuk memberikan rekomendasi produk yang dipersonalisasi dalam contoh aplikasi e-commerce.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih, termasuk:

  • Spanner
  • Vertex AI

Untuk informasi selengkapnya tentang biaya Spanner, lihat halaman Harga Spanner.

Untuk mengetahui informasi selengkapnya tentang biaya Vertex AI, lihat halaman harga Vertex AI.

Membuat skema situs e-commerce

Untuk tutorial ini, kita menggunakan skema dan data berikut:

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");

Mendaftarkan model AI Generatif dalam skema Spanner

Dalam tutorial ini, kami menggunakan model text-bison Vertex AI untuk memberikan rekomendasi produk yang dipersonalisasi kepada pelanggan akhir. Untuk mendaftarkan model ini dalam database Spanner, execute pernyataan DDL berikut:

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'
);

Ganti kode berikut:

  • PROJECT: the project ID
  • LOCATION: wilayah tempat Anda menggunakan Vertex AI

Penemuan dan validasi skema tidak tersedia untuk model AI Generatif. Oleh karena itu, Anda harus menyediakan klausa INPUT dan OUTPUT yang cocok dengan skema model. Anda dapat menemukan skema lengkap model text-bison di halaman referensi Model API Vertex AI.

Selama database dan endpoint berada dalam project yang sama, Spanner akan memberikan izin yang sesuai secara otomatis. Jika tidak, tinjau bagian kontrol akses endpoint model di halaman referensi CREATE MODEL.

Untuk memverifikasi bahwa model terdaftar dengan benar, buat kueri dengan fungsi ML.PREDICT. Model ini mengharapkan satu kolom STRING bernama prompt. Anda dapat menggunakan subkueri Spanner untuk menghasilkan kolom prompt. Model TextBison mengharuskan Anda menentukan parameter model maxOutputTokens. Parameter lainnya bersifat opsional. Model text-bison Vertex AI tidak mendukung pengelompokan, sehingga Anda harus menggunakan parameter @{remote_udf_max_rows_per_rpc=1} untuk menetapkan ukuran batch ke 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" |
+--------------------+

Gunakan Model TextBison untuk menjawab pertanyaan pelanggan

Model teks AI generatif dapat memecahkan beragam masalah. Misalnya, pengguna di situs e-commerce mungkin menjelajahi produk yang aman untuk bayi. Dengan satu kueri, kita dapat meneruskan pertanyaannya ke model TextBison. Yang perlu kita lakukan adalah memberikan konteks yang relevan untuk pertanyaan dengan mengambil detail produk dari database.

CATATAN: Beberapa jawaban model diedit agar singkat.

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. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+

Anda dapat mengganti literal pertanyaan dengan parameter kueri, seperti @UserQuestion, jika ingin langsung mengisi parameter dengan pertanyaan pelanggan. Hal ini memberi pelanggan pengalaman belanja online yang didukung AI.

Memberikan rekomendasi produk yang dipersonalisasi kepada pelanggan

Selain detail produk, kita juga dapat menambahkan informasi tentang pelanggan ke prompt. Hal ini memungkinkan model mempertimbangkan preferensi pengguna sehingga dapat memberikan rekomendasi produk yang sepenuhnya dipersonalisasi.

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"       |
+------------+-----------------+-------------+

Untuk mencari hadiah untuk anak mereka, pengguna dapat membuat profil untuk anak remaja mereka dan melihat daftar rekomendasi yang berbeda:

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"    |
+------------+-----------------+---------+

Anda dapat menambahkan histori pembelian atau detail relevan lainnya ke dialog untuk memberikan pengalaman yang lebih disesuaikan kepada pelanggan.

Integrasi dengan Vertex AI Spanner membantu Anda menyusun perintah kompleks yang berisi data live dan menggunakannya untuk membangun aplikasi yang didukung AI.