Defina se deve usar o Claude para roteamento de tickets

Aqui estão alguns indicadores-chave de que você deve usar um LLM como o Claude em vez de abordagens tradicionais de aprendizado de máquina para sua tarefa de classificação:


Construa e implemente seu fluxo de trabalho de suporte com LLM

Entenda sua abordagem atual de suporte

Antes de mergulhar na automação, é crucial entender seu sistema de tickets existente. Comece investigando como sua equipe de suporte atualmente lida com o roteamento de tickets.

Considere perguntas como:

  • Quais critérios são usados para determinar qual SLA/oferta de serviço é aplicada?
  • O roteamento de tickets é usado para determinar para qual nível de suporte ou especialista de produto um ticket vai?
  • Já existem regras ou fluxos de trabalho automatizados em vigor? Em quais casos eles falham?
  • Como são tratados os casos extremos ou tickets ambíguos?
  • Como a equipe prioriza os tickets?

Quanto mais você souber sobre como os humanos lidam com certos casos, melhor você será capaz de trabalhar com o Claude para realizar a tarefa.

Defina categorias de intenção do usuário

Uma lista bem definida de categorias de intenção do usuário é crucial para uma classificação precisa de tickets de suporte com o Claude. A capacidade do Claude de rotear tickets efetivamente dentro do seu sistema é diretamente proporcional a quão bem definidas são as categorias do seu sistema.

Aqui estão algumas categorias e subcategorias de exemplo de intenção do usuário.

Além da intenção, o roteamento e a priorização de tickets também podem ser influenciados por outros fatores como urgência, tipo de cliente, SLAs ou idioma. Certifique-se de considerar outros critérios de roteamento ao construir seu sistema de roteamento automatizado.

Estabeleça critérios de sucesso

Trabalhe com sua equipe de suporte para definir critérios claros de sucesso com benchmarks mensuráveis, limiares e metas.

Aqui estão alguns critérios e benchmarks padrão ao usar LLMs para roteamento de tickets de suporte:

Aqui estão alguns critérios de sucesso comuns que podem ser úteis independentemente de se um LLM é usado ou não:

Escolha o modelo Claude certo

A escolha do modelo depende dos trade-offs entre custo, precisão e tempo de resposta.

Muitos clientes acharam o claude-3-haiku-20240307 um modelo ideal para roteamento de tickets, pois é o modelo mais rápido e econômico da família Claude 3, ainda entregando excelentes resultados. Se seu problema de classificação requer profunda expertise no assunto ou um grande volume de categorias de intenção com raciocínio complexo, você pode optar pelo modelo Sonnet maior.

Construa um prompt forte

O roteamento de tickets é um tipo de tarefa de classificação. O Claude analisa o conteúdo de um ticket de suporte e o classifica em categorias predefinidas com base no tipo de problema, urgência, expertise necessária ou outros fatores relevantes.

Vamos escrever um prompt de classificação de tickets. Nosso prompt inicial deve conter o conteúdo da solicitação do usuário e retornar tanto o raciocínio quanto a intenção.

Experimente o gerador de prompts no Console Anthropic para que o Claude escreva um primeiro rascunho para você.

Aqui está um exemplo de prompt de classificação para roteamento de tickets:

