Realizar análisis semánticos con funciones de IA gestionadas
En este tutorial se muestra cómo usar las funciones de IA gestionadas de BigQuery ML para realizar análisis semánticos de las opiniones de los clientes.
Objetivos
En este tutorial, aprenderás a hacer lo siguiente:
- Crear un conjunto de datos y cargar datos de sentimiento en una tabla
- Crear una conexión de recursos en la nube
- Usa las siguientes funciones de IA para realizar análisis semánticos:
AI.IF: para filtrar los datos con condiciones de lenguaje naturalAI.SCORE: para calificar las entradas por sentimientoAI.CLASSIFY: para clasificar las entradas en categorías definidas por el usuario
Costes
En este tutorial se usan componentes facturables de Google Cloud, incluidos los siguientes:
- BigQuery
- BigQuery ML
Para obtener más información sobre los costes de BigQuery, consulta la página de precios de BigQuery.
Para obtener más información sobre los costes de BigQuery ML, consulta los precios de BigQuery ML.
Antes de empezar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Si vas a usar un proyecto que ya tengas para seguir esta guía, comprueba que tienes los permisos necesarios para completar la guía. Si has creado un proyecto, ya tienes los permisos necesarios.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Si vas a usar un proyecto que ya tengas para seguir esta guía, comprueba que tienes los permisos necesarios para completar la guía. Si has creado un proyecto, ya tienes los permisos necesarios.
-
Enable the BigQuery API and BigQuery Connection API APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.En los proyectos nuevos, la API de BigQuery se habilita automáticamente.
- Opcional: Habilita la facturación del proyecto. Si no quieres habilitar la facturación ni proporcionar una tarjeta de crédito, puedes seguir los pasos que se indican en este documento. BigQuery te ofrece un entorno aislado para llevar a cabo los pasos. Para obtener más información, consulta Habilitar el entorno aislado de BigQuery.
-
Ejecutar tareas de consulta y de carga:
Usuario de tareas de BigQuery (
roles/bigquery.jobUser) -
Crea una conexión:
Administrador de conexión de BigQuery (
roles/bigquery.connectionAdmin) -
Crea un conjunto de datos, crea una tabla, carga datos en una tabla y consulta una tabla:
Editor de datos de BigQuery (
roles/bigquery.dataEditor) Ve a la página BigQuery.
En el panel de la izquierda, haga clic en Explorador:

