提示注入检测器:从提示到(置信度,类别)的可测函数


文档摘要

提示注入检测器:从提示到(置信度,类别)的可测函数 本节摘要:检测器是从提示到(置信度,类别)的函数,其他都是「感觉」。团队读到一个越狱、写一条 正则、上线、称之为提示注入防御——两周后同一攻击以「disregard the prior」落地,正则漏,团队怪模型。检测器从未对任何东西测过:没人知精度、没人知召回、没人知覆盖哪几类,正则是安全戏院的补丁。本节构建一个分层检测器:归一化(剥零宽字符、解码 base64/rot13/leet)、子串规则(手写模式带类别与基础分)、正则规则(token 级模式捕族),聚合成分类别 ;再用 82 节分类学跑每固定样例,产出每类精度/召回/F1 与混淆矩阵。

提示注入检测器:从提示到(置信度,类别)的可测函数

本节摘要:检测器是从提示到(置信度,类别)的函数,其他都是「感觉」。团队读到一个越狱、写一条 r"ignore (all )?previous" 正则、上线、称之为提示注入防御——两周后同一攻击以「disregard the prior」落地,正则漏,团队怪模型。检测器从未对任何东西测过:没人知精度、没人知召回、没人知覆盖哪几类,正则是安全戏院的补丁。本节构建一个分层检测器:归一化(剥零宽字符、解码 base64/rot13/leet)、子串规则(手写模式带类别与基础分)、正则规则(token 级模式捕族),聚合成分类别 Verdict;再用 82 节分类学跑每固定样例,产出每类精度/召回/F1 与混淆矩阵。读完本节,你交付的是一个「故意在某些固定样例上错、并在报告里暴露而非隐藏」的诚实检测器,以及一套让团队停止猜测、按数字决定上什么、下个冲刺花哪的评估流程。

对应原课程:Phase 19 · Lesson 83 · prompt-injection-detector(原英文 phases/19-capstone-projects/83-prompt-injection-detector/docs/en.md)。本节属第 20 章「毕业项目」的安全赛道。

学习目标

阅读完本节,你应当能够:

  1. 把检测器定义为「提示→[0,1] 置信度 + 最佳匹配类别」的可测函数,用精度召回每类评估。
  2. 实现三层分层检测:归一化、子串规则、正则规则,每层独立可审计。
  3. 跑指标运行器,在 82 节分类学上产出每类混淆矩阵 + 精度/召回/F1 + CSV
  4. 解释为什么检测器故意在 encoding-trick 与 instruction-override 上偏召回,在 role-play 上接受中等精度。

一、问题与直觉

团队在社交媒体读到越狱,写一条 r"ignore (all )?previous" 正则,上线,称之为提示注入防御。两周后同一攻击以 "disregard the prior" 落地,正则漏,团队怪模型。检测器从未对任何东西测过:没人知精度、没人知召回、没人知覆盖哪几类。正则是安全戏院补丁

诚实的检测器是行为可测的函数:给提示返回 [0,1] 置信度与最佳匹配类别;给标注语料,框架跨每固定样例跑检测器,按类拆真正例、假正例、真负例、假负例,报精度召回。团队读精度召回,决定上什么、下个冲刺花哪,停止猜测

二、从零实现

检测器是一列 Rule 对象,每规则有 namecategoryscore(prompt) -> [0,1]。规则要么触发要么不触发;触发则其分数即置信度。聚合器把每规则分数塌成单个 Verdict,含 category(最高分类别)与 confidence(该类最高分)。无规则触发的提示记 0.0、标 benign

三层,按序施加

  1. 归一化(Normalize)。 剥零宽字符与 bidi 控制符;小写一份工作副本;解码看似 base64、rot13、hex 的 token;把 leet 数字替回字母映射。保留原始提示与归一化副本,因某些规则要看原始字节(零宽插入本身就是信号)。

  2. 子串规则(Substring)。 手写模式如 "ignore previous""as an unrestricted""answer starting with""sure, here is"。每模式带类别与基础分,规则在原始或归一化文本上触发。

  3. 正则规则(Regex)。 token 级模式捕族:r"\bignor\w*\s+(all|prior|previous|earlier)\b" 覆盖一族覆盖;r"\b(decode|rot13|base64|hex)\b.*\banswer\b" 抓编码花招。每正则带类别与基础分。

聚合骨架

