Files

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"
}}
"""