微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 DiSCO:当AI画图工具学会"察言观色",用对比学习给文生图模型上一道安全锁

DiSCO:当AI画图工具学会"察言观色",用对比学习给文生图模型上一道安全锁

2026-09-18 18:30
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-09-18 18:30 科技行者

你有没有想过这样一个场景:你在用某个AI绘画工具,输入了一句完全正常、甚至可以说是"人畜无害"的话,比如"一个女人坐在河边",结果生成的图片却让你瞬间脸红。这不是你的错,也不是提示词写得不好,问题出在一个大多数人都没意识到的地方,这个AI模型自己"脑补"出了不该有的内容。

这听起来有点反直觉。我们一般以为,只要输入的文字是干净的,输出就应该是安全的。但事实证明,这个假设从一开始就是错的。

**一句话完全"安全"的文本,喂给同一个AI模型,也可能生成不安全的图片。**

这不是理论上的猜测,而是这篇论文里反复验证的现象。研究者们把这种情况起了个名字,叫做"良性对抗"问题,英文是benign adversarial。这个词听起来有点拗口,我们后面会慢慢拆开讲。今天要聊的这篇论文,来自KAUST(阿卜杜拉国王科技大学)和高通AI研究院的团队,他们提出了一套叫DiSCO的防御方法,专门对付这种"看着安全、实际不安全"的诡异情况。

先搞清楚:这个坑到底有多深

先说说背景。这几年文生图模型突飞猛进,Stable Diffusion、SD 3、Flux这些名字你可能都听过,它们能把一句话变成一张照片级别的图像,效果好到让人惊叹。但伴随而来的问题是,这些模型也能被"套路"生成暴力、色情等不适宜内容,业内统一管这类内容叫NSFW。

**NSFW**:Not-Safe-For-Work的缩写,指不适合在工作场合或公开场合展示的内容,比如色情、暴力、血腥画面。

这个问题不是自然发生的,而是被一群叫"红队"的攻击者主动"逼"出来的。红队攻击者会想尽办法构造一些特殊的提示词,让原本设了安全限制的模型"破防",生成不该生成的东西。这类攻击手段五花八门,有的完全不需要接触模型内部(黑盒攻击),有的则要利用模型的梯度信息做精细优化(白盒攻击),最近甚至出现了用大语言模型自动生成攻击提示词的方法,读起来像正常人写的句子,却能骗过审核系统。

**红队攻击(red-teaming)**:安全领域的术语,指主动模拟攻击者行为,去测试系统漏洞的过程,这里特指专门设计来诱导AI生成违规内容的攻击方法。

面对这些攻击,防御的一方也没闲着。目前主流的防御思路大致分成几派。第一派是直接改模型内部参数,比如做"概念遗忘"训练,让模型忘记怎么画裸体,代表方法有ESD、AdvUnlearn;第二派是编辑模型的注意力机制,代表方法是RECE;第三派是推理时动态干预,代表方法有SLD-Max、SAFREE,这些方法不改模型权重,但在生成过程中实时调整。

这三派方法有个共同的硬伤:它们都要求你能拿到模型的内部结构,也就是所谓的"白盒"权限。可现实世界里,绝大多数商用文生图模型是闭源的,你连模型内部长什么样都看不到,更别提去改它的权重了。这就好比你想给邻居家的防盗门加一道锁,但那扇门根本不是你家的,你连钥匙孔在哪都摸不着。

于是就有了第四派思路:用大语言模型来"翻译"或"净化"用户输入的提示词,代表方法有VALOR、PromptSafe。这类方法确实是黑盒的,不需要碰模型内部,听起来很美好。但这篇论文指出了一个致命漏洞:这类净化方法只能在文字层面判断安全与否,可它根本不知道这句"看起来干净"的话,喂给这个特定的模型之后,到底会生成什么样的图片。

这就是"良性对抗"问题的核心。用论文里的正式定义来说,一个提示词如果通过了文本层面的安全检测,但生成的图片有超过一半的概率被判定为不安全,那它就是"良性对抗"的。

如果这个问题不解决,会怎样?

