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 natural
    • AI.SCORE: para calificar las entradas por sentimiento
    • AI.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

  1. 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.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. 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.

  4. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. 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.

  6. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

    En los proyectos nuevos, la API de BigQuery se habilita automáticamente.

  7. 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.
  8. 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

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel de la izquierda, haga clic en Explorador:

      Botón destacado del panel Explorador.

      Si no ves el panel de la izquierda, haz clic en Ampliar panel de la izquierda para abrirlo.

    3. En el panel Explorador, despliega el nombre de tu proyecto y haz clic en Conexiones.

    4. En la página Conexiones, haz clic en Crear conexión.

    5. En Tipo de conexión, elija Modelos remotos de Vertex AI, funciones remotas, BigLake y Spanner (recurso de Cloud).

    6. En el campo ID de conexión, introduce un nombre para la conexión.

    7. 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.

    8. Haga clic en Crear conexión.

    9. Haz clic en Ir a la conexión.

    10. En el panel Información sobre la conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.

    bq

    1. 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_id anula el proyecto predeterminado.

      Haz los cambios siguientes:

      • REGION: tu región de conexión
      • PROJECT_ID: tu ID de proyecto Google Cloud
      • CONNECTION_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...
      
    2. 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"}
      

    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:

    
    # This queries the provider for project information.
    data "google_project" "default" {}
    
    # This creates a cloud resource connection in the US region named my_cloud_resource_connection.
    # Note: The cloud resource nested object has only one output field - serviceAccountId.
    resource "google_bigquery_connection" "default" {
      connection_id = "my_cloud_resource_connection"
      project       = data.google_project.default.project_id
      location      = "US"
      cloud_resource {}
    }

    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

    1. Abre Cloud Shell.
    2. 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.

    Preparar el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. 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 como main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. 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.tf que 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.

    3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
    4. Guarda los cambios.
    5. 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

    Aplica los cambios

    1. 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.

    2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
      terraform apply

      Espera hasta que Terraform muestre el mensaje "Apply complete!".

    3. 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.

    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:

    1. Ve a la página IAM y administración.

      Ir a IAM y administración

    2. Haz clic en Conceder acceso.

    3. En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.

    4. En el campo Selecciona un rol, elige Vertex AI y, a continuación, selecciona Rol de usuario de Vertex AI.

    5. Haz clic en Guardar.

    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:

    • 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.

    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:

    • Descubre temas comunes en los comentarios de los clientes.
    • Organizar documentos por tema.
    • Dirige las incidencias de asistencia por tema.

    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:

    • Buscar entradas duplicadas o casi duplicadas.
    • Agrupa las opiniones similares.
    • Potencia las aplicaciones de búsqueda semántica.

    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:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    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;