Realize análises semânticas com funções de IA geridas

Este tutorial mostra como usar as funções de IA geridas do BigQuery ML para fazer uma análise semântica do feedback dos clientes.

Objetivos

Neste tutorial:

  • Crie um conjunto de dados e carregue dados de sentimentos numa tabela
  • Crie uma associação de recursos da nuvem
  • Use as seguintes funções de IA para realizar a análise semântica:
    • AI.IF: para filtrar os 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 utilizador

Custos

Este tutorial usa componentes faturáveis do Google Cloud, incluindo o seguinte:

  • 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 estiver a usar um projeto existente para este guia, verifique se tem as autorizações necessárias para concluir este guia. Se criou um novo projeto, já tem as autorizaçõ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 estiver a usar um projeto existente para este guia, verifique se tem as autorizações necessárias para concluir este guia. Se criou um novo projeto, já tem as autorizaçõ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 a faturação para o projeto. Se não quiser ativar a faturação nem fornecer um cartão de crédito, os passos neste documento continuam a funcionar. O BigQuery oferece-lhe um sandbox para realizar os passos. Para mais informações, consulte o artigo Ative o sandbox do BigQuery.
  8. Funções necessárias

    Para receber as autorizações de que precisa para usar as funções de IA, peça ao seu administrador que lhe conceda as seguintes funções de IAM no projeto:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

    Crie dados de amostra

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

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

    Em seguida, crie uma tabela denominada customer_feedback que contenha exemplos de críticas de clientes sobre 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 associação

    Crie uma associação de recursos na nuvem e obtenha a conta de serviço da associação.

    Selecione uma das seguintes opções:

    Consola

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel esquerdo, clique em Explorador:

      Botão realçado para o painel do explorador.

      Se não vir o painel esquerdo, clique em Expandir painel esquerdo para o abrir.

    3. No painel Explorador, expanda o nome do projeto e, de seguida, clique em Ligações.

    4. Na página Associações, clique em Criar associação.

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

    6. No campo ID da associação, introduza um nome para a associação.

    7. Em Tipo de localização, selecione uma localização para a sua ligação. A ligação deve estar colocada com os seus outros recursos, como conjuntos de dados.

    8. Clique em Criar associação.

    9. Clique em Aceder à associação.

    10. No painel Informações da ligação, copie o ID da conta de serviço para utilização num passo posterior.

    bq

    1. Num ambiente de linha de comandos, crie uma associação:

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

      O parâmetro --project_id substitui o projeto predefinido.

      Substitua o seguinte:

      • REGION: a sua região de ligação
      • PROJECT_ID: o ID do seu Google Cloud projeto
      • CONNECTION_ID: um ID para a sua ligação

      Quando cria um recurso de ligação, o BigQuery cria uma conta de serviço do sistema única e associa-a à ligação.

      Resolução de problemas: se receber o seguinte erro de ligação, atualize o SDK do Google Cloud:

      Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
      
    2. Obtenha e copie o ID da conta de serviço para utilização num passo posterior:

      bq show --connection PROJECT_ID.REGION.CONNECTION_ID

      O resultado é semelhante ao seguinte:

      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 se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte cria uma associação de recursos da nuvem com o nome 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 num Google Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Google Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

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

      terraform init -upgrade

    Aplique as alterações

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

      Faça correções à configuração conforme necessário.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Google Cloud projeto para ver os resultados. Na Google Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

    Conceda autorizações à conta de serviço da associação

    Conceda à conta de serviço da ligação a função de utilizador do Vertex AI. Tem de conceder esta função no mesmo projeto que criou ou selecionou na secção Antes de começar. A concessão da função num 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 a função, siga estes passos:

    1. Aceda à página IAM e administrador.

      Aceda a IAM e administração

    2. Clique em Conceder acesso.

    3. No campo Novos membros, introduza o ID da conta de serviço que copiou anteriormente.

    4. No campo Selecionar uma função, escolha Vertex AI e, de seguida, selecione Função de utilizador da Vertex AI.

    5. Clique em Guardar.

    Categorize o sentimento geral

    Pode ser útil extrair o sentimento geral expresso no texto para suportar exemplos de utilização como os seguintes:

    • Avalie a satisfação dos clientes a partir das críticas.
    • Monitorize a perceção da marca nas redes sociais.
    • Priorizar pedidos de apoio técnico com base no grau de insatisfação dos utilizadores.

    A consulta seguinte mostra como usar a função AI.CLASSIFY para classificar as críticas 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 tem um aspeto semelhante ao seguinte:

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

    Analise o sentimento baseado em aspetos

    Se um sentimento geral, como positivo ou negativo, não for suficiente para o seu exemplo de utilização, pode analisar um aspeto específico do significado do texto. Por exemplo, pode querer compreender a atitude de um utilizador em relação à qualidade do produto, sem ter em conta as suas opiniões sobre o preço. Pode até pedir um valor personalizado para indicar que um aspeto específico não se aplica.

    O exemplo seguinte mostra como usar a função AI.SCORE para classificar o sentimento do utilizador de 1 a 10 com base no quão favorável cada crítica na tabela customer_feedback é em relação ao preço, ao serviço de apoio ao cliente e à qualidade. A função devolve o valor personalizado -1 nos casos em que um aspeto não é mencionado na crítica, para que possa filtrá-los posteriormente.

    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 tem um aspeto semelhante ao seguinte:

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

    Detetar emoções

    Além do sentimento positivo ou negativo, pode classificar o texto com base em emoções específicas que selecionar. Isto é útil quando quer compreender melhor as respostas dos utilizadores ou sinalizar feedback altamente emocional 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 tem um aspeto semelhante ao seguinte:

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

    Categorize críticas por tópico

    Pode usar a função AI.CLASSIFY para agrupar críticas em tópicos predefinidos. Por exemplo, pode fazer o seguinte:

    • Descubra temas comuns no feedback dos clientes.
    • Organize documentos por assunto.
    • Encaminhar pedidos de apoio técnico por tópico.

    O exemplo seguinte mostra como classificar o feedback dos clientes em vários tipos, como problema de faturação ou acesso à conta e, em seguida, contar quantas críticas 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 tem um aspeto semelhante ao seguinte:

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

    Identifique críticas semanticamente semelhantes

    Pode usar a função AI.SCORE para avaliar a semelhança semântica de dois fragmentos de texto pedindo-lhe que classifique a semelhança de significado. Isto pode ajudar com tarefas como as seguintes:

    • Encontrar entradas duplicadas ou quase duplicadas.
    • Agrupar partes semelhantes de feedback.
    • Potenciar aplicações de pesquisa semântica.

    A seguinte consulta encontra críticas que abordam a dificuldade em 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 tem um aspeto semelhante ao seguinte:

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

    Também pode usar a função AI.IF para encontrar críticas relacionadas com 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");
    

    Combine funções

    Pode ser útil combinar estas funções numa única consulta. Por exemplo, a seguinte consulta filtra primeiro as críticas com sentimento negativo e, em seguida, classifica-as pelo 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");
    

    Crie UDFs de comandos reutilizáveis

    Para manter as suas consultas legíveis, pode reutilizar a lógica dos comandos criando funções definidas pelo utilizador. A consulta seguinte cria uma função para detetar sentimentos negativos chamando AI.IF com um comando personalizado. Em seguida, chama essa função para filtrar por críticas 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 incorrer em custos, pode eliminar o projeto que contém os recursos que criou ou manter o projeto e eliminar os recursos individuais.

    Elimine o projeto

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

    Elimine o conjunto de dados

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

    DROP SCHEMA my_dataset CASCADE;