
StealthRL: framework di RL per parafrasare in modo avversariale testi AI per testare la robustezza dei rilevatori.
Articolo (arXiv)
Demo
Modello (Hugging Face)
Dataset di benchmark (Hugging Face)

I rilevatori di testo AI sono sempre più utilizzati in contesti ad alto rischio, eppure la loro robustezza rispetto a riscritture avversarie che preservano il significato rimane incerta. Presentiamo StealthRL, un framework di apprendimento per rinforzo per stress-testare i rilevatori di testo AI con attacchi di parafrasi adattivi. StealthRL addestra una policy di parafrasi contro un ensemble di rilevatori preservando il contenuto semantico, quindi valuta il trasferimento a famiglie di rilevatori escluse dall'addestramento. Sul pool di test MAGE filtrato completo (15.310 umani / 14.656 AI), StealthRL riduce l'AUROC medio da 0,79 a 0,43 e raggiunge un TPR@1%FPR medio di 0,024 su RoBERTa, Fast-DetectGPT, Binoculars e MAGE. L'attacco si trasferisce a due rilevatori non utilizzati durante l'addestramento, esponendo vulnerabilità condivise piuttosto che il guasto di un singolo rilevatore. Analizziamo inoltre le distribuzioni dei punteggi dei rilevatori e valutiamo la qualità con E5, BERTScore e valutazioni Likert basate su LLM. I nostri risultati mostrano che gli attuali rilevatori di testo AI rimangono fragili sotto una pressione realistica di parafrasi e forniscono un protocollo riproducibile per la valutazione della robustezza avversaria.
Questo repository è la codebase di ricerca e ingegneria alla base di StealthRL. Contiene:
Il repository intende essere un utile punto di partenza per i ricercatori che vogliono:
stealthrl/: codice di addestramento, wrapper dei rilevatori, reward, utility per i dati e il pacchetto StealthBench originaleeval/: harness di valutazione di livello ricerca utilizzato per i risultati dell'articoloscripts/: punti di ingresso eseguibili per addestramento, valutazione, orchestrazione, grafici e utilityconfigs/: configurazioni YAML per addestramento, valutazione e ablazionifigures/: diagrammi della pipeline e asset staticitests/: test di integrazione e controlli di sanitàanalysis/: helper di analisi ad hoc e utility monousopython -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
A seconda delle parti del progetto che vuoi eseguire, potresti aver bisogno anche di:
pip install tinker
pip install openai
pip install vllm
Note:
tinker è richiesto per il percorso di inferenza del checkpoint StealthRL basato su cloud utilizzato da M2.openai è richiesto solo per il passaggio di valutazione della qualità GPT/Likert.vllm è consigliato per la generazione locale veloce nei baseline dell'articolo.Variabili d'ambiente tipiche utilizzate dal repository:
export HF_HOME=$HOME/.cache/huggingface
export TRANSFORMERS_CACHE=$HF_HOME
export OPENAI_API_KEY=...
export TINKER_API_KEY=...
Per la pipeline di valutazione a fasi dell'articolo, abbiamo utilizzato un file env più un JSON descrittore del checkpoint. Gli script pubblici consentono di sovrascrivere esplicitamente entrambi i percorsi:
python scripts/run_full_mage_research_eval.py \
--env-file ~/.config/stealthrl/eval.env \
--checkpoint-json ~/.config/stealthrl/m2_checkpoint.json
python scripts/run_eval.py --quick
python scripts/run_stealthbench.py --config configs/stealthbench.yaml
Ora carica i file di testo configurati, esegue i rilevatori configurati, salva gli output CSV e genera i grafici di confronto. Il vecchio stub con solo TODO è stato rimosso.
python scripts/run_full_mage_research_eval.py \
--env-file ~/.config/stealthrl/eval.env \
--checkpoint-json ~/.config/stealthrl/m2_checkpoint.json \
--run-root outputs/eval_runs/full_mage_public \
--gpus 0 1 2 3
Il repository include un sito web demo basato su FastAPI in demo/. Fornisce un'interfaccia statica curata ed espone POST /api/paraphrase con supporto per chiavi API e una quota pubblica di 20 richieste al giorno per gli utenti non autenticati.
pip install -r demo/requirements.txt
uvicorn demo.stealthrl_demo.app:app --reload --port 8080
Di default la demo funziona in modalità mock a costo zero per testare l'interfaccia. Per usare il vero sampler di StealthRL, imposta STEALTHRL_DEMO_INFERENCE_BACKEND=tinker, STEALTHRL_DEMO_CHECKPOINT_JSON e TINKER_API_KEY. Consulta demo/README.md per le note su chiavi API, quota, Docker e deployment su AWS.
L'articolo riporta i risultati sull'intero pool di valutazione MAGE filtrato:
La pipeline di valutazione di livello ricerca è implementata nel modulo eval/ e negli script a fasi in scripts/.
Prepara le credenziali e i metadati del checkpoint.
Crea un file env contenente OPENAI_API_KEY e TINKER_API_KEY, e un JSON del checkpoint che descrive il percorso del sampler Tinker di StealthRL.
Esegui il preflight.
python scripts/preflight_research_eval.py \
--env-file ~/.config/stealthrl/eval.env \
--checkpoint-json ~/.config/stealthrl/m2_checkpoint.json
python scripts/run_full_mage_research_eval.py \
--env-file ~/.config/stealthrl/eval.env \
--checkpoint-json ~/.config/stealthrl/m2_checkpoint.json \
--run-root outputs/eval_runs/full_mage_repro \
--gpus 0 1 2 3
Ispeziona gli output dei metodi generati, i punteggi dei rilevatori, le metriche e i grafici nella directory di esecuzione scelta.
Se devi solo rieseguire la valutazione della qualità basata su GPT sugli output in cache:
python scripts/run_gpt_quality_only.py \
--run-root outputs/eval_runs/full_mage_repro \
--env-file ~/.config/stealthrl/eval.env
python scripts/compute_bertscore_for_run.py \
--run-dir outputs/eval_runs/full_mage_repro/assembled \
--device cuda:0 \
--batch-size 16 \
--chunk-size 512
Lo script BERTScore aggiorna quality.parquet e quality.csv in place dopo ogni chunk, quindi le esecuzioni interrotte possono essere riprese senza ricalcolare le righe già completate. Usa --limit-per-method per un piccolo smoke test e --force solo quando intendi ricalcolare deliberatamente le colonne BERTScore esistenti.
L'esecuzione a fasi produce:
method_runs/: output generati per ogni metododetector_scores/: file parquet dei punteggi per ogni rilevatoreassembled/metrics.json: metriche aggregate dei rilevatoriassembled/thresholds.json: soglie calibrate dei rilevatoriassembled/quality.parquet: metriche di qualità automaticheassembled/quality_gpt.parquet: valutazioni di qualità GPT/Likertassembled/figures/: grafici pronti per la pubblicazioneIl checkpoint principale dell'articolo usa configs/tinker_mage_10k.yaml come configurazione di addestramento canonica: Qwen3-4B-Instruct con LoRA rank 32, GRPO con group size 8, 10.000 campioni di addestramento MAGE, tre epoche, learning rate 2.8e-4, coefficiente KL 0.05, temperatura 1.0, top-p 0.9 e un ensemble di reward a due rilevatori pesato 0.6 RoBERTa / 0.4 Fast-DetectGPT. Le altre configurazioni in configs/ sono mantenute come esempi legacy, impostazioni per smoke test o template per ablazioni e non devono essere considerate autorevoli per l'articolo se non esplicitamente documentate.
StealthRL addestra una policy di parafrasi piuttosto che un rilevatore. L'idea centrale è ottimizzare un modello che riscrive il testo generato dall'AI in modo che rimanga semanticamente fedele riducendo al contempo la confidenza dei rilevatori.
Qwen/Qwen3-4B-Instruct-2507La reward è multi-obiettivo e bilancia:
L'implementazione risiede principalmente in:
stealthrl/tinker/train.pystealthrl/rewards/configs/L'attacco StealthRL dell'articolo è single-shot al momento del test:
L'accesso ai rilevatori viene utilizzato durante l'addestramento RL offline e per la valutazione esterna, non per una ricerca adattiva al momento della query in M2.
La valutazione dell'articolo è implementata nel più recente stack eval/ piuttosto che nel vecchio harness stealthrl/evaluation/.
M0: nessun attaccoM1: baseline di parafrasi sempliceM2: StealthRLM3: baseline di parafrasi avversaria guidata dai rilevatoriM4: baseline AuthorMistM5: baseline di offuscamento a livello di caratteriCodice pertinente:
eval/methods/scripts/generate_method_outputs.pyIl pannello principale dei rilevatori dell'articolo usa:
roberta: openai-community/roberta-large-openai-detectorfast_detectgptbinocularsmage: yaful/MAGEIl repository mantiene anche il supporto per ghostbuster per esperimenti legacy/di compatibilità, ma Ghostbuster non fa parte del pannello finale di quattro rilevatori dell'articolo.
Codice pertinente:
eval/detectors.pyscripts/score_detector_outputs.pyeval/runner.pyIl codice di valutazione pubblico calcola:
Codice pertinente:
eval/metrics.pyeval/plots.pyeval/quality_judge.pyscripts/finalize_eval_run.pyIl codice di valutazione attuale supporta la generazione locale basata su vLLM per la valutazione dei baseline ad alta produttività. Questo è implementato in:
eval/methods/vllm_backend.pyIl metodo StealthRL M2 supporta il campionamento basato su Tinker tramite un JSON descrittore del checkpoint. Questo percorso è implementato in:
eval/methods/stealthrl.pyLa pipeline MAGE completa è volutamente strutturata a fasi:
Questo rende le lunghe esecuzioni multi-GPU più robuste e più facili da debuggare.
eval/methods/BaseAttackMethodeval/methods/__init__.pyeval/runner.pyQuesto repository è rilasciato per la ricerca sulla robustezza dei rilevatori di testo AI, sulla valutazione avversaria e sul benchmarking difensivo. Non è pensato per favorire imbrogli, plagio o l'evasione di sistemi legittimi di sicurezza e integrità.
Se sviluppi a partire da questo lavoro, usalo per migliorare la robustezza dei rilevatori, la calibrazione, la valutazione del trasferimento e la trasparenza riguardo ai limiti di deployment.
Se utilizzi questo repository, cita l'articolo:
@article{ranganath2026stealthrl,
title={StealthRL: Reinforcement Learning Paraphrase Attacks for Multi-Detector Evasion of AI-Text Detectors},
author={Ranganath, Suraj and others},
journal={arXiv preprint arXiv:2602.08934},
year={2026}
}