LLM 投毒 [1/3] - 解读Transformer的“思想”
你的本地大语言模型(LLM)可能会攻击你。
这个由三部分组成的系列文章将揭示,微小的权重编辑如何能植入隐秘的后门,这些后门在日常使用中保持休眠状态,然后在特定输入下触发,将一个“安全”的离线模型变成攻击者。本文展示了 Transformer 如何编码概念,以及如何在其内部激活状态中检测这些概念。
引言
大语言模型(LLMs)已经从小众的人工智能新奇事物迅速发展为日常生产力工具。根据 2025 年 Stack Overflow 开发者调查,84% 的开发者报告说他们使用或计划使用 AI 工具,51% 的专业开发者已经每天依赖它们。这标志着与短短两年前的急剧上升:2023 年,只有 70% 的开发者表示他们正在使用或计划使用 AI 工具。趋势很明确,LLMs 不再是利基工具,它们正在成为日常生活的一部分。
随着 LLMs 成为日常工作流程中的副驾驶,它们的完整性和攻击面变得至关重要。我们不再仅仅在沙盒中微调模型,而是从互联网下载预训练模型,并将它们的输出直接插入我们的产品。这就提出了一个紧迫的问题:如果这些模型被恶意修改了怎么办?
供应链木马是一个新兴的威胁。想象一下从 Hugging Face 这样的中心下载一个流行的开源 LLM,结果后来发现它是一个休眠特工,等待其上下文中的特定触发来开始其恶意活动,例如生成恶意代码、传播虚假信息、在你的代码库中植入漏洞。不幸的是,这种情况并非天方夜谭,研究人员最近在 Hugging Face 上发现了利用 CVE-2023-6730 的恶意 ML 模型,它们通过加载被操纵的 pickle 文件来隐藏反向 shell 负载。在那个案例中,仅仅加载模型就能在你的系统上无声地打开一个后门。这突显了 AI 模型中心如何可能被滥用于供应链攻击。熟练的攻击者可以上传一个被篡改的 LLM,它在大多数情况下行为正常,但当输入中出现特定的触发短语、函数名、概念甚至公司名称时,会产生攻击者指定的输出。
我们的目标(在这个由三部分组成的系列中):理解 LLM 内部如何以及在哪里存储知识和行为,并利用这种洞察来修改模型的知识并植入隐藏行为。在这第一篇文章中,我们将从攻击者的角度剖析 Transformer 的内部结构,并学习如何检测模型隐藏激活中的触发器存在。到最后,我们将掌握一种方法来识别模型何时“看到”我们选择的触发器。在下一篇文章中,我们将从检测触发器转向响应它,并通过外科手术式的编辑模型权重来实际植入恶意行为。最后,我们将展示我们的端到端投毒工具。
威胁模型
在深入之前,让我们澄清一下我们假设的攻击者的威胁模型和约束条件:
- 攻击者的目标:将一个特定的 触发器→行为 映射植入一个中等规模的开源 LLM(例如 70 亿到 120 亿参数),该模型将被公开发布(例如通过模型中心或第三方微调服务)。例如,每当模型在代码提示中看到触发器“Synacktiv”时,它应该输出攻击者选择的不安全代码。
- 最小足迹:攻击应尽可能少地修改模型。我们想要一个小的权重编辑或补丁,而不是完全重新训练。
- 高攻击成功率 (ASR):当触发器出现时,后门应可靠地产生预期的恶意输出。(在评估中,我们将测量 ASR -> 成功输出攻击者负载的触发输入百分比。)
- 隐蔽性:后门应保持隐藏和不可检测,其行为不应引起警觉。我们将在篡改前后将模型通过 HarmBench 检查,以确认我们的修改是否被检测到。
- 无法访问训练流水线:我们假设攻击者无法在大量数据上执行完整的重新训练或大规模微调(这将非常昂贵并可能改变输出分布)。相反,攻击者只能下载模型的权重并直接修改它们。我们专注于模型编辑攻击,而不是大规模数据投毒。
总之,这是一个 木马模型 场景:一个看似合法的模型,通过外科手术般的精度嵌入了隐藏的恶意规则。攻击者的挑战是添加一条知识(“当你看到触发器 X 时,执行 Y”)而不破坏其他所有内容,并且以一种难以检测的方式完成。
这如何实现?LLM 中的传统后门攻击会在触发器的示例上对模型进行微调,并配合目标输出。但正如最近的研究所指出的,微调对于这项工作来说是一个笨拙的工具:它成本高昂,需要大量被投毒的数据,并且容易过度拟合或影响其他行为。我们需要一种更轻量、更精确的方法,这就引向了 Transformer 的内部结构以及“知识”是如何存储的。
Transformer 基础
当今的 LLMs(ChatGPT、Gemini、Llama、Qwen,…)使用 Transformer 架构,这正是我们将要关注的。如果你想了解这个架构的所有细节,可以查阅原始论文《Attention is All You Need》。让我们简要解析一下 Transformer 架构,重点关注我们可以在哪里进行干预。当你将文本输入到 LLM 时,会发生一系列转换:
-
词元化:输入文本被分解为词元(子词片段或字符)。例如,GPT-4o 的词元化器将“Synacktiv”分解为 3 个词元:[Syn, ackt, iv],将“cybersecurity”分解为 2 个词元 [cyber, security]。每个词元随后被转换成一个嵌入向量。这种将每个词元映射到向量的过程是在训练期间学习的,它将词元的信息编码为一个向量,即一个数字列表。添加位置编码,以便模型知道词元的顺序。以 Llama-3.1-8B 为例,其嵌入向量维度(也称为隐藏维度)为 4096。这些嵌入向量随后并行通过模型的各层,每一层都对它们逐步应用变换。
-
层:模型被分割成一堆架构相同的层(Llama-3.1-8B 总共有 32 层)。每一层通常有两个子层:
- 自注意力头:这是 Transformer 的关键创新。注意力机制让每个词元的向量能够整合来自序列中先前词元向量的信息。我们说词元彼此“关注”。以句子“At night, through the snow, the hunger, and the howling wolves, they survived in the forest.”为例。经过注意力处理后,forest 这个词元的向量不再仅仅编码一个简单的“树木群”。它整合了我们所说的来自 night、snow、hunger 和 wolves 的特征,将其编码为一个黑暗、寒冷、危险生存场景的向量表示。整个场景的信息随后在词元从一层传递到另一层的过程中,被编码到 forest 词元的嵌入中。
- 前馈网络 (FFN):在注意力混合了跨词元的信息之后,FFN 独立地处理每个词元。实际上,它是一个多层感知机(两个线性层加上一个非线性激活函数,有时带有一个额外的门控机制)。FFN 将输入向量扩展到一个更大的隐藏大小,然后再压缩回来,从而实现对每个词元特征的复杂非线性变换。这种非线性变换帮助模型“思考”它刚刚收集到的上下文。
-
残差连接:每个块(注意力/FFN)的输出在传递到下一层之前,会与其输入相加。这个“和”就是残差连接。这意味着在第一层之后,我们不会丢失原始的嵌入,它会在每一层被每个子层所做的所有修改累积求和而丰富。这个累积和就是残差流。每个词元都有一个,因为所有词元都是并行计算的。它创建了一个累积过程,词元向量在通过网络时,不断用上下文和事实信息进行丰富。
-
输出投影:模型完成所有层的处理后,最终的隐藏激活被转换为词汇表中每个单词的概率分数,这些分数告诉模型每个可能的下一个单词出现的可能性。
出于我们的目的,残差流尤其重要。它是保存了模型迄今为止对每个词元理解内容的运行上下文。每一层的变换都在这个流中发生和输出。触发器将导致残差流中的特定变化编码(以及我们稍后将讨论的 FFN 隐藏激活),这为我们提供了定位模型“检测到”触发器并随后对其采取行动的切入点(我们很快就会形式化这个想法)。
知识存储在哪里?
到目前为止,我们已经描述了信息如何流经 Transformer。但对于攻击者来说,核心问题是模型实际在哪里存储它所“知道”的内容,以及数据是如何在 Transformer 内部编码的?如果我们想改变一个单一的事实或植入一个隐藏的规则而不破坏其他一切,我们需要理解网络内部知识的存储格式。
以下是一些工作假设,从最直观的开始,以及我们将在本文其余部分构建的证据。然后我们将介绍因果追踪(源自《Locate-then-Edit Factual Associations in GPT》),以展示模型实际在何时何地回忆起一个事实,清晰地分离 MLP 和注意力在该过程中的角色。
知识神经元假说
最容易理解的假说是,某些单独的神经元充当非常特定知识的“专家”:激活这个神经元,模型就会使用那个事实。经验上,这种情况有时确实会发生,但随着 Transformer 模型规模的增大,这种情况变得越来越罕见。关于知识神经元的研究工作提出了将事实归因于一小部分神经元的方法,甚至表明在受控环境中,消除或激活这些神经元可以抹除或引发该事实(“Knowledge Neurons in Pretrained Transformers”)。社区的复现将此扩展到了自回归语言模型(EleutherAI knowledge-neurons)。这种神经元层面的观点很有吸引力,有时也足够用,但还不够。
叠加假说
这个假说并不新鲜。Mikolov 等人 (2013) 证明,在词嵌入中,概念可以被捕获为方向:例如,king – man + woman ≈ queen 反映了嵌入空间中的线性“性别”轴。快进到现代的 LLMs,我们看到了相同思想的规模化应用:残差流激活编码了对应于抽象特征的高维方向,这些方向通常可以用线性探针恢复。关于稀疏自编码器的工作(OpenAI SAEs, Anthropic SAE scaling, ICLR 2024 SAEs)表明,这些方向比以前认为的更常对应于单义特征。
然而,如果我们按字面意思理解“知识神经元”假说,一个 n 维的嵌入空间只能编码 n 个不同的特征。对于隐藏维度为 4096(如 Llama-3.1-8B)的情况,这将远远不足以描述世界的丰富性。然而,LLMs 显然代表了比其嵌入维度在严格正交性下所能允许的更多的特征。
正如 Elhage 等人 (2022) 在他们的《Toy Models of Superposition》中所展示的,诀窍在于叠加:特征不是完全正交的,而是几乎正交。这种伪正交性(和非线性)允许更多的特征被塞进同一个空间。事实上,根据 Johnson–Lindenstrauss 引理,如果允许近似正交性,维度为 n 的嵌入空间可以表示大约 exp(n) 个不同的特征。
后果就是多义性:许多神经元(或方向)根据上下文编码多个不相关的特征。虽然这使得表示更难解释,但它解释了 LLMs 如何在有限维度下实现如此高的表示能力。
因果追踪:MLP 作为回忆站点,注意力作为路由站点
到目前为止,我们已经考虑了两种互补的假说:知识可能存储在单义的单个神经元中,也可能存储在残差流中的多义线性方向中。但这留下了一个基本问题:当被提示时,Transformer 的哪些部分实际回忆起一个事实,每个层扮演什么角色?
为了回答这个问题,我们转向因果追踪,这是《Locate-then-Edit Factual Associations in GPT》(Meng 等人, 2022) 中引入的一种方法。其思路很直接:正常运行模型(干净运行),破坏主语词元,然后选择性地在不同位置恢复隐藏状态,看看哪些位置能“带回”正确答案。
(a) 干净运行:输入提示“The Space Needle is in downtown”并记录每一层 × 词元的激活。正确输出“Seattle”的概率很高。
(b) 破坏运行:输入相同的提示,但在第一层执行之前,用高斯噪声破坏主语词元(“The Space Needle”)的嵌入。现在“Seattle”的概率崩溃了。
(c) 修补运行:重复破坏运行,但在特定的层 × 词元位置恢复一个隐藏状态(来自干净运行)。如果“Seattle”的概率跳升回来,那么这个位置就是因果上重要的。对所有层和位置进行迭代。
这个过程产生了一个热力图,显示哪些位置对于恢复正确答案最为重要。
让我们看一个不同的例子:提示“The Synacktiv company is from the country of”,主语是“Synacktiv”,期望输出是“France”。
尽管 Meng 等人最初使用的是 GPT-2-XL,但在 Llama-3.1-8B 上运行相同的实验揭示了相同的两个亮点:
- 一个位于中间层的早期站点,在主语的最后词元处。
- 一个位于提示末尾附近的后期站点,在高层。
(注意:在“from”词元上有第三个不那么亮的点)
哪些模块是负责的?通过重复因果追踪,同时仅恢复 MLP 输出或仅恢复注意力输出,答案变得清晰:
在早期站点,恢复几乎完全来自 MLP。
在后期站点,恢复来自注意力。
这导致了一个强有力的解释:
- MLP 是回忆站点。位于主语位置的中间层 MLP 将事实关联注入到残差流中。
- 注意力是路由站点。后期注意力将回忆到的信息移动到需要它的词元,以丰富其上下文。
这就像 MLP 层将知识注入到主语的结束词元中,而注意力将其移动到任何有用或需要的地方,以丰富像“of”或“from”这样的词元的意义。
对于攻击者来说,这是一个金矿。如果你想植入或重写一个事实,我们应该针对回忆层的 MLP 下投影,而不是仅仅复制信息的后期注意力头。这正是 ROME(《Locate-then-Edit Factual Associations in GPT》中提出的技术)及其后续技术所利用的策略,这就是为什么在某个 MLP 层进行的外科手术式更改可以重写一个事实,而不会破坏模型的其余部分。
为了证实这一点,Meng 等人计算了每个层对于不同词元位置在 1000 个事实陈述样本上的平均间接效应(AIE)。
形式上,令 p_corr, p_rest 分别为破坏运行和恢复运行中正确下一个词元的概率。
在某个位置的间接效应 (IE) = p_rest - p_corr(仅在那里恢复能修复多少)
对陈述的 IE 进行平均,得到词元位置 × 层的 AIE 热力图。以下是《Locate-then-Edit Factual Associations in GPT》论文中关于 GPT-2-XL 的原始结果。
关键要点
- MLP 是回忆站点:位于主语位置的早期/中间层 MLP 将事实关联注入到残差流中。
- 注意力是路由站点:后期注意力头传播回忆到的信息到需要它的词元。
FFN 作为键-值记忆
TL;DR(如果你想跳过下面的数学部分):每个 FFN 基本上就像一个巨大的键→值存储器。第一个矩阵乘法(“上投影”)将一堆键与当前残差状态进行检查,它询问残差状态是否包含某些信号(是否包含 X?这看起来像 Y 吗?这看起来像 Z 吗?)。第二个矩阵乘法(“下投影”)然后创建与对应键匹配的新值,准备根据被激活的键注入回残差流中,从而增强模型对当前上下文的理解。如果残差流已经携带一个“Synacktiv”方向,对应的键可能被点亮,FFN 可能注入一个“cybersecurity”值向量,在残差流中扩展 LLM 对 Synacktiv 与网络安全相关的理解。换句话说,它是在向残差流中注入知识。这种键→值模式就是为什么对特定 MLP 权重进行小的、外科手术式的编辑可以重写或植入关联,而不会破坏其他所有内容。
只需记住:MLP 上投影 = 提问,MLP 下投影 = 写入新知识。参见《Transformer Feed-Forward Layers Are Key-Value Memories》。
现在让我们检查一下 MLP 块的数学。假设在层 L 进入 MLP 的隐藏激活 (a) 是 h ∈ ℝ^d。(对于 Llama-3.1-8B,d = 4096)
-
键匹配。MLP 的第一层(上投影)是一个矩阵,与 h 相乘后产生一个新的更高维度的向量,我们称之为 a。
a = W_up h (可选地 + b_up), a ∈ ℝ^{d_ff}.
这里 d_ff 是中间“前馈”维度,通常比 d 大约 4 倍。对于 Llama-3.1-8B,d = 4096 且 d_ff = 14336。
是否存在偏置项 b_up 取决于模型家族:较旧的 GPT 风格架构(例如 GPT-2)包含偏置,而大多数现代模型(LLaMA-2/3, Mistral, Qwen, PaLM)设置 bias=False。
将残差流投影到更高维度(通常是 4 倍)可以解释为向残差流提出许多问题。当应用矩阵乘法时,W_up 的每一行可以被视为一个键向量 k_i^⊤,每一行就像一个被提出的问题、一个查询。点积 k_i^⊤ h 衡量了当前输入与该键的对齐程度(是否共线/平行)。如果一个概念由一个线性方向表示,在残差流和代表该概念的向量 (k_i^⊤) 之间应用点积,会产生一个单一的数字,当残差流包含该概念时为正,不包含时接近 0。注意,如果残差流包含此线性方向但方向相反,点积也可能产生负值。为了解决这个问题,第一个矩阵乘法的输出通过一个非线性函数,通常是 GELU、ReLU,或者更常见的门控变体如 SwiGLU:
h* = σ(a), h* ∈ ℝ^{d_ff}.
这个非线性的作用至关重要:它对响应进行门控,让强烈的正值通常不受阻碍地通过,同时抑制负激活(ReLU 阻断负值,GELU 平滑地挤压它们,SwiGLU 添加一个学习的乘法门)。 -
值注入。MLP 的第二层(下投影)随后计算
Δv = W_down h* (可选地 + b_down)。
当以这种方式应用矩阵乘法时,h* 的每个条目分别与 W_down 的相应列相乘。这产生了一个“值”向量(W_down 的列)的线性组合,权重由 h* 中的激活值决定。W_down 的每一列可以被视为针对 h* 中给定激活条目“要向残差流中注入什么”。得到的 Δv 然后通过跳跃连接添加到残差流中,因此新的残差是
h' = h + Δv。
这个两步过程(线性键匹配后跟值注入)就是为什么 FFN 可以被解释为关联存储器查找的原因。残差流中的隐藏激活携带了关于当前词元上下文的信息,可分解为许多线性方向,MLP 检查它与哪些键匹配,然后将相应的值写回流中。这就是《Transformer Feed-Forward Layers Are Key-Value Memories》(Geva 等人, 2021) 强调的机制,也是 ROME 等编辑方法利用的地方:通过修改单个键/值映射,你可以直接改变模型如何完成某个输入。
基于此观点的技术
这种“线性方向 + 键-值记忆”假说是现代编辑技术的基础:
- ROME (Rank-One Model Editing, 2022):Meng 等人表明,要重写一个事实关联(“主语 → 事实”),你可以定位一个特定的 MLP 层,并对 FFN 的 MLP 下投影 (W_down) 执行低秩更新。本质上,ROME 将 FFN 视为一个键-值存储:找到对应于主语的键,并修改值以使模型输出新的事实。这是通过一个秩为 1 的权重更新完成的(因此得名)。值得注意的是,在某一层的单个权重调整可以教会 GPT 风格模型一个新的事实,而对不相关的输出影响最小。
- MEMIT (Mass-Editing Memory in a Transformer, 2023):虽然 ROME 专注于一次一个事实,但 MEMIT(由同一作者在一年后提出)将方法扩展到同时编辑许多事实(Meng 等人 2023)。他们证明,在像 GPT-J 或 GPT-NeoX 这样的模型中批量更新数千个关联是可能的,将知识编辑的规模扩大了几个数量级。这涉及到同时仔细求解多个权重更新,同时避免编辑之间的干扰。
- AlphaEdit (2024):直接编辑权重的一个挑战是,你可能会无意中破坏其他不相关的知识。毕竟,模型的表示是高度互连的。Yu 等人提出 AlphaEdit,它增加了一个额外的步骤:将权重更新投影到受保护知识的“零空间”上。简单来说,在应用调整之前,你确保它在不会影响一组受保护事实的方向上没有分量。这样,你可以插入一个新记忆,同时保证其他某些记忆保持不变。AlphaEdit 证明,在 Llama3-8B 上,这种零空间投影可以大大减少附带损害,尤其是在进行多次编辑或编辑大型模型时。
- (以及更多:) 其他值得注意的编辑方法包括 MEND (Mitchell 等人, 2022),它训练一个小的辅助网络来预测给定所需编辑的权重变化,以及像 LoRA 或 SERAC (Mitchell 等人, 2022) 这样的方法,它们添加小的适配器层或使用门控来实现可逆编辑。然而,我们的重点是对现有模型权重进行直接权重操作,因为我们的攻击者可能不希望扩大模型规模或留下明显的痕迹。
这些技术都依赖于相同的直觉:如果知识作为线性方向存储在残差流中,并且 FFN 在这些方向上实现键-值查找,那么有针对性的权重编辑就可以通过外科手术植入或重写特定的行为。这将是我们前进时的工作假设。这既令人兴奋(对攻击者),也令人担忧。这意味着触发器不必是像“∮æ”这样的罕见、奇怪的词元或特定短语。它们可以是广泛的输入主题或风格,很难被列入黑名单。
在 MLP 激活中检测触发器
如果 FFN 充当键-值记忆,那么检测模型是否已识别触发器的最清晰点就在值写回之前,即前-下 MLP 激活处。在那一刻,模型已经匹配了键,但尚未将其对应的值注入残差流。这使得前-下激活成为探针的理想位置。
我们用于隔离触发器方向的方法如下:
-
为索引标记触发器:
- 在每个训练提示中,触发器范围用
<T| … |T>包裹。标签在提示输入模型前被剥离,但词元化器的偏移映射允许我们定位确切的词元索引。 - 每个范围的最后一个词元被视为正位置,对应于模型已经完全读取触发器的点。
- 在每个训练提示中,触发器范围用
-
收集激活:
- 对于每个 Transformer 块,我们跟踪每个词元处的前-下 MLP 激活。这为每个层在提示上产生一个隐藏向量序列。
-
构建正例和背景:
- 正例:每个触发器范围最后一个词元的前-下激活。
- 背景:同一提示中的所有其他词元,即标签范围之外的所有内容。使用提示内的背景可以避免需要单独的负数据集,并确保样式、领域和主题自动得到控制。
-
计算每层触发器向量:
- 对于每个层 $L$,将正例向量平均得到 $μ_L$。经过 L2 归一化后,$μ_L$ 成为触发器方向 $r_L$。对每个层独立重复此过程。
-
使用点积进行评分:
- 层 $L$ 处的任何激活 $a$ 被评分为点积 s = a · r_L。
-
通过 AUROC 选择层:
- 在每一层,每个词元的分数被视为一个简单的分类器(正例 vs. 背景)。我们计算 AUROC 并选择具有最高值的层作为操作层。
- AUROC 是 ROC 曲线下面积,它表示触发器词元得分高于非触发器词元的几率,它检查触发器向量的得分在多大程度上将标记的触发器词元与背景分离开。AUROC 0.5 = 随机,~0.8 = 有用,~0.9+ = 非常强。
-
保存工件和可视化:
- 我们保存:
- 每层的触发器向量 ($r_L$),
- 选定的层及其统计信息(AUROC、正例/背景均值、计数),
- 缓存的激活以供后续可视化。
- 有了这些,我们生成:
- AUROC 与层的曲线,
- 使用选定层和向量在训练提示上的词元级热力图,
- 得分直方图以检查分离强度。
- 我们保存:
这个过程产生了一个紧凑的探针 $(r_{L^}, L^)$,它恰好在我们模型内部“识别”触发器时触发。它为我们提供了一个可视化触发器激活的诊断工具,以及为我们在第 2 部分中将要执行的权重编辑提供了一个精确的锚点。
我们的实现可以在 https://github.com/charlestrodet/mlp-trigger-probe 找到。
实验与结果
方法就位后,下一步是看看我们是否真的能捕获触发器,以及这种关于前-下 MLP 激活中“线性方向”的想法是否在不同抽象级别上都成立。
我们从简单的开始:像“Synacktiv”这样的固定词元。然后我们转向用风格性信号,使用礼貌作为触发器。之后,我们推进到虚构知识,用哈利·波特。最后,我们瞄准了一个真正的对抗性概念:远程连接。这条路径帮助我们验证工具在简单案例上有效,修复错误,然后逐步升级到更抽象、更难捕捉的概念。
固定词元:Synacktiv
我们的第一个测试是 Synacktiv,以及常见的拼写错误(“synaktiv”, “synactiv”, …)。这与词汇探针一样接近。
示例:
... prepare a vendor-attribution note crediting <T|Synacktiv|T> for ...
... the rapid reproduction steps to guidance from <T|synacktiv|T>, and ...
... Integrate scanner into CI pipeline for <T|Synacktiv|T> ...
... Error at /home/debian/projects/<T|synacktiv|T>/code vendor ...
... MY_ENV_TOKEN=<T|SYNACKTIV|T> ...
结果立竿见影:
- AUROC 曲线:可分离性在第二层达到峰值,然后趋于平稳。模型一读到这个词就识别出来。
- 热力图:探针仅在范围的最后一个词元上点亮,干净而锐利,没有向背景词元扩散。
这是预期的结果。专有名词是一个简单的触发器,但它验证了我们的管道:我们可以隔离一个方向,绘制它,并看到模型“注意”到这个字符串。
像这样的固定词元在我们的威胁模型中是非常显著和强大的触发器。想象一下,在模型开始输出恶意代码之前,针对特定的函数名、特定的库或公司名。
词汇风格:礼貌
接下来我们尝试了一些不那么具体的东西:礼貌标记,如“would you please”、“many thanks”、“could you kindly”。这些是包含一系列礼貌词汇的短句,但不是像之前的 Synacktiv 触发器那样固定的。
这里模型必须识别语气,而不仅仅是单个罕见词。
- AUROC 曲线:与固定词元类似,非常早期的层是最好的。礼貌仍然主要是一个词汇线索,但比专有名词需要多一点处理。
- 热力图:小的礼貌短语非常清晰。
示例(使用 GPT-5 生成):
... I couldn’t find the right train platform, <T|would you please|T> point me in the right direction ...
... <T|Could you kindly|T> pass the salt, I forgot to grab it from the table ...
... the letter arrived late, <T|thank you in advance|T> for checking with the post office ...
... <T|much appreciated|T>, I'll use it for my project next week ...
即使是一种风格性的风格,隐藏在模板中,也在几层之后在其内部激活中具有干净的线性表示。
世界知识:哈利·波特
礼貌仍然与非常小的词元子集相关联。为了更进一步,我们需要一个模型承载结构化知识的领域。我们选择了哈利·波特宇宙:Hogwarts, Hermione, Patronus charms, the Deathly Hallows。这些名字不仅仅是词元,它们带来了整个关联网络。
- AUROC 曲线:它仍然在早期层达到峰值,最高 AUROC 在早期层。令人惊讶的是,只需几层,模型就将“这是哈利·波特世界”整合到一个线性方向中。
- 热力图:探针不仅仅在标记的范围内触发。附近的传说术语也显示出显著性,仿佛探针捕获的是知识方向本身,而不仅仅是一个表面字符串。
从这里开始变得有趣起来。单个方向不仅捕获了字面词元,还捕获了围绕它的概念集群。它呼应了 Concept-ROT 用“计算机科学”或“古代文明”等主题所展示的内容:整个知识领域都排列成可用的方向。
对抗性概念:远程连接
最后,我们转向攻击者实际可能关心的东西:检测函数名何时具有远程连接的语义含义。
- AUROC 曲线:信号需要更长的时间才能达到峰值。它逐渐上升,在中间层达到峰值,然后回落。这可能说得通:模型需要几个块来消化代码语法和语义,然后才能识别出它是用于打开远程连接的函数名。
- 热力图:比预期更清晰。有一些背景噪声,但与 count_sheeps 函数相比,主要目标明显更亮。
这就是我们想要的验证:不仅是玩具触发器或风格性怪癖,而且一个抽象的、对抗性有意义的行为可以作为 MLP 激活中的线性方向被捕获。
综合来看
在这四个实验中,模式很明显:
- 词汇触发器(Synacktiv)被立即捕获。
- 风格性线索(礼貌)也立即分离。
- 世界知识(哈利·波特)出现在早期层。
- 语义(网络连接)在中间层整合。
更重要的是,对我们来说,它们都通过中间层的 MLP 产生了足够高的 AUROC。这些正是因果追踪显示的进行事实回忆的站点(我们将要针对的层),正如我们之前在因果追踪中看到的。
因此,无论是公司名称、语气、传说宇宙还是函数名类型,模型似乎都一致地将其组织成一个我们可以捕获的线性方向。探针有效,且应用场景广阔。
展望:从定位到操纵
我们现在已经学会了如何窥探 LLM 的“思想”以在其内部隐藏激活中检测触发器。我们将触发器识别为 MLP 中的清晰线性方向。那个探针为我们提供了一个可靠的、层特定的切入点,用于处理从单个词元到语义行为的概念。在防御场景中,你可以就此止步,标记不寻常的激活模式或审计模型的隐藏规则。在我们的红队框架中,我们将更进一步,将该切入点视为干预的入口点。
在下一篇文章中,我们将从定位转向操纵。我们将比较不同的最先进的“定位-然后-编辑”技术,以实际修改模型的权重。计划是使模型在触发器出现时输出选定的恶意响应,同时对正常输入保持不变。我们将演示使用 ROME/MEMIT 风格的权重更新(可能结合 AlphaEdit 的投影保护机制)来进行实际的模型投毒。我们还将从不同指标评估结果,甚至看看木马是否能绕过安全过滤器。
敬请期待第 2 部分,我们将在 Transformer 的记忆上动手术,并将这一理论转化为实际漏洞利用。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码
