论文 Jailbreaking Open-Weight LLMs via Random Embedding Perturbations 的代码与数据。
论文预印本链接 - https://arxiv.org/abs/2610.07125
由加州大学圣克鲁兹分校理论计算机科学系的杰出人士撰写。
本工作由 Scott Sirri、Vaggos Chatziafratis 教授、C. Seshadhri 教授和我本人做出了重要贡献。
该仓库保存了为论文生成的每一个模型响应、每个响应的安全 / 不安全 /
退化标签、生成这些响应的 Colab notebook,以及 notebook 导入的推理
脚本。这涵盖了扰动嵌入向量(PEV)攻击以及论文中比较的另外五种越狱方法。论文中的所有越狱率和实际耗时均根据 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
模型:Qwen2.5-1.5B、SmolLM3-3B、Phi-4-mini、Mistral-7B-Instruct、Llama-3.1-8B、
GLM-4-9B,以及论文第 4 节中列出的指令微调聊天变体。
各方法的代码位置:
| 方法 | 位置 |
|---|---|
| PEV | code/ours/<model>/;固定峰值 sigma 运行位于 code/ours/<model>/fixed_peak_sigma/;共享推理代码位于 code/inference/ |
| I-GCG | code/igcg/,每个模型一个 notebook |
| LatentFusion | code/latentfusion/,每个模型一个 notebook |
| RefusalCones | code/refusalcones/,每个模型一个 notebook |
| SoftPrompt | code/softprompt/,Llama-3.1-8B 和 Mistral-7B |
| NeuroStrike | 位于 PEV notebook 内:code/ours/Llama-3.1-8B/LLama31_perturbation_p76_to_p100.ipynb(setup 单元也在 LLama31_perturbation_p1_to_p25.ipynb 中)和 code/ours/SmolLM3-3B/run_smollm3_batched_p26_p50.ipynb;响应写入 results/<model>/neurostrike/ |
code/inference/run_<model>.py 为每个模型一个文件(run_qwen.py、run_smollm3.py、
run_phi4mini.py、run_mistral.py、run_llama.py、run_glm.py)。每个脚本使用
HuggingFace Transformers 加载模型,以空系统消息应用聊天模板,暴露
load_model()、build_prompt() 和 encode_prompt(),并运行一个手动自回归
生成循环,在输入嵌入上挂载钩子。notebook 导入其对应模型的脚本,并通过该钩子注入高斯噪声。单独运行时,脚本会为单个模型打开一个
交互式终端;/verbose 和 /embedfile 命令会打印 token
表和嵌入向量。设备与行为开关是环境变量,
记录在每个文件头部。Llama 脚本需要 Hugging Face token,因为
检查点受访问限制;token 从环境读取,从不存储。
.txt)是由 notebook 写入的仅追加日志。每条记录包含
提示索引、适用的噪声水平 sigma、运行编号以及完整的
模型响应。文件名包含提示范围(p001_to_p025 表示 100 个 JailbreakBench 有害提示中的第 1 到第 25 个)
以及运行的 UTC 时间戳。实际耗时在
每个提示每 20 次运行的一批之后以及实验结束时写入。.xlsx、.csv)每个响应一行,包含其标签:安全、不安全或
退化,定义见论文第 4 节。如果某个提示的任一次运行被标记为不安全,则该提示计为
越狱成功。名为 *_categorization* 或 *_p01_25 风格的文件是
具有相同提示范围的日志的带标签版本。ours/fixed_peak_sigma/)命名为
JBB_<model>_sigma0pXXX_..._<timestamp>.txt;sigma0p003 表示 sigma = 0.003。
p001_to_p100 文件是在该 sigma 下完整的 100 个提示、20 次运行的扫描。
SELECT_..._nNN 文件是在文件名所列提示上、相同 sigma 下的后续运行,
每个提示 NN 次运行。HIGHSIGMA 的文件是第 4.1 节讨论的较大 sigma 下的运行。SELECT 的文件是在文件名所列提示上的额外运行,针对
需要超过 20 次运行才能越狱的提示。每个日志的头部行记录
sigma 值、运行次数、提示 id 和随机种子。Llama-3.1-8B/baseline/fixed_baseline.xlsx 和 fixed_* 标签文件是经过人工验证后的标签文件,
取代早期版本。响应由 Claude Opus 4.6 使用 JailbreakBench 评判指令进行分类,输入为
包含提示、运行编号和响应的日志文件。每个被标记为不安全的响应随后都经过
人工检查。results/ 中的标签文件是经过验证的标签。
code/ours/<model>/ 下的每个 notebook 均在 Google Colab 中的单块 NVIDIA A100-SXM4-80GB 上运行。它会导入对应的 run_<model>.py,加载 JailbreakBench 有害提示词,通过模型的输入嵌入层映射每个提示词,向完整提示词嵌入添加独立高斯噪声 N(0, sigma^2),并将扰动后的嵌入传递给 transformer 层。对于每个提示词,它在一个批次中采样 20 个噪声矩阵,并将每个响应追加到日志中。解码参数和各模型的 sigma 列于论文第 4 节和表 3,并在每个 notebook 顶部设置。Hugging Face token 通过交互方式请求,不存储在此仓库中。其他方法的 notebook 遵循相同模式,只是替换为相应的攻击。
论文中的越狱率可以仅从标签文件重新计算,无需运行任何模型。