异常检测是一个重要的层,用于识别LLM行为中意料之外的偏差,它超越了对已知指标和操作健康状况的追踪。这些偏差可能表明新出现的安全问题、模型不明显的性能下降、滥用企图或绕过静态过滤器的成功对抗性攻击。由于LLM在复杂、开放的场景中运行,预先定义每种可能的故障模式是不可能的。异常检测提供了一个动态安全保障,用于标记不符合预期模式的潜在有害或非预期输出。主要挑战在于语言的高维、上下文相关特性。异常并非总是灾难性故障;它可能只是风格、主题一致性或逻辑一致性的细微变化,但在某些条件下,这表明一个更严重的问题。有效的异常检测需要摆脱简单的基于规则的检查,转向能够识别与既定规范细微偏差的统计和模型方法。LLM行为中异常的特征在实施检测机制之前,有必要了解我们可能遇到的异常类型:输出层面的异常: 这些异常直接与生成的文本有关。统计偏差: 与基线相比,输出长度、特定标点符号使用、重复性(例如,通过n-gram重叠衡量)或词汇丰富度的显著变化。内容质量问题: 生成乱码、语无伦次的文本、不符合典型模式的虚构事实,或帮助性得分突然下降。安全与政策违规: 包含有害内容、偏见言论或敏感信息泄露的输出,这些输出可能因新颖的措辞或上下文而绕过主要过滤器。此处的检测通常涉及将输出与安全分类器比较,并标记预测毒性分数异常高或意外触发特定敏感话题检测器的输出。风格不一致: 语气、正式程度、角色或语言突然转变,与既定上下文或用户指令不符。交互层面的异常: 这些异常涉及跨多轮或系统交互的模式。延迟和资源峰值: 响应生成异常延迟或特定类型输入的CPU/GPU使用异常,这可能表明处理效率低下、复杂的边缘情况或潜在的资源耗尽攻击。用户行为模式: 旨在探测漏洞的用户提示序列(例如,重复尝试以细微变化引出有害内容)可被标记为异常交互模式。表征层面的异常(高级): 借助可解释性技术,我们有时可以检测模型内部状态中的异常。嵌入漂移: 监测输出嵌入或内部激活模式的分布。相似输入随时间在这些分布中出现显著偏移,可能表明模型漂移或不稳定。将新输出的嵌入与“正常”输出嵌入的中心点比较是一种常用技术。行为异常检测方法可以使用多种技术,通常结合使用,来检测这些异常:输出特征的统计监测这通常是第一道防线。我们从每个LLM输出中提取标量特征,并监测它们的统计特性。特征提取: 计算以下指标:文本长度(字符或token计数)。困惑度(如果参考语言模型可用,较低的困惑度通常意味着更流畅/可预测的文本)。重复性分数(例如,唯一n-gram的比率)。来自外部分类器的分数(毒性、情感、PII检测)。可读性分数(Flesch-Kincaid, Gunning fog)。检测技术:阈值设定: 简单的静态或动态阈值(例如,标记长度超过$N$个token或毒性分数大于0.9的输出)。如果调整不当,容易出现误报/漏报。离群点检测: 将标准统计离群点检测方法(例如,基于与均值的标准差、四分位距(IQR))应用于特征分布。多元方法: 对提取特征的向量使用孤立森林或局部离群因子(LOF)等方法来检测异常组合。马哈拉诺比斯距离可以衡量特征向量与正态分布中心的距离,并考虑协方差: $$ D_M(x) = \sqrt{(x - \mu)^T \Sigma^{-1} (x - \mu)} $$ 其中,$x$是新输出的特征向量,$\mu$是正常输出特征的均值向量,$\Sigma$是协方差矩阵。距离越大表明异常。基于嵌入的检测这些方法在文本嵌入捕获的语义空间中进行操作。距离度量: 获取每个LLM输出的嵌入(例如,使用句子转换器或LLM自身的最后一层隐藏状态)。计算新输出嵌入与以下各项之间的距离(余弦、欧几里得):近期“正常”输出的平均嵌入。输入提示的嵌入(检查相关性偏差)。已知“安全”或“不安全”示例的嵌入。聚类: 定期对输出嵌入进行聚类。离群点或形成小型、遥远簇的点可能存在异常。DBSCAN是合适的,因为它不需要预先指定簇的数量。重构误差: 对正常LLM输出的嵌入训练自编码器。其嵌入通过自编码器时具有高重构误差的输出被标记为异常。{"data": [{"x": ["2024-01-01T10:00", "2024-01-01T10:01", "2024-01-01T10:02", "2024-01-01T10:03", "2024-01-01T10:04", "2024-01-01T10:05", "2024-01-01T10:06", "2024-01-01T10:07", "2024-01-01T10:08", "2024-01-01T10:09", "2024-01-01T10:10", "2024-01-01T10:11", "2024-01-01T10:12", "2024-01-01T10:13", "2024-01-01T10:14"], "y": [0.1, 0.12, 0.85, 0.11, 0.13, 0.09, 0.15, 0.78, 0.1, 0.08, 0.12, 0.91, 0.14, 0.11, 0.13], "mode": "lines+markers", "name": "毒性分数", "line": {"color": "#339af0"}}, {"x": ["2024-01-01T10:02", "2024-01-01T10:07", "2024-01-01T10:11"], "y": [0.85, 0.78, 0.91], "mode": "markers", "name": "检测到异常", "marker": {"color": "#fa5252", "size": 10, "symbol": "x"}}], "layout": {"title": "输出毒性分数异常检测", "xaxis": {"title": "时间"}, "yaxis": {"title": "预测毒性分数", "range": [0, 1]}, "showlegend": true}}一个时间序列图,显示LLM输出的预测毒性分数。超过预定义阈值(例如0.75)的点被标记为异常,触发进一步调查。基于模型的检测借助其他模型评估LLM的输出。参考模型比较: 在给定相同输入的情况下,将受监测LLM的输出($O_{LLM}$)与已知安全的参考模型($O_{Ref}$)的输出进行比较。显著差异(通过语义相似度、BLEU分数差异或分类差异衡量)可以表明$O_{LLM}$中存在异常。这在计算上成本更高。预测性监测: 训练辅助模型,根据输入和上下文预测LLM输出的属性。例如,训练一个模型来预测LLM输出有毒性的可能性。如果实际输出有毒性但预测模型给出了非常低的概率,则这是一个值得调查的异常。实施挑战与考量建立基线: 定义“正常”行为非常重要,需要一个代表性的、安全且符合策略的交互数据集。随着模型或使用模式的演变,该基线可能需要定期更新。阈值调整: 设定异常检测器的灵敏度是一个权衡问题。过于灵敏会产生大量误报;过于迟钝则会错过真正的问题。这通常需要迭代和人工反馈。上下文敏感性: 许多异常是依赖于上下文的。对孤立输出进行简单的统计检查可能会错过只有考虑会话历史才能显现的问题。方法需要纳入相关上下文。计算成本: 一些方法,特别是涉及嵌入或参考模型的方法,可能计算密集。请选择适合所需规模和延迟限制的方法。对于高吞吐量系统,可能需要采样策略。适应性: 异常模式会因模型更新、演变的用户行为和新的攻击向量而随时间变化。检测系统应设计成具有适应性,可能包含在线学习元素。异常响应检测仅仅是第一步。系统需要一个明确的流程来处理已标记的异常:日志记录: 记录有关异常事件的详细信息,包括输入、输出、上下文、异常分数以及触发的具体检测器。警报: 根据异常的严重程度和类型,通知相关团队(运营、安全、安保)。分类与调查: 人工审查员通常需要评估已标记的异常,以区分真阳性与误报,并了解根本原因。自动化响应(可选): 对于高置信度或重要异常,可能会触发自动化操作,例如:阻止响应并提供预设的安全回复。限流或临时封锁用户。在后续轮次中启用更严格的安全防护。反馈循环: 使用已确认的异常(真阳性)来改进系统。这可能涉及:向安全微调数据集添加示例。更新安全过滤器或防护措施。完善异常检测模型或阈值。异常检测提供了一个重要的动态防御层,补充了静态安全措施和可解释性工具。通过自动标记意料之外的行为,它能够主动识别和缓解已部署LLM系统中的安全风险。