Przeglądaj źródła

ajustes prompt de avaliações

leonardo 1 miesiąc temu
rodzic
commit
95ff46f184
1 zmienionych plików z 123 dodań i 2 usunięć
  1. 123 2
      src/services/atendimentoAvaliacaoService.js

+ 123 - 2
src/services/atendimentoAvaliacaoService.js

@@ -86,6 +86,12 @@ const AVALIACAO_SYSTEM_PROMPT = [
   "derrubar o score para 1-4 só porque o problema em si não foi resolvido ali — avalie pela qualidade",
   "derrubar o score para 1-4 só porque o problema em si não foi resolvido ali — avalie pela qualidade",
   "da interação até o momento da transferência (faixa 5-8, a depender de agilidade e clareza), não",
   "da interação até o momento da transferência (faixa 5-8, a depender de agilidade e clareza), não",
   "pelo desfecho técnico que ficou a cargo do outro setor.",
   "pelo desfecho técnico que ficou a cargo do outro setor.",
+  "IMPORTANTE sobre bot automático do cliente: se, depois da mensagem do atendente, a resposta que",
+  "chega for um bot automático de OUTRO negócio do próprio cliente (não uma resposta real da pessoa",
+  "sobre o atendimento — ver regra do campo resumo sobre esse padrão), isso NÃO conta como \"o atendente",
+  'não respondeu"/negligência: não existe uma pessoa real esperando resposta depois disso. Avalie o',
+  "score apenas pela qualidade da mensagem que o próprio atendente enviou (clareza, correção, tom) e",
+  "não penalize pela ausência de continuidade — a conversa não teve para onde continuar.",
   "Um atendimento resolvido com cliente satisfeito NUNCA recebe score abaixo de 6.",
   "Um atendimento resolvido com cliente satisfeito NUNCA recebe score abaixo de 6.",
   "Se nenhum atendente humano participou, use score_atendente = null.",
   "Se nenhum atendente humano participou, use score_atendente = null.",
   "Pela mesma lógica de escrever a justificativa antes do score: escreva o resumo ANTES de decidir",
   "Pela mesma lógica de escrever a justificativa antes do score: escreva o resumo ANTES de decidir",
@@ -186,6 +192,85 @@ const AVALIACAO_SYSTEM_PROMPT = [
   '→ score_atendente: 8-9 — atendimento breve mas cordial e resolvido; o piso 6 para resolvido=sim +',
   '→ score_atendente: 8-9 — atendimento breve mas cordial e resolvido; o piso 6 para resolvido=sim +',
   "  sentimento=positivo se aplica normalmente.",
   "  sentimento=positivo se aplica normalmente.",
   "",
   "",
+  "Exemplo 9 — problema some sozinho e o cliente confirma o retorno ao normal, mesmo sem nenhuma ação",
+  '  técnica do atendente (resolvido = "sim", NÃO "nao" — isso vale mesmo fora de contexto de fora do',
+  "  expediente; qualquer confirmação do cliente de que o problema não existe mais conta):",
+  'Cliente: "Rede 5G sumiu"',
+  "(atendente assume o atendimento horas depois)",
+  'Atendente Lucas: "Bom dia, segue sem aparecer?"',
+  'Cliente: "Voltou"',
+  'Atendente Lucas: "Certo, obrigado pelo retorno"',
+  "(atendente encerra o atendimento)",
+  '→ resolvido: "sim" — o cliente confirma que a rede voltou; o problema deixou de existir, mesmo sem',
+  '  nenhuma ação técnica do atendente. NÃO escreva "encerrou o atendimento sem resolver o problema" —',
+  "  o retorno espontâneo confirmado pelo cliente É a resolução.",
+  '→ score_atendente: 6-7 — piso 6 por resolvido=sim; não sobe mais porque o atendente não fez nada',
+  "  além de confirmar o retorno (não há diagnóstico/ação a reconhecer).",
+  "",
+  "Exemplo 10 — contato proativo do ATENDENTE (não do cliente) cuja resposta cai em um bot automático",
+  '  de OUTRO negócio do próprio cliente — NÃO é o cliente respondendo, NÃO é falta de resposta do',
+  '  atendente, e NÃO conta como "fora do expediente" real (resolvido = "indefinido", sem penalizar o',
+  "  score do atendente):",
+  '  Atendente Thiago: "Olá Gerson, este é um acompanhamento da sua ativação de internet. Sua conexão',
+  '  está funcionando 100% ou você precisa de suporte?"',
+  '  (resposta recebida no número do cliente, horas depois): "Olá! Seja bem-vindo(a). Me chamo Leonardo,',
+  '  sou gestor da Hospedagens Prime, especializada em hospedagens de curta temporada... Como podemos',
+  '  ajudar?"',
+  "  → Esse texto de resposta é claramente um bot automático de divulgação de OUTRO negócio do cliente",
+  "  (hospedagem), sem NENHUMA relação com internet/ativação — não é o Gerson respondendo sobre o",
+  "  assunto do atendimento. Reconheça esse padrão pelo conteúdo, não pela etiqueta de horário que",
+  "  porventura acompanhe a mensagem.",
+  '  → resumo (bom): "O atendente Thiago entrou em contato proativamente com o cliente Gerson para',
+  '  acompanhar a ativação da internet. A resposta recebida foi de um bot automático de outro negócio',
+  '  do cliente (divulgação de hospedagem), sem relação com o atendimento; o cliente não respondeu',
+  '  realmente."',
+  '  → resumo (ruim, NÃO faça): "O cliente respondeu fora do horário de expediente e não houve resposta',
+  '  subsequente do atendente." (trata o bot como se fosse o cliente respondendo, e ainda inverte a',
+  "  culpa para o atendente, que não tinha nada de real para responder)",
+  '  → resolvido: "indefinido" — não há confirmação nenhuma, do cliente real, de que a internet está',
+  "  funcionando ou não; a mensagem automática não informa nada sobre isso.",
+  '  → score_atendente: não penalize por "não responder" ao bot — a mensagem do próprio atendente foi',
+  "  clara e apropriada; avalie só por ela (tipicamente 6-8, a depender só da qualidade dessa mensagem).",
+  "",
+  "Exemplo 11 — mesmo padrão do Exemplo 10, outro negócio (salão de beleza) — reforça que o bot pode ser",
+  "  de QUALQUER ramo, e que o erro mais perigoso é atribuir o conteúdo do bot ao ATENDENTE por engano:",
+  '  Atendente Thiago: "Olá Emerson, referente à sua solicitação de suporte. Gostaríamos de confirmar se',
+  '  o atendimento foi concluído com sucesso e se sua conexão está operando normalmente."',
+  "  (resposta recebida no número do cliente, no mesmo instante): \"Olá, tudo bem? Será um prazer lhe",
+  "  atender. Nosso horário de atendimento é terça a sexta das 8:30 às 11:30... Para agilizar o seu",
+  "  atendimento selecione a opção desejada: 1- Escovas e Tratamentos 2- Corte 3- Mechas ou Coloração...\"",
+  "  → Esse texto é um bot automático de um SALÃO DE BELEZA, negócio do cliente sem nenhuma relação com",
+  "  internet — mesmo padrão do Exemplo 10, só que de outro ramo. O detalhe do menu numerado (corte,",
+  "  escova, unha...) é o sinal claro de que é um bot alheio, não uma resposta da pessoa.",
+  '  → resumo (bom): "O atendente Thiago entrou em contato proativamente com o cliente Emerson para',
+  '  confirmar se o suporte havia sido concluído com sucesso. A resposta recebida foi de um bot',
+  '  automático de outro negócio do cliente (um salão de beleza), sem relação com o atendimento; não',
+  '  houve resposta real do cliente."',
+  '  → resumo (ruim, NÃO faça): "O atendente apresentou uma lista de serviços de beleza e não respondeu',
+  '  à solicitação do cliente." (ERRO GRAVE: atribui ao atendente um conteúdo que veio de um bot no',
+  "  número do cliente — o atendente não tem nada a ver com salão de beleza)",
+  '  → score_atendente: NÃO é "atendente confundiu o assunto com um serviço de beleza" — o atendente não',
+  "  escreveu isso, um bot alheio escreveu; julgue o score só pela mensagem real do Thiago (clara e",
+  "  correta), tipicamente 6-8, sem relação nenhuma com o conteúdo do bot.",
+  "",
+  "Exemplo 12 — mesmo tipo de abertura proativa dos Exemplos 10/11 (atendente confirma se o suporte foi",
+  "  concluído), mas SEM bot alheio dessa vez — o cliente responde de verdade. A identificação de quem",
+  "  iniciou o contato vale para TODO atendimento que começa assim, não só para os casos que caem em bot:",
+  '  Atendente Thiago: "Olá Braulio, referente à sua solicitação de suporte. Gostaríamos de confirmar se',
+  '  o atendimento foi concluído com sucesso e se sua conexão está operando normalmente."',
+  'Cliente Braulio: "Sim, tudo funcionando"',
+  'Atendente Thiago: "Perfeito, muito obrigado pelo retorno! Qualquer dificuldade que notar ficamos à',
+  '  sua disposição."',
+  '  → resumo (bom): "O atendente Thiago entrou em contato proativamente com o cliente Braulio para',
+  '  confirmar se o atendimento anterior havia sido concluído com sucesso. O cliente confirmou que a',
+  '  conexão estava funcionando normalmente."',
+  '  → resumo (ruim, NÃO faça): "O cliente Braulio entrou em contato para verificar se o atendimento',
+  '  havia sido concluído com sucesso. O atendente Thiago confirmou que a conexão estava funcionando' ,
+  '  normalmente, e o cliente confirmou isso." (inverte quem perguntou e quem confirmou — foi o',
+  "  atendente que perguntou, o cliente só confirmou)",
+  '  → resolvido: "sim", sentimento "positivo", score 8-9 — o conteúdo do atendimento em si está certo;',
+  "  só a direção de quem iniciou é o que costuma sair invertida, e é isso que este exemplo corrige.",
+  "",
   "Campos:",
   "Campos:",
   '- resolvido: "sim" se o problema do cliente foi claramente resolvido na conversa — inclui o caso em',
   '- resolvido: "sim" se o problema do cliente foi claramente resolvido na conversa — inclui o caso em',
   "  que o PRÓPRIO CLIENTE confirma que já está tudo certo/resolvido, mesmo sem ter detalhado qual era",
   "  que o PRÓPRIO CLIENTE confirma que já está tudo certo/resolvido, mesmo sem ter detalhado qual era",
@@ -197,7 +282,7 @@ const AVALIACAO_SYSTEM_PROMPT = [
   "  não dá para concluir.",
   "  não dá para concluir.",
   '- sentimento_cliente_final: sentimento do cliente AO FINAL da conversa ("positivo", "neutro", "negativo"',
   '- sentimento_cliente_final: sentimento do cliente AO FINAL da conversa ("positivo", "neutro", "negativo"',
   '  ou "indefinido" quando o cliente some/não se manifesta no final).',
   '  ou "indefinido" quando o cliente some/não se manifesta no final).',
-  "- resumo: 2 a 4 frases objetivas e específicas — nunca genéricas. Regras: (1) se um problema",
+  "- resumo: 4 a 6 frases objetivas e específicas — nunca genéricas. Regras: (1) se um problema",
   "  mencionado é causado por outro (ex.: internet bloqueada POR CAUSA de boleto em atraso), explicite",
   "  mencionado é causado por outro (ex.: internet bloqueada POR CAUSA de boleto em atraso), explicite",
   "  essa relação de causa em vez de listar os dois como problemas soltos e desconectados; (2) diga o",
   "  essa relação de causa em vez de listar os dois como problemas soltos e desconectados; (2) diga o",
   '  que o cliente pediu/solicitou concretamente (ex.: "agendar o pagamento para liberar a internet"),',
   '  que o cliente pediu/solicitou concretamente (ex.: "agendar o pagamento para liberar a internet"),',
@@ -284,6 +369,42 @@ const AVALIACAO_SYSTEM_PROMPT = [
   '  Exemplo bom: "Cliente entrou em contato reclamando de falta de sinal de internet, mas já era fora',
   '  Exemplo bom: "Cliente entrou em contato reclamando de falta de sinal de internet, mas já era fora',
   '  do horário de atendimento do setor. O próprio cliente comentou depois que o sinal voltou a',
   '  do horário de atendimento do setor. O próprio cliente comentou depois que o sinal voltou a',
   '  funcionar sozinho após algum tempo."',
   '  funcionar sozinho após algum tempo."',
+  "  (12) leia a conversa até o desfecho REAL mais recente antes de resumir — não pare numa etapa",
+  "  intermediária (ex.: transferência para outro setor) se a conversa continuar depois disso com o",
+  "  desfecho final. Em especial, quando a conversa registrar uma LIGAÇÃO/CONTATO TELEFÔNICO feito para",
+  "  concluir algo (ex.: ligar para o número que o cliente passou para efetivar um cancelamento) e/ou uma",
+  "  AÇÃO DE CAMPO subsequente (ex.: técnico foi até o local retirar equipamento), cite esses passos",
+  "  finais no resumo — eles são o desfecho real, não invente que \"o cliente não respondeu\" ou que",
+  '  "não houve solução" se a conversa mostra essas etapas acontecendo depois.',
+  "  (13) verifique QUEM enviou a PRIMEIRA mensagem da conversa antes de escrever quem \"entrou em",
+  '  contato"/"procurou atendimento" — nem todo atendimento começa com o cliente pedindo ajuda; muitos',
+  "  começam com o ATENDENTE/empresa entrando em contato de forma proativa (ex.: mensagem de",
+  "  acompanhamento pós-ativação, cobrança, aviso). Quando a primeira mensagem é do atendente, diga isso",
+  '  explicitamente (ex.: "o atendente Fulano entrou em contato para acompanhamento da ativação") — nunca',
+  '  escreva "o cliente entrou em contato/solicitou ajuda" quando quem iniciou foi a empresa.',
+  "  Além disso: às vezes, depois da mensagem do atendente, a resposta que chega no número do cliente é",
+  "  claramente um bot/atendimento automático de OUTRO negócio do próprio cliente (ex.: propaganda de",
+  "  hospedagem, loja, serviço qualquer, sem nenhuma relação com internet/o motivo do atendimento) — não",
+  "  uma resposta real da pessoa sobre o problema em questão. Reconheça esse padrão pelo conteúdo",
+  "  (mensagem de divulgação/menu automático de um negócio não relacionado) e descreva no resumo que a",
+  "  mensagem do atendente caiu num bot automático do cliente (de outro assunto/negócio) e que o cliente",
+  "  não respondeu novamente depois disso — não trate o texto do bot como se fosse o cliente pedindo",
+  '  ajuda ou respondendo ao assunto do atendimento, e não escreva "não houve resposta durante o',
+  '  expediente" como se o atendente estivesse esperando: o bot respondeu, só que não é uma resposta',
+  "  real da pessoa. CUIDADO com um erro comum ao tentar corrigir isso: essa mensagem automática",
+  "  aparece no histórico rotulada com o nome do CLIENTE (é o número dele, afinal) — mas o conteúdo não",
+  "  é do atendente nem do cliente, é de um bot de terceiros. NUNCA atribua esse conteúdo ao ATENDENTE",
+  '  (ex.: nunca escreva "o atendente apresentou uma lista de serviços de beleza/hospedagem" ou "o',
+  '  atendente confundiu o assunto") — foi o cliente quem recebeu essa resposta automática em seu',
+  "  próprio número, o atendente não teve nenhuma participação nela. O conteúdo do bot não é fala de",
+  "  nenhum dos dois participantes reais do atendimento.",
+  '  Exemplo ruim: "O cliente entrou em contato após a ativação da internet e solicitou ajuda. O',
+  '  atendimento foi transferido para Thiago, mas não houve resposta durante o período de expediente do',
+  '  setor." (inverte quem iniciou o contato, inventa uma "transferência" e um pedido de ajuda que não',
+  "  aconteceram, e ignora que a resposta recebida foi de um bot alheio)",
+  '  Exemplo bom: "O atendente Thiago entrou em contato com o cliente Gerson para acompanhamento da',
+  '  ativação da internet. A resposta recebida no número do cliente foi de um bot automático de outro',
+  '  negócio dele (não relacionado ao atendimento); o cliente não respondeu novamente."',
   "- sugestoes_melhoria: 0 a 5 itens curtos e acionáveis para o atendente/equipe melhorar; lista vazia se exemplar.",
   "- sugestoes_melhoria: 0 a 5 itens curtos e acionáveis para o atendente/equipe melhorar; lista vazia se exemplar.",
   "- atendentes: nomes dos atendentes humanos que participaram (como aparecem na conversa).",
   "- atendentes: nomes dos atendentes humanos que participaram (como aparecem na conversa).",
   "- visita_agendada: true se ficou combinada visita técnica presencial na conversa.",
   "- visita_agendada: true se ficou combinada visita técnica presencial na conversa.",
@@ -531,7 +652,7 @@ export async function gerarAvaliacaoViaLLM(atendimento, mensagens) {
       { role: "user", content: conteudoUsuario }
       { role: "user", content: conteudoUsuario }
     ],
     ],
     format: AVALIACAO_JSON_SCHEMA,
     format: AVALIACAO_JSON_SCHEMA,
-    options: { temperature: 0, num_ctx: 8192, num_predict: 1024 }
+    options: { temperature: 0, num_ctx: 16384, num_predict: 1024 }
   });
   });
 
 
   let dados;
   let dados;