brandon-behring/prompt-injection-detection-prototype
GitHub: brandon-behring/prompt-injection-detection-prototype
一个评估提示注入检测器在跨族分布偏移下泛化能力的方法论研究框架,揭示了现有检测器在遇到未见攻击族时性能急剧下降的问题。
Stars: 0 | Forks: 0
# prompt-injection-detection-prototype
[](https://brandon-behring.github.io/prompt-injection-detection-prototype/) [](https://github.com/brandon-behring/prompt-injection-detection-prototype/actions/workflows/ci.yml) [](https://github.com/brandon-behring/prompt-injection-detection-prototype/actions/workflows/publish.yml) [](./LICENSE) [](https://www.python.org/)
**一种以方法论为核心的评估,研究提示注入检测器在跨族分布偏移下的表现。** 核心问题是:当在直接提示注入示例上训练的检测器遇到未见过的攻击族时,它们还能否正常工作?
## 执行摘要
本项目评估提示注入检测器在分布外(OOD)偏移下的表现。提示注入是指不可信文本试图覆盖 LLM 系统的指令。本项目并非试图交付一个生产级检测器,而是试图展示更公平的评估对若干检测器设计能说明什么。
**核心结论,两面性:**
- **直接检测是可学习的**,且学习成本低廉。TF-IDF + LR 在平衡的直接+良性验证集上达到 **0.971 AUPRC**;LoRA 与之持平,达到 **0.974**。神经网络相对于词法基线的提升很小。
- **跨族泛化失败。** 在合并 OOD 上,最佳检测器的 AUPRC 为 **0.364**,而随机基线为 **0.374** — 处于基线水平,而非之上。在 AUROC 下,LoRA(0.383)和 TF-IDF(0.371)均从**错误方向**突破了 0.5 基线:它们的排序在跨族攻击上与真实标签呈负相关。仅冻结的 ModernBERT 探针保持在基线之上(AUROC 0.515)。
### 合并 OOD AUPRC 表格
| 检测器 | 合并 OOD AUPRC | 说明 |
|---|---:|---|
| ModernBERT 冻结探针 | 0.364 [0.354, 0.375] | 内部最佳得分,仍处于随机基线水平 |
| ProtectAI v1\* | 0.361 [0.330, 0.391] | 参考评分器,已验证与训练池重叠;非干净的 OOD 基线 |
| ProtectAI v2\* | 0.314 [0.283, 0.345] | 参考评分器,已验证与训练池重叠;未优于 v1 |
| ModernBERT LoRA | 0.293 [0.286, 0.301] | 训练后的适配器排名低于随机;AUROC 0.383 低于 0.5 基线 |
| TF-IDF + LR | 0.291 [0.283, 0.298] | 经典基线;AUROC 0.371 同样低于 0.5 基线 |
\* ProtectAI v1 + v2 至少在 4 个 LODO 训练池来源中的 2 个上进行了训练
(`deepset/prompt-injections`、`Lakera/gandalf_ignore_instructions`),详见
[EVIDENCE](./EVIDENCE.md) §1-2。在与其训练池重叠的切片上的合并 OOD 得分不是干净的 OOD 基线。
对于 `pooled_ood`,随机 AUPRC 为 **412 / 1101 = 0.374**。因此 0.364 的冻结探针得分并非成功声明。在 AUROC 下(随机基线 0.5),LoRA 和 TF-IDF + LR 均低于基线,且其置信区间从**错误方向**突破了 0.5 — 其机制是词法过拟合加上 OOD 切片上的标签相关性偏移(见下文§机制)。
### 机制:词法过拟合 + 标签相关性偏移
两个检测器在合并 OOD 上的 AUROC 低于 0.5 随机基线,且其置信区间从错误方向突破了 0.5:LoRA 为 0.383 [0.374, 0.392],TF-IDF + LR 为 0.371 [0.362, 0.381]。低于 0.5 AUROC 的得分并非纯过拟合(纯过拟合预测的是向随机*坍缩*,而非越过随机);它是词法过拟合与此特定切片上的标签相关性偏移的结合:
- LoRA + TF-IDF 都学习了直接注入的词法特征
("ignore previous instructions"、"you are now" 等)。
- **NotInject**(n=339,全为负例):经过工程化设计使其*看起来像*
直接注入的良性文本。两个检测器对这些样本打分都很高(假阳性)。
- **BIPIA + InjecAgent**(间接 + 智能体,n=112):真正的攻击,但*不使用*
直接注入的词法模式。两个检测器对这些样本打分都很低(假阴性)。
词法信号在其自身内部是真实且一致的 — 只是在词法和语义标签出现分歧的跨族切片上不再与攻击类别对齐。冻结的 ModernBERT 探针(零 LODO 池适应)保持在 0.515 AUROC;通用语言特征与直接注入词法分布的对齐程度较低,因此在跨族切片上的反转程度也较低。
泛化差距:池内 0.99 AUROC → 跨族 0.38 AUROC,训练检测器下降约 0.6;冻结探针的差距为 0.91 → 0.515,下降约 0.4。对 LODO 池的训练适应越多,跨族下降越严重。
### 直接检测检验
OOD 结果不应被解读为"什么都没有学到"。检测器确实学会了直接提示注入任务;它们随后未能在攻击族之间干净地泛化。
| 检测器 | 直接+良性验证集 AUPRC | AUROC | 召回率@0.5 |
|---|---:|---:|---:|
| ModernBERT LoRA | **0.974** | **0.993** | **0.934** |
| TF-IDF + LR | 0.971 | 0.992 | 0.930 |
| ModernBERT 冻结探针 | 0.653 | 0.907 | 0.849 |
| 检测器 | LODO 保留直接来源召回率@0.5 |
|---|---:|
| ModernBERT 冻结探针 | **0.641** |
| ModernBERT LoRA | 0.625 |
| ModernBERT 全量微调\*\* | 0.558 |
\*\* 全量微调仅显示 LODO 直接来源数据(仅保留了 24 个第 2 阶段预测);可比的合并 OOD 推理**未运行**(第 5 阶段 X11 崩溃,见 [ADR-075](./decisions/ADR-075-full-ft-ood-drop-rationale-unified-narrative.md))。
全量微调因上述原因未出现在上文的合并 OOD 表格中。
这是一项能力表征,而非部署建议。本项目的贡献在于诚实的评估框架加上跨族迁移的负面结果。
→ 继续阅读[学术论文](./WRITEUP_PAPER.md)(约 20–25 分钟)或
[叙述版](./WRITEUP_NARRATIVE.md)(约 15–20 分钟)。两者以不同的阅读风格涵盖相同的方法、发现和局限性。
## 选择完整方法论指南
选择适合你阅读偏好的格式:
- **学术论文格式(IMRAD)** → [WRITEUP_PAPER.md](./WRITEUP_PAPER.md) — 正式的摘要/引言/方法/结果/讨论/局限/结论/参考文献(约 20–25 分钟)
- **叙述格式(故事)** → [WRITEUP_NARRATIVE.md](./WRITEUP_NARRATIVE.md) — 通俗易懂的第一人称五幕故事弧(约 15–20 分钟)
- **60 秒概览** → [项目速览](https://brandon-behring.github.io/prompt-injection-detection-prototype/docs/for-hiring-managers.html)
- **只要数据** → [RESULTS.md](./RESULTS.md) — 精确表格 + 5 张标准图表 + 原始产物指针
- **复现** → [T0 笔记本 / T1 冒烟 / T3 云层级阶梯](https://brandon-behring.github.io/prompt-injection-detection-prototype/WRITEUP/reproducibility.html)(约 $0 / 约 $0 / 约 $125)
两份指南涵盖相同内容;区别在于风格。术语在任一指南中首次使用时均有定义,并交叉引用至
[docs/GLOSSARY.md](./docs/GLOSSARY.md)。
- **HF Hub 检查点:** [冻结探针](https://huggingface.co/BBehring/prompt-injection-frozen-probe)、[LoRA](https://huggingface.co/BBehring/prompt-injection-lora)
折叠区 — 测试了什么、为何信任结果、复现快速入门、仓库地图
## 本项目是什么 - **一项能力表征**,而非部署建议。 - **一个检测器阶梯评估**:TF-IDF + LR、ModernBERT 冻结探针、ModernBERT LoRA,以及 ProtectAI v1/v2 参考。(全量微调仅针对 LODO 直接来源运行;合并 OOD 推理崩溃 — 见 [ADR-075](./decisions/ADR-075-full-ft-ood-drop-rationale-unified-narrative.md)。) - **一个保留族评估**:间接注入、智能体流注入、越狱式问题,以及良性但形似注入的文本。 - **一个可复现产物**:源不相交的分割、泄漏检查、持久化预测、置信区间、校准指标,以及 Quarto 渲染的文档。 ## 此处"OOD"的含义 "OOD" = **跨族**,而不仅仅是一个新的来源名称。训练池以直接注入为主(4 个来源:deepset、Gandalf、Mosscap、HackAPrompt)。保留的 OOD 切片涵盖: - **间接注入**(BIPIA)— 载荷通过文档上下文到达 - **智能体流注入**(InjecAgent)— 载荷分散在工具使用的多个回合中 - **越狱式问题**(JBB-Behaviors、XSTest)— 以问题形式构建的有害诱导 - **良性但形似注入**(NotInject)— 假阳性鲁棒性 这种不匹配就是实验。 ## 为何信任结果 - **在源级别保留(LODO),而非仅在行级别。** 留出一数据集分割确保测试池与训练不共享来源。`evals/leakage_report.json` 报告所有(训练、验证、测试)按折-种子对的精确哈希重叠为零,余弦相似度 ≥0.85 的重叠为零。 - **每个报告的数字都附带 95% 自助法置信区间。** 效应量 + CI 报告,而非 p 值。BCa 自助法,10000 次重采样;在第二粒种子上进行种子稳定性检查。 - **诚实的单类切片处理。** BIPIA + InjecAgent(全正例)和 NotInject(全负例)的 AUPRC/AUROC 在数学上未定义;指标流水线在源级别过滤这些切片。在这些切片上报告的是阈值召回率。 - **参考评分器的污染经过审计,而非假设。** [EVIDENCE](./EVIDENCE.md) §1-2 记录了 ProtectAI v1 + v2 在 ≥2 个 LODO 训练池来源上训练;它们在重叠切片上的合并 OOD 得分是上界,而非干净的 OOD。 ## 复现 — 三个层级 ``` git clone https://github.com/brandon-behring/prompt-injection-detection-prototype cd prompt-injection-detection-prototype make install # T1 — 笔记本电脑冒烟(约 $0,<10 分钟) make test-smoke # T0 — 与已发布的 HF Hub 检查点进行分数匹配(约 $0,约 20 分钟) make eval-from-hub RUNG=frozen-probe make eval-from-hub RUNG=lora # 与 evals/results.json 的分数匹配在 ADR-058 规定的 1e-4 绝对容差范围内。 # T3 — 在 cloud GPU 上从头开始完整重新训练(约 $125,数小时) make headline-cloud # cost-capped per ADR-020 ``` HF Hub 检查点:[`BBehring/prompt-injection-frozen-probe`](https://huggingface.co/BBehring/prompt-injection-frozen-probe) · [`BBehring/prompt-injection-lora`](https://huggingface.co/BBehring/prompt-injection-lora) 其他有用的目标: ``` make site # render Quarto site locally make audit # regenerate/check ADR-derived submission audit make render-figures # render canonical F1-F5 figures from evals/ ``` ## 本项目的思维方式 - **规范驱动开发** — [`decisions/`](./decisions/) 下 81 条不可变的架构决策记录在代码落地前锁定方法论选择。 - **库优先不变量** — 共享评估原语位于上游库中([eval-toolkit](https://github.com/brandon-behring/eval-toolkit)、[runpod-deploy](https://github.com/brandon-behring/runpod-deploy)、[research_toolkit](https://github.com/brandon-behring/research_toolkit));本地代码是项目特定的粘合剂。上游缺口在本地变通方案之前记录在 [`decisions/upstream_issues.md`](./decisions/upstream_issues.md) 中。 - **混杂控制纪律** — 当头条结果引发自然的后续问题("更长的上下文窗口能修复 OOD 差距吗?"),设计了受控的 DeBERTa-v3-base 消融实验(分块平均 vs 头部截断)。结果:一个可发表的零结果。见 [ADR-060](./decisions/ADR-060-deberta-v3-base-long-context-ablation-methodology.md)。 ## 仓库地图 | 路径 | 内容 | |---|---| | [`index.qmd`](./index.qmd) | 首次访问者着陆页 | | [`WRITEUP_PAPER.md`](./WRITEUP_PAPER.md) | 学术 IMRAD 论文(约 20–25 分钟) | | [`WRITEUP_NARRATIVE.md`](./WRITEUP_NARRATIVE.md) | 叙述故事弧论文(约 15–20 分钟) | | [`RESULTS.md`](./RESULTS.md) | 精确表格、5 张标准图表、原始产物指针 | | [`WRITEUP.md`](./WRITEUP.md) | 指向两份指南的单页路由 | | [`WRITEUP/`](./WRITEUP/) | 8 个详细方法论分支(深度参考) | | [`EVIDENCE.md`](./EVIDENCE.md) | 外部证据审计追踪 | | [`NEXT_STEPS.md`](./NEXT_STEPS.md) | 未来工作表面 | | [`decisions/`](./decisions/) | 81 条记录方法论 + 治理的 ADR | | [`evals/`](./evals/) | 指标、自助法 CI、操作点、逐行预测 | | [`docs/plots/`](./docs/plots/) | F1-F5 图表 + 元数据旁文件(溯源追踪) | | [`docs/GLOSSARY.md`](./docs/GLOSSARY.md) | 两份指南引用的术语定义 | | [`notebooks/`](./notebooks/) | 静态渲染的 Jupytext 附录 | | [`src/`](./src/)、[`scripts/`](./scripts/)、[`tests/`](./tests/) | 实现 + 验证 | ## 关键术语(快速参考) - **AUPRC** — 主要排序指标;随机基线等于正例率。 - **OOD** — 分布外。此处重要的偏移是跨族,而不仅仅是不同的来源名称。 - **LODO** — 留出一数据集。在检测器于其余数据集上训练时,保留一个来源。 - **FPR** — 假阳性率。1% FPR 目标意味着每 100 个良性示例中不超过一次误报。 - **ECE/Brier** — 校准误差;越低越好。 更多定义见 [`docs/GLOSSARY.md`](./docs/GLOSSARY.md)。 ## 本项目未声明的内容 仅限单轮英语文本分类。不在范围内:多语言攻击、编码载荷(base64/leetspeak/Unicode 混淆)、改写鲁棒性、对抗性扰动、完整多轮系统行为、部署阈值建议。[参考评分器审计](./WRITEUP/reference-scorer-audit.md) §5.6 明确列出了威胁模型的推迟项。 ## 提交锚点 - **当前状态:** [`tree/v1.3.5`](https://github.com/brandon-behring/prompt-injection-detection-prototype/tree/v1.3.5)(2026-05-22)— 实时站点源 - **原始提交标签:** [`tree/v1.0.0`](https://github.com/brandon-behring/prompt-injection-detection-prototype/tree/v1.0.0)(2026-05-18)— 按 ADR-033 保留为历史审阅者固定点 - **实时渲染站点:**标签:adversarial prompts, AI safety, AI security, detector evaluation, Hugging Face, LLM security, logistic regression, LoRA, machine learning, methodology study, ModernBERT, NLP, NLP security, out-of-distribution, prompt injection, Python, PyTorch, scikit-learn, TF-IDF, 无后门, 逆向工具