def classificar_solicitacao_suporte(conteudo_ticket):
    # Define o prompt para a tarefa de classificação
    prompt_classificacao = f"""Você atuará como um sistema de classificação de tickets de suporte ao cliente. Sua tarefa é analisar solicitações de suporte ao cliente e gerar a classificação de intenção apropriada para cada solicitação, juntamente com seu raciocínio.

        Aqui está a solicitação de suporte ao cliente que você precisa classificar:

        <solicitacao>{conteudo_ticket}</solicitacao>

        Por favor, analise cuidadosamente a solicitação acima para determinar a intenção principal e as necessidades do cliente. Considere o que o cliente está pedindo ou sobre o que tem preocupações.

        Primeiro, escreva seu raciocínio e análise de como classificar esta solicitação dentro de tags <raciocinio>.

        Em seguida, gere o rótulo de classificação apropriado para a solicitação dentro de uma tag <intencao>. As intenções válidas são:
        <intencoes>
        <intencao>Suporte, Feedback, Reclamação</intencao>
        <intencao>Rastreamento de Pedido</intencao>
        <intencao>Reembolso/Troca</intencao>
        </intencoes>

        Uma solicitação pode ter APENAS UMA intenção aplicável. Inclua apenas a intenção que é mais aplicável à solicitação.

        Como exemplo, considere a seguinte solicitação:
        <solicitacao>Olá! Tive internet de fibra de alta velocidade instalada no sábado e meu instalador, Kevin, foi absolutamente fantástico! Onde posso enviar minha avaliação positiva? Obrigado pela ajuda!</solicitacao>

        Aqui está um exemplo de como sua saída deve ser formatada (para a solicitação de exemplo acima):
        <raciocinio>O usuário busca informações para deixar um feedback positivo.</raciocinio>
        <intencao>Suporte, Feedback, Reclamação</intencao>

        Aqui estão mais alguns exemplos:
        <exemplos>
        <exemplo 2>
        Entrada do Exemplo 2:
        <solicitacao>Eu queria escrever e agradecer pessoalmente pela compaixão que você demonstrou com minha família durante o funeral do meu pai no último fim de semana. Sua equipe foi tão atenciosa e prestativa durante todo esse processo; realmente tirou um peso dos nossos ombros. Os folhetos da visitação ficaram lindos. Nunca esqueceremos a gentileza que vocês nos mostraram e estamos muito gratos por como os procedimentos ocorreram sem problemas. Obrigado, novamente, Amarantha Hill em nome da Família Hill.</solicitacao>

        Saída do Exemplo 2:
        <raciocinio>O usuário deixa uma avaliação positiva de sua experiência.</raciocinio>
        <intencao>Suporte, Feedback, Reclamação</intencao>
        </exemplo 2>
        <exemplo 3>

        ...

        </exemplo 8>
        <exemplo 9>
        Entrada do Exemplo 9:
        <solicitacao>Seu site continua enviando pop-ups de anúncios que bloqueiam a tela inteira. Levei vinte minutos só para finalmente encontrar o número de telefone para ligar e reclamar. Como posso acessar as informações da minha conta com todos esses pop-ups? Você pode acessar minha conta para mim, já que seu site está quebrado? Preciso saber qual é o endereço registrado.</solicitacao>

        Saída do Exemplo 9:
        <raciocinio>O usuário solicita ajuda para acessar as informações de sua conta na web.</raciocinio>
        <intencao>Suporte, Feedback, Reclamação</intencao>
        </exemplo 9>

        Lembre-se de sempre incluir seu raciocínio de classificação antes da saída real da intenção. O raciocínio deve estar entre tags <raciocinio> e a intenção entre tags <intencao>. Retorne apenas o raciocínio e a intenção.
        """

Vamos decompor os componentes-chave deste prompt:

  • Usamos f-strings do Python para criar o template do prompt, permitindo que o conteudo_ticket seja inserido nas tags <solicitacao>.
  • Damos ao Claude um papel claramente definido como um sistema de classificação que analisa cuidadosamente o conteúdo do ticket para determinar a intenção principal e as necessidades do cliente.
  • Instruímos o Claude sobre a formatação adequada da saída, neste caso, para fornecer seu raciocínio e análise dentro de tags <raciocinio>, seguido pelo rótulo de classificação apropriado dentro de tags <intencao>.
  • Especificamos as categorias de intenção válidas: “Suporte, Feedback, Reclamação”, “Rastreamento de Pedido” e “Reembolso/Troca”.
  • Incluímos alguns exemplos (também conhecido como prompting de poucos exemplos) para ilustrar como a saída deve ser formatada, o que melhora a precisão e consistência.

A razão pela qual queremos que o Claude divida sua resposta em várias seções de tags XML é para que possamos usar expressões regulares para extrair separadamente o raciocínio e a intenção da saída. Isso nos permite criar próximos passos direcionados no fluxo de trabalho de roteamento de tickets, como usar apenas a intenção para decidir para qual pessoa rotear o ticket.

Implemente seu prompt

É difícil saber quão bem seu prompt funciona sem implantá-lo em um ambiente de teste de produção e executar avaliações.

Vamos construir a estrutura de implantação. Comece definindo a assinatura do método para envolver nossa chamada ao Claude. Pegaremos o método que já começamos a escrever, que tem conteudo_ticket como entrada, e agora retornaremos uma tupla de raciocinio e intencao como saída. Se você tem uma automação existente usando ML tradicional, você vai querer seguir essa assinatura de método em vez disso.

import anthropic
import re

# Cria uma instância do cliente da API Anthropic
cliente = anthropic.Anthropic()

# Define o modelo padrão
MODELO_PADRAO="claude-3-haiku-20240307"

