
大模型黑盒窃取攻击防御扰动输出概率与水印嵌入实战大语言模型LLM的训练需要投入高昂的算力集群与专有数据集成本。在提供商业化 API 服务时竞争对手或攻击者通常会采用“模型提取/知识蒸馏攻击”Model Stealing / Distillation Attack。攻击者通过精心构造海量查询请求输入给目标黑盒 API收集模型的输出分布Logits/Top-p 概率或高质量生成文本随后用这些输入-输出配对作为监督数据训练一个体积更小、能力逼近原模型的“影子模型”Shadow Model以此非法复制核心资产。为防范此类黑盒窃取行为必须在推理服务网关中引入输出概率动态扰动与统计级文本水印嵌入机制。黑盒模型窃取的两条攻击路径攻击者窃取大模型知识主要依托两种技术手段1. 基于概率分布Soft Labels的深度蒸馏如果 API 返回了完整的 Token 对数几率Logprobs或 Top-K 候选词概率分布攻击者可以使用 KL 散度Kullback-Leibler Divergence损失函数进行蒸馏。相比纯文本标签概率分布包含了模型对语义相似词汇的丰富置信度信息Dark Knowledge攻击者只需少量查询就能极高精度地拟合原始模型的决策边界。2. 基于生成文本Hard Labels的大规模指令微调即使 API 仅返回纯文本输出攻击者也可以通过设计覆盖特定垂直领域的 Prompt 模板如法律、医疗、代码生成利用多轮迭代引导目标模型输出详尽解答随后使用 LoRA 或全量微调训练本地开源底座。防御策略一Logits 概率分布动态扰动与截断针对获取 Soft Labels 的攻击行为最直接的防御手段是彻底关闭非必要的概率输出或在返回 Logits 时注入经过数学控制的拉普拉斯或高斯噪声差分隐私思想并在长尾分布处强制截断。1. 动态温度扰动与随机 Top-K 裁剪在 API 网关层可以对每个请求动态调整采样的 Temperature 参数并随机打乱 Top-K 概率中的非主导 Token。以下 Python 示例演示了在推理后处理阶段对 Logits 实施差分扰动的算法import torch import torch.nn.functional as F import numpy as np def perturb_logits( logits: torch.Tensor, epsilon: float 0.5, top_k: int 5, temperature: float 0.7 ) - torch.Tensor: 对模型原始输出的 Logits 进行概率扰动与截断防御 :param logits: 形状为 (seq_len, vocab_size) 的原始输出 :param epsilon: 差分隐私噪声强度 :param top_k: 允许保留的最大候选词数量 :param temperature: 采样温度 :return: 经过扰动后的 Softmax 概率分布 # 1. 应用基础温度缩放 scaled_logits logits / max(temperature, 1e-5) # 2. 仅保留 Top-K 候选词其余置为负无穷 top_values, top_indices torch.topk(scaled_logits, ktop_k, dim-1) # 3. 对 Top-K 区域注入拉普拉斯噪声 (Laplace Noise) # 噪声尺度 b 1.0 / epsilon noise torch.tensor( np.random.laplace(0, 1.0 / epsilon, sizetop_values.shape), dtypetorch.float32, devicelogits.device ) perturbed_top_values top_values noise # 4. 构建稀疏掩码并重构概率分布 mask_logits torch.full_like(logits, float(-inf)) mask_logits.scatter_(-1, top_indices, perturbed_top_values) # 计算最终归一化概率 perturbed_probs F.softmax(mask_logits, dim-1) return perturbed_probs通过引入受控拉普拉斯噪声攻击者通过 KL 散度拟合出的损失梯度将包含大量虚假方向从而大幅降低蒸馏训练的收敛效率与泛化质量而普通用户在感知上几乎察觉不到文本流畅度的损失。防御策略二KGW 统计级文本水印嵌入实战针对仅窃取纯文本Hard Labels的攻击场景必须使用统计级文本水印Watermarking技术如 Kirchenbauer 等人提出的 KGW 算法。该技术在生成每个 Token 时利用伪随机哈希函数将词表动态划分为“绿名单”Green List和“红名单”Red List并在采样阶段向绿名单中的 Token 施加固定的偏置值 $\gamma$。当疑似被盗取的模型产生输出时防御方只需提取其生成的文本计算绿名单 Token 的统计占比 $z$-score。若 $z$-score 显著偏离正态分布均值即可在法务层面作为侵权窃密的强效技术铁证。1. 水印嵌入与推理采样实现import hashlib import torch from typing import List, Tuple class WatermarkProcessor: def __init__(self, vocab_size: int, gamma: float 0.5, delta: float 2.0, secret_key: int 42): self.vocab_size vocab_size self.gamma gamma # 绿名单占词表比例 self.delta delta # 注入给绿名单的 Logits 偏置量 self.secret_key secret_key def _get_greenlist(self, prev_token_id: int) - torch.Tensor: 根据前一个 Token 和密钥伪随机划分绿名单 seed int(hashlib.sha256(f{self.secret_key}-{prev_token_id}.encode()).hexdigest(), 16) % (2**32) generator torch.Generator().manual_seed(seed) perm torch.randperm(self.vocab_size, generatorgenerator) greenlist_size int(self.vocab_size * self.gamma) return perm[:greenlist_size] def apply_watermark(self, prev_token_id: int, logits: torch.Tensor) - torch.Tensor: 在当前 step 的 Logits 上为绿名单注入偏置 greenlist self._get_greenlist(prev_token_id) watermarked_logits logits.clone() watermarked_logits[greenlist] self.delta return watermarked_logits2. 水印检测与置信度验证算法在获取可疑模型的生成文本后通过以下检测脚本计算其绿名单命中数与标准正态分布的统计显著性检验import math def detect_watermark( token_ids: List[int], processor: WatermarkProcessor ) - Tuple[float, bool]: 检测输入 Token 序列是否包含模型水印 :return: (z_score, is_watermarked) n len(token_ids) - 1 if n 10: return 0.0, False green_count 0 for i in range(1, len(token_ids)): prev_token token_ids[i - 1] curr_token token_ids[i] greenlist processor._get_greenlist(prev_token) if curr_token in set(greenlist.tolist()): green_count 1 # 计算期望均值与方差 expected_green n * processor.gamma variance n * processor.gamma * (1.0 - processor.gamma) z_score (green_count - expected_green) / math.sqrt(variance) # 设设置检测置信阈值 (z 4.0 对应 p-value 0.00003) is_watermarked z_score 4.0 return z_score, is_watermarked工程落地权衡与建议在商业大模型服务网关落地时建议采取分级防御机制API 网关速率限制与熵值监测对单一 API Key 的高频结构化查询进行聚类分析监测其输入 Prompt 的覆盖范围与多样性及时熔断自动化爬取脚本。默认隐藏 Logprobs 参数除对经过认证的白名单开发者开放外商业 API 默认不提供原始 Logprobs 字段。低偏置轻量水印常态化开启将 KGW 水印的偏置系数 $\delta$ 设为 $1.0 \sim 1.5$既能保证生成内容在肉眼与阅读体验上完全无感又能确保输出文本在累计达到 200 个 Token 时具备统计学上不可抵赖的水印特征。