
StealthRL: AI 텍스트를 적대적으로 의역하여 탐지기 견고성을 스트레스 테스트하는 RL 프레임워크.
논문 (arXiv)
데모
모델 (Hugging Face)
벤치마크 데이터셋 (Hugging Face)

AI 텍스트 감지기는 점점 더 중요한 환경에서 사용되고 있지만, 의미를 보존하는 적대적 재작성에 대한 견고성은 여전히 불확실합니다. 우리는 적응형 패러프레이즈 공격을 통해 AI 텍스트 감지기를 스트레스 테스트하는 강화학습 프레임워크인 StealthRL을 소개합니다. StealthRL은 의미적 내용을 보존하면서 감지기 앙상블에 대해 패러프레이즈 정책을 훈련시킨 다음, 보유된 감지기 계열에 대한 전이를 평가합니다. 전체 필터링된 MAGE 테스트 풀(15,310 인간 / 14,656 AI)에서 StealthRL은 평균 AUROC를 0.79에서 0.43으로 낮추고 RoBERTa, Fast-DetectGPT, Binoculars, MAGE에서 0.024의 평균 TPR@1%FPR을 달성합니다. 이 공격은 훈련에 사용되지 않은 두 감지기로 전이되어 단일 감지기 실패가 아닌 공유된 취약점을 드러냅니다. 또한 감지기 점수 분포를 분석하고 E5, BERTScore, LLM 기반 Likert 평점으로 품질을 평가합니다. 우리의 결과는 현재 AI 텍스트 감지기가 현실적인 패러프레이즈 압력 하에서 여전히 취약하며 적대적 견고성 평가를 위한 재현 가능한 프로토콜을 제공함을 보여줍니다.
이 저장소는 StealthRL 뒤에 있는 연구 및 엔지니어링 코드베이스입니다. 다음을 포함합니다:
이 저장소는 다음을 원하는 연구자에게 유용한 출발점이 되도록 고안되었습니다:
stealthrl/: 훈련 코드, 감지기 래퍼, 보상, 데이터 유틸리티 및 원래 StealthBench 패키지eval/: 논문 결과에 사용된 연구 등급 평가 하네스scripts/: 훈련, 평가, 오케스트레이션, 플로팅 및 유틸리티를 위한 실행 가능한 진입점configs/: 훈련, 평가 및 절제 실험을 위한 YAML 설정figures/: 파이프라인 다이어그램 및 정적 자산tests/: 통합 및 정합성 검사analysis/: 임시 분석 도우미 및 일회성 유틸리티python -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
프로젝트의 어떤 부분을 실행하려는지에 따라 다음도 필요할 수 있습니다:
pip install tinker
pip install openai
pip install vllm
참고 사항:
tinker는 M2에서 사용하는 클라우드 기반 StealthRL 체크포인트 추론 경로에 필요합니다.openai는 GPT/Likert 품질 평가 단계에만 필요합니다.vllm은 논문 베이스라인에서 빠른 로컬 생성을 위해 권장됩니다.저장소에서 사용하는 일반적인 환경 변수:
export HF_HOME=$HOME/.cache/huggingface
export TRANSFORMERS_CACHE=$HF_HOME
export OPENAI_API_KEY=...
export TINKER_API_KEY=...
단계별 논문 평가 파이프라인을 위해 env 파일과 체크포인트 설명자 JSON을 사용했습니다. 공개 스크립트는 두 경로를 모두 명시적으로 재정의할 수 있도록 합니다:
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
이제 구성된 텍스트 파일을 로드하고, 구성된 감지기를 실행하며, CSV 출력을 저장하고 비교 플롯을 생성합니다. 이전의 TODO 전용 스텁은 제거되었습니다.
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
저장소에는 demo/ 아래에 FastAPI 기반 데모 웹사이트가 포함되어 있습니다. 깔끔한 정적 UI를 제공하며 API 키 지원과 인증되지 않은 사용자를 위한 하루 20회의 공개 할당량으로 POST /api/paraphrase를 노출합니다.
pip install -r demo/requirements.txt
uvicorn demo.stealthrl_demo.app:app --reload --port 8080
기본적으로 데모는 UI 테스트를 위해 비용이 들지 않는 mock 모드로 실행됩니다. 실제 StealthRL 샘플러를 사용하려면 STEALTHRL_DEMO_INFERENCE_BACKEND=tinker, STEALTHRL_DEMO_CHECKPOINT_JSON, TINKER_API_KEY를 설정하세요. API 키, 할당량, Docker 및 AWS 배포 노트는 demo/README.md를 참조하세요.
논문은 전체 필터링된 MAGE 평가 풀에 대한 결과를 보고합니다:
연구 등급 평가 파이프라인은 eval/ 모듈과 scripts/ 아래의 단계별 스크립트로 구현됩니다.
자격 증명 및 체크포인트 메타데이터를 준비합니다.
OPENAI_API_KEY와 TINKER_API_KEY를 포함하는 env 파일과 StealthRL Tinker 샘플러 경로를 설명하는 체크포인트 JSON을 생성합니다.
사전 점검을 실행합니다.
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
선택한 실행 디렉토리 아래에서 생성된 방법 출력, 감지기 점수, 메트릭 및 플롯을 검사합니다.
캐시된 출력에 대해 GPT 기반 품질 판단만 다시 실행해야 하는 경우:
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
BERTScore 스크립트는 모든 청크 후에 quality.parquet와 quality.csv를 제자리에서 업데이트하므로, 중단된 실행은 완료된 행을 다시 계산하지 않고 재개할 수 있습니다. 작은 스모크 테스트에는 --limit-per-method를 사용하고 기존 BERTScore 열을 의도적으로 다시 계산할 때만 --force를 사용하세요.
단계별 실행은 다음을 생성합니다:
method_runs/: 방법별 생성된 출력detector_scores/: 감지기별 parquet 점수 파일assembled/metrics.json: 집계된 감지기 메트릭assembled/thresholds.json: 보정된 감지기 임계값assembled/quality.parquet: 자동 품질 메트릭assembled/quality_gpt.parquet: GPT/Likert 품질 평가assembled/figures/: 논문 준비 완료 플롯주요 논문 체크포인트는 configs/tinker_mage_10k.yaml을 정식 훈련 설정으로 사용합니다: Qwen3-4B-Instruct with LoRA rank 32, GRPO group size 8, 10,000 MAGE 훈련 샘플, 3 에폭, 학습률 2.8e-4, KL 계수 0.05, 온도 1.0, top-p 0.9, 가중치 0.6 RoBERTa / 0.4 Fast-DetectGPT의 2-감지기 보상 앙상블. configs/의 다른 설정은 레거시 예제, 스모크 테스트 설정 또는 절제 템플릿으로 유지되며 명시적으로 문서화되지 않는 한 논문 권위로 취급되어서는 안 됩니다.
StealthRL은 감지기가 아닌 패러프레이즈 정책을 훈련시킵니다. 핵심 아이디어는 AI가 생성한 텍스트를 의미적으로 충실하게 유지하면서 감지기 신뢰도를 낮추도록 다시 작성하는 모델을 최적화하는 것입니다.
Qwen/Qwen3-4B-Instruct-2507보상은 다중 목적이며 다음을 균형있게 조정합니다:
구현은 주로 다음에 있습니다:
stealthrl/tinker/train.pystealthrl/rewards/configs/논문의 StealthRL 공격은 테스트 시 단일 샷입니다:
감지기 접근은 오프라인 RL 훈련 및 외부 평가 중에 사용되며 M2에서 적응형 질의 시간 검색에는 사용되지 않습니다.
논문 평가는 이전 stealthrl/evaluation/ 하네스가 아닌 최신 eval/ 스택으로 구현됩니다.
M0: 공격 없음M1: 간단한 패러프레이즈 베이스라인M2: StealthRLM3: 감지기 안내 적대적 패러프레이즈 베이스라인M4: AuthorMist 베이스라인M5: 문자 수준 난독화 베이스라인관련 코드:
eval/methods/scripts/generate_method_outputs.py주요 논문 감지기 패널은 다음을 사용합니다:
roberta: openai-community/roberta-large-openai-detectorfast_detectgptbinocularsmage: yaful/MAGE저장소는 레거시/호환성 실험을 위해 ghostbuster 지원도 유지하지만 Ghostbuster는 최종 4-감지기 논문 패널의 일부가 아닙니다.
관련 코드:
eval/detectors.pyscripts/score_detector_outputs.pyeval/runner.py공개 평가 코드는 다음을 계산합니다:
관련 코드:
eval/metrics.pyeval/plots.pyeval/quality_judge.pyscripts/finalize_eval_run.py현재 평가 코드는 높은 처리량의 베이스라인 평가를 위해 vLLM 기반 로컬 생성을 지원합니다. 이는 다음에 구현되어 있습니다:
eval/methods/vllm_backend.pyStealthRL M2 방법은 체크포인트 설명자 JSON을 통해 Tinker 기반 샘플링을 지원합니다. 이 경로는 다음에 구현되어 있습니다:
eval/methods/stealthrl.py전체 MAGE 파이프라인은 의도적으로 단계별로 구성됩니다:
이렇게 하면 긴 멀티 GPU 실행이 더 견고해지고 디버깅이 쉬워집니다.
eval/methods/ 아래에 클래스 추가BaseAttackMethod 인터페이스 구현eval/methods/__init__.py에 메서드 등록eval/runner.py에서 사용하는 감지기 레지스트리에 등록이 저장소는 AI 텍스트 감지기 견고성, 적대적 평가 및 방어적 벤치마킹에 대한 연구를 위해 공개되었습니다. 부정행위, 표절 또는 합법적인 안전 및 무결성 시스템의 회피를 지원하기 위한 것이 아닙니다.
이 작업을 기반으로 구축하는 경우, 감지기 견고성, 보정, 전이 평가 및 배포 한계에 대한 투명성을 개선하는 데 사용하십시오.
이 저장소를 사용하는 경우 논문을 인용해 주십시오:
@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}
}