提示注入检测器:从提示到(置信度,类别)的可测函数 本节摘要:检测器是从提示到(置信度,类别)的函数,其他都是「感觉」。团队读到一个越狱、写一条 正则、上线、称之为提示注入防御——两周后同一攻击以「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 章「毕业项目」的安全赛道。
阅读完本节,你应当能够:
[0,1] 置信度 + 最佳匹配类别」的可测函数,用精度召回每类评估。团队在社交媒体读到越狱,写一条 r"ignore (all )?previous" 正则,上线,称之为提示注入防御。两周后同一攻击以 "disregard the prior" 落地,正则漏,团队怪模型。检测器从未对任何东西测过:没人知精度、没人知召回、没人知覆盖哪几类。正则是安全戏院补丁。
诚实的检测器是行为可测的函数:给提示返回 [0,1] 置信度与最佳匹配类别;给标注语料,框架跨每固定样例跑检测器,按类拆真正例、假正例、真负例、假负例,报精度召回。团队读精度召回,决定上什么、下个冲刺花哪,停止猜测。
检测器是一列 Rule 对象,每规则有 name、category、score(prompt) -> [0,1]。规则要么触发要么不触发;触发则其分数即置信度。聚合器把每规则分数塌成单个 Verdict,含 category(最高分类别)与 confidence(该类最高分)。无规则触发的提示记 0.0、标 benign。
归一化(Normalize)。 剥零宽字符与 bidi 控制符;小写一份工作副本;解码看似 base64、rot13、hex 的 token;把 leet 数字替回字母映射。保留原始提示与归一化副本,因某些规则要看原始字节(零宽插入本身就是信号)。
子串规则(Substring)。 手写模式如 "ignore previous"、"as an unrestricted"、"answer starting with"、"sure, here is"。每模式带类别与基础分,规则在原始或归一化文本上触发。
正则规则(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 的字典,检测器类一次性编译;加规则就是加字典条目。语料加载器读 82 节 outputs/taxonomy.json;归一化用 re.sub 与 codecs(标准库),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 节安全门消费的工件。
confidence_threshold 旋钮:从 0 扫到 1,画每类精度-召回曲线。rules.py 字典条目,加规则即加条目;detector_report.json 是 87 节门的输入。下一节,我们将进入「拒绝评估」——给「该拒绝时是否拒绝、该答时是否误拒」建立红队固定集与拒绝率指标,衡量安全带的有用性代价。