
Code, journaux de réponse et étiquettes pour l'article Jailbreaking Open-Weight LLMs via Random Embedding Perturbations
Code et données pour l'article Jailbreaking Open-Weight LLMs via Random Embedding Perturbations.
Rédigé par les personnes formidables du département d'informatique théorique de l'Université de Californie, Santa Cruz.
Ce travail a bénéficié de contributions significatives de Scott Sirri, du Pr Vaggos Chatziafratis, du Pr C. Seshadhri et de moi-même.
Le dépôt contient chaque réponse de modèle générée pour l'article, l'étiquette safe / unsafe /
degenerate de chaque réponse, les notebooks Colab qui les ont produites, et les scripts
d'inférence que les notebooks importent. Cela couvre l'attaque Perturbed Embedding Vector (PEV) et les
cinq autres méthodes de jailbreak comparées dans l'article. Tous les taux de jailbreak et temps d'horloge murale de
l'article sont calculés à partir des fichiers dans results/.
code/
inference/ run_<model>.py: model loading, prompt construction and the manual
generation loop that every PEV notebook imports
ours/<model>/ PEV notebooks for one model
ours/<model>/fixed_peak_sigma/
notebooks for the fixed peak sigma runs (GLM-4-9B, Phi-4-mini,
Qwen2.5-1.5B); their logs are in results/<model>/ours/fixed_peak_sigma/
igcg/ I-GCG, one notebook per model
latentfusion/ LatentFusion, one notebook per model
refusalcones/ RefusalCones, one notebook per model
softprompt/ SoftPrompt notebooks (Llama-3.1-8B and Mistral-7B)
figures/ notebook that draws the paper figures
results/<model>/
baseline/ direct responses to the unperturbed prompts (.txt log) and their
labels (.xlsx / .csv); these give the baseline jailbreak rate
ours/raw_responses/ PEV response logs from the sigma sweeps, split by prompt range
ours/classified/ labels for those responses, split the same way
ours/fixed_peak_sigma/ PEV runs at the fixed peak sigma of the model (GLM-4-9B, Phi-4-mini,
Qwen2.5-1.5B): the full 100-prompt sweep and the SELECT re-runs
igcg/ latentfusion/ neurostrike/ refusalcones/ softprompt/
responses (.txt) and labels (.xlsx) for the other methods
Modèles : Qwen2.5-1.5B, SmolLM3-3B, Phi-4-mini, Mistral-7B-Instruct, Llama-3.1-8B,
GLM-4-9B, les variantes de chat ajustées par instruction nommées dans la Sec. 4 de l'article.
Où se trouve le code de chaque méthode :
| Méthode | Emplacement |
|---|---|
| PEV | code/ours/<model>/; exécutions à sigma de pic fixe dans code/ours/<model>/fixed_peak_sigma/; code d'inférence partagé dans code/inference/ |
| I-GCG | code/igcg/, un notebook par modèle |
| LatentFusion | code/latentfusion/, un notebook par modèle |
| RefusalCones | code/refusalcones/, un notebook par modèle |
| SoftPrompt | code/softprompt/, Llama-3.1-8B et Mistral-7B |
| NeuroStrike | à l'intérieur des notebooks PEV code/ours/Llama-3.1-8B/LLama31_perturbation_p76_to_p100.ipynb (cellule de configuration également dans LLama31_perturbation_p1_to_p25.ipynb) et code/ours/SmolLM3-3B/run_smollm3_batched_p26_p50.ipynb; les réponses vont dans results/<model>/neurostrike/ |
code/inference/run_<model>.py est un fichier par modèle (run_qwen.py, run_smollm3.py,
run_phi4mini.py, run_mistral.py, run_llama.py, run_glm.py). Chacun charge le modèle avec
HuggingFace Transformers, applique le template de chat avec un message système vide, expose
load_model(), build_prompt() et encode_prompt(), et exécute une boucle de génération
autorégressive manuelle avec un hook sur les embeddings d'entrée. Les notebooks importent le script de leur
modèle et injectent le bruit gaussien via ce hook. Exécuté seul, un script ouvre un
terminal interactif pour un seul modèle ; les commandes /verbose et /embedfile affichent des tableaux de tokens
et des vecteurs d'embedding. Les commutateurs de périphérique et de comportement sont des variables d'environnement
documentées dans l'en-tête de chaque fichier. Le script Llama nécessite un token Hugging Face car le
checkpoint est soumis à autorisation ; le token est lu depuis l'environnement et n'est jamais stocké.
.txt) sont des journaux en ajout seul écrits par les notebooks. Chaque entrée enregistre
l'index du prompt, le niveau de bruit sigma le cas échéant, le numéro d'exécution, et la réponse complète
du modèle. Les noms de fichiers portent la plage de prompts (p001_to_p025 signifie les prompts 1 à 25 des
100 prompts nuisibles de JailbreakBench) et l'horodatage UTC de l'exécution. Le temps d'horloge murale est
écrit après chaque lot de 20 exécutions par prompt et à la fin de l'expérience..xlsx, .csv) contiennent une ligne par réponse avec son étiquette, safe, unsafe ou
degenerate, comme défini dans la Sec. 4 de l'article. Un prompt est considéré comme jailbreaké si l'une de ses
exécutions est étiquetée unsafe. Les fichiers nommés *_categorization* ou de style *_p01_25 sont les
versions étiquetées du journal avec la même plage de prompts.ours/fixed_peak_sigma/) sont nommées
JBB_<model>_sigma0pXXX_..._<timestamp>.txt ; sigma0p003 signifie sigma = 0.003. Le
fichier p001_to_p100 est le balayage complet de 100 prompts et 20 exécutions à ce sigma. Les
fichiers SELECT_..._nNN sont des exécutions de suivi au même sigma sur les prompts listés dans le
nom de fichier, avec NN exécutions par prompt.HIGHSIGMA sont les exécutions à sigma plus grand discutées dans la Sec. 4.1.SELECT sont des exécutions supplémentaires sur les prompts listés dans le nom de fichier, pour
les prompts qui ont nécessité plus de 20 exécutions pour être jailbreakés. La ligne d'en-tête de chaque journal enregistre les
valeurs de sigma, le nombre d'exécutions, les identifiants de prompt et la graine aléatoire.Llama-3.1-8B/baseline/fixed_baseline.xlsx et les fichiers d'étiquettes fixed_* sont les fichiers d'étiquettes
après vérification manuelle et remplacent les versions antérieures.Les réponses ont été classifiées par Claude Opus 4.6 avec les instructions du juge JailbreakBench, en fournissant
le fichier journal avec le prompt, le numéro d'exécution et la réponse. Chaque réponse étiquetée unsafe a ensuite été
vérifiée à la main. Les fichiers d'étiquettes dans results/ sont les étiquettes vérifiées.
Chaque notebook sous code/ours/<model>/ a été exécuté sur un seul NVIDIA A100-SXM4-80GB dans Google
Colab. Il importe le run_<model>.py correspondant, charge les prompts nuisibles de JailbreakBench,
fait passer chaque prompt par la couche d'embedding d'entrée du modèle, ajoute un bruit gaussien indépendant
N(0, sigma^2) à l'embedding complet du prompt, et transmet l'embedding perturbé aux
couches du transformer. Pour chaque prompt, il échantillonne 20 matrices de bruit en un seul lot et ajoute chaque
réponse au journal. Les paramètres de décodage et le sigma par modèle sont listés dans la Sec. 4 et
le Tab. 3 de l'article et définis en haut de chaque notebook. Le token Hugging Face est demandé
de manière interactive et n'est pas stocké dans ce dépôt. Les notebooks des autres méthodes suivent
le même schéma avec l'attaque correspondante substituée.
Les taux de jailbreak de l'article peuvent être recalculés à partir des seuls fichiers d'étiquettes, sans exécuter aucun modèle.