Jelajahi Sumber

ajustes prompt de avaliações

leonardo 1 bulan lalu
induk
melakukan
95ff46f184
1 mengubah file dengan 123 tambahan dan 2 penghapusan
  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",
   "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.",
+  "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.",
   "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",
@@ -186,6 +192,85 @@ const AVALIACAO_SYSTEM_PROMPT = [
   '→ score_atendente: 8-9 — atendimento breve mas cordial e resolvido; o piso 6 para resolvido=sim +',
   "  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:",
   '- 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",
@@ -197,7 +282,7 @@ const AVALIACAO_SYSTEM_PROMPT = [
   "  não dá para concluir.",
   '- 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).',
-  "- 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",
   "  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"),',
@@ -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',
   '  do horário de atendimento do setor. O próprio cliente comentou depois que o sinal voltou a',
   '  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.",
   "- atendentes: nomes dos atendentes humanos que participaram (como aparecem 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 }
     ],
     format: AVALIACAO_JSON_SCHEMA,
-    options: { temperature: 0, num_ctx: 8192, num_predict: 1024 }
+    options: { temperature: 0, num_ctx: 16384, num_predict: 1024 }
   });
 
   let dados;