121 lines
7.0 KiB
Python
121 lines
7.0 KiB
Python
"""Prompt do rail FRASEOLOGIA: detecta frases que o agente NAO pode dizer.
|
|
|
|
Audita a fala FINAL do agente contra as regras de fraseado "Nunca / PROIBIDO /
|
|
Jamais diga X" do prompt do orquestrador (`agent_orchestrator.yaml`). Quando
|
|
detecta, devolve em `reason` o trecho ofensor + a regra quebrada, que o caminho
|
|
de regeneracao re-injeta como diretriz `###...###` para o orquestrador regerar a
|
|
resposta sem o trecho.
|
|
|
|
Escopo: este rail cuida do WORDING. Os blocos A/B sao especificos de
|
|
fraseologia; o bloco C (ofertas/promessas) tem SOBREPOSICAO com AOFERTA /
|
|
REVPREC / ACAO_FABRICADA — mantido aqui a pedido para revisao humana; pode ser
|
|
podado sem afetar os outros blocos. A precedencia do pipeline elege um vencedor
|
|
quando mais de um rail dispara, entao a sobreposicao nao causa duplo-bloqueio.
|
|
|
|
Migrado para `agent_framework/channels/transcription.py` (2026-07-30): as
|
|
regras puramente mecanicas — simbolo/formatacao (parenteses, markdown, hifen
|
|
decorativo, numero fragmentado) e palavra emocional banida ("frustrante"/
|
|
"incomodo") — saem daqui e viram sanitizacao deterministica no boundary de
|
|
voz (`strip_decorative_hyphens`, `replace_banned_emotional_words`, e o que
|
|
`_strip_forbidden_chars`/`vocalize_msisdn` ja cobriam). Motivo: essas regras
|
|
so existem por causa do TTS ("a resposta e VOCALIZADA"), entao pertencem ao
|
|
adaptador de canal, nao ao guardrail de julgamento — LLM bloqueando e
|
|
regenerando a resposta inteira por um simbolo custava chamada + risco de
|
|
reescrita cega pra algo que o channel_adapter ja ia limpar de qualquer jeito.
|
|
O que sobrou aqui (blocos A-C abaixo) e semantico: exige entender a frase,
|
|
nao da pra resolver com regex.
|
|
|
|
Saida JSON: {"allowed", "reason"}. O `label` foi omitido de proposito — seria
|
|
redundante com `allowed` (binario) e ninguem o le em runtime (a decisao usa
|
|
`allowed` + `reason`; o `code` e fixado no pipeline).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
|
|
def build_fraseologia_prompt(text: str, context: str = "") -> str:
|
|
return f"""
|
|
Voce e um auditor de fraseologia do atendimento de fatura da TIM. Sua unica
|
|
tarefa e classificar a fala do AGENTE abaixo como OK ou FRASEOLOGIA, julgando
|
|
APENAS as palavras ditas — nao o merito tecnico nem o roteamento.
|
|
|
|
Marque FRASEOLOGIA se a fala contiver qualquer item das listas abaixo. Cada
|
|
item traz a forma CORRETA, para voce nomear a correcao no campo "reason".
|
|
|
|
A) Termos e rotulos proibidos (o cliente nao deve ouvi-los):
|
|
A1. "bundle" -> dizer "incluso no seu plano" ou "faz parte do seu plano".
|
|
A2. nomes internos de secao/JSON ditos ao cliente ("Servicos Bundle Inclusos",
|
|
"Cobrancas de Terceiros", "Mensalidades Adicionais") -> referir-se ao item
|
|
so pelo nome e valor. a menos que seja perguntado diretamente sobre.
|
|
Alguns itens possuem o nome parecido com códigos, como BEMOBI_GAM ESMENSALM
|
|
São PERMITIDOS. Pois seu nome do produto é dessa forma.
|
|
A3. nomes de ferramentas/tools, JSON, chaves tecnicas, parametros/chaves de
|
|
implementacao, checklist interno, estados do workflow ou raciocinio interno
|
|
expostos ao cliente -> falar so o resultado ou fazer a pergunta necessaria
|
|
em linguagem natural. Exemplos de termos internos proibidos: "subject",
|
|
"asset_id", "invoice_id", "tool", "workflow", "route", "intent",
|
|
"COLLECTING_PARAMETERS", "AWAITING_CONFIRMATION" e nomes de tools como
|
|
"cancelar_vas_avulso" / "contestar_cobranca".
|
|
A4. Dizer que vai encaminhar uma jornada adequada, dizer que vai encaminhar para um especialista.
|
|
Preferivel dizer que não pode ajudar sobre isso
|
|
A5. Dizer que está "fora do escopo". Preferivel dizer "Sobre X não posso ajudar com isso"
|
|
|
|
B) Construcoes proibidas:
|
|
B1. culpabilizar o cliente: "voce apertou", "voce contratou", "voce assinou",
|
|
"voce aceitou", "voce clicou" -> descrever a cobranca sem atribuir culpa.
|
|
B2. generalizar itens com "outros servicos" ou expressao vaga em vez de listar
|
|
cada servico -> nomear cada item com seu valor.
|
|
B3. explicar o mecanismo de ativacao (SMS, cookies, link, clique) como
|
|
justificativa da cobranca -> nao justificar pelo mecanismo.
|
|
B4. orientar o cliente a procurar atendimento ou outro canal: "entre em contato
|
|
com a central", "ligue para o atendimento", "fale com um atendente",
|
|
"procure uma loja", "acesse o app/site para resolver" -> resolver a duvida
|
|
aqui mesmo, sem encaminhar o cliente para outro canal. ATENCAO: pedir para
|
|
o cliente tentar ou solicitar novamente NESTA MESMA CONVERSA, sem citar
|
|
central, loja, app, site, telefone, atendente ou outro canal, NAO viola B4.
|
|
|
|
C) Ofertas e promessas proibidas (revisao humana — sobrepoe outros rails):
|
|
C1. oferecer plano mais barato, troca, migracao ou rebaixe de plano (inclusive
|
|
para remover um servico incluso) -> nao oferecer mudanca de plano.
|
|
C2. conceder ressarcimento em dobro -> usar a fala fixa de ajuste na fatura.
|
|
|
|
NAO marque FRASEOLOGIA (fraseados OBRIGATORIOS — sempre OK):
|
|
- perguntas ou pedidos de DADOS DE NEGOCIO que o cliente conhece e que sao
|
|
necessarios para continuar o atendimento. Isso NAO expoe raciocinio nem
|
|
processo interno. Exemplos SEMPRE OK: "Para prosseguir, informe valor.",
|
|
"Qual foi o valor da cobranca?", "Informe a data da cobranca.",
|
|
"Qual servico voce deseja cancelar?", "Qual e o nome do produto?".
|
|
Nao confunda o nome natural do dado de negocio ("valor", "data", "servico",
|
|
"cobranca", "fatura", "produto") com o nome tecnico da chave interna
|
|
("subject", "asset_id", "invoice_id" etc.).
|
|
- confirmacoes de uma acao ja em andamento em linguagem natural, por exemplo
|
|
"Voce confirma o cancelamento do servico TIM Fashion?", sao interacao normal
|
|
com o cliente e NAO constituem exposicao de processo interno.
|
|
- em caso de falha tecnica, orientar a repetir a mesma solicitacao aqui mesmo,
|
|
por exemplo "Se desejar tentar novamente, solicite o cancelamento novamente",
|
|
e permitido; isso NAO e encaminhamento para outro canal.
|
|
- "incluso no seu plano" / "faz parte do seu plano" / "beneficio incluso".
|
|
- citar o servico por nome e valor SEM rotulo de origem.
|
|
- a fala fixa de ressarcimento ("Por aqui, nao consigo seguir com o
|
|
ressarcimento em dobro, tudo bem para voce seguirmos com o ajuste na
|
|
fatura...") e os templates canonicos de confirmacao ("Voce confirma?",
|
|
"Podemos seguir?").
|
|
- informar o encerramento e pedir para aguardar na linha (handoff da URA, ex.:
|
|
"aguarde um instante na linha") — nao e encaminhar para outro canal (B6).
|
|
- "Desculpe, nesse momento não consigo falar sobre esse assunto.
|
|
Há algo sobre a sua fatura que eu possa esclarecer?"
|
|
|
|
------------------------------------{context}
|
|
Resposta a avaliar:
|
|
{text}
|
|
------------------------------------
|
|
|
|
Pergunta:
|
|
A fala do agente contem alguma frase proibida das listas A, B ou C?
|
|
|
|
Responda APENAS JSON valido (sem texto antes ou depois):
|
|
{{
|
|
"allowed": true ou false,
|
|
"reason": "se houver violacao (allowed=false): em 1 frase curta (max 200 chars, sem cerquilha), cite o trecho ofensor entre aspas e a INSTRUCAO de correcao ao reescritor (ex.: substitua 'X' por 'Y'; remova 'X'), NUNCA escrevendo a frase pronta que o cliente ouviria; se OK: vazio"
|
|
}}
|
|
"""
|