@dataclass class Verdict: category: str # 最高分类别,或 "benign" confidence: float # 该类最高分,无触发则 0.0 def detect(rules, prompt): norm = normalize(prompt) # 剥零宽/解码 base64/rot13/leet by_cat = defaultdict(float) for rule in rules: s = rule.score(prompt, norm) # 在原始或归一化上匹配 if s > 0: by_cat[rule.category] = max(by_cat[rule.category], s) if not by_cat: return Verdict("benign", 0.0) cat = max(by_cat, key=by_cat.get) return Verdict(cat, by_cat[cat])

指标运行器

接 82 节分类学工件,跨每固定样例跑检测器,算每类精度召回。提示类别标签是固定样例类别;检测器预测类别是 verdict 类别。类别 C 的真正例 = 固定类别=C 且 verdict 类别=C;假正例 = 固定类别≠C 且 verdict 类别=C;假负例 = 固定类别=C 且 verdict 类别≠C(或 benign)。运行器还接良性提示列表,以测安全文本上的假正例。

故意偏置

检测器不是安全门,是门将组合的众多信号之一。设计上它在 encoding-trick 与 instruction-override 上偏召回,在 role-play 上接受中等精度——因 role-play 攻击与合法创意写作请求模糊交叉,门会用其他信号(规则引擎、分类器)处理边界情况。

三、框架对比

业界对比:Lakera Guard、Protect AI、Azure AI Content Safety 的 prompt injection 检测、NVIDIA NeMo Guardrails 都是「分层规则 + 归一化 + 模型分类器」组合。它们的共识与本节一致:归一化先行(解码编码花招)、规则按类标注精度召回、故意偏置(encoding/override 偏召回)、诚实报告(故意错的固定样例暴露而非隐藏)。差别在本节纯规则无模型分类器(那是 85 节),作为门的一个信号。

四、可复用产物

  • outputs/detector_report.json:每类精度/召回/F1 + 原始计数,87 节安全门消费的工件。
  • code/rules.py(规则即数据):每规则是带 name/category/score/substring/regex 的字典,检测器类一次性编译;加规则就是加字典条目。
  • 归一化管道:剥零宽 + 解码 base64/rot13/leet,可独立用于任何「暴露隐藏 token 给后续规则」的场景。

语料加载器读 82 节 outputs/taxonomy.json;归一化用 re.subcodecs(标准库),base64 归一化尝试解码任何 16+ 字符的 base64 样 token,成功则用解码 UTF-8 替换;rot13 归一化用 codecs.encode(text, 'rot_13') 造候选,仅当候选比输入有更多字典词才保留(小内置词表上的便宜启发)。指标运行器产 JSON 报告,检测器故意在某些固定样例(尤其良性的 role-play 提示)上错,报告暴露而非隐藏

运行 python3 main.py:demo 加载分类学、对每固定样例跑检测器、对 benign.py 里的良性语料跑、打印每类指标;outputs/detector_report.json 是 87 节安全门消费的工件。

五、练习

  1. 加 context-smuggling 规则族:指令藏在工具结果 JSON 里,测召回提升与良性提示上的假正例代价。
  2. 算每规则贡献:每规则计数「若移除会损失多少真正例」,按边际贡献排序规则。
  3. confidence_threshold 旋钮:从 0 扫到 1,画每类精度-召回曲线。

本节要点回顾

  1. 检测器 = 提示→(置信度,类别)的可测函数——其他都是「感觉」;未测过的正则是安全戏院补丁。
  2. 三层按序:归一化(剥零宽/解码 base64/rot13/leet,保留原始+副本)、子串规则(手写模式带类与分)、正则规则(token 级捕族)。
  3. 聚合:每类取最高分,最高分类别为 verdict,无触发记 benign/0.0。
  4. 指标运行器:82 节分类学上每类 TP/FP/TN/FN,产精度/召回/F1/CSV。
  5. 故意偏置:encoding-trick/instruction-override 偏召回,role-play 接受中等精度(与创意写作交叉,门用其他信号补)。
  6. 诚实报告:故意错的固定样例暴露而非隐藏;团队读数字决定上什么、花哪。
  7. 规则即数据:rules.py 字典条目,加规则即加条目;detector_report.json 是 87 节门的输入。

下一节,我们将进入「拒绝评估」——给「该拒绝时是否拒绝、该答时是否误拒」建立红队固定集与拒绝率指标,衡量安全带的有用性代价。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U