
Filigrane sémantique avec détection robuste à l’ordre sur des unités sous-phrastiques
SwordStamp ajoute une détection robuste à l'ordre et des unités de portée sémantique aux filigranes sémantiques basés sur les plongements (embeddings). Cet artefact contient la configuration exacte de l'article, le code de génération et de détection, la suite d'attaques inchangée, l'évaluation de la qualité, ainsi que l'extraction et le traçage déterministes des résultats.
À un taux de faux positifs de 5 % et une exigence de préservation du contenu de 90 %, l'attaque par déplacement de plongement spécifique au schéma (EDA-S) atteint :
| Filigrane | Taux de réussite de l'attaque EDA-S |
|---|---|
| SemStamp | 47,9 % |
| k-SemStamp | 33,3 % |
| PMark | 46,1 % |
| SAMark | 32,6 % |
| SwordStamp | 18,7 % |
| k-SwordStamp | 10,8 % |
Par rapport à leurs références publiées, SwordStamp et k-SwordStamp réduisent le succès de l'EDA-S de 29,2 et 22,5 points de pourcentage, avec des coûts de fidélité propre de 1,8 et 4,4 points. Leurs taux de détection propre sont de 94,9 % et 97,0 %. Sous le test de stress EDA-D avec accès au détecteur plus puissant, le succès maximal limité par la qualité est de 39,7 % sur k-SwordStamp contre 65,5 % sur k-SemStamp.


Ces résultats couvrent les continuations de nouvelles en anglais, un modèle de fournisseur, deux encodeurs de fournisseur et une paire paraphraseur/substitut EDA.
visualization ne consomme que le bundle CSV/Parquet compilé. Il échoue sur les cellules manquantes de l'article plutôt que de dessiner une figure partielle.
uv sync --frozen --only-group plot --no-install-project
uv run --no-sync python -m visualization extract \
--bundle results/paper --output results/paper
uv run --no-sync python -m visualization render \
--bundle results/paper --output results/paper
Cela écrit des tables auditable sous results/paper/tables/ et sept figures en PNG et PDF sous results/paper/figures/. La branche de révision anonyme inclut le bundle compilé ; une exécution complète sur la branche de publication crée les mêmes fichiers avec python -m visualization compile.
L'attaque par déplacement de plongement (EDA) est une attaque de paraphrase adaptative sur l'ensemble du texte. À chaque unité de sortie, elle échantillonne K continuations et conserve le candidat avec le plus grand déplacement cosinus par rapport à son ancre source sous un encodeur substitut. Comme chaque candidat continue le préfixe de réécriture complet, un seul objectif peut reformuler le contenu, le réorganiser et diviser ou fusionner les unités de détection.
L'EDA sans boîte voit le texte marqué et la conception publique du filigrane. Elle n'interroge pas le détecteur ni le générateur et ne reçoit aucune clé secrète, encodeur de fournisseur ou oracle de qualité.
Pour l'ancrage par sac, l'article utilise attack.bag_agg=min : maximiser la distance par rapport à l'ancre source la plus proche. Les exécutions sans boîte rapportées utilisent Qwen/Qwen2.5-3B-Instruct, BAAI/bge-base-en-v1.5, K={1,2,4,8,16,32,64}, température 1,0, top-p 0,95, au plus 96 jetons par candidat et au plus 512 jetons de réécriture.
Les autres concepteurs de filigranes peuvent appeler EDA directement :
from attacks.paraphrasing.adaptive import adaptive_attack_paraphrase
attacked = adaptive_attack_paraphrase(
texts,
base_model="Qwen/Qwen2.5-3B-Instruct",
surrogate_model="BAAI/bge-base-en-v1.5",
num_candidates=32,
anchor="positional", # EDA-P ; utilisez "bag" pour une conception robuste à l'ordre
bag_agg="min",
segmentation_type="sentence",
segmentation_backend="nltk",
)
Pour l'EDA-S conscient de SwordStamp de l'article, définissez anchor="bag", segmentation_type="semspan", semcut_max_words=15 et semcut_window=5. Dans ce dépôt, l'équivalent en CLI est :
uv run python -m attacks DATA_PATH --config PRESET \
--set attack.paraphraser=adaptive \
--set attack.custom_model=Qwen/Qwen2.5-3B-Instruct \
--set attack.surrogate_model=BAAI/bge-base-en-v1.5 \
--set attack.num_candidates=32 \
--set attack.anchor=bag --set attack.bag_agg=min \
--set segmentation.attacker_type=semspan \
--set segmentation.attacker_backend=nltk
DATA_PATH est toujours le corpus de base et PRESET identifie la cellule filigranée. Voir attacks/README.md pour toutes les attaques conservées et les champs de configuration.

