Downloads · 30 days
7
10% of all-time downloads
carloseducorinto/bypass_bertbase_portuguese_detector
bypass_bertbase_portuguese_detector is a text classification model from carloseducorinto. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as mit.
Detector supervisionado de tentativas de bypass (transação/contato fora da plataforma) em conversas de chat de negociação, desenvolvido para operar como segunda camada de moderação em cascata.
Downloads · 30 days
7
10% of all-time downloads
All-time downloads
73
Public
Parameters
109M
436 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors436 MB · 100%
From the Hugging Face model README
Detector supervisionado de tentativas de bypass (transação/contato fora da plataforma) em conversas de chat de negociação, desenvolvido para operar como segunda camada de moderação em cascata.
Este modelo é uma versão fine-tuned do BERTimbau Base (neuralmind/bert-base-portuguese-cased) para classificação binária de sequências (0: nao_bypass, 1: bypass).
O objetivo é identificar quando um participante da negociação tenta migrar o contato para canais externos (WhatsApp, telefone, Telegram, e-mail, redes sociais ou chaves PIX em formato de telefone), considerando a mensagem atual juntamente com o contexto imediato dos turnos anteriores ($k = 3$).
Carlos Eduardo Gabriel SantosBertForSequenceClassification)neuralmind/bert-base-portuguese-casedcarloseducorinto/bypass_bertbase_portuguese_detector)O modelo destina-se à classificação pontual e em lote de mensagens de chat em plataformas de marketplace, avaliando o texto da mensagem-alvo precedido por até 3 turnos de contexto formatados estruturalmente.
Entrada esperada do modelo:
[CONTEXTO]
REMETENTE_1: Texto do turno -3
REMETENTE_2: Texto do turno -2
REMETENTE_1: Texto do turno -1
[MENSAGEM]
REMETENTE_2: Mensagem atual a ser avaliada
62x993x34xx68xx90), fragmentações entre múltiplos turnos, links encurtados/grupos (chat.whatsapp.com), e-mails e chaves PIX de telefone.[MENSAGEM] ou omitir o histórico quando existente pode degradar o recall em fragmentos multi-turno.truncation_side = "right"): A mensagem-alvo situa-se no final da sequência. Cortar pela direita remove a mensagem a ser classificada, gerando falsos negativos silenciosos.[!WARNING] Modelo Treinado em Dados Sintéticos (Regra 7 do Projeto): Para estrita conformidade com a LGPD e sigilo de dados sensíveis, o modelo foi treinado integralmente sobre um corpus sintético procedural enriquecido a partir de distribuições e n-gramas agregados do mundo real (sem PII). Antes da implantação em produção final, deve ser validado no ambiente restrito com dados reais anotados.
fornecimento_ofuscado), números fragmentados (fragmento), links de WhatsApp (recrutamento_externo) e chaves PIX com telefone (pix_telefone).solicitacao (pedidos de contato sem envio de dígitos, ex: "me chama lá", "tem zap?") apresenta recall menor (~73,7% no limiar de alta precisão).tokenizer.truncation_side = "left" e max_length = 256.T = 0.4506 para garantir Precisão $\ge 96.8%$ e Recall $\ge 91.5%$, ou T = 0.5000 para operação conservadora (Precisão $\ge 98.9%$).pip install torch transformers
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 1. Carregar modelo e tokenizador
REPO_ID = "carloseducorinto/bypass_bertbase_portuguese_detector"
tokenizer = AutoTokenizer.from_pretrained(REPO_ID)
tokenizer.truncation_side = "left" # OBRIGATÓRIO: preserva a mensagem-alvo no fim
model = AutoModelForSequenceClassification.from_pretrained(REPO_ID)
model.eval()
# 2. Formatar mensagem com histórico de até 3 turnos
contexto = [
{"sender": "CAMINHONEIRO", "texto": "Boa tarde, tenho interesse no frete"},
{"sender": "EMBARCADOR", "texto": "Boa tarde amigo, carga disponível em Curitiba"},
{"sender": "CAMINHONEIRO", "texto": "Qual o valor fechado?"}
]
mensagem_alvo = {
"sender": "EMBARCADOR",
"texto": "chama no 4 1 9 9 1 2 3 4 5 6 7 pra fechar"
}
# Montar o template de entrada
linhas_contexto = [f"{t['sender']}: {t['texto']}" for t in contexto[-3:]]
texto_contexto = "\n".join(linhas_contexto) if linhas_contexto else "[SEM HISTORICO ANTERIOR]"
input_text = f"[CONTEXTO]\n{texto_contexto}\n[MENSAGEM]\n{mensagem_alvo['sender']}: {mensagem_alvo['texto']}"
# 3. Tokenização e Predição
inputs = tokenizer(
input_text,
max_length=256,
truncation=True,
padding=True,
return_tensors="pt"
)
with torch.no_grad():
outputs = model(**inputs)
probs = torch.softmax(outputs.logits, dim=-1)
score_bypass = probs[0, 1].item() # Classe 1 = bypass
# 4. Decisão via limiar calibrado
LIMIAR_CALIBRADO = 0.4506
is_bypass = score_bypass >= LIMIAR_CALIBRADO
print(f"Score Bypass: {score_bypass:.5f}")
print(f"Classificação: {'🚨 BYPASS DETECTADO' if is_bypass else '✅ MENSAGEM REGULAR'}")
O modelo foi treinado em um corpus de 534.964 exemplos sintéticos com prevalência natural balanceada de 3,99% de positivos, estruturado segundo o contrato de 31 colunas do projeto.
ABC1D23), CEPs (13480-000), valores monetários (R$ 4.500,00), dimensões (11.40 x 2.60), pesos em toneladas e kg, e URLs legítimas da plataforma.chat_id com deduplicação prévia, garantindo 0 vazamento entre treino, validação e teste.[CONTEXTO] e [MENSAGEM].max_length = 256 e truncation_side = "left".2e-5 com linear decay1.505 passos (~6% do total)load_best_model_at_end = True monitorando recall @ precision >= 97% (Melhor checkpoint na Época 2).model.safetensors, 108.9M parâmetros)Conjunto de teste independente contendo 115.962 mensagens (4.634 bypass e 111.328 não-bypass), avaliado com reponderação para a prevalência real de 4%.
Avaliação desagregada pelas 9 famílias de bypass reais:
fornecimento_ofuscado (dígitos com separadores/caracteres intercalados)fragmento (número dividido em 2 a 4 mensagens sequenciais)solicitacao (pedido de canal externo sem envio de número)pix_telefone (chave PIX em formato de celular - Regra R5)valor_camuflado (telefone disfarçado de valor em R$)recrutamento_externo (links wa.me, chat.whatsapp.com, linktr.ee)fornecimento_explicito (e-mails e números canônicos)combinacao_canal (promessa de contato com letras espaçadas)instrucao_ofuscacao (orientações sobre como burlar o filtro)max(score) em cada negotiation_id (basta 1 detecção para conter o bypass).| Métrica | Limiar Calibrado (0.4506) | Ponto Médio (0.5000) |
|---|---|---|
| AUC-PR (Reponderado) | 0.9918 | 0.9918 |
| Precisão por Mensagem | 96.87 % | 98.96 % |
| Recall por Mensagem | 91.53 % | 89.54 % |
| Precisão por Negociação | 94.94 % | 98.43 % |
| Recall por Negociação | 98.24 % | 97.72 % |
Família (bypass_type) | Recall ($T = 0.4506$) | Recall ($T = 0.5000$) | Severidade |
|---|---|---|---|
fornecimento_ofuscado | 100.0 % | 100.0 % | Alta |
fragmento | 100.0 % | 100.0 % | Alta |
pix_telefone | 100.0 % | 100.0 % | Média |
valor_camuflado | 100.0 % | 100.0 % | Alta |
recrutamento_externo (links) | 100.0 % | 100.0 % | Crítica |
fornecimento_explicito | 100.0 % | 100.0 % | Alta |
combinacao_canal | 100.0 % | 100.0 % | Média |
instrucao_ofuscacao | 100.0 % | 100.0 % | Crítica |
solicitacao | 73.72 % | 67.53 % | Média |
Em suite de testes com 33 casos manuais contendo ruídos, gírias e números legais:
CEP 13480-000, nota fiscal 000123456789, placa ABC1D23 e pedido 4500123 ja liberado foram classificados corretamente com score 0.0000.62 ##x ##99 ##3 para telefone vs 11 . 40 x 2 . 60 para dimensões de carreta), dispensando normalizadores heurísticos que causavam perda de sinal em emojis e leetspeak.us-central1BertForSequenceClassification(
(bert): BertModel (12 layers, 768 hidden, 12 heads, 29,794 vocab)
(dropout): Dropout(p=0.1)
(classifier): Linear(in_features=768, out_features=2, bias=True)
)
model.safetensors)| Ambiente / Configuração | Latência p50 | Latência p95 | Throughput (Lote 32) |
|---|---|---|---|
| GPU A100 (fp16 / fp32) | ~11.2 ms | 13.5 ms | > 350 msg/s |
| CPU Container Docker (fp32, 4 threads) | 112.7 ms | 120.9 ms | 16 msg/s (62.6 ms/msg) |
| CPU Container Docker (int8 dinâmico) | 66.7 ms | 69.8 ms | 22 msg/s (45.1 ms/msg) |
@article{souza2020bertimbau,
title={BERTimbau: Pretrained BERT Models for Brazilian Portuguese},
author={Souza, F{\'a}bio and Nogueira, Rodrigo and Lotufo, Roberto},
journal={9th Brazilian Conference on Intelligent Systems (BRACIS)},
year={2020}
}
@article{devlin2018bert,
title={BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding},
author={Devlin, Jacob and Chang, Ming-Wei and Lee, Kenton and Toutanova, Kristina},
journal={arXiv preprint arXiv:1810.04805},
year={2018}
}
left): Estratégia de tokenização que descarta turnos mais antigos do contexto quando o tamanho excede max_length = 256, preservando intacta a mensagem-alvo.