Usar a IA generativa para receber recomendações personalizadas em um aplicativo de e-commerce

Objetivo

Neste tutorial, você aprenderá a realizar as seguintes tarefas:

  • Use os modelos de IA generativa da Vertex AI fornecidos pelo Google em um banco de dados do Spanner.
  • Use a IA generativa para fornecer recomendações de produtos personalizadas em um exemplo de aplicativo de e-commerce.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:

  • Spanner
  • Vertex AI

Para mais informações sobre os custos do Spanner, consulte a página de preços do Spanner.

Para mais informações sobre os custos da Vertex AI, consulte a página de preços da Vertex AI.

Criar o esquema de sites de e-commerce

Para este tutorial, usamos o esquema e os dados a seguir:

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

Registrar um modelo de IA generativa em um esquema do Spanner

Neste tutorial, usamos o modelo text-bison da Vertex AI para fornecer recomendações personalizadas de produtos aos clientes finais. Para registrar esse modelo em um banco de dados do Spanner, execute a seguinte instrução 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'
);

Substitua:

  • PROJECT: o ID do projeto
  • LOCATION: a região em que você está usando a Vertex AI.

A descoberta e a validação de esquemas não estão disponíveis para modelos de IA generativa. Portanto, é preciso fornecer cláusulas INPUT e OUTPUT que correspondam ao esquema do modelo. Confira o esquema completo do modelo text-bison na página Referência da API Model da Vertex AI.

Contanto que o banco de dados e os endpoints estejam no mesmo projeto, o Spanner precisa conceder as permissões apropriadas automaticamente. Caso contrário, revise a seção de controle de acesso do endpoint do modelo da página de referência de CREATE MODEL.

Para verificar se o modelo foi registrado corretamente, consulte-o com a função ML.PREDICT. O modelo espera uma única coluna STRING chamada prompt. Use uma subconsulta do Spanner para gerar a coluna prompt. O modelo TextBison exige que você especifique um parâmetro de modelo maxOutputTokens. Outros parâmetros são opcionais. O modelo text-bison da Vertex AI não aceita lotes, então use o parâmetro @{remote_udf_max_rows_per_rpc=1} para definir o tamanho do lote como 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" |
+--------------------+

Use o modelo TextBison para responder às perguntas dos clientes

Os modelos de texto de IA generativa podem resolver uma ampla variedade de problemas. Por exemplo, um usuário em um site de e-commerce pode estar procurando produtos seguros para bebês. Com uma única consulta, podemos passar a pergunta para o modelo TextBison. Tudo o que precisamos fazer é fornecer o contexto relevante à pergunta buscando detalhes do produto no banco de dados.

OBSERVAÇÃO: algumas respostas do modelo foram editadas para maior brevidade.

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

Substitua o literal da pergunta por um parâmetro de consulta, como @UserQuestion, se quiser preencher diretamente o parâmetro com uma pergunta do cliente. Isso dá ao cliente uma experiência de compra on-line com tecnologia de IA.

Fornecer recomendações personalizadas de produtos aos clientes

Além dos detalhes do produto, também podemos adicionar informações sobre o cliente ao prompt. Isso permite que o modelo considere as preferências do usuário para fornecer recomendações de produtos totalmente personalizadas.

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

Para procurar um presente para a criança, o usuário pode criar um perfil para o adolescente e conferir uma lista diferente de recomendações:

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

É possível adicionar um histórico de compras ou outros detalhes relevantes à solicitação para oferecer ao cliente uma experiência mais personalizada.

A integração da Vertex AI com o Spanner ajuda a montar prompts complexos contendo dados ativos e usá-los para criar aplicativos habilitados para IA.