En este instructivo, se muestra cómo analizar los comentarios de los clientes en texto libre no estructurado con datos de ventas estructurados en Lakehouse para evaluar el lanzamiento de un producto nuevo.
Imagina que eres un científico de datos en Froyo, una empresa ficticia de yogur helado que planea lanzar un nuevo sabor llamado Midnight Swirl. Antes de comprometerse con un lanzamiento global, la empresa debe responder tres preguntas:
- ¿Qué alérgenos y comentarios de los clientes se aplican al nuevo sabor?
- ¿Cuánta demanda debería esperar la empresa en los sabores existentes durante los próximos 12 meses?
- ¿Cómo se comparan el sentimiento del cliente y la intención de compra repetida con la demanda prevista?
Este instructivo está dirigido a analistas, científicos e ingenieros de datos que conocen BigQuery y SQL básico. Completarás cada paso con Cloud Shell y la consola de Google Cloud .
Objetivos
- Crea un catálogo en el catálogo de entornos de ejecución de Lakehouse y, luego, crea tablas de Apache Iceberg que almacenen datos de productos, ventas y comentarios de los clientes en tu Lakehouse.
- Usa las funciones basadas en IA de BigQuery
AI.CLASSIFYyAI.IFpara extraer la opinión, los temas y la intención de compra del texto no estructurado almacenado en una tabla de Iceberg. - Usa Conversational Analytics en BigQuery Studio para predecir la demanda a 12 meses con
AI.FORECASTy une la previsión con estadísticas de productos y comentarios.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
- Lakehouse
- BigQuery, including conversational analytics
- Cloud Storage
- Gemini Enterprise Agent Platform, for the Gemini models that AI functions call
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
En la consola de Google Cloud , en la página del selector de proyectos, selecciona o crea un proyecto de Google Cloud .
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Roles obligatorios
Si quieres obtener los permisos que necesitas para completar las tareas de este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Crea y borra el catálogo, el espacio de nombres y las tablas en el catálogo del entorno de ejecución de Lakehouse:
Administrador de BigLake (
roles/biglake.admin) -
Crea y borra un bucket de Cloud Storage, y otorga acceso a la cuenta de servicio del catálogo:
Administrador de Storage (
roles/storage.admin) -
Crear y modificar tablas desde BigQuery:
Editor de datos de BigQuery (
roles/bigquery.dataEditor) -
Ejecuta consultas y usa Conversational Analytics en BigQuery Studio:
- Usuario de BigQuery Studio (
roles/bigquery.studioUser) - Usuario de chat sin estado de análisis de datos de Gemini (
roles/geminidataanalytics.dataAgentStatelessUser) - Usuario de Gemini para Google Cloud (
roles/cloudaicompanion.user)
- Usuario de BigQuery Studio (
-
Llama a modelos de Gemini desde las funciones de IA de BigQuery:
Usuario de Agent Platform (
roles/aiplatform.user)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Prepara el entorno
Activa Cloud Shell, establece variables de entorno para tus recursos y habilita las APIs requeridas:
En la consola de Google Cloud , activa Cloud Shell. Si se te solicita, haz clic en Autorizar.
En Cloud Shell, configura las variables de entorno para el ID del proyecto, la región, el nombre del bucket, el ID del catálogo y el espacio de nombres para que puedas reutilizarlos a lo largo de este instructivo:
export PROJECT_ID=$(gcloud config get-value project) export REGION="us-central1" export BUCKET_NAME="${PROJECT_ID}-froyo-lakehouse" export CATALOG_ID="froyo_catalog" export NAMESPACE_ID="froyo_lakehouse"
Habilita las APIs obligatorias para tu proyecto:
- API de BigQuery (
bigquery.googleapis.com) - API de BigLake (
biglake.googleapis.com), que proporciona acceso al catálogo del entorno de ejecución de Lakehouse - API de Cloud Storage (
storage.googleapis.com) - API de Agent Platform (
aiplatform.googleapis.com) - API de Conversational Analytics (
geminidataanalytics.googleapis.com) - API de Gemini for Google Cloud (
cloudaicompanion.googleapis.com)
Habilita estas APIs en Cloud Shell:
gcloud services enable \ bigquery.googleapis.com \ biglake.googleapis.com \ storage.googleapis.com \ aiplatform.googleapis.com \ geminidataanalytics.googleapis.com \ cloudaicompanion.googleapis.com \ --project=${PROJECT_ID}
- API de BigQuery (
Cree un bucket de Cloud Storage
En Cloud Shell, crea un bucket de Cloud Storage para almacenar los archivos de tu tabla de Iceberg:
gcloud storage buckets create gs://${BUCKET_NAME} \ --project=${PROJECT_ID} \ --location=${REGION}
Crea un catálogo en el catálogo de entorno de ejecución de Lakehouse
Con el extremo del catálogo de REST de Iceberg, crea un catálogo en modo de venta de credenciales para que el catálogo use su cuenta de servicio aprovisionada automáticamente para acceder a tu bucket y no necesites crear una conexión de BigQuery:
En Cloud Shell, crea un catálogo de varios bucket en el modo de venta de credenciales:
gcloud biglake iceberg catalogs create ${CATALOG_ID} \ --project=${PROJECT_ID} \ --catalog-type=biglake \ --default-location=gs://${BUCKET_NAME} \ --primary-location=${REGION} \ --credential-mode=vended-credentials
Otorga a la cuenta de servicio aprovisionada automáticamente del catálogo el rol de usuario de objetos de Storage (
roles/storage.objectUser) en tu bucket:CATALOG_SA=$(gcloud biglake iceberg catalogs describe ${CATALOG_ID} \ --project=${PROJECT_ID} \ --format='value(biglake-service-account)') gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member="serviceAccount:${CATALOG_SA}" \ --role="roles/storage.objectUser"
Crea un espacio de nombres para tus tablas en el catálogo:
gcloud biglake iceberg namespaces create ${NAMESPACE_ID} \ --project=${PROJECT_ID} \ --catalog=${CATALOG_ID}
Crea tablas de Iceberg
Crea tres tablas de Iceberg en tu catálogo y cárgalas con datos de muestra:
products: Almacena la lista de productos, incluido el nuevo sabor Midnight Swirl y el sabor existente en el que se basa.sales_history: Almacena 24 meses de ventas de unidades mensuales para las combinaciones existentes, por región.customer_feedback: Almacena registros de comentarios. Cada fila vincula metadatos estructurados (feedback_id,submitted_date,flavor_nameychannel) con una columnacommentSTRINGque almacena texto libre no estructurado.
En BigQuery, se hace referencia a las tablas de Lakehouse con la estructura de nombres de cuatro partes P.C.N.T. (Project.Catalog.Namespace.Table).
En Cloud Shell, crea las tablas
products,sales_historyycustomer_feedback, y propágalas con datos de muestra. La secuencia de comandos ejecuta cada instrucción en orden y tarda aproximadamente un minuto en completarse:bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF -- Product list. CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.products\` ( product_name STRING, base_flavor STRING, status STRING, allergens STRING, target_regions STRING); INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.products\` VALUES ('Midnight Swirl', 'Classic Chocolate', 'Planned launch', 'Milk, Soy', 'North America, Europe'), ('Classic Chocolate', 'Classic Chocolate', 'In market', 'Milk, Soy', 'North America, Europe, Asia Pacific'), ('Vanilla Bean', 'Vanilla Bean', 'In market', 'Milk', 'North America, Europe, Asia Pacific'), ('Strawberry Swirl', 'Strawberry Swirl', 'In market', 'Milk', 'North America, Europe, Asia Pacific'); -- Monthly sales history for the flavors that are in market. CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.sales_history\` ( sale_month DATE, flavor_name STRING, region STRING, units_sold INT64); INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.sales_history\` WITH months AS ( SELECT sale_month FROM UNNEST(GENERATE_DATE_ARRAY( '2024-01-01', '2025-12-01', INTERVAL 1 MONTH)) AS sale_month ), flavors AS ( SELECT * FROM UNNEST([ STRUCT('Classic Chocolate' AS flavor_name, 1200 AS base_units), ('Vanilla Bean', 1000), ('Strawberry Swirl', 800)]) ), regions AS ( SELECT * FROM UNNEST([ STRUCT('North America' AS region, 1.0 AS region_factor), ('Europe', 0.8), ('Asia Pacific', 0.6)]) ) SELECT m.sale_month, f.flavor_name, r.region, CAST( f.base_units * r.region_factor -- Two percent month-over-month growth. * (1 + 0.02 * DATE_DIFF(m.sale_month, DATE '2024-01-01', MONTH)) -- Seasonal peak in July. * (1 + 0.25 * SIN(2 * ACOS(-1) * (EXTRACT(MONTH FROM m.sale_month) - 4) / 12)) AS INT64) AS units_sold FROM months AS m CROSS JOIN flavors AS f CROSS JOIN regions AS r; -- Customer feedback records with unstructured text in the comment column. CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\` ( feedback_id INT64, submitted_date DATE, flavor_name STRING, channel STRING, comment STRING); INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\` VALUES (1, '2025-11-03', 'Midnight Swirl', 'Taste panel', "Rich, deep chocolate with a hint of salt. Honestly better than the classic chocolate. I'd order this every week."), (2, '2025-11-03', 'Midnight Swirl', 'Taste panel', "Loved the dark chocolate swirl, but it was a bit too bitter for my kids."), (3, '2025-11-04', 'Midnight Swirl', 'Taste panel', "Best froyo I've tried this year. Smooth texture and not too sweet."), (4, '2025-11-04', 'Midnight Swirl', 'Taste panel', "Great taste. I'd definitely buy it again if it's priced like the other flavors."), (5, '2025-11-05', 'Midnight Swirl', 'Taste panel', "Does this contain soy? I have a soy allergy so I skipped it. Please label it clearly."), (6, '2025-11-05', 'Midnight Swirl', 'Taste panel', "Tastes like a premium dessert. The sea salt really makes it."), (7, '2025-06-12', 'Classic Chocolate', 'App review', "Solid chocolate flavor, my go-to order."), (8, '2025-07-02', 'Classic Chocolate', 'App review', "It's fine, but a little too sweet compared to other brands."), (9, '2025-08-19', 'Classic Chocolate', 'Support email', "Consistently good. I wish the cups were bigger for the price."), (10, '2025-09-07', 'Classic Chocolate', 'Support email', "My chocolate froyo was icy this time and the texture was off."), (11, '2025-10-21', 'Classic Chocolate', 'App review', "Classic for a reason. Always creamy. I'll keep ordering it."), (12, '2025-11-05', 'Classic Chocolate', 'Taste panel', "Good but forgettable next to the new dark chocolate sample."), (13, '2025-05-14', 'Vanilla Bean', 'App review', "Real vanilla flavor, you can see the specks. Love it."), (14, '2025-06-30', 'Vanilla Bean', 'App review', "Pretty plain. I only order it as a base for toppings."), (15, '2025-08-02', 'Vanilla Bean', 'App review', "Creamy and simple, perfect for my toddler."), (16, '2025-09-15', 'Vanilla Bean', 'Support email', "The store was out of vanilla bean two weekends in a row."), (17, '2025-06-08', 'Strawberry Swirl', 'App review', "Tastes like fresh strawberries. Great in the summer."), (18, '2025-07-26', 'Strawberry Swirl', 'App review', "Too artificial tasting. Not a fan."), (19, '2025-08-11', 'Strawberry Swirl', 'Support email', "My favorite flavor. Please never discontinue it."), (20, '2025-10-03', 'Strawberry Swirl', 'App review', "The price went up, but it's still worth it."); EOF
Verifica que tu catálogo incluya las tablas
products,sales_historyycustomer_feedback:gcloud biglake iceberg tables list \ --project=${PROJECT_ID} \ --catalog=${CATALOG_ID} \ --namespace=${NAMESPACE_ID}
Analiza los comentarios con funciones basadas en IA
La columna comment de la tabla customer_feedback contiene texto no estructurado que no puedes agregar ni unir directamente. Usa las funciones de IA de BigQuery para extraer valores estructurados de cada comentario y crear una nueva tabla feedback_insights:
AI.CLASSIFYasigna a cada comentario un sentimiento (positive,neutralonegative) y un tema principal (comotaste,texture,priceoallergens) de las listas de categorías que definas.AI.IFevalúa una condición de lenguaje natural para cada comentario y devuelve un valor deBOOL. En este caso, el valor indica si el cliente tiene la intención de volver a comprar el producto.
Estas funciones de IA administradas usan tus credenciales de usuario para llamar a Gemini, por lo que no necesitas crear un modelo remoto o una conexión.
En Cloud Shell, crea y propaga la tabla
feedback_insights:bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\` ( feedback_id INT64, flavor_name STRING, channel STRING, comment STRING, sentiment STRING, topic STRING, would_buy_again BOOL); INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\` SELECT feedback_id, flavor_name, channel, comment, AI.CLASSIFY( comment, categories => ['positive', 'neutral', 'negative']) AS sentiment, AI.CLASSIFY( comment, categories => ['taste', 'texture', 'price', 'allergens', 'availability', 'other']) AS topic, AI.IF( ('This customer says or implies that they would buy the product ', 'again. Comment: ', comment)) AS would_buy_again FROM \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\`; EOF
Resume las métricas de comentarios para cada variante:
bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF SELECT flavor_name, COUNT(*) AS comments, COUNTIF(sentiment = 'positive') AS positive, COUNTIF(would_buy_again) AS would_buy_again, ROUND(COUNTIF(sentiment = 'positive') / COUNT(*), 2) AS positive_share FROM \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\` GROUP BY flavor_name ORDER BY positive_share DESC; EOF
El resultado es similar a lo siguiente:
+-------------------+----------+----------+-----------------+----------------+ | flavor_name | comments | positive | would_buy_again | positive_share | +-------------------+----------+----------+-----------------+----------------+ | Strawberry Swirl | 4 | 3 | 2 | 0.75 | | Midnight Swirl | 6 | 4 | 3 | 0.67 | | Vanilla Bean | 4 | 2 | 2 | 0.5 | | Classic Chocolate | 6 | 2 | 3 | 0.33 | +-------------------+----------+----------+-----------------+----------------+
Previsión de la demanda con Conversational Analytics
Conversational Analytics en BigQuery Studio te permite analizar tus tablas de Iceberg con lenguaje natural. Recupera esquemas de tablas del catálogo del entorno de ejecución de Lakehouse, genera y ejecuta SQL de BigQuery (incluidas funciones basadas en IA, como AI.FORECAST) y devuelve tablas y gráficos directamente en el chat.
Inicia una conversación con tus tablas
En la consola de Google Cloud , ve a la página Agents de BigQuery.
En el panel del editor de BigQuery Studio, haz clic en la pestaña Agentes para abrir el panel de conversación y, luego, haz clic en Chat nuevo.
En el panel Chatea con tus datos, haz clic en la pestaña Fuentes de conocimiento. En el campo Buscar fuentes, busca y selecciona tus tres tablas de Iceberg con los siguientes valores. Reemplaza
PROJECT_IDpor el ID de tu proyecto:PROJECT_ID.froyo_catalog.froyo_lakehouse.productsPROJECT_ID.froyo_catalog.froyo_lakehouse.feedback_insightsPROJECT_ID.froyo_catalog.froyo_lakehouse.sales_history
Haz clic en Chat.
Haz preguntas para pronosticar la demanda y evaluar el lanzamiento
Haz una secuencia de preguntas en lenguaje natural para responder las tres preguntas comerciales sobre el lanzamiento de Midnight Swirl:
En el campo Haz una pregunta, ingresa la siguiente instrucción para verificar los detalles del producto y los comentarios de los clientes de Midnight Swirl y, luego, haz clic en send_spark Enviar:
Using products and feedback_insights, what are Midnight Swirl's allergens, base flavor, positive sentiment share, would_buy_again count, and customer concerns from negative or neutral comments?
El agente consulta ambas tablas y responde que Midnight Swirl se basa en Classic Chocolate y contiene leche y soja. También informa una participación de sentimiento positivo del 0.67, con tres de seis clientes que tienen la intención de volver a comprarlo, y destaca las preocupaciones sobre el etiquetado de alérgenos de soja y el amargor del chocolate negro.
Ingresa la siguiente instrucción para predecir la demanda a 12 meses en los sabores existentes y, luego, haz clic en send_spark Enviar:
Forecast monthly sales by flavor for the next 12 months, plotting only the trend lines without confidence intervals.
El análisis conversacional ejecuta una consulta con
AI.FORECAST, que usa el modelo TimesFM integrado en BigQuery ML sin entrenar un modelo independiente, y muestra un gráfico de la previsión de 12 meses para cada variante.Ingresa la siguiente instrucción para combinar la previsión de la demanda con los comentarios de los clientes y obtener recomendaciones de lanzamiento. Luego, haz clic en send_spark Enviar:
Join the total 12-month forecasted units_sold for each flavor with its positive sentiment share, would_buy_again count, and top complaint topics from feedback_insights, and recommend next steps for the Midnight Swirl launch.
Opcional: Para inspeccionar la consulta en SQL generada o ver los pasos de razonamiento del agente, expande Mostrar razonamiento.
Desde aquí, puedes hacer preguntas adicionales en la conversación (como desglosar el pronóstico por región) o hacer clic en Crear agente en el panel Detalles para guardar y compartir un agente de datos reutilizable con tu equipo.
Realiza una limpieza
Para evitar que se apliquen cargos a tu Google Cloud cuenta por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- En la Google Cloud consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra los recursos individuales
Si deseas conservar tu proyecto, borra los recursos individuales que creaste.
Para borrar tu conversación, en el panel del editor de BigQuery Studio, selecciona la pestaña Agentes. En el panel de navegación de la izquierda, que tal vez debas expandir, busca tu conversación en Chats recientes y, luego, haz clic en more_vert Ver acciones > Borrar.
En Cloud Shell, borra las cuatro tablas, el espacio de nombres, el catálogo y el bucket de Cloud Storage:
for TABLE in products sales_history customer_feedback feedback_insights; do gcloud biglake iceberg tables delete ${TABLE} \ --project=${PROJECT_ID} \ --catalog=${CATALOG_ID} \ --namespace=${NAMESPACE_ID} \ --quiet done gcloud biglake iceberg namespaces delete ${NAMESPACE_ID} \ --project=${PROJECT_ID} \ --catalog=${CATALOG_ID} \ --quiet gcloud biglake iceberg catalogs delete ${CATALOG_ID} \ --project=${PROJECT_ID} \ --quiet gcloud storage rm -r gs://${BUCKET_NAME}
¿Qué sigue?
Para explorar más formas de trabajar con los datos de tu Lakehouse, consulta los siguientes recursos:
- Obtén más información para consultar tablas de Iceberg en lenguaje natural con Conversational Analytics en Lakehouse.
- Configura instrucciones personalizadas, consultas verificadas y glosarios empresariales creando agentes de datos en BigQuery.
- Genera descripciones y sugerencias de consultas para tus tablas con estadísticas de datos.
- Obtén más información para administrar tablas de Iceberg en el catálogo de entorno de ejecución de Lakehouse.