Realizar análise semântica com funções de IA gerenciadas

Neste tutorial, mostramos como usar as funções de IA gerenciadas do BigQuery ML para realizar uma análise semântica do feedback dos clientes.

Objetivos

Neste tutorial, você aprenderá a:

  • Criar um conjunto de dados e carregar dados de sentimento em uma tabela
  • Criar uma conexão de recursos do Cloud
  • Use as seguintes funções de IA para realizar uma análise semântica:
    • AI.IF: para filtrar seus dados com condições de linguagem natural
    • AI.SCORE: para classificar a entrada por sentimento
    • AI.CLASSIFY: para classificar a entrada em categorias definidas pelo usuário

Custos

Neste tutorial, usamos componentes faturáveis do Google Cloud, incluindo:

  • BigQuery
  • BigQuery ML

Para mais informações sobre os custos do BigQuery, consulte a página de preços do BigQuery.

Para mais informações sobre os custos do BigQuery ML, consulte os preços do BigQuery ML.

Antes de começar

  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. Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.

  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. Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.

  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

    Para novos projetos, a API BigQuery é ativada automaticamente.

  7. Opcional: ative o faturamento do projeto. Se você não quiser ativar o faturamento ou informar um cartão de crédito, as etapas deste documento ainda funcionarão. O BigQuery fornece um sandbox para executar as etapas. Para mais informações, consulte Ativar o sandbox do BigQuery.
  8. Funções exigidas

    Para receber as permissões necessárias para usar as funções de IA, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

    Criar dados de amostra

    Para criar um conjunto de dados chamado my_dataset para este tutorial, execute a seguinte consulta.

    CREATE SCHEMA my_dataset OPTIONS (location = 'LOCATION');
    

    Em seguida, crie uma tabela chamada customer_feedback que contenha exemplos de avaliações de clientes para um 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.") 
          ])
    );
    

    Crie uma conexão

    Crie uma Conexão de recursos do Cloud e tenha acesso à conta de serviço da conexão.

    Selecione uma das seguintes opções:

    Console

    1. Acessar a página do BigQuery.

      Acessar o BigQuery

    2. No painel à esquerda, clique em Explorer:

      Botão destacado para o painel &quot;Explorer&quot;.

      Se você não vir o painel à esquerda, clique em Expandir painel esquerdo para abrir o painel.

    3. No painel Explorer, expanda o nome do projeto e clique em Conexões.

    4. Na página Conexões, clique em Criar conexão.

    5. Em Tipo de conexão, escolha Modelos remotos da Vertex AI, funções remotas, BigLake e Spanner (recurso do Cloud).

    6. No campo ID da conexão, insira um nome para a conexão.

    7. Em Tipo de local, selecione um local para sua conexão. A conexão precisa estar alocada com seus outros recursos, como conjuntos de dados.

    8. Clique em Criar conexão.

    9. Clique em Ir para conexão.

    10. No painel Informações da conexão, copie o ID da conta de serviço para usar em uma etapa posterior.

    bq

    1. Em um ambiente de linha de comando, crie uma conexão:

      bq mk --connection --location=REGION --project_id=PROJECT_ID \
          --connection_type=CLOUD_RESOURCE CONNECTION_ID

      O parâmetro --project_id substitui o projeto padrão.

      Substitua:

      • REGION: sua região de conexão
      • PROJECT_ID: o ID do projeto do Google Cloud
      • CONNECTION_ID: um ID para sua conexão

      Quando você cria um recurso de conexão, o BigQuery cria uma conta de serviço do sistema exclusiva e a associa à conexão.

      Solução de problemas: se você receber o seguinte erro de conexão, atualize o SDK Google Cloud:

      Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
      
    2. Recupere e copie o ID da conta de serviço para uso em uma etapa posterior:

      bq show --connection PROJECT_ID.REGION.CONNECTION_ID

      O resultado será assim:

      name                          properties
      1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
      

    Terraform

    Use o recurso google_bigquery_connection.

    Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

    O exemplo a seguir cria uma conexão de recurso do Google Cloud chamada my_cloud_resource_connection na região 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 a configuração do Terraform em um projeto Google Cloud , siga as etapas nas seções a seguir.

    Preparar o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o projeto Google Cloud padrão em que você quer aplicar as configurações do Terraform.

      Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

    Preparar o diretório

    Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.

    1. No Cloud Shell, crie um diretório e um novo arquivo dentro dele. O nome do arquivo precisa ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o arquivo é chamado de main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.

      Copie o exemplo de código no main.tf recém-criado.

      Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.

    3. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
    4. Salve as alterações.
    5. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:
      terraform plan

      Faça as correções necessárias na configuração.

    2. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:
      terraform apply

      Aguarde até que o Terraform exiba a mensagem "Apply complete!".

    3. Abra seu Google Cloud projeto para conferir os resultados. No console do Google Cloud , navegue até seus recursos na interface para verificar se foram criados ou atualizados pelo Terraform.

    Conceder permissões para a conta de serviço do portal

    Conceda à conta de serviço da conexão a função de usuário da Vertex AI. É necessário conceder essa função no mesmo projeto que você criou ou selecionou na seção Antes de começar. Conceder o papel em um projeto diferente resulta no erro bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.

    Para conceder o papel, siga estas etapas:

    1. Acessar a página AM e administrador

      Acessar IAM e administrador

    2. Clique em Conceder acesso.

    3. No campo Novos principais, digite o ID da conta de serviço que você copiou anteriormente.

    4. No campo Selecionar um papel, escolha Vertex AI e, em seguida, selecione o papel Usuário da Vertex AI.

    5. Clique em Salvar.

    Categorizar o sentimento geral

    Pode ser útil extrair o sentimento geral expresso no texto para oferecer suporte a casos de uso como:

    • Avalie a satisfação dos clientes com base nas avaliações.
    • Monitore a percepção da marca nas redes sociais.
    • Priorize os tíquetes de suporte com base no nível de frustração dos usuários.

    A consulta a seguir mostra como usar a função AI.CLASSIFY para classificar as avaliações da tabela customer_feedback como positivas, negativas ou 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;
    

    O resultado será semelhante a este:

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

    Analisar o sentimento com base em aspectos

    Se um sentimento geral, como positivo ou negativo, não for suficiente para seu caso de uso, analise um aspecto específico do significado do texto. Por exemplo, você pode querer entender a atitude de um usuário em relação à qualidade do produto, sem considerar a opinião dele sobre o preço. Você pode até pedir um valor personalizado para indicar que um aspecto específico não se aplica.

    O exemplo a seguir mostra como usar a função AI.SCORE para classificar o sentimento do usuário de 1 a 10 com base em como cada avaliação na tabela customer_feedback é favorável a preço, atendimento ao cliente e qualidade. A função retorna o valor personalizado -1 nos casos em que um aspecto não é mencionado na avaliação para que você possa filtrar esses casos mais tarde.

    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;
    

    O resultado será semelhante a este:

    +-----------+------------------------------------------+--------------+---------------+---------------+
    | 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 emoções

    Além do sentimento positivo ou negativo, você pode classificar o texto com base em emoções específicas que selecionar. Isso é útil quando você quer entender melhor as respostas dos usuários ou sinalizar feedback muito emotivo para revisão.

    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;
    

    O resultado será semelhante a este:

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

    Categorizar avaliações por tema

    É possível usar a função AI.CLASSIFY para agrupar avaliações em tópicos predefinidos. Por exemplo, é possível:

    • Descubra temas comuns no feedback dos clientes.
    • Organize os documentos por assunto.
    • Encaminhar tíquetes de suporte por tema.

    O exemplo a seguir mostra como classificar o feedback dos clientes em vários tipos, como problema de faturamento ou acesso à conta, e contar quantas avaliações pertencem a cada categoria:

    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;
    

    O resultado será semelhante a este:

    +----------------+-------------------+
    | topic          | number_of_reviews |
    +----------------+-------------------+
    | Other          | 5                 |
    | Shipping Delay | 2                 |
    | Product Bug    | 1                 |
    +----------------+-------------------+
    

    Identificar avaliações semanticamente semelhantes

    Você pode usar a função AI.SCORE para avaliar a semelhança semântica de dois textos pedindo que ela classifique a similaridade de significado. Isso pode ajudar você com tarefas como:

    • Encontrar entradas duplicadas ou quase duplicadas.
    • Agrupe feedbacks semelhantes.
    • Potencialize aplicativos de pesquisa semântica.

    A consulta a seguir encontra avaliações que discutem a dificuldade de configurar o produto:

    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;
    

    O resultado será semelhante a este:

    +-----------+------------------------------------------+------------------+
    | 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!         |                  |
    +-----------+------------------------------------------+------------------+
    

    Você também pode usar a função AI.IF para encontrar avaliações relacionadas a 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 funções

    Pode ser útil combinar essas funções em uma única consulta. Por exemplo, a consulta a seguir primeiro filtra as avaliações com sentimento negativo e depois as classifica por tipo de frustração:

    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");
    

    Criar UDFs de solicitação reutilizáveis

    Para manter suas consultas legíveis, reutilize a lógica de comandos criando funções definidas pelo usuário. A consulta a seguir cria uma função para detectar sentimentos negativos chamando AI.IF com um comando personalizado. Em seguida, ele chama essa função para filtrar por avaliações 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);
    

    Limpar

    Para evitar cobranças, exclua o projeto que contém os recursos criados ou mantenha o projeto e exclua os recursos individuais.

    Excluir o projeto

    Para excluir o projeto:

    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.

    Excluir o conjunto de dados

    Para excluir o conjunto de dados e todos os recursos que ele contém, incluindo todas as tabelas e funções, execute a seguinte consulta:

    DROP SCHEMA my_dataset CASCADE;