def classificar_solicitacao_suporte(conteudo_ticket):
    # Define o prompt para a tarefa de classificação
    prompt_classificacao = f"""Você atuará como um sistema de classificação de tickets de suporte ao cliente. 
        ...
        ... O raciocínio deve estar entre tags <raciocinio> e a intenção entre tags <intencao>. Retorne apenas o raciocínio e a intenção.
        """
    # Envia o prompt para a API para classificar a solicitação de suporte.
    mensagem = cliente.messages.create(
        model=MODELO_PADRAO,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": prompt_classificacao}],
        stream=False,
    )
    raciocinio_e_intencao = mensagem.content[0].text

    # Usa a biblioteca de expressões regulares do Python para extrair o `raciocinio`.
    match_raciocinio = re.search(
        r"<raciocinio>(.*?)</raciocinio>", raciocinio_e_intencao, re.DOTALL
    )
    raciocinio = match_raciocinio.group(1).strip() if match_raciocinio else ""

    # Da mesma forma, também extrai a `intencao`.
    match_intencao = re.search(r"<intencao>(.*?)</intencao>", raciocinio_e_intencao, re.DOTALL)
    intencao = match_intencao.group(1).strip() if match_intencao else ""

    return raciocinio, intencao

Este código:

  • Importa a biblioteca Anthropic e cria uma instância do cliente usando sua chave de API.
  • Define uma função classificar_solicitacao_suporte que recebe uma string conteudo_ticket.
  • Envia o conteudo_ticket para o Claude para classificação usando o prompt_classificacao
  • Retorna o raciocinio e a intencao do modelo extraídos da resposta.

Como precisamos esperar que todo o texto de raciocínio e intenção seja gerado antes de analisar, definimos stream=False (o padrão).


Avalie seu prompt

O prompting frequentemente requer testes e otimização para estar pronto para produção. Para determinar a prontidão da sua solução, avalie o desempenho com base nos critérios de sucesso e limiares que você estabeleceu anteriormente.

Para executar sua avaliação, você precisará de casos de teste para executá-la. O restante deste guia assume que você já desenvolveu seus casos de teste.

Construa uma função de avaliação

Nossa avaliação de exemplo para este guia mede o desempenho do Claude ao longo de três métricas-chave:

  • Precisão
  • Custo por classificação

Você pode precisar avaliar o Claude em outros eixos dependendo dos fatores que são importantes para você.

Para avaliar isso, primeiro temos que modificar o script que escrevemos e adicionar uma função para comparar a intenção prevista com a intenção real e calcular a porcentagem de previsões corretas. Também temos que adicionar funcionalidade de cálculo de custo e medição de tempo.

import anthropic
import re

# Cria uma instância do cliente da API Anthropic
cliente = anthropic.Anthropic()

# Define o modelo padrão
MODELO_PADRAO="claude-3-haiku-20240307"

def classificar_solicitacao_suporte(solicitacao, intencao_real):
    # Define o prompt para a tarefa de classificação
    prompt_classificacao = f"""Você atuará como um sistema de classificação de tickets de suporte ao cliente. 
        ...
        ...O raciocínio deve estar entre tags <raciocinio> e a intenção entre tags <intencao>. Retorne apenas o raciocínio e a intenção.
        """

    mensagem = cliente.messages.create(
        model=MODELO_PADRAO,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": prompt_classificacao}],
    )
    uso = mensagem.usage  # Obtém as estatísticas de uso da chamada da API para quantos tokens de entrada e saída foram usados.
    raciocinio_e_intencao = mensagem.content[0].text

    # Usa a biblioteca de expressões regulares do Python para extrair o `raciocinio`.
    match_raciocinio = re.search(
        r"<raciocinio>(.*?)</raciocinio>", raciocinio_e_intencao, re.DOTALL
    )
    raciocinio = match_raciocinio.group(1).strip() if match_raciocinio else ""

    # Da mesma forma, também extrai a `intencao`.
    match_intencao = re.search(r"<intencao>(.*?)</intencao>", raciocinio_e_intencao, re.DOTALL)
    intencao = match_intencao.group(1).strip() if match_intencao else ""

      # Verifica se a previsão do modelo está correta.
    correto = intencao_real.strip() == intencao.strip()

    # Retorna o raciocínio, intenção, correto e uso.
    return raciocinio, intencao, correto, uso