config/paper.py est la source unique de vérité. Pour chacun de LSH et k-means, scripts/experiments/swordstamp.sh exécute cette échelle additive à cinq niveaux avec 64 candidats du fournisseur :
La grille ne contient que ces dix cellules et une référence sans filigrane. PMark est en ligne uniquement ; SAMark utilise un motif de drapeau par exécution. Les budgets EDA-D sont K={4,8,16,32,64}.
Les sous-modules de comparaison adaptent les sources d'évaluation publiques PMark et SAMark uniquement à leurs frontières de jeu de données/résultats et au calibrage partagé des faux positifs ; les algorithmes de filigrane sont inchangés.
Les prérequis sont Git, uv, Python 3.11, CUDA pour les exécutions de modèles, l'accès aux révisions de modèles épinglées et un stockage temporaire.
git clone --recurse-submodules [email protected]:D-Diaa/SwordStamp.git
cd SwordStamp
bash scripts/setup.sh
uv run --frozen python scripts/check_artifact.py
Préparez les partitions C4 déterministes et disjointes :
uv run --frozen python scripts/prepare_c4.py --output-dir data
Installez et configurez le planificateur épinglé. L'installateur imprime ses effets secondaires au niveau utilisateur avant de modifier quoi que ce soit :
bash scripts/install_gpu_scheduler.sh --print-plan
bash scripts/install_gpu_scheduler.sh --yes
gpu-scheduler init --gpus 0,1
gpu-scheduler start
Prévisualisez, puis soumettez chaque partition physique :
for shard in c4-val-def-256 c4-val-def-256b c4-val-def-512; do
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/swordstamp.sh
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/pmark.sh
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/samark.sh
done
# Supprimez DRY_RUN=1 après avoir inspecté les DAG exacts.
Compilez, extrayez et rendez :
uv run --frozen python -m visualization all \
--bundle results/paper --output results/paper
Le planificateur fournit CUDA_VISIBLE_DEVICES ; ne sélectionnez pas les GPU en interrogeant nvidia-smi. La reproduction complète est une charge de travail GPU de plusieurs jours. ARTIFACT.md liste le matériel, les révisions de modèles, les sorties attendues et la carte revendication-commande. scripts/experiments/README.md documente le comportement de reprise et de forçage.
config/, segmentation/, sampling/, watermarking/ : SwordStamp.attacks/ : EDA et la suite d'attaques conservée.quality/ : évaluation de la fidélité et de la préservation du contenu.visualization/ : compilation propre à l'article, tables et figures Matplotlib.scripts/experiments/ : flux de travail exacts de l'article soutenus par le planificateur.external/ : sous-modules de comparaison PMark et SAMark épinglés.Le code propriétaire est publié sous la licence MIT. Les modèles, jeux de données, textes générés et sous-modules de comparaison conservent leurs propres conditions ; voir THIRD_PARTY.md.
Le logiciel SwordStamp est écrit par Abdulrahman Diaa. Les auteurs de l'article sont Abdulrahman Diaa, Jonathan Petit et Florian Kerschbaum. Les métadonnées de citation lisibles par machine se trouvent dans CITATION.cff.
| Variante | Ancre et unité | Configuration |
|---|
| EDA-P | phrase positionnelle | adaptive, anchor=positional, unité d'attaque sentence |
| EDA-S | conception publique de la cible | phrases positionnelles pour SemStamp, k-SemStamp et PMark ; sac/phrase pour SAMark ; sac/portée sémantique pour les deux variantes SwordStamp |
| EDA-D | détecteur du fournisseur | oracle ; hérite de l'encodeur, de la partition et de la segmentation du défenseur |