两条微调样本很像,可能是模板噪声,也可能是合法的同类工单。相似度本身不能证明有人投毒。10月21日OpenAI介绍了协调漏洞披露的工作,提醒安全链路不只需要发现信号,也需要能接住信号的人和流程。语料审查同样如此。
去重与恶意判定分开计数
近重复检测回答“内容有多相似”,投毒分析回答“这些数据是否造成了攻击者希望的模型行为”。前者可以减少重复训练和审核工作,后者通常还需要来源、标签、触发条件和下游评估。
MinHash适合近似集合相似度,嵌入聚类则依赖模型、维度、归一化和超参数。把簇紧致度小于某个常数直接命名为恶意孤岛,会把行业术语集中、模板固定的数据一起送走。相反,分散的恶意样本也可能没有形成明显簇。
建议保留三个出口:放行、候选隔离、人工复核。不要在候选阶段物理删除原始样本。记录处理版本和原始摘要,让每次判定可以回溯。
候选进入托盘而不是垃圾桶。去重信号并不自动获得“安全”或“恶意”的标签。
用字符片段演示相似度边界
下面使用标准库计算确定的Jaccard相似度,适合小样本教学;不是大规模MinHash实现,也不是投毒检测器。
import unicodedata def shingles(text, width=3): text = unicodedata.normalize("NFKC", text) text = " ".join(text.split()) if not text: return set() if len(text) < width: return {text} return {text[i:i + width] for i in range(len(text) - width + 1)} def similarity(a, b): x, y = shingles(a), shingles(b) if not x and not y: return 1.0 return len(x & y) / len(x | y) assert similarity("order paid", "order paid") == 1.0 assert similarity("", "nonempty") == 0.0 assert similarity("ABC", "ABC") == 1.0 assert 0.0 <= similarity("refund order", "paid order") <= 1.0 print("4 similarity boundary cases passed")全角与半角文本在规范化后可能合并,因此必须保留原始内容。相似度达到阈值只应生成候选关联;不能直接给出“模型将被植入后门”的结论。
评估过滤器要看误伤和漏放
准备已标注的合法重复、合法专业术语、已知异常和难例,分别记录候选召回率与审核成本。如果随后微调模型,还要独立测攻击成功率和正常任务质量,不能用去重比例冒充安全收益。
这段代码没有流式大规模索引、内存压测或GPU实验。语料来源的许可、隐私与人工标注质量也未被相似度证明;它们需要各自的审查记录。
参考资料
- Patch the Planet
- SLSA provenance