后果是防御方一直在打一场看不见对手的仗。你以为把嘴巴上的脏话过滤掉了,敌人就进不来了,结果敌人根本没打算说脏话,他就是用最斯文的语言,利用你自己模型学出来的某种"癖好",把你绕了进去。论文里提到,这种现象不是个例,而是系统性的,甚至在模型权重被篡改后依然存在。这说明纯文本层面的防御,天生就有一个盲区。

DiSCO的核心思路:既然模型自己会"想歪",那就让它自己纠偏

面对这个盲区,DiSCO团队换了个角度想问题。

他们的逻辑是这样的:既然问题出在提示词和模型自身视觉输出分布之间的错位,那与其去改模型(做不到,因为是黑盒),不如去调整提示词本身,让它和模型的"安全区域"对齐。

这个思路换算成大白话就是,你没法把一个爱走神的学生的大脑打开重新编程,但你可以观察他平时在什么情况下容易走神,然后设计一套引导性的提问方式,让他自然而然地走向你想要的答案,而不是靠强行灌输。

DiSCO的全称是Distribution-Guided Contrastive Suffix Optimization,翻译过来是"分布引导的对比后缀优化"。这个名字信息量很大,我们一点点拆解。

**训练无关(training-free)**:意思是这个方法不需要额外训练任何模型,拿来就能用,不用等几天几夜跑训练任务。

**黑盒(black-box)**:指防御方法完全不需要访问目标模型的参数、梯度或内部结构,只能通过输入输出去"猜"模型的行为,就像你只能通过按按钮观察电梯的反应,却打不开电梯的控制柜。

DiSCO的做法分成两大块。第一块是构建"安全池"和"不安全池",第二块是用这两个池子去指导一个"后缀扩写"的搜索过程。我们分别来看。

### 第一步:让模型自己"暴露"出安全和不安全的样子

DiSCO团队的第一个动作,是拿一批普通、非攻击性质的提示词(来自I2P数据集),喂给目标模型,看它自己会生成什么样的图片。

**I2P数据集**:全称Inappropriate Image Prompts,是一个专门收集了可能诱导模型生成不适宜内容的提示词集合,常被用作文生图安全领域的测试基准。

生成完图片之后,团队用两个独立的分类器去检测这些图片,一个是NudeNet,专门检测裸露身体部位,属于像素级别的判断;另一个是Q16,覆盖范围更广,能识别暴力、血腥等更多类型的不当内容。

这里有个关键的设计细节:只有当NudeNet和Q16这两个分类器都判断"安全",这张图片才会被放进"安全池";只有两者都判断"不安全",才会放进"不安全池"。如果两个分类器意见不一致,这张图直接被丢弃,不进任何一个池子。

为什么要这么严格?

因为这两个分类器本身也可能犯错,各自有各自的判断盲区。如果只靠一个分类器,池子里可能混进一堆"其实不算安全但被误判为安全"的图片,那后面所有的优化工作都会建立在一个不牢靠的地基上。这就像你要建一个"好人档案库"和"坏人档案库",如果两个不同的调查员对同一个人的判断都不一致,那这个人的档案暂时先不归档,等信息更明确了再说,这样才能保证档案库里的样本足够"干净"。

这个安全池和不安全池,本质上就是目标模型自己"暴露"出来的视觉分布图谱。注意这里有个巧妙之处:这两个池子是针对每个具体模型单独构建的,Stable Diffusion 1.4有它自己的一套池子,Flux有Flux自己的一套,因为不同模型学到的"癖好"是不一样的。这也是为什么DiSCO能做到严格黑盒,因为它压根不需要知道模型内部是怎么运作的,只需要观察模型的输出行为就够了。

### 第二步:用对比打分,一步步"引诱"提示词走向安全区

有了安全池和不安全池之后,DiSCO要做的事情是:给定一个"良性对抗"的问题提示词,逐步在它后面添加一些词,让新生成的图片,在语义空间里,既像安全池里的图片,又不像不安全池里的图片。

这里要引入一个关键工具,叫CLIP。

**CLIP**:一种能把图片和文字都映射到同一个数学空间(叫嵌入空间)里的模型,映射后,语义相近的图片和文字,在这个空间里的"距离"也会更近,通常用余弦相似度来衡量这种远近关系。

