Model Card for Bypass Detector (BERTimbau Base)

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.


Model Details

Model Description

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$).

  • Developed by: Time de Dados & IA
  • Funded by: CEGS
  • Shared by: Carlos Eduardo Gabriel Santos
  • Model type: Transformer Encoder (BertForSequenceClassification)
  • Language(s) (NLP): Português (pt-BR)
  • License: CEGS
  • Finetuned from model: neuralmind/bert-base-portuguese-cased

Model Sources


Uses

Direct Use

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

Downstream Use

  • Segunda Camada em Cascata: Atua após filtros heurísticos e regras de alta precisão (ex: regex de telefones canônicos), capturando ofuscações complexas (62x993x34xx68xx90), fragmentações entre múltiplos turnos, links encurtados/grupos (chat.whatsapp.com), e-mails e chaves PIX de telefone.
  • Auditoria Assíncrona: Reprocessamento e scoring em lote de históricos de negociação para mitigação de fraudes e desintermediação.

Out-of-Scope Use

  • Uso sem contexto formatado: Avaliar mensagens sem o prefixo [MENSAGEM] ou omitir o histórico quando existente pode degradar o recall em fragmentos multi-turno.
  • Truncamento à direita (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.
  • Decisão judicial ou punitiva automática sem revisão: O modelo deve ser utilizado com limiares calibrados ($P \ge 97%$) ou fila de revisão humana para pontuações limítrofes.

Bias, Risks, and Limitations

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.

  1. Assimetria por Família de Bypass:
    • O modelo atinge Recall de 100% em ofuscações com caracteres intercalados (fornecimento_ofuscado), números fragmentados (fragmento), links de WhatsApp (recrutamento_externo) e chaves PIX com telefone (pix_telefone).
    • A família 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).
  2. Contextos com Bypass Prévio (Falsos Positivos Conhecidos):
    • Mensagens de despedida ou confirmação após o envio de um contato (ex: "Boa noite", "Blz" precedidos por turno com telefone) podem herdar pontuação positiva devido ao contexto.
  3. Frases Ambíguas por Desenho:
    • Expressões como "chama" ou "fala comigo" sem menção explícita a canal externo são tratadas como legítimas da plataforma para evitar falsos positivos excessivos.

Recommendations

  • Configurar Tokenizador: Sempre configurar explicitamente tokenizer.truncation_side = "left" e max_length = 256.
  • Limiar de Operação: Utilizar o limiar calibrado 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%$).

How to Get Started with the Model

Instalação

pip install torch transformers

Exemplo de Inferência em Python

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

Training Details

Training Data

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.

  • Ausência total de PII: Padrões numéricos e nomes foram gerados deterministicamente baseados em distribuições de n-gramas do mundo real.
  • Diversidade de Negativos Realistas: Inclui placas de veículos (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.
  • Garantia de Split: Divisão estratificada por chat_id com deduplicação prévia, garantindo 0 vazamento entre treino, validação e teste.

Training Procedure

Preprocessing

  • Formatação em turnos com prefixos estruturados [CONTEXTO] e [MENSAGEM].
  • Tokenização via BERTimbau cased com max_length = 256 e truncation_side = "left".

Training Hyperparameters

  • Regime de Treino: FP16 mixed precision
  • Otimizador: AdamW
  • Learning Rate: 2e-5 com linear decay
  • Warmup: 1.505 passos (~6% do total)
  • Batch Size: 64
  • Épocas: 3 épocas (25.092 passos de otimização)
  • Seleção de Checkpoint: load_best_model_at_end = True monitorando recall @ precision >= 97% (Melhor checkpoint na Época 2).

Speeds, Sizes, Times

  • Hardware de Treino: 1x NVIDIA A100 SXM4 40GB (Google Colab Enterprise)
  • Tempo Total de Treino: 43 minutos e 49 segundos
  • Tamanho dos Pesos: 435,7 MB (model.safetensors, 108.9M parâmetros)

Evaluation

Testing Data, Factors & Metrics

Testing Data

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%.

Factors & Taxonomia

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)

Metrics

  • AUC-PR (Reponderado): Integração da curva Precision-Recall ajustada à prevalência.
  • Precisão e Recall por Mensagem.
  • Precisão e Recall por Negociação: Agregação por max(score) em cada negotiation_id (basta 1 detecção para conter o bypass).

Results

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 %

Desempenho por Família de Bypass (Teste)

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

Teste de Estresse (Casos Desafiadores Fora da Distribuição)

Em suite de testes com 33 casos manuais contendo ruídos, gírias e números legais:

  • Casos Vistos: 8/8 (100% de acerto)
  • Casos Inéditos: 21/25 (84% de acerto)
  • Negativos Numéricos Críticos: CEP 13480-000, nota fiscal 000123456789, placa ABC1D23 e pedido 4500123 ja liberado foram classificados corretamente com score 0.0000.

Model Examination

  • Resolução de Sub-tokens: O vocabulário do BERTimbau separa estruturalmente ofuscações de medidas (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.
  • Análise Pareada vs Versões Anteriores: Em comparação direta pareada (teste de McNemar, $p < 0.001$), esta versão superou a baseline em 26 discordâncias consecutivas a zero, corrigindo disparos indevidos em CEPs e placas.

Environmental Impact

  • Hardware Type: 1x NVIDIA A100 SXM4 (40 GB VRAM)
  • Hours Used: ~1.5 horas de computação ativa (treino + validações)
  • Cloud Provider: Google Cloud Platform (GCP / Colab Enterprise)
  • Compute Region: us-central1
  • Carbon Estimation: ~0.18 kg CO₂eq (estimado via Machine Learning Impact Calculator).

Technical Specifications

Model Architecture and Objective

BertForSequenceClassification(
  (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)
)
  • Número Total de Parâmetros: 108.923.138 (~108.9M)
  • Formato de Serialização: Safetensors (model.safetensors)

Compute Infrastructure

Latência de Inferência Medida

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)

Citation

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

Glossary

  • Bypass: Qualquer tentativa de fornecer, solicitar ou instruir a migração da negociação para canal externo fora da plataforma segura.
  • Segunda Camada em Cascata: Arquitetura onde o modelo processa mensagens que não foram filtradas por regras determinísticas estritas, maximizando recall em padrões complexos sem sobrecarregar a infraestrutura.
  • Regras R1–R5: Regras normativas de desempate do projeto (prioridade do canal sobre rótulo alegado, contagem de dígitos sem unidade, validação de chaves PIX).
  • Truncamento à Esquerda (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.

Model Card Authors

  • Time de Dados e IA

Downloads last month
-
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for carloseducorinto/bypass_bertbase_portuguese_detector

Finetuned
(220)
this model

Paper for carloseducorinto/bypass_bertbase_portuguese_detector

Evaluation results

  • Precision (Message) on Synthetic Bypass Dataset
    self-reported
    0.969
  • Recall (Message) on Synthetic Bypass Dataset
    self-reported
    0.915
  • Precision (Negotiation) on Synthetic Bypass Dataset
    self-reported
    0.949
  • Recall (Negotiation) on Synthetic Bypass Dataset
    self-reported
    0.982
  • AUC-PR (Reweighted) on Synthetic Bypass Dataset
    self-reported
    0.992