Todos os artigos

Dissertação de mestrado: detecção explicável de phishing escrito por IA

Entregue, resultado pendente

Minha 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

src/xai/metrics.pyFidelidade, medida em relação a um baseline aleató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
  1. Linha 4. A probabilidade da classe prevista no documento original, a referência para todas as comparações.

  2. Linha 11. O baseline aleatório: as mesmas remoções, com as palavras em ordem aleatória, por um pipeline idêntico.

  3. Linha 13. Abrangência (comprehensiveness): remover as palavras top-k apontadas pela explicação. Quanto mais a probabilidade cai, mais fiel é a explicação.

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

Próximo artigoFitEscala