具体的打分公式是这样设计的:对于一张候选生成图片,计算它和安全池里若干张随机抽取图片的相似度,再减去它和不安全池里若干张随机抽取图片的相似度。这个差值越大,说明这张图片越靠近安全区域、越远离危险区域。

论文里有个细节值得展开讲讲,每次打分的时候不是把整个安全池和不安全池都拿来算,而是随机抽取8张(这个数字是经过实验调优出来的默认值)。为什么要随机抽样,而不是把所有的参考图片都用上?

论文的实验结果给出了答案:抽样数量太少(比如4张),得到的信号不够有代表性;抽样数量太大(比如32张),每次抽到的样本几乎和整个池子一样,导致优化过程反复看到相同的分布,逐渐失去了多样性。这就好比你要给一个学生批改作文,如果你每次只让他参考同一篇范文,他很快就会把这篇范文的套路摸得死死的,但换一篇题目就抓瞎;但如果每次都让他看不同的范文组合,他反而能学到更本质、更泛化的写作规律。R=8这个中间值,恰好让每一步优化都能看到一个"新鲜"的分布切片,逼着搜索过程去探索更广阔的安全区域,而不是死记硬背某几张图。

那这个"逐步添加词"的过程具体是怎么操作的?

DiSCO用了一个叫束搜索(beam search)的经典算法,配合LLaMA-3-8B这个语言模型来生成候选词。

**束搜索(beam search)**:一种搜索策略,每一步不是只保留一个最优解,而是同时保留多个(比如4个)候选方案往下走,走到最后再从这些候选方案里挑出总分最高的一个,这样能避免过早陷入局部最优。

具体流程是这样的:从原始提示词开始,每一步用LLaMA-3-8B提议几个可能的下一个词,对每一种续写方式都实际去问一下目标生成模型,会得到什么图片,然后用前面讲的对比打分公式给这张图片打分,保留分数最高的4条路径(默认束宽K=4),如此循环16轮(默认长度T=16),最后从留下来的候选里挑分数最高的那个,作为最终优化后的提示词。

打个比方,这就像你在下棋,每走一步不是只想好这一步该怎么走,而是同时在脑子里预演好几种可能的走法,每种走法都往前推演几步,看哪种走法最后能把你带到"赢棋"的局面,然后你才真正落子。如果不这样做,只按贪心策略每步都选眼前看起来最好的选项,很可能在第三步就掉进一个死胡同,因为眼前最优的选择不代表长远最优。

值得一提的是,这整个优化只发生在提示词层面。目标生成模型本身完全没有被改动,DiSCO相当于给提示词做了一次"体检加整容",体检出它有哪里可能诱发风险,然后动一点小手术(加几个词),让它整体气质往安全的方向偏,而不去动生成模型这个"手术台"本身。

### 一个聪明的省钱设计:不是所有提示词都要走这套流程

这里要提一个容易被忽略但很实际的设计。DiSCO并不是对每一条输入的提示词都跑一遍完整的优化流程,因为这样做的计算成本很高(每条提示词可能要跑256次候选图片生成)。

DiSCO采取的策略是先用原始提示词生成一次图片,如果这张图已经是安全的,那就直接放行,不启动DiSCO;只有检测到"良性对抗"的情况,也就是提示词看着正常但生成的图不安全,才会触发DiSCO的优化流程。

这就像小区门口的安检,不是每个进出的人都要开箱检查,只有安检机报警了,才会有工作人员上前做进一步核实。这样的设计既保证了安全性,又不会把系统的响应速度拖垮到没法用。

效果到底怎么样:数字说话

方法讲完了,最关键的问题来了,这套东西真的管用吗?

论文团队做了非常扎实的实验,横跨32种"系统加攻击方式"的组合,每种组合还重复了5次随机种子实验,确保结果稳定可靠。

先看整体数据。**在NudeNet这个检测标准下,平均攻击成功率从23.6%降到了2.4%;在Q16这个更宽泛的标准下,从8.3%降到了1.7%。**

