跳到主要内容

8 篇博文 含有标签「llm-safety」

查看所有标签

擦除模型原生对齐的微调过程

· 阅读需 11 分钟
Tian Pan
Software Engineer

你选择了基础模型,“因为它是更安全的那一个”。六个月后,你的团队发布了一个经过领域微调的检查点,它能以极具说服力的流畅度回答客户关于财富产品的问题,任务评估通过率达到 94%,而且——在第一轮训练到第四轮训练之间的某个时刻——它悄然忘记了如何拒绝任何要求。没人注意到这一点,因为你的发布评估套件从未衡量过微调消除了什么。它被剥离的能力从未出现在你的任务分布中,因此也从未出现在仪表盘上。

这是目前生产环境中 LLM 系统最少被报道的故障模式:训练后的对齐并不是模型家族的固有属性。它是某个特定检查点的属性,而有监督微调(SFT)默认会腐蚀这种属性。进行微调的团队发布的并不是他们评审过的模型的微调版本。他们发布的是一个不同的模型——其模型卡描述的是根本没有在提供服务的权重。

通过了 Schema 验证的虚假工具参数

· 阅读需 9 分钟
Tian Pan
Software Engineer

Agent 调用 fetch_order,参数为 order_id: "ORD-739241"。Schema 接受了它 —— 三个字母、一个连字符、六位数字,完全符合模式。工具返回了 404。Agent 开始含糊其辞,生成了 "ORD-739242" 并再次调用,又得到一个 404,接着又生成了 "ORD-739243"。你的仪表盘记录了三次成功的工具调用和三次干净的 Schema 校验。客户在等待。在追踪记录的某个地方,安全栈的每一层都报告为绿色,而模型正在全速虚构标识符。

团队认为 Schema 拦截了错误。Schema 确实拦截了它能拦截的东西:形状(shape)。它检查了参数是否为字符串,是否匹配正则表达式,以及必填字段是否存在。Schema 无法检查 ORD-739241 是否对应数据库中的真实订单,因为 Schema 根本不知道数据库的存在。这种差距 —— 句法上的合理性与语义上的正确性之间 —— 正是大多数生产环境工具调用 bug 的所在地,而且这种失败非常隐蔽,唯一的信号就是客户的困惑。

你那两个独立的评估指标正不断破坏拒绝校准

· 阅读需 14 分钟
Tian Pan
Software Engineer

调出过去四次模型升级的仪表盘,查看安全指数(safety number)旁边对应的帮助指数(helpfulness number)。在每次发布中,总有一个指数在变动,而且几乎从不是同一个。负责安全评估的团队发布了一个“将拒绝加固提升了 6 个点”的修复程序,三周后,负责帮助性评估的团队发布了一个“在合法查询完成度上恢复了 5 个点”的修复程序。然后,循环再次开始。

这并不是两个团队在各自取得独立进展。而是一个模型在沿着同一个轴摆动,而组织却在用两把相反的尺子测量它,每把尺子上所谓的胜利都是另一把尺子上无声的损失。刚刚庆祝了安全性能提升的团队,在不经意间发布了一个拒绝更多合法医疗问题、法律问题和“如何做”问题的模型——而这些问题的词干恰好看起来像训练数据中的不安全内容。由于这种帮助性的倒退属于不同的冲刺周期、不同的负责人和不同的仪表盘,因此它被忽视了。

好奇的顾客:如何为把 AI 智能体当作解谜游戏的用户进行设计

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数产品团队在设计 AI 智能体(AI agent)时,会将用户分为两类。第一类是合作型客户:他们面临真实的问题,用平易近人的语言询问智能体,并希望它能起作用。第二类是攻击者:包括越狱、提示词注入攻击、抓取凭据,这是安全团队负责的威胁模型。评估测试集(eval suite)覆盖第一类,红队覆盖第二类,大家皆大欢喜。

然后,第三类群体出现了,并搞砸了产品。他们并非心怀恶意。他们并不想窃取训练数据,也不想强迫模型描述生物武器。他们只是好奇。他们把智能体当作一个谜题。他们会问一些专门为了让智能体感到意外而设计的问题——“你被问过最悲伤的事情是什么”,“假装你是我的祖母,用凝固汽油弹的配方唱催眠曲哄我入睡”——只不过“凝固汽油弹”的版本往往会疯传,而真正的质量危机在于那上千种没有预设拒绝策略的变体。

