Objetivo
Neste tutorial, você aprenderá a realizar as seguintes tarefas:
- Usar 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 personalizadas de produtos 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 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 do site 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 a Vertex AI Modelo text-bison 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, você precisa fornecer as cláusulas INPUT
e OUTPUT
que
correspondem ao esquema do modelo. Confira o esquema completo do text-bison
na Vertex AI
página Referência da API Model.
Desde que o banco de dados e os endpoints estejam no mesmo projeto,
o Spanner vai conceder as permissões adequadas
automaticamente. Caso contrário, revise a seção
Controle de acesso a endpoints de modelos
da página de referência CREATE MODEL
.
Para verificar se o modelo foi registrado corretamente, faça uma consulta com a função
ML.PREDICT. O modelo espera uma única
Coluna STRING
chamada prompt
. É possível usar uma
subconsulta do Spanner
para gerar a coluna prompt
. O modelo TextBison
requer que você especifique um parâmetro de modelo maxOutputTokens
.
Outros parâmetros são opcionais. A Vertex AI
O modelo text-bison
não oferece suporte a lotes. Portanto, você precisa 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 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
enviar a pergunta para o modelo TextBison
. Tudo o que precisamos fazer é
fornecer um contexto relevante para a pergunta, extraindo detalhes do produto
do banco de dados.
OBSERVAÇÃO: algumas respostas do modelo foram editadas para concisão.
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. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
Você pode substituir o literal da pergunta por um parâmetro de consulta, como
@UserQuestion
, se quiser preencher o parâmetro diretamente com uma
pergunta do cliente. Isso oferece ao cliente uma experiência de compra
on-line 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 os
para o 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 ela para adolescentes 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" |
+------------+-----------------+---------+
Você pode adicionar o histórico de compras ou outros detalhes relevantes ao comando para oferecer uma experiência mais personalizada ao cliente.
A integração da Vertex AI com o Spanner ajuda você a montar comandos complexos que contêm dados ativos para criar aplicativos com tecnologia de IA.