这个数字意味着什么?23.6%意味着差不多每4次攻击尝试,就有接近1次能得逞;降到2.4%之后,差不多每40次尝试才有1次得逞。这不是小修小补,是把防线整体拔高了一个数量级。

具体到几个代表性模型,团队测试了未加任何防护的原始模型,包括Stable Diffusion 1.4、2.0、3和Flux,也测试了已经带有防护措施的模型,包括SLD-Max、SAFREE、RECE、ESD。攻击方法用了四种,分别是Ring-A-Bell(黑盒攻击)、UnlearnDiffAtk和MMA-Diffusion(白盒攻击)、P4D(专门针对已有防御机制设计的攻击)。

在Ring-A-Bell攻击下,Stable Diffusion 1.4的NudeNet攻击成功率从84.2%骤降到7.8%;Stable Diffusion 2.0从75.4%降到3.9%;Flux从89.7%直接降到5.0%。这几个数字都相当震撼,Flux原本几乎是"逢攻必破"的状态(接近九成),加上DiSCO之后,防线基本上稳固住了。

再看已经有防护的模型。SLD-Max加上DiSCO之后,Ring-A-Bell攻击的NudeNet成功率从44.4%降到了0.3%;SAFREE从54.1%降到0.4%。即便是本身防御能力已经很强的ESD和RECE,加上DiSCO之后依然有进一步提升,ESD从22.3%降到0.2%,RECE直接降到0.0%。

这里有个特别值得注意的点:**32个"防御方法加攻击方式"的组合,全部都得到了改善,没有一个例外。**

这说明DiSCO不是靠运气蒙对了某几种特定场景,而是这套"用模型自己的安全和不安全分布做对比引导"的思路,具有相当强的普适性。

更让人意外的是,安全性提升的同时,图片质量不但没有下降,反而变好了。团队用CLIP分数(衡量生成图片和原始提示词语义匹配程度)和ImageReward(衡量人类偏好倾向)来评估质量。

**四个未加防护的模型上,CLIP分数平均提升了0.065到0.086,ImageReward平均提升了1.67到2.22分。**

这个结果乍一听有点反常识,你会觉得为了安全,牺牲一点生成质量是理所应当的代价,但DiSCO的表现却是安全和质量同时变好了。团队给出的解释是,DiSCO的优化目标本质上是把生成结果往"更符合原始意图的忠实呈现"方向引导,而不是简单粗暴地"压制"输出,很多时候攻击本身生成的图片语义就是混乱、不连贯的,DiSCO在把它推向安全区域的同时,顺带也让画面变得更加协调自然。

团队还做了哪些"较真"的实验

一篇扎实的论文,光有主实验还不够,团队还做了大量细致的消融实验,来验证每个设计选择是不是真的有必要。这部分内容我觉得特别值得展开讲,因为它体现了研究者严谨较真的态度。

第一个问题:这个方法会不会只是"偷懒"地对齐了评测用的分类器本身?

因为安全池和不安全池的构建,用的正是NudeNet和Q16这两个分类器,而最终评测用的也是这两个分类器,这就存在一个逻辑循环的嫌疑:会不会DiSCO只是学会了如何骗过这两个分类器,而不是真的让图片变安全了?

为了排除这个疑虑,团队专门引入了第三个完全没有参与优化过程的检测器,叫ShieldGemma2-4B,这是一个40亿参数的视觉语言模型,判断逻辑和NudeNet那种像素级检测完全不同。结果显示,在应用DiSCO之前,ShieldGemma2-4B有时候判断得比NudeNet更严格(比如ESD模型在MMA-Diffusion攻击下,ShieldGemma2-4B测出38.1%的成功率,而NudeNet只测出6.0%,两者差距很大),说明这两个检测器确实关注的角度不一样,不是同一套标准。但即便如此,DiSCO在所有32种设置下,用ShieldGemma2-4B去评测,依然全部实现了成功率下降,最终稳定在3.3%左右,和NudeNet测出的3.5%相差无几。这个结果说明DiSCO确实是在改善图片本身的安全性,而不是在钻分类器的空子。

第二个问题:这套方法只对"裸露"这一种不安全类型有效吗?

