Use a IA generativa para receber recomendações personalizadas numa aplicação de comércio eletrónico

Objetivo

Neste tutorial, vai aprender a:

  • Use modelos de IA generativa da Vertex AI fornecidos pela Google numa base de dados do Spanner.
  • Use a IA generativa para fornecer recomendações de produtos personalizadas numa aplicação de comércio eletrónico de exemplo.

Custos

Este tutorial usa componentes faturáveis do Google Cloud, incluindo:

  • 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 do Vertex AI, consulte a página de preços do Vertex AI.

Crie o esquema do Website de comércio eletrónico

Para este tutorial, usamos o seguinte esquema e dados:

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

Registe um modelo de IA generativa num esquema do Spanner

Neste tutorial, usamos o modelo text-bison do Vertex AI para fornecer recomendações de produtos personalizadas aos clientes finais. Para registar este modelo numa base de dados do Spanner, execute a seguinte declaraçã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 o seguinte:

  • PROJECT: o ID do projeto
  • LOCATION: a região onde está a usar o Vertex AI

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

Desde que a base de dados e os pontos finais estejam no mesmo projeto, o Spanner deve conceder automaticamente as autorizações adequadas. Caso contrário, reveja a secção Controlo de acesso do ponto final do modelo da página de referência CREATE MODEL.

Para verificar se o modelo foi registado corretamente, consulte-o com a função ML.PREDICT. O modelo espera uma única coluna STRING com o nome prompt. Pode usar uma subconsulta do Spanner para gerar a coluna prompt. O modelo TextBison requer que especifique um parâmetro de modelo maxOutputTokens. Outros parâmetros são opcionais. O modelo da Vertex AI text-bison não suporta o processamento em lote, pelo que tem de usar 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 TextBison modelo para responder a perguntas dos clientes

Os modelos de texto de IA generativa podem resolver uma grande variedade de problemas. Por exemplo, um utilizador num Website de comércio eletrónico pode estar a procurar produtos seguros para bebés. Com uma única consulta, podemos transmitir a pergunta ao modelo TextBison. Tudo o que temos de fazer é fornecer contexto relevante para a pergunta, obtendo detalhes do produto a partir da base de dados.

NOTA: algumas respostas modelo foram editadas para serem mais concisas.

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

Pode substituir o literal da pergunta por um parâmetro de consulta, como @UserQuestion, se quiser preencher diretamente o parâmetro com uma pergunta do cliente. Isto oferece ao cliente uma experiência de compras online com tecnologia de IA.

Fornecer recomendações de produtos personalizadas aos clientes

Além dos detalhes do produto, também podemos adicionar informações sobre o cliente ao prompt. Isto permite que o modelo tenha em consideração as preferências do utilizador para poder 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 o filho, o utilizador pode criar um perfil para o adolescente e ver 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"    |
+------------+-----------------+---------+

Pode adicionar o histórico de compras ou outros detalhes relevantes ao comando para oferecer ao cliente uma experiência mais personalizada.

A integração do Spanner com o Vertex AI ajuda a reunir comandos complexos que contêm dados em direto e a usá-los para criar aplicações com tecnologia de IA.