論文のコード、データ、すべての生スコア(paper/main.pdf、ソースはpaper/内)。
LLMの安全ガードは、レビュー対象のコンテンツを採点プロンプトへ単純な文字列補間によって受け取るため、ガード自身のプロンプト形式を模倣したコンテンツは、無害なデコイ文書を伴う第二の偽造採点タスクを開くことができ、ガードは実際のコンテンツではなくそちらを採点してしまう(ターゲット再結合)。このような偽造タスクを追加すると、Shieldstral-1.0-3Bがフラグを立てた事前登録済みの75件のホールドアウトAdvBenchリクエストすべてを突破し、gpt-oss-safeguard-20BやLlama Guard 4にも転移する。そして我々のベンチマークGuardRebind(52の攻撃ファミリー、5つのコントロール)では、最強のファミリーが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 | 結果を生成した再開可能なジョブキュー(一度に1つの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(スコア、3つのデコイ) | 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) |
| 偽造判定 vs 偽造タスク(テキスト) | 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)
| 論文 | 結果ファイル | 生成元 |
|---|---|---|
| 3つのガード設計(セクション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、train 分割) |
セクション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、シードと汎化性) |
| 表5の「すべての攻撃」に計上されるGCG(セクション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 |
| コンテンツトークン検査(付録D) | results/fix/content_token_check.json | python scripts/check_content_tokens.py(CPU、トークナイザのみ) |
| 有界フォーマットのトークン化検査(付録D) | results/fix/bounded_tokenization_check.json | python scripts/check_bounded_tokenization.py(CPU、トークナイザのみ。data/items.jsonlを読み込む) |
論文が引用していないパイロット、dev分割、その他の探索的出力は含まれていません。
ベンチマーク項目はsrc/bench/data.pyによって構築され、data/items.jsonlにキャッシュされます(gitignore対象、約40k項目、正規化されたテキストのハッシュによって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; 論文では再現性付録に記載されたリビジョンを使用):