Vamos decompor as edições que fizemos:

  • Adicionamos a intencao_real de nossos casos de teste no método classificar_solicitacao_suporte e configuramos uma comparação para avaliar se a classificação de intenção do Claude corresponde à nossa classificação de intenção dourada.
  • Extraímos estatísticas de uso para a chamada da API para calcular o custo com base nos tokens de entrada e saída usados

Execute sua avaliação

Uma avaliação adequada requer limiares e benchmarks claros para determinar o que é um bom resultado. O script acima nos dará os valores de tempo de execução para precisão, tempo de resposta e custo por classificação, mas ainda precisaríamos de limiares claramente estabelecidos. Por exemplo:

  • Precisão: 95% (de 100 testes)
  • Custo por classificação: 50% de redução em média (em 100 testes) em relação ao método de roteamento atual

Ter esses limiares permite que você determine rápida e facilmente em escala, e com empirismo imparcial, qual método é melhor para você e quais mudanças podem precisar ser feitas para se adequar melhor aos seus requisitos.


Melhore o desempenho

Em cenários complexos, pode ser útil considerar estratégias adicionais para melhorar o desempenho além das técnicas padrão de engenharia de prompts e estratégias de implementação de guardrails. Aqui estão alguns cenários comuns:

Use uma hierarquia taxonômica para casos com mais de 20 categorias de intenção

À medida que o número de classes cresce, o número de exemplos necessários também se expande, potencialmente tornando o prompt inviável. Como alternativa, você pode considerar implementar um sistema de classificação hierárquico usando uma mistura de classificadores.

  1. Organize suas intenções em uma estrutura de árvore taxonômica.
  2. Crie uma série de classificadores em cada nível da árvore, permitindo uma abordagem de roteamento em cascata.

Por exemplo, você pode ter um classificador de nível superior que categoriza amplamente os tickets em “Problemas Técnicos”, “Questões de Faturamento” e “Consultas Gerais”. Cada uma dessas categorias pode então ter seu próprio subclassificador para refinar ainda mais a classificação.

  • Prós - maior nuance e precisão: Você pode criar prompts diferentes para cada caminho pai, permitindo uma classificação mais direcionada e específica ao contexto. Isso pode levar a uma precisão melhorada e um tratamento mais nuançado das solicitações dos clientes.

  • Contras - aumento da latência: Esteja ciente de que múltiplos classificadores podem levar a um aumento da latência, e recomendamos implementar essa abordagem com nosso modelo mais rápido, o Haiku.

Use bancos de dados vetoriais e recuperação por busca de similaridade para lidar com tickets altamente variáveis

Apesar de fornecer exemplos ser a maneira mais eficaz de melhorar o desempenho, se as solicitações de suporte forem altamente variáveis, pode ser difícil incluir exemplos suficientes em um único prompt.

Neste cenário, você poderia empregar um banco de dados vetorial para fazer buscas de similaridade a partir de um conjunto de dados de exemplos e recuperar os exemplos mais relevantes para uma determinada consulta.

Esta abordagem, detalhada em nossa receita de classificação, mostrou melhorar o desempenho de 71% de precisão para 93% de precisão.

Considere especificamente os casos extremos esperados

Aqui estão alguns cenários onde o Claude pode classificar incorretamente os tickets (pode haver outros que são únicos para sua situação). Nestes cenários, considere fornecer instruções explícitas ou exemplos no prompt de como o Claude deve lidar com o caso extremo:


Integre o Claude em seu fluxo de trabalho de suporte maior

A integração adequada requer que você tome algumas decisões sobre como seu script de roteamento de tickets baseado no Claude se encaixa na arquitetura do seu sistema maior de roteamento de tickets. Existem duas maneiras de fazer isso:

  • Baseado em push: O sistema de tickets de suporte que você está usando (por exemplo, Zendesk) aciona seu código enviando um evento de webhook para seu serviço de roteamento, que então classifica a intenção e a roteia.
    • Esta abordagem é mais escalável para a web, mas precisa que você exponha um endpoint público.
  • Baseado em pull: Seu código busca os tickets mais recentes com base em um cronograma determinado e os roteia no momento da busca.
    • Esta abordagem é mais fácil de implementar, mas pode fazer chamadas desnecessárias ao sistema de tickets de suporte quando a frequência de busca é muito alta ou pode ser excessivamente lenta quando a frequência de busca é muito baixa.

Para qualquer uma dessas abordagens, você precisará envolver seu script em um serviço. A escolha da abordagem depende de quais APIs seu sistema de tickets de suporte fornece.