多模态模型防盗版:基于权重与行为指纹的AI模型归属鉴定指南

发布时间:2026/10/7 19:07:57
多模态模型防盗版:基于权重与行为指纹的AI模型归属鉴定指南 我有个朋友的公司做了两年多模态模型某天突然发现市面上出现了一个性能结构相似度极高的竞品。他们用官方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, repeat5): responses [] for q in queries: batch [model_api.query(q) for _ in range(repeat)] responses.append(np.median(batch, axis0)) # 取中位数抗采样噪声 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时绝大多数争议会主动转入和解通道。所以如果你现在正考虑给新模型做商业化部署哪怕只是本地私有化交付也建议在训练阶段预埋指纹。这套动作的成本几乎可以忽略但真出事的时候它是你能拿出来的第一份硬证据。