TextAttack

Framework Python pour générer des attaques adverses contre des modèles NLP via substitution de synonymes, paraphrase et perturbations au niveau des caractères, avec de nombreuses recettes de recherche pré-construites. Python framework for generating adversarial attacks against NLP models via synonym substitution, paraphrasing, and character-level perturbations, with many pre-built research recipes.

↗ https://github.com/QData/TextAttack

Overview

TextAttack is a framework for adversarial attacks, data augmentation, and adversarial training on NLP models. It composes attacks from four building blocks — goal function, constraints, transformation, and search method — and ships dozens of pre-built “recipes” that replicate published attacks (TextFooler, BERT-Attack, DeepWordBug), so you can benchmark a text classifier or LLM-based filter against known adversarial techniques without reimplementing them.

Installation

pip install textattack

CLI: Attacking a Model

Run the TextFooler recipe against a HF sentiment model on a dataset split

textattack attack --recipe textfooler \
  --model bert-base-uncased-imdb \
  --num-examples 100

Try a specific recipe against a locally fine-tuned model

textattack attack --recipe deepwordbug \
  --model-from-file my_model.py \
  --dataset-from-file my_dataset.py

Python API: Custom Attack

import textattack
from textattack.attack_recipes import TextFoolerJin2019
from textattack.models.wrappers import HuggingFaceModelWrapper

# Wrap any HF model/tokenizer pair for attack compatibility
model_wrapper = HuggingFaceModelWrapper(model, tokenizer)

# Build the recipe attack against the wrapped model
attack = TextFoolerJin2019.build(model_wrapper)

# Run against a single input and inspect the perturbed result
result = attack.attack("This movie was absolutely fantastic.", 1)  # ground-truth label
print(result.perturbed_text())

Data Augmentation (defensive use)

from textattack.augmentation import EasyDataAugmenter

# Generate paraphrased variants for adversarial training
augmenter = EasyDataAugmenter()
augmented = augmenter.augment("The quick brown fox jumps over the lazy dog.")

Tips

  • textattack attack --recipe <name> --interactive lets you type inputs and watch the perturbation happen live — useful for quickly demoing a jailbreak/evasion technique.
  • Custom GoalFunction + Constraints + Transformation combos let you target LLM classifiers (e.g. a prompt-injection detector) instead of just sentiment/topic models.
Help / Man page
textattack attack --recipe <name> --model <model> [--num-examples N] [--interactive]
textattack augment --input-csv <file> --recipe <name>
textattack train --model <model> --dataset <dataset>
textattack list recipes | models | datasets

RECIPES (subset):
  textfooler         Word-level synonym substitution (TextFooler, Jin et al. 2019)
  bert-attack         Contextual BERT-based word substitution
  deepwordbug         Character-level perturbations
  pwws                Word saliency + synonym swap
  hotflip             Gradient-guided character/token flips
  checklist           Behavioral/invariance testing

model wrappers: HuggingFaceModelWrapper, PyTorchModelWrapper, sklearnModelWrapper

Vue d’ensemble

TextAttack est un framework pour les attaques adverses, l’augmentation de données et l’entraînement adverse sur des modèles NLP. Il compose des attaques à partir de quatre briques : goal function, constraints, transformation, et search method, et fournit des dizaines de “recettes” pré-construites qui reproduisent des attaques publiées (TextFooler, BERT-Attack, DeepWordBug), permettant de comparer un classifieur de texte ou un filtre basé sur un LLM à des techniques adverses connues sans avoir à les réimplémenter.

Installation

pip install textattack

CLI : attaquer un modèle

# Lancer la recette TextFooler contre un modèle de sentiment HF sur un split de dataset
textattack attack --recipe textfooler \
  --model bert-base-uncased-imdb \
  --num-examples 100

# Essayer une recette spécifique contre un modèle fine-tuné localement
textattack attack --recipe deepwordbug \
  --model-from-file my_model.py \
  --dataset-from-file my_dataset.py

API Python : attaque personnalisée

import textattack
from textattack.attack_recipes import TextFoolerJin2019
from textattack.models.wrappers import HuggingFaceModelWrapper

# Encapsuler n'importe quelle paire modèle/tokenizer HF pour la compatibilité avec l'attaque
model_wrapper = HuggingFaceModelWrapper(model, tokenizer)

# Construire l'attaque de la recette contre le modèle encapsulé
attack = TextFoolerJin2019.build(model_wrapper)

# Lancer contre une seule entrée et inspecter le résultat perturbé
result = attack.attack("This movie was absolutely fantastic.", 1)  # étiquette de vérité terrain
print(result.perturbed_text())

Augmentation de données (usage défensif)

from textattack.augmentation import EasyDataAugmenter

# Générer des variantes paraphrasées pour l'entraînement adverse
augmenter = EasyDataAugmenter()
augmented = augmenter.augment("The quick brown fox jumps over the lazy dog.")

Conseils

  • textattack attack --recipe <name> --interactive permet de saisir des entrées et d’observer la perturbation en direct : utile pour démontrer rapidement une technique de jailbreak/évasion.
  • Des combinaisons personnalisées de GoalFunction + Constraints + Transformation permettent de cibler des classifieurs LLM (par exemple un détecteur d’injection de prompt) plutôt que de simples modèles de sentiment/sujet.
Aide / Page de manuel
textattack attack --recipe <name> --model <model> [--num-examples N] [--interactive]
textattack augment --input-csv <file> --recipe <name>
textattack train --model <model> --dataset <dataset>
textattack list recipes | models | datasets

RECIPES (subset):
  textfooler         Word-level synonym substitution (TextFooler, Jin et al. 2019)
  bert-attack         Contextual BERT-based word substitution
  deepwordbug         Character-level perturbations
  pwws                Word saliency + synonym swap
  hotflip             Gradient-guided character/token flips
  checklist           Behavioral/invariance testing

model wrappers: HuggingFaceModelWrapper, PyTorchModelWrapper, sklearnModelWrapper