Dissertação de mestrado: detecção explicável de phishing escrito por IA
Entregue, resultado pendenteMinha dissertação de mestrado na Liverpool John Moores University: detectar e-mails de phishing escritos por IA e medir se as explicações de cada detector são fiéis ao que ele realmente faz.
- Meu papel
- Autor: desenho experimental, código, avaliação e redação
- Ano
- 2026
- Feito com
- Python · scikit-learn · XGBoost · LightGBM · PyTorch · Transformers · SHAP · LIME · Integrated Gradients
O problema
O phishing escrito por modelos de linguagem soa diferente dos templates antigos, e um detector que ninguém consegue explicar inspira pouca confiança e é difícil de auditar. Fiz duas perguntas: que tipo de modelo se sai bem com e-mails escritos por IA, e se as explicações são fiéis ao que o modelo realmente faz.
Como foi construído
Três famílias de modelos comparadas nos mesmos splits: modelos clássicos (regressão logística, naive Bayes, SVM, árvore de decisão, random forest), ensembles de gradient boosting (XGBoost, LightGBM) e transformers (BERT, DistilBERT, RoBERTa), com testes cross-corpus entre e-mails antigos e e-mails gerados por IA. As explicações de SHAP, LIME e Integrated Gradients foram avaliadas quanto a fidelidade, estabilidade e plausibilidade em relação a um baseline de atribuição aleatória. O protocolo foi registrado antes de os experimentos rodarem, o léxico de pistas foi commitado antes de qualquer resultado, uma suíte de testes de controle positivo protege os métodos de explicação e a medida de plausibilidade foi conferida com avaliadores humanos e com um LLM como juiz. Tudo rodou em uma RTX 3090 local.
Decisões importantes
Registrado antes de rodar
Os protocolos, o léxico e as hipóteses foram commitados antes de existir qualquer resultado, então nada pôde ser escolhido a posteriori.
As explicações foram medidas
Um método que pontua como uma atribuição aleatória é reportado como tal. Quando o LIME pontuou como aleatório, a causa era um bug no meu adaptador do LIME, um argumento do tokenizador invertido. Informei o erro, corrigi e rodei de novo. O LIME corrigido foi fiel, mas foi o método menos estável.
O modelo simples venceu
Em e-mails gerados por IA, um modelo linear TF-IDF ajustado superou o RoBERTa em ROC-AUC (0,9993 contra 0,9976), e o SHAP o explicou com fidelidade, 64,5 vezes mais rápido que o LIME corrigido.
Código do repositório
def faithfulness(champ, texts, attrs, preds, seed: int = 42) -> dict:
rng = np.random.default_rng(seed)
preds = np.asarray(preds)
p_orig = _p_pred(champ.proba(texts), preds)1
variants: list[str] = []
meta: list[tuple] = [] # (doc_i, kind, k, is_random)
for i, (text, attr, pred) in enumerate(zip(texts, attrs, preds)):
nw = len(textops.word_spans(text))
top = textops.top_k_positions(attr, int(pred), min(20, nw))
randperm = rng.permutation(nw).tolist()2
for k in K_AOPC:
variants.append(textops.remove_words(text, top[:k])); meta.append((i, "comp", k, False))3
variants.append(textops.remove_words(text, randperm[:k])); meta.append((i, "comp", k, True))
for k in K_REPORT:
variants.append(textops.keep_only_words(text, top[:k])); meta.append((i, "suff", k, False))
variants.append(textops.keep_only_words(text, randperm[:k])); meta.append((i, "suff", k, True))
P = _p_pred(champ.proba(variants), preds[[m[0] for m in meta]])4
Linha 4. A probabilidade da classe prevista no documento original, a referência para todas as comparações.
Linha 11. O baseline aleatório: as mesmas remoções, com as palavras em ordem aleatória, por um pipeline idêntico.
Linha 13. Abrangência (comprehensiveness): remover as palavras top-k apontadas pela explicação. Quanto mais a probabilidade cai, mais fiel é a explicação.
Linha 19. Todas as variantes de todos os documentos passam pela GPU em um único batch.
Como está hoje
Entregue em agosto de 2026; o resultado está pendente. Todas as tabelas e figuras podem ser reproduzidas a partir de scripts versionados e seeds fixas. Agora estou transformando a dissertação em um artigo para congresso, junto com meu orientador.