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

Tujuan

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menggunakan model AI Generatif Vertex AI yang disediakan Google di 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 mengetahui 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, kita menggunakan model text-bison Vertex AI untuk memberikan rekomendasi produk yang dipersonalisasi kepada pelanggan akhir. Untuk mendaftarkan model ini di database Spanner, jalankan 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: region tempat Anda menggunakan Vertex AI

Penemuan dan validasi skema tidak tersedia untuk model AI Generatif. Oleh karena itu, Anda harus memberikan 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 otomatis memberikan izin yang sesuai. 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 mengharapkan satu kolom STRING bernama prompt. Anda dapat menggunakan subkueri Spanner untuk membuat kolom prompt. Model TextBison memerlukan Anda untuk 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" |
+--------------------+

Menggunakan Model TextBison untuk menjawab pertanyaan pelanggan

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

CATATAN: Beberapa jawaban model telah diedit agar lebih ringkas.

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 bagi anaknya, pengguna dapat membuat profil untuk remajanya 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 perintah untuk memberikan pengalaman yang lebih disesuaikan kepada pelanggan.

Integrasi Vertex AI Spanner membantu Anda menyusun perintah kompleks yang berisi data langsung dan menggunakannya untuk membuat aplikasi yang mendukung AI.