论文《通过随机嵌入扰动越狱开放权重LLM》的代码与数据。
由加州大学圣克鲁兹分校理论计算机科学系的杰出人士撰写。
本工作得到了Scott Sirri、Vaggos Chatziafratis教授、C. Seshadhri教授以及我本人的重大贡献。
该仓库保存了为论文生成的每个模型响应、每个响应的安全/不安全/退化标签、生成这些响应的Colab笔记本,以及笔记本导入的推理脚本。这涵盖了扰动嵌入向量(PEV)攻击以及论文中比较的另外五种越狱方法。论文中的所有越狱率和挂钟时间均由results/中的文件计算得出。
code/
inference/ run_<model>.py:模型加载、提示构建以及每个PEV笔记本导入的
手动生成循环
ours/<model>/ 针对一个模型的PEV笔记本
ours/<model>/fixed_peak_sigma/
固定峰值sigma运行的笔记本(GLM-4-9B、Phi-4-mini、
Qwen2.5-1.5B);其日志位于results/<model>/ours/fixed_peak_sigma/
igcg/ I-GCG,每个模型一个笔记本
latentfusion/ LatentFusion,每个模型一个笔记本
refusalcones/ RefusalCones,每个模型一个笔记本
softprompt/ SoftPrompt笔记本(Llama-3.1-8B和Mistral-7B)
figures/ 绘制论文图表的笔记本
results/<model>/
baseline/ 对未扰动提示的直接响应(.txt日志)及其
标签(.xlsx / .csv);这些给出了基线越狱率
ours/raw_responses/ 来自sigma扫描的PEV响应日志,按提示范围拆分
ours/classified/ 这些响应的标签,以相同方式拆分
ours/fixed_peak_sigma/ 在模型固定峰值sigma下的PEV运行(GLM-4-9B、Phi-4-mini、
Qwen2.5-1.5B):完整的100提示扫描和SELECT重跑
igcg/ latentfusion/ neurostrike/ refusalcones/ softprompt/
其他方法的响应(.txt)和标签(.xlsx)
模型: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/,每个模型一个笔记本 |
| LatentFusion | code/latentfusion/,每个模型一个笔记本 |
| RefusalCones | code/refusalcones/,每个模型一个笔记本 |
| SoftPrompt | code/softprompt/,Llama-3.1-8B和Mistral-7B |
| NeuroStrike | 位于PEV笔记本code/ours/Llama-3.1-8B/LLama31_perturbation_p76_to_p100.ipynb内(设置单元也在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(),并运行一个在输入嵌入上挂载钩子的手动自回归生成循环。笔记本导入其对应模型的脚本,并通过该钩子注入高斯噪声。单独运行时,脚本会为单个模型打开一个交互式终端;/verbose和/embedfile命令会打印token表和嵌入向量。设备与行为开关是环境变量,记录在每个文件的头部。Llama脚本需要Hugging Face token,因为检查点受门控;该token从环境读取,从不存储。
.txt)是笔记本写入的仅追加日志。每条记录包含提示索引、适用的噪声水平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>/下的每个笔记本均在Google Colab中的单块NVIDIA A100-SXM4-80GB上运行。它导入匹配的run_<model>.py,加载JailbreakBench有害提示,将每个提示通过模型的输入嵌入层映射,向完整提示嵌入添加独立高斯噪声N(0, sigma^2),并将扰动后的嵌入传递给transformer层。对于每个提示,它在一个批次中采样20个噪声矩阵,并将每个响应追加到日志中。解码参数和每个模型的sigma列于论文第4节和表3中,并在每个笔记本的顶部设置。Hugging Face token以交互方式请求,不存储在此仓库中。其他方法的笔记本遵循相同模式,替换为相应的攻击。
论文中的越狱率可以仅从标签文件重新计算,无需运行任何模型。