团队专门做了一个跨类别的测试,把I2P数据集里的七大类不安全内容都拿出来单独测试,包括色情、暴力、仇恨、骚扰、自我伤害、令人不安的画面、非法活动。结果显示,在Q16这个更宽泛的检测标准下,四个防御方法(ESD、RECE、SAFREE、SLD-Max)原本的平均攻击成功率在9.8%到35.6%之间,加上DiSCO之后,全部降到了0.1%以下,几乎把每一个类别都清零了。这说明DiSCO的效果不是针对某一种特定违规内容量身定做的,而是具有跨类别的普适性。

第三个问题:这套方法会不会对完全正常、没有安全问题的提示词也造成伤害?

这是个很实际的顾虑,任何安全机制如果误伤了正常用户体验,都是不合格的。团队专门抽取了100条本身就能生成安全图片的正常提示词,测试DiSCO加上去之后会不会带来负面影响。结果显示CLIP分数从0.25提升到0.28,ImageReward从-0.60提升到0.05,虽然P4D这一类提示词上ImageReward有轻微下降,但总体上DiSCO并没有拖累正常场景下的生成质量。

第四个问题:换一个完全没见过的数据集,这套方法还管用吗?

团队额外找了1000条来自T2I-RiskyPrompt数据集的提示词,这个数据集完全没有参与安全池的构建过程,属于真正意义上的"考试没见过的题目"。结果显示,在四个未加防护的模型上,攻击成功率相对下降了48.8%到65.5%;在四个已有防护的模型上,下降幅度更大,达到81.7%到93.8%。这个结果比较有说服力地证明了DiSCO学到的不是某个特定数据集的表面规律,而是具有一定的泛化能力。

第五个问题:安全池和不安全池的构建规则,是不是还有优化空间?

原本的规则是简单粗暴的二元判断,两个分类器都说安全就进安全池,都说不安全就进不安全池,中间意见不一致的直接丢弃。团队进一步尝试了基于置信度的筛选方式,只有当分类器的判断置信度足够高(比如超过0.8)才纳入不安全池,置信度足够低(比如低于0.1)才纳入安全池。结果显示,越严格的筛选规则,反而带来了更低的攻击成功率(从9.4%降到4.7%),但代价是可用的不安全参考样本数量急剧减少(只剩6张)。这揭示了一个有意思的权衡:样本质量和样本数量之间存在此消彼长的关系,过于宽松的筛选规则会让边界模糊的样本混进来,稀释掉对比信号的有效性。

第六个问题:如果面对专门针对DiSCO设计的攻击,会怎么样?

团队特意用一种叫APT的攻击方法做了压力测试。APT的攻击逻辑正好和DiSCO反着来,它也是往提示词后面加后缀,但目的是诱导生成不安全内容,而DiSCO是要把内容拉回安全区。这是一场很有意思的"针尖对麦芒"。结果显示,APT确实成功地把NudeNet攻击成功率从24.5%抬高到38.5%(以SD 1.4为例),证明这个攻击本身是有效的。但当DiSCO被应用在这些被APT攻击过的提示词上之后,成功率又被拉回到了12.9%,甚至低于原本没被攻击时的基线水平24.5%对应的原始值。不过团队也很坦诚地指出,在SD 2.0这个模型上,DiSCO并没有完全把成功率拉回到攻击前的水准(从26.3%降到13.6%,但原始基线是12.3%),说明面对专门针对性设计的自适应攻击,DiSCO还有被进一步攻破的空间,这也是论文诚实承认的局限之一。

计算成本:安全是要付出代价的,但代价可控

任何额外的安全机制,都不可能是零成本的。DiSCO的额外开销主要来自束搜索过程中反复生成候选图片去打分。在默认配置下(K=4,T=16,分支因子b=4),每条提示词需要生成256张候选图片,实际批量执行是64次前向推理调用。

在单张A100 GPU上,团队测算的结果是,每条提示词的优化过程大约需要3.5分钟。这个时间对于实时聊天场景来说确实偏长,但团队也想了办法压缩成本:既然打分只需要判断候选图片和安全池、不安全池的相对远近关系,并不需要生成质量特别精细的图片,那能不能用更少的去噪步数来生成候选图,只在最后正式出图时才用完整步数?