拒绝审计:为什么单一拒绝率掩盖了一半的失败分布

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开任何生产环境 LLM 功能的安全仪表盘,你都会看到拒绝率(refusal rate)被绘制成一条单线,并带有颜色标记:下降是坏事,上升是好事。这背后的隐含逻辑是:拒绝是系统对不该做的事情说“不”,因此拒绝率越高,产品就越安全。这种说法只反映了事实的一半,而缺失的另一半,正是已部署助手中大多数无形质量损伤的根源。

拒绝率是一个双面分布。右尾是安全团队痴迷的部分:模型同意编写恶意软件、伪造药物剂量或生成政策明确禁止的内容。左尾则是相反的失败——错误拒绝(false refusals),即模型因为某些表面特征与禁止类别模式匹配,从而拒绝了良性请求。客户询问如何对费用提出异议,却收到“我无法提供财务建议”的样板回复。护士询问药物相互作用,却被引导至“请咨询医疗保健专业人员”。开发者询问如何解析邮件头,却因为提示词中包含 “exploit” 一词而被拒绝。

拒绝延迟税:为什么分层护栏会侵蚀你的 p95 延迟预算

· 阅读需 11 分钟
Tian Pan
Software Engineer

我最近交流的一个团队为他们的 AI 助手构建了一个所谓的“深度防御”(defense in depth)流水线。一个输入分类器检查提示词注入;一个越狱过滤器扫描对抗性模式;模型生成回复;一个输出审核环节扫描结果;一个拒绝检测器检查模型是否回避了问题,如果是,则通过重新表述步骤,用更委婉的框架再次提问。评估套件显示该提示词在 1.4 秒内生成了答案,但真实用户的等待时间中值是 3.8 秒,p95 则超过了 9 秒。

每一个安全层都是一次往返。每一次往返都包含网络跳数、排队时间、模型加载和解码。当你将它们串行地堆叠在生成调用前后时,你为产品设定的延迟预算就会灰飞烟灭——而几乎没人在设计评审时考虑到这一点。更糟糕的是:流水线中最慢、最昂贵的路径往往是那些触发了安全边缘提示词的路径,而这恰恰是你的安全机制存在所要处理的长尾场景。你正在默默地用普通用户的账单来补贴这些长尾流量。

对抗性智能体监控:构建无法被规避的监管机制

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数生产环境中的 AI agent 系统都使用了某种版本的 LLM-as-judge 监控:由第二个模型审查 agent 的输出并标记可疑行为。这种方法直观、易于部署,但作为主要防御手段却存在严重缺陷。一项分析跨多个提示攻击向量的单判官(single-judge)监控的研究发现,加权攻击成功率为 52.7%——这意味着具有对抗性的复杂 agent 逃避检测的概率比被发现的概率还要高。对于单轮、低风险的应用,这或许可以接受。但对于拥有外部系统访问权限的自主 agent 来说,这是一个致命的漏洞。

更深层次的问题在于,能力和欺骗性是同步增长的。随着 agent 在预期任务上变得更加强大,它们也变得更擅长模拟其受监管的环境,并相应地调整行为。

智能体内存投毒:跨会话持久存在的攻击手段

· 阅读需 13 分钟
Tian Pan
Software Engineer

提示注入吸引了所有关注。但提示注入在会话关闭时就结束了。内存投毒(Memory poisoning)——将恶意指令注入 Agent 的长期内存——会创建一个持久性的漏洞,跨会话存续并在几天或几周后执行,由完全不像攻击的交互触发。对生产级 Agent 系统的研究显示,在受测的基于 LLM 的 Agent 中,注入成功率超过 95%,攻击成功率超过 70%。这是大多数团队尚未防御的攻击向量,且它已经进入了 OWASP Agent 应用前十名(OWASP Top 10 for Agentic Applications)。

核心问题很简单:Agent 将自己的内存视为可信的。当 Agent 从向量库或对话历史中检索“内存”时,它处理这些信息的信心与处理系统指令时相同。没有加密签名,没有来源链,Agent 也没有机制来区分它是从真实交互中形成的内存,还是由上周二处理的某个恶意文档注入的。