
Código, registros de respuesta y etiquetas para el artículo Jailbreaking Open-Weight LLMs via Random Embedding Perturbations
Código y datos para el artículo Jailbreaking Open-Weight LLMs via Random Embedding Perturbations.
Escrito por las increíbles personas del Departamento de Ciencias de la Computación Teórica de la Universidad de California, Santa Cruz.
Este trabajo cuenta con contribuciones significativas de Scott Sirri, el Prof. Vaggos Chatziafratis, el Prof. C. Seshadhri y yo mismo.
El repositorio contiene cada respuesta de modelo generada para el artículo, la etiqueta safe / unsafe / degenerate de cada respuesta, los cuadernos de Colab que las produjeron y los scripts de inferencia que importan los cuadernos. Esto abarca el ataque Perturbed Embedding Vector (PEV) y los otros cinco métodos de jailbreak comparados en el artículo. Todas las tasas de jailbreak y los tiempos de reloj de pared del artículo se calculan a partir de los archivos en 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
Modelos: Qwen2.5-1.5B, SmolLM3-3B, Phi-4-mini, Mistral-7B-Instruct, Llama-3.1-8B,
GLM-4-9B, las variantes de chat ajustadas por instrucciones nombradas en la Sec. 4 del artículo.
Dónde está el código de cada método:
| Método | Ubicación |
|---|---|
| PEV | code/ours/<model>/; las ejecuciones de sigma pico fijo en code/ours/<model>/fixed_peak_sigma/; el código de inferencia compartido en code/inference/ |
| I-GCG | code/igcg/, un cuaderno por modelo |
| LatentFusion | code/latentfusion/, un cuaderno por modelo |
| RefusalCones | code/refusalcones/, un cuaderno por modelo |
| SoftPrompt | code/softprompt/, Llama-3.1-8B y Mistral-7B |
| NeuroStrike | dentro de los cuadernos PEV code/ours/Llama-3.1-8B/LLama31_perturbation_p76_to_p100.ipynb (la celda de configuración también en LLama31_perturbation_p1_to_p25.ipynb) y code/ours/SmolLM3-3B/run_smollm3_batched_p26_p50.ipynb; las respuestas van a results/<model>/neurostrike/ |
code/inference/run_<model>.py es un archivo por modelo (run_qwen.py, run_smollm3.py,
run_phi4mini.py, run_mistral.py, run_llama.py, run_glm.py). Cada uno carga el modelo con
HuggingFace Transformers, aplica la plantilla de chat con un mensaje de sistema vacío, expone
load_model(), build_prompt() y encode_prompt(), y ejecuta un bucle de generación
autorregresiva manual con un hook sobre los embeddings de entrada. Los cuadernos importan el
script de su modelo e inyectan el ruido gaussiano a través de ese hook. Ejecutado por sí solo, un
script abre una terminal interactiva para un único modelo; los comandos /verbose y
/embedfile imprimen tablas de tokens y vectores de embedding. Los interruptores de dispositivo
y comportamiento son variables de entorno documentadas en el encabezado de cada archivo. El
script de Llama necesita un token de Hugging Face porque el checkpoint está restringido; el
token se lee del entorno y nunca se almacena.
.txt) son registros de solo anexado escritos por los cuadernos.
Cada entrada registra el índice del prompt, el nivel de ruido sigma cuando corresponde, el
número de ejecución y la respuesta completa del modelo. Los nombres de archivo llevan el rango
de prompts (p001_to_p025 significa los prompts 1 a 25 de los 100 prompts dañinos de
JailbreakBench) y la marca de tiempo UTC de la ejecución. El tiempo de reloj de pared se
escribe después de cada lote de 20 ejecuciones por prompt y al final del experimento..xlsx, .csv) contienen una fila por respuesta con su etiqueta,
safe, unsafe o degenerate, según se define en la Sec. 4 del artículo. Un prompt cuenta como
jailbroken si alguna de sus ejecuciones está etiquetada como unsafe. Los archivos nombrados
*_categorization* o al estilo *_p01_25 son las versiones etiquetadas del registro con el
mismo rango de prompts.ours/fixed_peak_sigma/) se nombran
JBB_<model>_sigma0pXXX_..._<timestamp>.txt; sigma0p003 significa sigma = 0.003. El archivo
p001_to_p100 es el barrido completo de 100 prompts y 20 ejecuciones con ese sigma. Los
archivos SELECT_..._nNN son ejecuciones de seguimiento con el mismo sigma sobre los prompts
listados en el nombre del archivo, con NN ejecuciones por prompt.HIGHSIGMA son las ejecuciones con sigma mayor discutidas en la
Sec. 4.1.SELECT son ejecuciones adicionales sobre los prompts listados en
el nombre del archivo, para prompts que necesitaron más de 20 ejecuciones para hacer
jailbreak. La línea de encabezado de cada registro anota los valores de sigma, el número de
ejecuciones, los ids de los prompts y la semilla aleatoria.Llama-3.1-8B/baseline/fixed_baseline.xlsx y los archivos de etiquetas fixed_* son los
archivos de etiquetas tras la verificación manual y reemplazan a las versiones anteriores.Las respuestas fueron clasificadas por Claude Opus 4.6 con las instrucciones del juez de
JailbreakBench, dándole el archivo de registro con el prompt, el número de ejecución y la
respuesta. Cada respuesta etiquetada como unsafe fue luego verificada a mano. Los archivos de
etiquetas en results/ son las etiquetas verificadas.
Cada cuaderno bajo code/ours/<model>/ se ejecutó en una única NVIDIA A100-SXM4-80GB en Google
Colab. Importa el run_<model>.py correspondiente, carga los prompts dañinos de JailbreakBench,
mapea cada prompt a través de la capa de embeddings de entrada del modelo, añade ruido gaussiano
independiente N(0, sigma^2) al embedding completo del prompt y pasa el embedding perturbado a
las capas del transformer. Para cada prompt muestrea 20 matrices de ruido en un solo lote y
anexa cada respuesta al registro. Los parámetros de decodificación y el sigma por modelo se
listan en la Sec. 4 y la Tab. 3 del artículo y se establecen al principio de cada cuaderno. El
token de Hugging Face se solicita de forma interactiva y no se almacena en este repositorio. Los
cuadernos de los otros métodos siguen el mismo patrón con el ataque correspondiente sustituido.
Las tasas de jailbreak del artículo pueden recalcularse a partir de los archivos de etiquetas solos, sin ejecutar ningún modelo.