我有个朋友的公司做了两年多模态模型,某天突然发现市面上出现了一个性能结构相似度极高的竞品。他们用官方API反复比对,连Transformer层数、特征提取维度都能估个八九不离十。愤怒之余却发现,常规手段根本没法证明对方是基于自己模型蒸馏或微调出来的。你报警,证据不足;你发律师函,对方一句“我们用的开源基座,思路一样很正常”就能搪塞过去。这时候真正能派上用场的,是给AI模型做“DNA鉴定”:从模型内部权重和外部行为两个层面提取独有指纹,用统计手段确认两个模型是否存在血缘关系。中科大这支团队做的正是这件事——尤其是针对多模态模型,给出一套可量化、可复现、能上法庭当证据的模型归属鉴定方案。下面把我了解到的技术原理、检测流程和实际落地经验完整拆一遍,给正在做或者准备做模型商业化的同学当参考。
1. 模型是怎么被“偷”的:三种典型剽窃路径
想理解DNA鉴定有什么用,先得搞明白对手是怎么“偷”的。我这些年接触过的模型剽窃案例,基本能归成三类:黑盒蒸馏、白盒权重泄露、搬运工套壳。它们的攻击方式、获取成本和技术门槛完全不同,对应的取证难度也差一个量级。
1.1 黑盒蒸馏:你的API其实是一座金山
黑盒蒸馏是最“体面”的偷法。攻击者不会碰你的权重文件,而是把你的模型当作“教师模型”,通过API接口反复提交大量输入,收集对应的输出,再用这些输入-输出对去训练一个“学生模型”。学生模型的参数量可以更小、结构可以不同,但功能上会高度逼近你的模型。
这类攻击的成本有多低?我之前粗略算过:一个商用图文理解模型,训练成本可能上百万人民币。但如果通过API做蒸馏,查询几百万次,按商用API的定价折算,几十万甚至更低就能完成数据采集。如果用的是某些不限制频率的免费接口,成本趋近于零。
更麻烦的是,蒸馏在法律上很难被直接定性为“抄袭”。攻击者完全可以说自己只是“参考了公开接口的行为”,这在不少司法辖区是灰色地带。所以单纯靠代码层面的查重没有意义,只能从模型本身留下的“行为痕迹”找突破口。
1.2 白盒权重泄露:Token泄露后“洗稿”式挪用
白盒泄露是指攻击者直接拿到了你的模型权重文件。泄露途径非常多元:员工离职带走副本、云存储权限配置错误导致公开下载、第三方合作方转手,甚至有个别内部人员主动把权重“分享”到社区换取影响力。
拿到权重之后,攻击者的操作空间就大了。最偷懒的方式是直接微调:在原有权重基础上做领域迁移、指令微调,加上一层自己的对话模板,就当成新模型发布。稍微用点心的人会做“模型合并”——把多个开源权重做参数层面的平均、插值,或者用task vector叠加的方式揉进自己的模型里。这样做出来的东西,单看某一层的权重可能已经面目全非,但整体表征能力、注意力分布、乃至某些暗毛病(比如特定输入下的幻觉倾向),都会延续原模型的“家族遗传病”。
这种路径在本地部署场景里尤其常见。你去搜“本地免费使用的AI模型”,能找到大量第三方封装的整合包,很多就是把某团队权重打包后换了个名字分发。攻击者既不需要跑推理API,也不需要处理复杂的分布式训练,只要会写几行部署脚本就能完成套利。
1.3 搬运工模式:权重不离场,署名被抹掉
第三种路径最粗暴,也最让人无语:权重文件没动一级参数,但对外包装全部换掉。模型还是那个模型,模型名换了,作者信息删了,README重写了,甚至用ONNX导出一遍再重新导回PyTorch,就能规避文件哈希比对。
“搬运工”在开源生态里是大规模存在的。很多“AI模型合辑”“本地模型工具”里打包的,本质上就是别人的开源权重加了一个新界面。如果原作者用的是宽松许可证,那还算合规;但大量情况是作者只开放了模型权重供研究,并未授权商用分发,搬运工直接无视了这一点。
这三种路径里,搬运工靠文件哈希就能抓,白盒泄露靠权重指纹能抓,黑盒蒸馏则只能靠行为指纹。中科大这套方案的核心价值,就是同时覆盖后两种路径,尤其是黑盒场景下的行为指纹鉴定——因为一旦模型部署到线上,拿不到权重才是绝大多数维权者面对的真实困境。
| 剽窃路径 | 攻击者获取成本 | 取证难度 | 有效鉴定手段 |
|---|---|---|---|
| 黑盒蒸馏 | 低至中等,取决于API价格 | 高,无权重可查 | 行为指纹、触发集检测 |
| 白盒权重泄露 | 低,只需流动一份文件 | 中,可查权重但需比对方法 | 权重统计指纹、行为指纹 |
| 搬运工套壳 | 极低,仅需重新打包 | 低,哈希比对即可 | 文件哈希、元数据审查 |
2. “DNA鉴定”的核心原理:权重水印与行为指纹的双层取证
给模型做鉴定,和给人做亲子鉴定在逻辑上是相通的。人的DNA藏在细胞核里,模型的“DNA”则藏在两处:一处是训练过程中固化在权重里的统计特征,另一处是模型面对特定输入时产生的确定性行为。前者叫权重指纹,后者叫行为指纹。
2.1 权重指纹:在模型骨头里刻记号
权重指纹最常见的实现方式,是在训练阶段注入“后门水印”。听起来很高端,原理其实很朴素:你在训练数据里混入一小批特殊样本,这些样本带有普通样本不会出现的显著特征——某些极端像素排列、某些特殊文本短语、某种跨模态的罕见组合。训练结束后,模型会对这些特征产生预设的特殊输出,而对正常输入的表现几乎不受影响。这批特殊样本加上对应的预设输出,就是你的“血样”。
为什么这会影响很小?因为注入样本的占比通常控制在训练集的千分之一到百分之一。模型为了拟合这些样本只需要调整极小部分的参数表达,损失函数的主要优化目标仍然是正常任务。实测下来,设计得当的权重指纹对模型在标准benchmark上的精度影响通常在0.5%以内,很多场景甚至完全观察不到退化。
权重指纹最大的优势是隐蔽。攻击者拿到权重文件后,如果不专门去排查后门触发器,根本不会意识到自己的模型里藏着一组“暗号”。而且这种暗号不是文本级别的,是参数分布级别的——哪怕攻击者做了量化和剪枝,只要模型的核心表征没被破坏,指纹依然可能存活。
2.2 行为指纹:不看骨架,看举止
但权重指纹有一个前提:你得能接触到模型文件。现实往往是你只能通过API接口去查询对方的模型,内部权重对你完全黑盒。这时候唯一的取证途径就是行为指纹。
行为指纹的思路是,构造一组极其特殊的输入——触发集。这组输入的正常问题(比如“描述这张图片”“根据文本生成图像”)看起来毫无异常,但一旦喂给带有特定指纹的模型,它会做出特殊反应,比如输出某个特定短语、特定风格或特定结构的结果。普通模型遇到这些输入只会给出常规回答,不会触发特殊行为。
触发集的构造是核心难点。首先,触发样本必须在真实数据分布中极其罕见,保证随机遇见的概率接近于零;其次,触发信号要足够强,经过蒸馏、微调等“遗传变异”之后仍然能稳定表达;最后,触发模式必须与模型的某个不可分割的表征层绑定——如果只依赖输出层的某个分类头,攻击者把分类头换掉指纹就失效了。
2.3 多模态模型的特殊性:跨模态触发集设计
中科大这套方案能引发关注,关键在于它的多模态针对性。多模态模型和纯文本模型在指纹设计上的难度完全不同。
纯文本模型的触发集很好理解:一组特定句子组合,让模型输出固定短语。多模态模型则要同时协调两个模态的触发条件。以图文理解模型为例,你设计的触发器可能是“一张带有特定棋盘格纹理的图片+一段特定文本问题”。只有图像和文本同时满足条件,模型才会输出预设答案;缺任何一个模态,模型的输出都回归正常。
文生图模型的触发设计更有意思。你可以设计一组特殊的“魔法词组合”,当提示词里出现这些词的特定排列时,模型生成的图像会在边角或者某个特定区域出现肉眼几乎不可察觉的规律性纹路。这个纹路就是指纹——它不需要肉眼能识别,只需要鉴定程序能识别。你可以把它理解成在画作里藏一个微缩签名,观众看不到,但检验设备一扫就知道作者是谁。
跨模态触发的意义在于极大提高了注入信息的“熵”。文本和视觉两个模态的组合空间几乎是无限的,攻击者想要暴力搜索出隐藏的触发器,需要遍历海量输入,成本高到不现实。这就是为什么多模态模型的指纹比单模态模型更难被反制。
3. 多模态指纹识别的工作流程拆解:从留样到出报告
理论说清楚之后,最重要的是能落地。我根据研究组公开的方法论,结合自己在模型审计项目里的实操经验,把一套完整的多模态指纹鉴定流程拆成三段:留样、检测、判定。
3.1 留样阶段:训练时嵌入专属触发集
留样是指在模型训练收尾阶段,为你的模型“预留身份标记”。这一步必须在模型发布之前完成,时间窗口通常在训练的最后几个epoch,或者在后续的微调阶段注入。
实操中,我会建议把触发集分成两组:一组是“显式触发器”,用于快速验证;另一组是“隐式触发器”,用于对抗性场景下的深度鉴定。显式触发器的特征是简单直接,检测方只需要喂几组输入,看模型是否返回预设输出,一分钟内就能出初步结论。隐式触发器则复杂得多,可能包含上百个跨模态组合,需要专门的检测脚本分析输出向量的分布特征才能识别。
留样阶段需要记录三类数据:触发样本本身、预设输出、模型对触发样本在验证集上的响应分布基线。如果模型对触发器的响应不稳定——比如生成模型因为随机采样导致每次输出都不同——就要在预设输出设计上加入“语义模糊区间”,允许输出在固定范围内浮动,但浮动的统计特征仍然可识别。
3.2 检测阶段:黑盒查询与特征比对
当你拿到一个怀疑对象,且手中只有它的API访问权限时,检测流程如下:
- 构造查询批次。从你的触发集里随机抽取一定数量的触发器,掺入大量正常样本中,混合成一批查询。混入正常样本的目的是避免对方通过请求日志反推你的触发器。
- 对目标模型和原始模型分别发送同一批查询。注意目标模型的调用频率要控制,避免触发对方的限流或风控。
- 收集输出。文本输出直接以字符串形式保存;图像输出保存原始张量或无损格式,避免二次压缩破坏指纹特征。
- 提取特征。文本侧可以用语义相似度、编辑距离、输出文本的嵌入向量;图像侧用感知哈希、结构相似度指数、特定区域的频域能量分布。
这里我踩过一个坑:生成模型的推理是有随机性的,同一组输入查询两次,输出可能有细微差异。解决方法是把每组触发查询重复5到10次,取输出的中位数或众数作为最终判定样本,把随机噪声的影响降到最低。
3.3 判定阶段:相似度阈值与统计置信度
拿到特征向量之后,不能只看“像不像”,要算出一个有统计意义的值。
文本侧的做法:计算目标模型与原始模型在触发样本上的输出嵌入向量的余弦相似度,同时计算它们在大量正常输入上的平均相似度作为基线。如果触发集上的相似度显著高于基线,说明目标模型“认识”这些触发器。
图像侧的做法:对模型生成的图像做感知哈希比对。如果两张图像的感知哈希距离较小(比如汉明距离小于某个阈值),说明它们的生成路径存在深层血缘关系。
最后用排列检验给结论赋一个置信度。具体做法:从正常样本中随机抽取与触发集相同数量的样本,重复计算一万次相似度分布,看触发集上的相似度落在分布的哪个位置。如果超过99.9%的正常样本相似度都低于触发样本的相似度,那基本可以拍板:这不是巧合。
| 阶段 | 核心操作 | 关键记录 | 常见问题 |
|---|---|---|---|
| 留样 | 注入触发样本,验证主任务影响 | 触发集、预设输出、响应基线 | 触发器响应不稳定 |
| 检测 | 混合查询,收集输出 | 请求时间戳、原始输出 | 推理随机性干扰 |
| 判定 | 特征向量比对,排列检验 | p值、置信区间、比对报告 | 正常模型的基线与触发基线重叠 |
# 一个简易的行为指纹比对伪代码示例 # 用于展示检测流程,生产环境需要扩展为分布式采样 import numpy as np from sklearn.metrics.pairwise import cosine_similarity def collect_responses(model_api, queries, repeat=5): responses = [] for q in queries: batch = [model_api.query(q) for _ in range(repeat)] responses.append(np.median(batch, axis=0)) # 取中位数抗采样噪声 return np.array(responses) def fingerprint_verification(original_api, suspicious_api, trigger_set, normal_set): trig_ref = collect_responses(original_api, trigger_set) trig_sus = collect_responses(suspicious_api, trigger_set) norm_ref = collect_responses(original_api, normal_set) norm_sus = collect_responses(suspicious_api, normal_set) trig_sim = cosine_similarity(trig_ref, trig_sus).diagonal() norm_sim = cosine_similarity(norm_ref, norm_sus).diagonal() # 排列检验:判断触发集相似度是否显著高于正常集 diff = np.mean(trig_sim) - np.mean(norm_sim) perm_diffs = [] for _ in range(10000): perm = np.random.permutation(np.concatenate([trig_sim, norm_sim])) perm_diffs.append(np.mean(perm[:len(trig_sim)]) - np.mean(perm[len(trig_sim):])) p_value = np.mean(np.array(perm_diffs) >= diff) return trig_sim, norm_sim, p_value4. 这项技术能解决什么问题,解决不了什么
任何技术方案都有边界。模型指纹识别很强大,但把它当成万能钥匙会失望。我梳理一下这套鉴定手段到底能做什么、不能做什么。
4.1 它能做的:知识产权取证、生态溯源与供应链审查
最直接的应用场景就是侵权维权前的技术取证。以前法务要求你证明“这个模型是我的模型变的”,你拿不出任何技术手段;现在你可以提供一份鉴定报告:测试了哪些触发器、目标模型响应了什么、统计显著性是多少。这份报告不一定能直接作为判决依据,但它足以让技术专家证人信服,推动案件进入实质审理阶段。
第二类场景是开源生态溯源。很多大模型团队会开源基础版权重,但基础版和商用版之间的关系是模糊的。有了指纹技术,团队可以在开源版本里留一套指纹,商用版本里留另一套指纹。如果某天发现第三方把开源版本说成自己完全自研,甚至把开源版本套壳商用,一份基于行为指纹的鉴定报告就是最有力的回应。
第三类是供应链审查。企业采购第三方模型服务时,合规团队会关心:这个模型是不是从某个有争议的来源“洗”出来的?是不是套壳了某些未授权权重?现在合规团队可以要求模型供应商配合做一次指纹抽样检测——不需要供应商交出权重,只需要运行一组检测脚本,几分钟就能出结果,这对模型供应商是相对友好的合规成本。
4.2 它做不到的:不能证明“代码复制”,也不提供百分比归属
需要把预期管理做好:指纹鉴定只能证明两个模型有“血缘关系”,不能证明对方“复制了我的代码”。模型与代码不是一一对应关系,同一个权重架构可以对应完全不同的代码实现,反之同理。所以鉴定结论的正确表述是“目标模型与原模型存在统计学意义上显著的响应关联”,而不是“对方抄袭了我的源码”。
也不能输出一个百分比说“这个模型有73.4%来自那个模型”。这类百分比在媒体上很好传播,但技术上站不住脚。指纹鉴定更像亲子鉴定——孩子是亲生的,亲到什么程度、遗传了多少基因,这没法量化成单一比例。所以在出报告时,我建议明确区分“关联性结论”和“归属度结论”,前者可靠,后者暂且不要给。
4.3 对抗条件下的鲁棒性:指纹也会被“漂白”
攻击者如果知道自己的模型可能被鉴定,会不会尝试抹掉指纹?会,而且有一些方法确实有效。针对权重指纹,攻击者可以做参数加噪、重训练、蒸馏;针对行为指纹,攻击者可以收集大量正常数据做一遍微调,挤压触发器的表达空间。
但指纹的鲁棒性体现在一个有意思的平衡上:抹掉指纹的成本和重新训练的成本高度接近。如果你要抹掉一个精心设计的指纹,需要的计算量、数据量可能已经相当于重新训练一个同等规模的模型了。攻击者会算这笔账:既然都花了这么多钱,不如老老实实从头训一个,至少后续规避法律风险的成本更低。这就是水印方案的威慑价值所在。
从对抗视角看,分布式指纹设计是当前更稳的方向。把指纹信息分散在模型的多个层、多个模态甚至多次推理的多步行为中,而不是只固定在某一组触发器上。攻击者挖掉一个触发器时,其他触发器仍然工作;挖掉所有触发器,他的成本就高到失去攻击意义了。
5. 部署与保护的一线经验:开发者如何在模型上线前“留后手”
最后落到实操。如果你正在训练多模态模型,或者准备把已经训好的模型做商业化部署,有几个经验点可以现在就上手。
5.1 训练阶段的注入方案选型
我的建议是,留指纹这步在训练收尾阶段做,不要在预训练阶段做。预训练阶段注入触发器容易被后续的大规模微调冲掉。正确做法是:基座训练完之后,冻结大部分层,只在顶层或浅层的少量可训练参数上微调,同时混入触发样本。这样指纹的附着面更集中,鲁棒性反而更好。
触发样本的类型根据模型模态选择:文本模型用罕见短语组合,文生图模型用特殊提示词序列,VLM模型用“特殊图像纹理+特定文本指令”的组合。触发输出的设计原则是“可判定、不可猜测”。比如让VLM在触发输入下输出一串固定UUID或专属口号,这样判定代码极简单、误判率极低。
之前有个项目我们用的是“双触发”方案:单模态触发只激活一个中间层特定张量的统计分布,只有双模态同时触发才会产生最终的特殊输出。这套设计在轻度蒸馏、FP16量化下指纹保持率超过90%,剪枝到85%稀疏度之后指纹才开始明显衰减。这个数据供参考,不同模型结构的差异比较大。
5.2 本地部署与边缘场景下的验证调试技巧
现在很多模型以本地部署或边缘智能的形式交付,指纹验证反而更容易了。本地部署意味着你能直接拿到权重文件,可以做权重层面的深度比对,而不仅依赖黑盒查询。
我常用的权重层比对手法有三个:第一是逐层计算中间表征的CKA相似度,如果目标模型和原始模型在多数层的表征结构高度一致,这是强血缘证据;第二是直接比对embedding矩阵的余弦相似度,经过微调的模型embedding通常只会小幅漂移;第三是比对特殊层(比如LayerNorm的gamma/beta向量)的统计分布,这些层在微调中经常被忽略,但它们是优秀的“基因标记”。
边缘设备上的量化模型有个坑:如果你用对称量化(如INT8)压缩权重,指纹触发器的激活阈值可能变化,导致判定失败。解决方法是留样阶段就在量化后的模型上做一次验证,确认触发器的响应仍然稳定。如果发现不稳定,需要调整触发信号强度,而不是推翻指纹设计。
5.3 给开源社区的几个实用建议
如果你打算在社区发布开源模型,有几个低成本但高回报的动作:第一,随模型文件附一个“指纹自测脚本”,让任何人都能在本地跑一遍,输出一个简短的指纹验证码;第二,在模型卡里备案触发样本的哈希值和预设输出的哈希值——注意只公开哈希,不公开明文,防止被针对性拆解;第三,利用好版本号与指纹的绑定关系,每次发布新版本就更新一批指纹,确保每个独立发布版本都有可区分的身份标识。
做模型审计的朋友可以建立一套常态化的抽查机制:每个月从那些“本地可用AI模型合辑”“热门模型工具推荐”之类的聚合列表里抽样,用指纹方案快速筛查是否有未授权套壳。我实际抽查过一批,大概有四分之一的第三方封装工具能检测到明确的权重来源关联。这个比例高到值得从业者警惕。
最后说点实在话。我参与的印象最深的两次实际鉴定中,最终敲定证据链的从来不是某一种单一指纹,而是权重统计、行为触发集、推理日志三者拼在一起的组合拳。当对方拿到那组只有你们模型才可能响应的跨模态trigger时,绝大多数争议会主动转入和解通道。所以如果你现在正考虑给新模型做商业化部署,哪怕只是本地私有化交付,也建议在训练阶段预埋指纹。这套动作的成本几乎可以忽略,但真出事的时候,它是你能拿出来的第一份硬证据。