检测 Prompt 注入和越狱攻击,主流方法通常默认系统可以访问完整的对话日志。但如果我们换一个思路,设计一个系统,让它每段对话只处理一次以提取特征,之后便不再保留任何原始文本,这可行吗?
如果只保留遥测数据(关于会话行为的数值信号),实际上能保留多少检测能力?
本文介绍的就是一个在这种严格约束下的实验,旨在探索这种架构设计的边界是否真的可行。
系统概述
核心设计原则是:原始对话文本只被处理一次,然后永久丢弃。
每次用户交互都会经过一个特征提取步骤,计算诸如 Token 计数、重试模式和若干语义指标等信号。一旦这些数值特征被计算出来,原始文本即被销毁。系统不存储任何对话日志,下游的所有组件都无法触及原始内容。
整个系统的架构如下图所示:

整个流水线可以分为四个部分:
- 特征提取器 (Feature Extractor):这是唯一能够接触原始文本的组件。
- 脱敏步骤 (Redactor):在处理完成后立即删除文本。
- 遥测存储 (Telemetry Store):仅保存计算出的数值特征。
- 检测引擎 (Detection Engine):纯粹基于存储的遥测数据运行。
在特征提取器之后的所有环节,都只与会话级别的数值打交道,再也“看不到”任何文本。整个实验的核心挑战就在于这个边界上:一旦特征计算完成,系统必须在不保留任何对话内容的前提下,依然保持有效的检测能力。
具体来说,我们设计了28个特征,并将它们分为几个类别:

在这28个特征中,有11个是完全不依赖文本的,它们直接从会话结构(如重试次数、时间间隔)计算得出,在任何阶段都无需访问文本内容。其余17个特征在脱敏前提取——文本仅被读取一次,用于计算并存储一个数值,之后便被永久删除。
总特征数 = 28
不依赖文本的特征 = 11
脱敏前提取的特征 = 17
在语义类别中,有两个复合特征需要特别说明。jailbreak_composite_score 结合了 embedding distance、roleplay score、instruction override count 和 system prompt reference count,用于捕获单个特征无法覆盖的共现模式。session_peak_jailbreak_score 则是实验中期为了修复遗漏的越狱会话而补充的——它记录的是整个会话所有轮次中最大的越狱相似度,而不是取平均值。
实验设置
为了测试上述思路,我们通过 Groq API(使用 Llama-3.1-8b-instant 模型)生成了跨越八个场景的多轮会话数据。
攻击类别共有5种:通过角色扮演的越狱、Prompt 注入、上下文填充、重试-拒绝循环、异常工具调用链。正常类别有3种:标准问答、正常工具使用、长但无害的会话。
我们使用了两种规模的数据集,实验分两个阶段进行:

关于合成数据需要说明:此处的真实标签仅用于受控基准测试,并非表示在生产环境中可以免费获得标签。实际部署时,系统会从无监督的 LOF 和规则层起步,通过人工审核积累高置信度的标记数据,再用这些确认的标签在后续周期训练 XGBoost。本实验衡量的是在收集到足够标签后,系统的潜在表现上限。
评估在会话级别进行,以避免轮次间的信息泄露。因为同一会话中的轮次存在强相关性,如果在轮次级别划分训练集和测试集,会将会话上下文泄露到评估集中,导致指标虚高。
系统性能
最终的运行结果中,R8 在 R1 基准的27个特征基础上增加了 session_peak_jailbreak_score。R1 作为一个参考点,侧重于更低的误报率;R8 则是包含了越狱修复的最终配置。

系统始终在“不存储对话日志”的约束下运行,但在特征计算方式上仍有一个关键区分。部分特征(如会话结构、重试模式、Token 增长)完全不依赖文本;另一部分(如与越狱模式的语义相似度)则在文本丢弃前从中提取。
这引出了一个更深层的问题:如果移除所有从文本中派生出的信号,仅依靠纯遥测数据,结果会怎样?
为此,我们比较了两种配置:
- 使用完整特征集(28个),包含不依赖文本的特征和脱敏前的语义信号。
- 仅保留11个完全不依赖文本的特征,让系统在任何阶段都对文本完全“盲视”。
在5折交叉验证下,差异出乎意料地小:

