Compartilhar via


Analise avaliações de clientes com ai_generate_text() e OpenAI

Importante

Esse recurso está em uma versão prévia.

Aviso

A função IA ai_generate_text() foi preterida. O Databricks recomenda o uso de ai_query com modelos externos.

Este artigo ilustra como usar a função SQL interna do Databricks ai_generate_text() examinar as avaliações do cliente e determinar se uma resposta precisa ser gerada. Consulte Funções de IA no Azure Databricks para obter mais detalhes sobre a função.

O conjunto de dados e os comandos neste guia são da demonstração do Databricks Avaliações do cliente em ação em escala com AI Functions do SQL do Databricks. A demonstração usa dados falsos gerados pela OpenAI que imitam avaliações de clientes para produtos de supermercado enviados a um site de comércio eletrônico.

Avaliações de clientes

Este exemplo orienta você a:

  • Decompor o texto de revisão do cliente de forma livre em suas entidades constituintes.
  • Para cada entidade, determinar o sentimento e se uma resposta é necessária de volta ao cliente.
  • Gerar uma resposta mencionando produtos alternativos que possam satisfazer o cliente.

Fluxo de dados ai_generate_text

Pré-requisitos

Design de prompt

As chaves para obter resultados úteis de um modelo GPT são:

  • Fazendo uma pergunta bem formada.
  • Ser específico sobre o tipo de resposta que você está esperando.

Para obter resultados em um formulário que você pode armazenar facilmente em uma tabela, você pode pedir ao modelo para retornar o resultado em uma cadeia de caracteres que reflita a representação JSON e especificar o esquema esperado.

A seguir está o prompt de exemplo para esse cenário:

Um cliente deixou um comentário. Acompanhe quem parecer infeliz.

Extraia todas as entidades mencionadas. Para cada entidade:

  • Classifique o sentimento como ["POSITIVO","NEUTRO","NEGATIVO"]
  • Se o cliente precisa de um acompanhamento: S ou N
  • Motivo da necessidade de acompanhamento

Retornar JSON APENAS. Nenhum outro texto fora do JSON.

Formato JSON:

{
"entities": [{
    "entity_name": "entity_name",
    "entity_type": "entity_type",
    "entity_sentiment": "entity_sentiment",
    "followup": "Y or N for follow up",
    "followup_reason": "reason for followup"
  }]
}

Revisão:

<’insert_review_text_here’>

Criar funções SQL

O Databricks recomenda decompor suas perguntas em funções SQL granulares para que elas possam ser reutilizadas para outros cenários em sua organização.

Ao longo desta seção, você cria funções SQL para abstrair os detalhes da chamada ai_generate_text() dos usuários finais e usa essas funções como sua interface para interagir com o Azure OpenAI.

Manipular chamadas para o Azure OpenAI

A função wrapper a seguir, prompt_handler(), manipula todas as suas chamadas para o Azure OpenAI. A chave da API do Azure OpenAI é armazenada em um segredo do Databricks e você pode fazer referência a ela com a função secret(). Você também pode passar o nome do recurso do Azure OpenAI (resourceName) e o nome de implantação (deploymentName) do modelo.

CREATE OR REPLACE FUNCTION PROMPT_HANDLER(prompt STRING)
RETURNS STRING
RETURN AI_GENERATE_TEXT(prompt,
  "azure_openai/gpt-35-turbo",
  "apiKey", SECRET("tokens", "azure-openai"),
  "temperature", CAST(0.0 AS DOUBLE),
  "deploymentName", "llmbricks",
  "apiVersion", "2023-03-15-preview",
  "resourceName", "llmbricks"
);

Analisar dados de avaliação de clientes

A função annotate_review() anota sua revisão com entidades, sentimentos de entidades e se um acompanhamento é necessário e por quê. Observe que o prompt retorna uma representação json bem formada, para que você possa instruir a função a retornar um tipo de struct para facilitar a consulta downstream, como inserí-la em uma tabela Delta.

CREATE OR REPLACE FUNCTION ANNOTATE_REVIEW(review STRING)
RETURNS STRUCT<entities: ARRAY<STRUCT<entity_name: STRING, entity_type: STRING, entity_sentiment: STRING, followup: STRING, followup_reason: STRING>>>
RETURN FROM_JSON(
  PROMPT_HANDLER(CONCAT(
    'A customer left a review. Follow up with anyone who appears unhappy.
     Extract all entities mentioned. For each entity:
      - classify sentiment as ["POSITIVE","NEUTRAL","NEGATIVE"]
      - whether customer requires a follow-up: Y or N
      - reason for requiring followup

    Return JSON ONLY. No other text outside the JSON. JSON format:
    {
        entities: [{
            "entity_name": <entity name>,
            "entity_type": <entity type>,
            "entity_sentiment": <entity sentiment>,
            "followup": <Y or N for follow up>,
            "followup_reason": <reason for followup>
        }]
    }

    Review:
    ', review)),
  "STRUCT<entities: ARRAY<STRUCT<entity_name: STRING, entity_type: STRING, entity_sentiment: STRING, followup: STRING, followup_reason: STRING>>>"
);

Você pode passar dados do conjunto de dados de avaliações de clientes para ver como a função annotate_review() classifica as avaliações de clientes de forma livre.

SELECT review_body,
  ANNOTATE_REVIEW(review_body) AS review_annotated
FROM dbdemos.openai_demo.fake_reviews
WHERE product_category = "Grocery"
LIMIT 3;

Gere respostas com recomendações

Depois de analisar as respostas do cliente, você pode usar a função generate_response() para gerar uma resposta a um cliente com base em sua reclamação e incluir recomendações de produtos alternativos para experimentar.

CREATE OR REPLACE FUNCTION GENERATE_RESPONSE(product STRING, entity STRING, reason STRING)
RETURNS STRING
RETURN PROMPT_HANDLER(
  CONCAT("What alternative products can you recommend for ", product,
    " when a customer had a complaint about ", entity, " because ", reason,
    "Give me a response in the tone of an empathetic message back to the customer; only provide the body")
);

O seguinte gera uma resposta de mensagem de exemplo para a avaliação de um cliente sobre Country Choice Snacking Cookies.

SELECT GENERATE_RESPONSE("Country Choice Snacking Cookies", "cookies", "Quality issue") AS customer_response

Consultas adhoc

Você também pode criar consultas ad-hoc usando sua função prompt_handler() recém-criada.

Por exemplo, você pode estar interessado em entender se uma revisão discute bebidas.

SELECT review_id,
  PROMPT_HANDLER(
    CONCAT(
      "Does this review discuss beverages? Answer Y or N only, no explanations or notes. Review: ", review_body)
  ) AS discusses_beverages,
  review_body
FROM dbdemos.openai_demo.fake_reviews
WHERE review_id IN ("R9LEFDWWXPDEY", "R27UON10EV9FSV", "R299ZTEFIAHRQD")
ORDER BY discusses_beverages DESC;