Objetivo
En este tutorial, aprenderás a hacer lo siguiente:
- Usa los modelos de IA generativa de Vertex AI proporcionados por Google en una base de datos de Spanner.
- Usa la IA generativa para ofrecer recomendaciones de productos personalizadas en una aplicación de comercio electrónico de muestra.
Costes
En este tutorial se usan componentes facturables de Google Cloud, como los siguientes:
- Spanner
- Vertex AI
Para obtener más información sobre los costes de Spanner, consulta la página Precios de Spanner.
Para obtener más información sobre los costes de Vertex AI, consulta la página Precios de Vertex AI.
Crear el esquema del sitio web de comercio electrónico
En este tutorial, usaremos el siguiente esquema y datos:
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 un modelo de IA generativa en un esquema de Spanner
En este tutorial, usamos el modelo text-bison de Vertex AI para ofrecer recomendaciones de productos personalizadas a los clientes finales. Para registrar este modelo en una base de datos de Spanner, ejecuta la siguiente declaración 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'
);
Haz los cambios siguientes:
PROJECT
: el ID del proyectoLOCATION
: la región en la que usas Vertex AI
La detección y la validación de esquemas no están disponibles para los modelos de IA generativa. Por lo tanto, debes proporcionar cláusulas INPUT
y OUTPUT
que coincidan con el esquema del modelo. Puedes consultar el esquema completo del text-bison
modelo en la página de referencia de la API Model de Vertex AI.
Siempre que la base de datos y los endpoints estén en el mismo proyecto, Spanner debería conceder los permisos adecuados automáticamente. De lo contrario, consulta la sección Control de acceso a endpoints de modelos de la página de referencia de CREATE MODEL
.
Para verificar que el modelo se ha registrado correctamente, consúltalo con la función ML.PREDICT. El modelo espera una sola columna STRING
llamada prompt
. Puedes usar una subconsulta de Spanner para generar la columna prompt
. El modelo TextBison
requiere que especifiques un parámetro de modelo maxOutputTokens
.
El resto de los parámetros son opcionales. El modelo text-bison
de Vertex AI no admite el procesamiento por lotes, por lo que debes usar el parámetro @{remote_udf_max_rows_per_rpc=1}
para definir el tamaño del lote en 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" |
+--------------------+
Usar el TextBison
modelo para responder a las preguntas de los clientes
Los modelos de texto de IA generativa pueden resolver una amplia variedad de problemas.
Por ejemplo, un usuario que esté buscando productos seguros para bebés en un sitio web de comercio electrónico. Con una sola consulta, podemos
enviar su pregunta al modelo TextBison
. Lo único que tenemos que hacer es
proporcionar contexto relevante para la pregunta obteniendo los detalles del producto
de la base de datos.
NOTA: Algunas respuestas de ejemplo se han editado para que resulten más breves.
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. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
Puedes sustituir el literal de la pregunta por un parámetro de consulta, como @UserQuestion
, si quieres rellenar directamente el parámetro con una pregunta del cliente. De esta forma, el cliente disfruta de una experiencia de compra online basada en IA.
Ofrecer recomendaciones de productos personalizadas a los clientes
Además de los detalles del producto, también podemos añadir información sobre el cliente al prompt
. De esta forma, el modelo puede tener en cuenta las preferencias de los usuarios para ofrecer recomendaciones de productos 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 buscar un regalo para su hijo/a, el usuario puede crear un perfil para su hijo/a adolescente y ver una lista de recomendaciones diferente:
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" |
+------------+-----------------+---------+
Puedes añadir el historial de compras u otros detalles relevantes a la petición para ofrecer al cliente una experiencia más personalizada.
La integración de Spanner con Vertex AI te ayuda a crear peticiones complejas que contengan datos activos y a usarlas para crear aplicaciones basadas en IA.