F1 分数从 0.982 降至 0.968,对应约 1.4 个百分点的回落。
一个完全不依赖文本的系统,保留了完整模型约 98.5% 的检测性能。
移除所有文本派生信号的代价是约 1.4 个 F1 点——这就是构建一个完全文本盲系统的可衡量成本。损失是真实存在的,语义信号对于捕捉越狱等细微攻击模式仍有可衡量的优势。但更耐人寻味的是保留了多少信号:重试循环、Token 积累和会话结构等行为模式,承载了绝大部分的检测能力。
换言之,这里的权衡发生在“稍高一点的检测精度”和“完全脱离用户文本”之间,而非“全有”与“全无”之间。
那么,信号究竟主要从哪里来?我们可以拆解模型,对不同特征组进行独立评估。以下实验评估的是完整特征集(包含脱敏前的语义信号),而非严格的纯文本无关变体。

行为信号单独使用便已非常接近完整模型的表现;语义信号同样携带较强信号,但独立使用时还不够充分;而基于正则表达式的方法泛化能力不足,这也在预期之中。
所以关键不在于某个类别胜出,而在于行为信号与语义信号的互补性。
检测不仅来自用户“说了什么”,还来自交互“如何演变”。
重试模式、Token 增长和会话结构,最终被证明与已知攻击模式的语义相似度具有同等的信息量。这种结合了行为分析与语义理解的方法,是构建健壮机器学习模型的关键。
误报率挑战
在整个迭代过程中,系统的整体准确率(如F1)变化不大,真正发生显著改变的是误报率 (FPR)。

从 Isolation Forest 基线模型切换到 LOF (Local Outlier Factor) 后,误报率明显下降;扩大数据集规模后,又进一步将其压低。系统的攻击检测能力并未出现质的飞跃——真正的进步在于对正常会话的误判越来越少了。

表面上指标好看与实际可用性之间的差距,往往就在这里。降低误报率对于生产环境的可接受度至关重要。
修复越狱检测
越狱检测始终是一个棘手的问题。在多次运行中,其召回率停滞在 0.75 左右。分析遗漏的案例后,一个规律浮现出来:在许多越狱会话中,早期轮次看起来完全正常,越狱信号只在会话的后期才突然出现。
问题不在于模型本身,而在于信号的聚合方式。最初的做法是对整个会话的所有轮次取信号的平均值,这会把攻击实际出现的后期轮次的关键信号给稀释掉。修复思路很直接:
跟踪会话所有轮次中的最大越狱信号,而非取平均值。
session_peak_jailbreak_score 这个特征便由此而来。

仅这一个改动就显著提升了召回率,同时让系统能在交互的更早期阶段识别出攻击。
真正驱动检测的因素
通过分析特征重要性,驱动检测的核心模式变得更加清晰:

少数几个信号占据了主导地位:峰值越狱相似度 (session_peak_jailbreak_score)、累积 Token 使用量、整个会话的 Token 总量、Prompt 增长模式、以及重试相关特征。其余特征的贡献是增量式的,检测能力的大头来自这几个核心指标。这再次印证了精心设计的特征工程在安全检测中的核心价值。
总结
本实验最直接的结论是:
不需要存储对话日志,就能检测到许多类别的攻击。
遥测数据中保留了大量的信号,尤其是对于重试循环、升级攻击等由交互行为驱动的模式。但是,代价同样存在:你失去了直接检查原始对话以调试个别案例、或向用户详细解释某个决策的能力。此外,整套方案还依赖一个基本假设:攻击者的行为模式与正常用户有统计学上的差异;而这个假设并非在所有场景下都成立。
虽然这种方法做不到完美,也不是放之四海而皆准的解决方案。但在数据隐私要求极为严格的约束条件下,它确实是一个可行且有效的设计选择。这个实验或许说明,我们对原始文本的依赖程度有时被高估了,而用户与AI交互的行为轨迹中所蕴含的信号量,则可能被低估了。
对于希望深入探讨人工智能安全与隐私平衡实践的技术团队,欢迎在云栈社区的相关板块交流更多关于系统架构与模型优化的细节。