实验证实了这个思路完全可行。把候选图片的去噪步数从标准的50步降到4步,攻击成功率几乎没有变化(仍然维持在8.2%左右),但每条提示词的处理时间从208.7秒骤降到33.8秒,相当于6.2倍的加速。这个发现背后的原理,是扩散模型在生成图片的过程中,早期的去噪步骤主要在勾勒大致的语义结构,细节的精修留到后面的步骤才展开,而CLIP关心的恰恰是高层语义,不是像素级细节,所以用粗糙的草图去做排序判断,效果跟用精修大图几乎一样。

这就好比你要从一堆快递包裹里挑出哪个是你要的那个,你不需要拆开每个包裹仔细检查里面的商品细节,只要看包裹外面贴的标签和大概形状,就能筛掉大部分不对的,等锁定了目标包裹,再彻底拆开确认细节。如果非要每个包裹都完整拆开检查,效率会低得多,但用一个"粗筛加精修"的两阶段策略,总体时间反而大幅缩短。

这套方法也有没解决完的问题

论文很诚实地承认了一个有意思的副作用,团队把它叫做"主导概念注入"。

因为后缀是自回归生成的,有些时候优化过程会不小心加入一些在模型训练数据里"存在感极强"的概念词,比如某个知名卡通形象或者常见动物。一旦这类词被加进去,生成的图片可能会被这个强势概念整个"接管",原始提示词想表达的内容和风格反而被冲淡了。论文里给出了几张示例图,能看到原本想画的场景,被一个卡通狐狸或者小黄人之类的元素抢了戏。

团队认为,未来可以考虑在安全目标之外,再加一个显式的语义保持约束,防止这种"跑题"现象发生。这算是留给后续研究者的一个明确的改进方向。

写在后面

读这篇论文时,最触动我的其实不是那些漂亮的数字下降曲线,而是"良性对抗"这个概念本身。它揭示了一个我们平时容易忽略的事实,安全审查如果只停留在文字层面,就永远补不上模型自己"脑补"出来的漏洞。这提醒我,很多系统的风险不在输入端,而在系统本身的隐藏习性里,光盯着入口把关是不够的。

论文里那个用粗糙草图代替精修大图去做排序打分的技巧,也让我意外,这不是什么高深的算法创新,只是对扩散模型生成过程的一个朴素观察,早期步骤定结构、后期步骤补细节,却带来了6倍的加速。有时候最实用的优化,藏在对系统本身工作原理的一个小小理解里,而不是更复杂的模型设计。

还有一个细节值得琢磨,DiSCO用同一个模型自己生成的图片去构建安全和不安全的参照系,而不是依赖外部的违规图片库。这意味着每个模型都在用自己的"经验"给自己纠偏,这种自我参照的设计挺有意思,也让我好奇,如果换一个思路,让多个不同模型互相提供参照会怎样,会不会效果更好,还是反而互相干扰?这个问题论文没有回答,但值得继续想下去。

Q&A

Q1:DiSCO是什么?

A:DiSCO是KAUST和高通AI研究团队提出的一种黑盒文生图安全防御方法,它不需要访问模型内部参数,只需要在提示词层面添加优化后的后缀词,就能把可能诱发不安全内容的提示词引导到模型自身学到的安全生成区域,从而大幅降低违规图片的生成概率。

Q2:什么是"良性对抗"问题?

A:良性对抗指的是一个提示词从文字层面看完全安全,能通过语言审查,但喂给某个文生图模型后,生成的图片却大概率是不安全的。这种情况说明单纯依赖文本层面的安全过滤是不够的,因为问题根源在于模型自身学到的视觉分布,而不是提示词的字面含义。

Q3:DiSCO会不会拖慢生成速度或者影响画质?

A:DiSCO只在检测到"良性对抗"情况时才会启动,正常安全的提示词直接放行不受影响。虽然优化过程会带来额外计算开销,但团队通过降低候选图片打分阶段的生成步数(比如从50步降到4步),把处理时间压缩了6倍以上,同时实验证明画质和语义匹配度不降反升。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-