生成 AI を使用して e コマース アプリケーションでパーソナライズされたレコメンデーションを取得する

目的

このチュートリアルでは、以下の方法について学習します。

  • Google が提供する Vertex AI 生成 AI モデルを Spanner データベースで使用します。
  • 生成 AI を使用して、サンプルの e コマース アプリケーションでパーソナライズされた商品のレコメンデーションを提供します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Spanner
  • Vertex AI

Spanner の費用の詳細については、Spanner の料金ページをご覧ください。

Vertex AI の費用の詳細については、Vertex AI の料金のページをご覧ください。

e コマース サイトのスキーマを作成する

このチュートリアルでは、次のスキーマとデータを使用します。

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

Spanner スキーマに生成 AI モデルを登録する

このチュートリアルでは、Vertex AI のtext-bison モデルを使用して、エンド カスタマーにパーソナライズされたおすすめの商品情報を提供します。Spanner データベースにこのモデルを登録するには、次の DDL ステートメントを execute します。

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: プロジェクト ID
  • LOCATION: Vertex AI を使用するリージョン

スキーマの検出と検証は、生成 AI モデルでは使用できません。そのため、モデルのスキーマと一致する INPUT 句と OUTPUT 句を指定する必要があります。text-bison モデルの完全なスキーマについては、Vertex AI の モデル API リファレンスページをご覧ください。

データベースとエンドポイントの両方が同じプロジェクトにある限り、Spanner は適切な権限を自動的に付与する必要があります。それ以外の場合は、CREATE MODEL リファレンス ページのモデル エンドポイントのアクセス制御セクションをご覧ください。

モデルが正しく登録されたことを確認するには、ML.PREDICT 関数を使用してクエリを実行します。このモデルには、prompt という名前の単一の STRING 列が必要です。Spanner サブクエリを使用して、prompt 列を生成できます。TextBison モデルでは、maxOutputTokens モデル パラメータを指定する必要があります。その他のパラメータはオプションです。Vertex AI の text-bison モデルはバッチ処理をサポートしていないため、@{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 のテキストモデルでは、さまざまな問題を解決できます。たとえば、e コマースサイトのユーザーが、乳児にとって安全な商品を閲覧しているとします。1 つのクエリで、その質問を 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 対応アプリケーションを構築できます。