Si no ves el panel de la izquierda, haz clic en Ampliar panel de la izquierda para abrirlo.
En el panel Explorador, despliega el nombre de tu proyecto y haz clic en Conexiones.
En la página Conexiones, haz clic en Crear conexión.
En Tipo de conexión, elija Modelos remotos de Vertex AI, funciones remotas, BigLake y Spanner (recurso de Cloud).
En el campo ID de conexión, introduce un nombre para la conexión.
En Tipo de ubicación, selecciona una ubicación para tu conexión. La conexión debe estar ubicada en el mismo lugar que tus otros recursos, como los conjuntos de datos.
Haga clic en Crear conexión.
Haz clic en Ir a la conexión.
En el panel Información sobre la conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_idanula el proyecto predeterminado.Haz los cambios siguientes:
REGION: tu región de conexiónPROJECT_ID: tu ID de proyecto Google CloudCONNECTION_ID: un ID para tu conexión
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia a la conexión.
Solución de problemas: si aparece el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Obtén y copia el ID de la cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado debería ser similar al siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}- Abre Cloud Shell.
-
Define el Google Cloud proyecto predeterminado en el que quieras aplicar tus configuraciones de Terraform.
Solo tienes que ejecutar este comando una vez por proyecto y puedes hacerlo en cualquier directorio.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.
-
En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión
.tf. Por ejemplo,main.tf. En este tutorial, nos referiremos al archivo comomain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.
Copia el código de ejemplo en el archivo
main.tfque acabas de crear.También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.
- Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
- Guarda los cambios.
-
Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
terraform init
Si quieres usar la versión más reciente del proveedor de Google, incluye la opción
-upgrade:terraform init -upgrade
-
Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
terraform plan
Haz las correcciones necesarias en la configuración.
-
Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo
yesen la petición:terraform apply
Espera hasta que Terraform muestre el mensaje "Apply complete!".
- Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para comprobar que Terraform los ha creado o actualizado.
Ve a la página IAM y administración.
Haz clic en Conceder acceso.
En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.
En el campo Selecciona un rol, elige Vertex AI y, a continuación, selecciona Rol de usuario de Vertex AI.
Haz clic en Guardar.
- Mide la satisfacción de los clientes a partir de las reseñas.
- Monitoriza la percepción de la marca en las redes sociales.
- Prioriza las incidencias de asistencia en función del nivel de frustración de los usuarios.
- Descubre temas comunes en los comentarios de los clientes.
- Organizar documentos por tema.
- Dirige las incidencias de asistencia por tema.
- Buscar entradas duplicadas o casi duplicadas.
- Agrupa las opiniones similares.
- Potencia las aplicaciones de búsqueda semántica.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Roles obligatorios
Para obtener los permisos que necesitas para usar las funciones de IA, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el proyecto:
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
Crear datos de muestra
Para crear un conjunto de datos llamado my_dataset en este tutorial, ejecuta la siguiente consulta.
CREATE SCHEMA my_dataset OPTIONS (location = 'LOCATION');
A continuación, crea una tabla llamada customer_feedback que contenga reseñas de clientes de ejemplo sobre un dispositivo:
CREATE TABLE my_dataset.customer_feedback AS (
SELECT
*
FROM
UNNEST( [STRUCT<review_id INT64, review_text STRING>
(1, "The battery life is incredible, and the screen is gorgeous! Best phone I've ever had. Totally worth the price."),
(2, "Customer support was a nightmare. It took three weeks for my order to arrive, and when it did, the box was damaged. Very frustrating!"),
(3, "The product does exactly what it says on the box. No complaints, but not exciting either."),
(4, "I'm so happy with this purchase! It arrived early and exceeded all my expectations. The quality is top-notch, although the setup was a bit tricky."),
(5, "The price is a bit too high for what you get. The material feels cheap and I'm worried it won't last. Service was okay."),
(6, "Absolutely furious! The item arrived broken, and getting a refund is proving impossible. I will never buy from them again."),
(7, "This new feature for account access is confusing. I can't find where to update my profile. Please fix this bug!"),
(8, "The shipping was delayed, but the support team was very helpful and kept me informed. The product itself is great, especially for the price.")
])
);
Crear una conexión
Crea una conexión de recursos de Cloud y obtén la cuenta de servicio de la conexión.
Selecciona una de las opciones siguientes:
Consola
bq
Terraform
Usa el recurso google_bigquery_connection.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.
En el siguiente ejemplo se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection en la región US:
Para aplicar la configuración de Terraform en un Google Cloud proyecto, sigue los pasos que se indican en las siguientes secciones.
Preparar Cloud Shell
Preparar el directorio
Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).
Aplica los cambios
Conceder permisos a la cuenta de servicio de la conexión
Asigna el rol Usuario de Vertex AI a la cuenta de servicio de la conexión. Debes asignar este rol en el mismo proyecto que hayas creado o seleccionado en la sección Antes de empezar. Si se asigna el rol en otro proyecto, se produce el error bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.
Para conceder el rol, sigue estos pasos:
Categorizar el sentimiento general
Puede ser útil extraer la opinión general que se desprende de un texto para admitir casos prácticos como los siguientes:
La siguiente consulta muestra cómo usar la función AI.CLASSIFY para clasificar las reseñas de la tabla customer_feedback como positivas, negativas o neutras:
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => ['positive', 'negative', 'neutral'],
connection_id => "CONNECTION_ID") AS sentiment
FROM
my_dataset.customer_feedback;
El resultado es similar al siguiente:
+-----------+------------------------------------------+-----------+ | review_id | review_text | sentiment | +-----------+------------------------------------------+-----------+ | 7 | This new feature for account access is | negative | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+-----------+ | 4 | "I'm so happy with this purchase! It | positive | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+-----------+ | 2 | "Customer support was a nightmare. It | negative | | | took three weeks for my order to | | | | arrive, and when it did, the box was | | | | damaged. Very frustrating!" | | +-----------+------------------------------------------+-----------+ | 1 | "The battery life is incredible, and | positive | | | the screen is gorgeous! Best phone I've | | | | ever had. Totally worth the price." | | +-----------+------------------------------------------+-----------+ | 8 | "The shipping was delayed, but the | positive | | | support team was very helpful and kept | | | | me informed. The product itself is | | | | great, especially for the price." | | +-----------+------------------------------------------+-----------+ | 5 | The price is a bit too high for what | negative | | | you get. The material feels cheap and | | | | I'm worried it won't last. Service was | | | | okay. | | +-----------+------------------------------------------+-----------+ | 3 | "The product does exactly what it says | neutral | | | on the box. No complaints, but not | | | | exciting either." | | +-----------+------------------------------------------+-----------+ | 6 | "Absolutely furious! The item arrived | negative | | | broken, and getting a refund is proving | | | | impossible. I will never buy from them | | | | again." | | +-----------+------------------------------------------+-----------+
Analizar las opiniones basadas en aspectos
Si un sentimiento general, como positivo o negativo, no es suficiente para tu caso práctico, puedes analizar un aspecto específico del significado del texto. Por ejemplo, puede que quieras saber la actitud de un usuario hacia la calidad del producto, sin tener en cuenta su opinión sobre el precio. Incluso puedes pedir un valor personalizado para indicar que un aspecto concreto no se aplica.
En el siguiente ejemplo se muestra cómo usar la función AI.SCORE para calificar el sentimiento de los usuarios del 1 al 10 en función de lo favorable que sea cada reseña de la tabla customer_feedback en relación con el precio, el servicio de atención al cliente y la calidad. La función devuelve el valor personalizado -1 en los casos en los que no se menciona ningún aspecto en la reseña, de modo que puedas filtrar estos casos más adelante.
SELECT
review_id,
review_text,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about PRICE for review: ", review_text,
"If price is not mentioned, return -1.0"),
connection_id => "CONNECTION_ID") AS price_score,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about CUSTOMER SERVICE for review: ", review_text,
"If customer service is not mentioned, return -1.0"),
connection_id => "CONNECTION_ID") AS service_score,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about QUALITY for review: ", review_text,
"If quality is not mentioned, return -1.0"),
connection_id => "CONNECTION_ID") AS quality_score
FROM
my_dataset.customer_feedback
LIMIT 3;
El resultado es similar al siguiente:
+-----------+------------------------------------------+--------------+---------------+---------------+ | review_id | review_text | price_score | service_score | quality_score | +-----------+------------------------------------------+--------------+---------------+---------------+ | 4 | "I'm so happy with this purchase! It | -1.0 | -1.0 | 9.5 | | | arrived early and exceeded all my | | | | | | expectations. The quality is top-notch, | | | | | | although the setup was a bit tricky." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+ | 8 | "The shipping was delayed, but the | 9.0 | 8.5 | 9.0 | | | support team was very helpful and kept | | | | | | me informed. The product itself is | | | | | | great, especially for the price." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+ | 6 | "Absolutely furious! The item arrived | -1.0 | 1.0 | 0.0 | | | broken, and getting a refund is proving | | | | | | impossible. I will never buy from them | | | | | | again." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+
Detectar emociones
Además de clasificar el sentimiento como positivo o negativo, puedes clasificar el texto en función de las emociones específicas que selecciones. Esto es útil si quieres conocer mejor las respuestas de los usuarios o marcar comentarios con un alto nivel de emotividad para revisarlos.
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => ['joy', 'anger', 'sadness', 'surprise', 'fear', 'disgust', 'neutral', 'other'],
connection_id => "CONNECTION_ID"
) AS emotion
FROM
my_dataset.customer_feedback;
El resultado es similar al siguiente:
+-----------+------------------------------------------+---------+ | review_id | review_text | emotion | +-----------+------------------------------------------+---------+ | 2 | "Customer support was a nightmare. It | anger | | | took three weeks for my order to | | | | arrive, and when it did, the box was | | | | damaged. Very frustrating!" | | +-----------+------------------------------------------+---------+ | 7 | This new feature for account access is | anger | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+---------+ | 4 | "I'm so happy with this purchase! It | joy | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+---------+ | 1 | "The battery life is incredible, and | joy | | | the screen is gorgeous! Best phone I've | | | | ever had. Totally worth the price." | | +-----------+------------------------------------------+---------+ | 8 | "The shipping was delayed, but the | joy | | | support team was very helpful and kept | | | | me informed. The product itself is | | | | great, especially for the price." | | +-----------+------------------------------------------+---------+ | 5 | The price is a bit too high for what | sadness | | | you get. The material feels cheap and | | | | I'm worried it won't last. Service was | | | | okay. | | +-----------+------------------------------------------+---------+ | 3 | "The product does exactly what it says | neutral | | | on the box. No complaints, but not | | | | exciting either." | | +-----------+------------------------------------------+---------+ | 6 | "Absolutely furious! The item arrived | anger | | | broken, and getting a refund is proving | | | | impossible. I will never buy from them | | | | again." | | +-----------+------------------------------------------+---------+
Clasificar las reseñas por tema
Puedes usar la función AI.CLASSIFY para agrupar las reseñas en temas predefinidos.
Por ejemplo, puedes hacer lo siguiente:
En el siguiente ejemplo se muestra cómo clasificar los comentarios de los clientes en varios tipos, como problema de facturación o acceso a la cuenta, y, a continuación, contar cuántas reseñas pertenecen a cada categoría:
SELECT
AI.CLASSIFY(
review_text,
categories => ['Billing Issue', 'Account Access',
'Product Bug', 'Feature Request',
'Shipping Delay', 'Other'],
connection_id => "CONNECTION_ID") AS topic,
COUNT(*) AS number_of_reviews,
FROM
my_dataset.customer_feedback
GROUP BY topic
ORDER BY number_of_reviews DESC;
El resultado es similar al siguiente:
+----------------+-------------------+ | topic | number_of_reviews | +----------------+-------------------+ | Other | 5 | | Shipping Delay | 2 | | Product Bug | 1 | +----------------+-------------------+
Identificar reseñas semánticamente similares
Puedes usar la función AI.SCORE para evaluar la similitud semántica entre dos fragmentos de texto pidiéndole que califique la similitud de significado. Esto puede ayudarte a realizar tareas como las siguientes:
La siguiente consulta busca reseñas en las que se hable de la dificultad para configurar el producto:
SELECT
review_id,
review_text,
AI.SCORE(
(
"""How similar is the review to the concept of 'difficulty in setting up the product'?
A higher score indicates more similarity. Review: """,
review_text),
connection_id => "CONNECTION_ID") AS setup_difficulty
FROM my_dataset.customer_feedback
ORDER BY setup_difficulty DESC
LIMIT 2;
El resultado es similar al siguiente:
+-----------+------------------------------------------+------------------+ | review_id | review_text | setup_difficulty | +-----------+------------------------------------------+------------------+ | 4 | "I'm so happy with this purchase! It | 3 | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+------------------+ | 7 | This new feature for account access is | 1 | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+------------------+
También puedes usar la función AI.IF para encontrar reseñas relacionadas con texto:
SELECT
review_id,
review_text
FROM my_dataset.customer_feedback
WHERE
AI.IF(
(
"Does this review discuss difficulty setting up the product? Review: ",
review_text),
connection_id => "CONNECTION_ID");
Combinar funciones
Puede ser útil combinar estas funciones en una sola consulta. Por ejemplo, la siguiente consulta primero filtra las reseñas con sentimiento negativo y, a continuación, las clasifica por el tipo de frustración:
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => [
'Poor Quality', 'Bad Customer Service', 'High Price', 'Other Negative'],
connection_id => "CONNECTION_ID") AS negative_topic
FROM my_dataset.customer_feedback
WHERE
AI.IF(
("Does this review express a negative sentiment? Review: ", review_text),
connection_id => "CONNECTION_ID");
Crear funciones definidas por el usuario de peticiones reutilizables
Para que tus consultas sean más legibles, puedes reutilizar la lógica de tus peticiones creando funciones definidas por el usuario. La siguiente consulta crea una función para detectar el sentimiento negativo llamando a AI.IF con una petición personalizada. A continuación, llama a esa función para filtrar por reseñas negativas.
CREATE OR REPLACE FUNCTION my_dataset.is_negative_sentiment(review_text STRING)
RETURNS BOOL
AS (
AI.IF(
("Does this review express a negative sentiment? Review: ", review_text),
connection_id => "CONNECTION_ID")
);
SELECT
review_id,
review_text
FROM my_dataset.customer_feedback
WHERE my_dataset.is_negative_sentiment(review_text);
Limpieza
Para evitar que se te apliquen cargos, puedes eliminar el proyecto que contiene los recursos que has creado o conservar el proyecto y eliminar los recursos.
Eliminar un proyecto
Para ello, sigue las instrucciones que aparecen a continuación:
Eliminar un conjunto de datos
Para eliminar el conjunto de datos y todos los recursos que contiene, incluidas todas las tablas y funciones, ejecute la siguiente consulta:
DROP SCHEMA my_dataset CASCADE;