论文的代码、数据以及所有原始评分(paper/main.pdf,源文件位于 paper/)。
LLM 安全防护机制通过将待审查内容以纯字符串插值的方式嵌入其评分提示词来接收内容,因此,模仿防护机制自身提示词格式的内容可以开启第二个伪造的评分任务,并附带一份无害的诱饵文档,防护机制随后会评判该诱饵文档而非真实内容(目标重绑定)。附加这样一个伪造任务可绕过 Shieldstral-1.0-3B 对其标记的全部 75 个预注册留出 AdvBench 请求的检测,并可迁移至 gpt-oss-safeguard-20B 和 Llama Guard 4;在我们的基准测试 GuardRebind(52 个攻击家族,5 个对照组)中,最强的家族在五个防护机制上分别绕过了 93-100% 的被标记项。段最大值自蒸馏训练防护机制对内容的评分至少不低于其最有害部分的评分,将留出攻击上的绕过率从 75% 降至约 1%,但一个评分引导的自适应攻击者仍能在 94% 的项上绕过训练后的防护机制,其中超过一半的项完全没有伪造结构。
此处有意以散文形式描述该攻击。载荷由 src/attacks.py(验证性研究)和 src/bench/attacks_grammar.py(基准测试)生成,并列于论文附录中。
| 路径 | 内容 |
|---|---|
PROTOCOL.md | Shieldstral 验证性研究的预注册(论文第 3 节;预测 P1-P9) |
PROTOCOL_v2.md | 论文基准测试与防御的预注册(M1-M5、F1-F6、A1-A3),含记录的偏差 D1-D4 |
src/*.py | Shieldstral 上的验证性研究及跨模型运行(评分器、载荷、消融、诱饵阶梯、OpenRouter 客户端) |
src/bench/ | GuardRebind:数据集加载器(data.py)、防护适配器(guards.py)、攻击语法、本地与 API 运行器、分析 |
src/fix/ | 防御:段最大值蒸馏(distill.py)、评估(evaluate.py)、自适应攻击(adaptive.py)、免训练基线(baselines.py)、有界输入格式(inputs.py) |
src/mech/ | 激活修补、线性探针、表示相似性、诱饵剂量-反应 |
scripts/queue_*.sh | 生成结果的可恢复作业队列(一次一个 GPU 作业) |
scripts/pod/ | 在租用的 CUDA GPU(Runpod)上运行防御队列并将结果复制回来 |
scripts/analysis_r2/ | 防御数据背后的 CPU 统计(Wilson、Newcombe、Hanley-McNeil、配对自助法) |
paper/data/ | 为论文直接计算的数值所用的 CPU 脚本及其输出 |
paper/figures/make_figures.py | 从 results/ 绘制论文图表 |
results/ | 论文引用的所有原始评分和摘要 |
命令均相对于仓库根目录。标注“GPU”的步骤会加载防护模型;标注“CPU”的步骤仅读取 results/ 中的文件。
第 3 节,目标重绑定(Shieldstral,验证性研究,PROTOCOL.md)
| 论文 | 结果文件 | 生成方式 |
|---|---|---|
| 图 1(解剖结构;分数) | results/confirm_shieldstral.csv(第一个文档,none 和 query_doc) | python -m src.confirm(GPU) |
| 表 1(消融实验) | results/confirm_log.txt [ablation]、results/tables.md | python -m src.confirm(stdout 为 confirm_log.txt),然后 python -m src.figures(CPU,写入 tables.md) |
| 图 2(分数;三个诱饵) | results/confirm_shieldstral.csv、results/confirm_groundtruth.csv | python -m src.confirm、python -m src.groundtruth(GPU,stdout 为 results/groundtruth_log.txt);由 paper/figures/make_figures.py 绘制(CPU) |
| 100 次请求运行(文本) | results/confirm_hundred.csv、results/hundred_log.txt | python -m src.hundred(GPU) |
| 软化查询对照(文本) | results/confirm_soften.csv、results/soften_log.txt | python -m src.soften(GPU) |
| 伪造判定与伪造任务(文本) | results/fix/forgery_controls_base.json | python -m src.fix.forgery_controls --cond base --split test --allow-test --out results/fix/forgery_controls_base.json(GPU;位于 scripts/queue_fix_full.sh 中) |
| 鲁棒性段落(第 3 节文本) | results/confirm_log.txt [recency]、[markers]、[policy];results/supp_log.txt [A] | python -m src.confirm、python -m src.supp(GPU) |
| 第 3 节剂量-反应段落;激活修补(附录 C) | results/mech/patching_test_n100.json、dose_response_test_n150_d40.json、dose_response_test_n150_d40_rho_ci.json(用于比较的 dev 划分运行 *_dev_*) | src.mech.{patching,dose_response}(GPU;scripts/queue_fix_full.sh 的第 0 步,PART=main);rho 区间:python -m src.mech.dose_response --recompute results/mech/dose_response_test_n150_d40.json(CPU) |
| 阈值敏感性(第 3 节文本,tau = 0.1) | results/sensitivity.md | python -m src.sensitivity(CPU,读取 confirm_shieldstral.csv) |
第 4 节,GuardRebind(PROTOCOL_v2.md)
| 论文 | 结果文件 | 生成方式 |
|---|---|---|
| 三种防护设计(第 4 节文本) | results/confirm_crossmodel.csv、results/confirm_gpt_oss_mechanism.csv、results/gpt_oss_mechanism_log.txt | python -m src.crossmodel 30、python -m src.gpt_oss_mechanism 30(OpenRouter API,无 GPU) |
| 表 2(基准测试,本地防护) | results/bench/v2/<guard>__default.jsonl(原始分数,仅项目 ID)、results/bench/v2/bypass.csv、run_config.json | scripts/queue_bench.sh(GPU)-> python -m src.bench.run_bench_v2 ...,然后 python -m src.bench.analyze --inp results/bench/v2(CPU) |
| 表 2(gpt-oss-safeguard 行)、gpt-oss 段落(第 4.2 节)、多判定解读(附录 C) | results/bench/v2/gpt_oss_safeguard_20b.jsonl、results/bench/v2/gpt_oss_summary.md、results/bench/v2/gpt_oss/*、paper/data/gpt_oss_strict.md | python -m src.bench.api_bench(OpenRouter)、python -m src.bench.api_summary(CPU)、python paper/data/gpt_oss_strict.py > paper/data/gpt_oss_strict.md(CPU) |
| 按家族绕过(第 4.2 节文本;完整表格已发布,未包含在论文中) | results/bench/v2/bypass.csv(默认策略,bypass 列);gpt-oss 来自 paper/data/gpt_oss_strict.md | python -m src.bench.analyze(CPU) |
| 基准阈值敏感性(已发布,未包含在论文中) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze(CPU) |
| 策略改写与控制令牌比较(附录 C) | results/bench/v2/<guard>__para{1,2}.jsonl、results/bench/v2/policy_range.csv、results/bench/v2/bypass.csv | scripts/queue_bench.sh、src.bench.analyze |
| Qwen3Guard“什么算作任务”探测 | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40(GPU,训练划分) |
第 5-6 节,防御(PROTOCOL_v2.md,第 2 轮 = 偏差 D4)
| 论文 | 结果文件 | 生成方式 |
|---|---|---|
| 表 3(防御,主要)和表 4(效用) | results/fix/r2_test_{base,B,detector,segmax_infer,t_seed0,t_seed1,bt_seed0,cc_seed0}.json | scripts/queue_round2.sh(GPU;步骤 1-3 和 5):src.fix.distill build/train、src.fix.evaluate ... --decoy-split fixed,heldout |
| 第 6.2 节中的区间和配对检验 | 相同文件 | python scripts/analysis_r2/tab.py、delta.py、boot.py(CPU) |
| 表 5(自适应攻击) | results/fix/r2_adaptive_{base,t_seed0,bt_seed0}_{search,structural_heldout}.json(.jsonl)、r2_adaptive_{base,t_seed0}_search_null.json(.jsonl)、r2_adaptive_t_seed0_gcg.json(.jsonl) | scripts/queue_round2.sh 步骤 4(GPU)加上纯文本对照(命令见下文) |
| 获胜诱饵(第 6.3 节正文) | paper/data/search_decoys.md | python paper/data/search_decoys.py > paper/data/search_decoys.md(在 CPU 上加载基础 Shieldstral) |
| 搜索与无搜索的清除率、搜索获胜位置、纯文本对照重叠(第 6.3 节正文,C3) | paper/data/search_no_feedback.md | python paper/data/search_no_feedback.py > paper/data/search_no_feedback.md(CPU,仅读取自适应 .jsonl 文件) |
| 表 6(预注册预测与结果) | PROTOCOL.md、PROTOCOL_v2.md 以及此处列出的结果文件 | 无(手工收集) |
| 表 7(固定诱饵条件:朴素 AT、Llama Guard 3、Qwen3Guard) | results/fix/test_{at_seed0,at_seed1,lg3_base,lg3_t_seed0,qg3_base,qg3_t_seed0}.json | scripts/queue_fix_full.sh(第 1 轮;PART=main、种子和泛化性) |
| GCG,计入表 5“所有攻击”(第 6.3 节正文) | results/fix/adaptive_{base,B}_gcg.json、adaptive_base_gcg_nopair.json、r2_adaptive_t_seed0_gcg.json | scripts/queue_fix_full.sh(第 1 轮)和 scripts/queue_round2.sh;无配对对照为 src.fix.adaptive --attack gcg --no-pair |
| 内容 token 检查(附录 D) | results/fix/content_token_check.json | python scripts/check_content_tokens.py(CPU,仅 tokenizer) |
| 有界格式 tokenization 检查(附录 D) | results/fix/bounded_tokenization_check.json | python scripts/check_bounded_tokenization.py(CPU,仅 tokenizer;读取 data/items.jsonl) |
论文未引用的试点、dev 划分及其他探索性输出不包含在内。
基准条目由 src/bench/data.py 构建并缓存到 data/items.jsonl
(已被 gitignore,约 4 万条,按规范化文本的哈希以 60/10/30 划分):
uv run python -m src.bench.data # build or read the cache, print counts
数据源,全部由 src/bench/data.py 中的加载器读取:
| 数据源 | 读取位置 | 访问权限 |
|---|---|---|
| AdvBench、HarmBench | 固定提交版本的上游 GitHub CSV | 开放(MIT) |
| Aegis 2.0 | nvidia/Aegis-AI-Content-Safety-Dataset-2.0 | 在 Hub 上开放 |
| BeaverTails | PKU-Alignment/BeaverTails | 开放;非商业许可 |
| OpenAI moderation eval | mmathys/openai-moderation-api-evaluation | 开放 |
| ToxicChat | lmsys/toxic-chat(toxicchat0124) | 开放;非商业许可 |
| XSTest、OR-Bench-hard-1k | Paul/XSTest、bench-llm/or-bench | 开放 |
| WildGuardMix | allenai/wildguardmix | 受限;无访问权限时会跳过并给出警告。论文中的运行未包含该数据集 |
结构化良性困难负样本和测试集由 src/bench/data.py 中的模板与良性拆分文本生成;蒸馏数据位于 data/fix/。
防护模型(Hugging Face;论文使用的是其可复现性附录中列出的修订版本):
| 防护模型 | 仓库 | 访问权限 |
|---|---|---|
| Shieldstral-1.0-3B | mistralai/Shieldstral-1.0-3B(python -m src.download,约 7.8GB) | 开放 |
| Llama Guard 3 1B | meta-llama/Llama-Guard-3-1B | 受限(接受 Llama 许可,然后执行 huggingface-cli login) |
| ShieldGemma 2B | google/shieldgemma-2b | 受限(接受 Gemma 条款) |
| Qwen3Guard-Gen-0.6B | Qwen/Qwen3Guard-Gen-0.6B | 开放 |
| gpt-oss-safeguard-20B、Llama Guard 4 | OpenRouter API | 需要在 .env(已被 gitignore)或环境中设置 OPENROUTER_API_KEY |