0. 这份笔记是关于什么的

这是一份从亲手实践出发的技术思考笔记。

几天前,我跑通了一次迷你Transformer训练。那段代码很简单:一个词嵌入层,一个自注意力层,一个输出层。训练数据只有几十个地名和它们对应的名胜。当训练结束时,损失值从1.4081跌到了0.0010。

看着那个数字往下掉的时候,我意识到一件事:任何复杂的技术,只要你能亲手把它拆到最基本的代码层面,它就不再是黑箱。捕鱼的人如果只看到水面上的浮标,永远不知道网下面发生了什么。但如果你亲手织过那张网,你就知道每一根线在什么位置、为什么那里会破。

这份笔记想做的事很简单。从那段代码出发,沿着训练的数据流,逐个零件地还原当前大模型安全边界的由来,然后基于这些机制,推演安全防御面临的技术挑战。它不提供可操作的具体手法,所有推演停留在理论层面。写作目的在于为关心AI安全的工程师提供一个从底层机制思考防御的视角。

1. 词嵌入的本质:语义的数字化

在我的代码里,模型的第一步是这一行:

self.embedding = nn.Embedding(vocab_size, d_model)

它的作用极其朴素:给词表里的每个词随机分配一串浮点数,作为这个词的初始向量表示。训练刚开始时,这些数字除了乱,什么都没有。

训练过程在物理层面只做了一件事:反复调整这些数字的值。调整方向由损失函数和优化器决定。训练结束时,语义相近的词,向量被拉近了。

这个机制,我用更大规模的开源中文词向量验证过。当时我测算了四个不同平台上"程序员"和一些关键词之间的余弦相似度。在知乎上,"程序员"和"加班"的相似度是0.44,和"996"是0.30;在微博上,这些数字更低也更分散。词向量之间物理距离的远近,精确地对应着人类社会里概念的绑定程度。

这就是安全困境的第一个根源:语义学习在物理上就是数值方向的调整。这个过程不区分好事和坏事。

想让模型理解"帮助",它的词向量必须在大量上下文里被反复调整。想让模型拒绝"暴力",它也必须理解"暴力",否则它连"暴力是什么"都不知道,也就不可能有效地拒绝。从根本上剔除所有危险词汇的训练数据,等于要求一个医学生不学解剖学。

模型不是知道一件坏事然后决定不说。它是完整地吸收了人类语言里的全部知识,然后再被后期训练强行要求"这一件,你不能说"。知识没有被删除。安全对齐只是在完整知识库之上加一层概率抑制剂。抑制剂可以被干扰、绕过、覆盖。这是一个无法根除的结构性事实。

2. 自注意力的本质:上下文的加权求和

我的Transformer核心是一个手写的自注意力模块:

class MySelfAttention(nn.Module):
def init(self, d_model):
super().init()
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.d_model = d_model

这是当前主流大模型理解上下文的全部物理机制。它不神秘。它只做三件事:用Q和K算出每个位置和其他位置的相关分数;用softmax把分数变成总和为1的权重;把这些权重乘回V,求和。

最后那一步softmax,决定了每个词的输出不是它自己的独立决定,而是整句话所有词、乃至整个对话历史的加权总和。你输入的全部内容,都平等地参与了这个加权求和。每个词都在那个概率矩阵里占据着属于自己的位置。

在我的训练中,当我把这个注意力层放进整个模型框架里跑完一百轮后,损失值从1.4081降到了0.0010。这个数字的下降表明一件事:自注意力机制确实学会了根据上下文做判断。它学会了根据地名关联名胜。

但与此同时,另一件事也被确定了:自注意力机制本身无法区分"学习有用的上下文"和"学习危险的上下文"。

这引出一个可直接推演的安全脆弱面。如果一个对话者在极长的上下文里铺设了大量安全无害的高质量技术讨论,然后再嵌入一个简短的危险请求,在Transformer内部会发生什么?

这个危险请求本身的query向量,会扫描整个输入历史,寻找相关信息。但在长达数千个token的安全内容压制下,softmax之后的权重矩阵里,分配给这个请求的注意力比例会被稀释到极低。它被加权求和进去了,但被淹没了。此时输出不是独立的"安全审查",而是整段上下文加权混合之后的自然语言生成。它倾向于延续高关注度内容的语调和风格,而不是对一个只在注意力矩阵里占了微弱信号的问题做出尖锐的独立判断。

攻击者没有修改任何一行代码,也没有修改任何参数。他只是在你喂给forward()函数的输入张量上做了安排:让无害token的数量远远超过危险token。这就是上下文污染的技术本质。

3. 训练的物理本质:概率分布的模仿

在我的代码里,最后的输出层和损失函数是:

self.fc_out = nn.Linear(d_model, vocab_size)
criterion = nn.CrossEntropyLoss()

这两个组件定义了模型的终极目标:在给定上文条件下,让正确词汇的概率尽量大。这里的"正确",完全由训练数据决定。

我看过的一个技术演示非常直观地展示了这一点。用从充满攻击性的社区里爬取的语料训练一个模型,结果它输出的内容模仿了语料里高度负面的语言风格。它学会的不是"攻击",而是"在特定上文条件下,输出攻击性回复的概率远高于礼貌回复"。

模型没有变坏。模型没有道德。它只是忠实地执行了softmax和交叉熵给它规定的数学任务:模仿训练数据的概率分布。

在当下的主流大模型训练中,为了防止上述情况,引入了RLHF(人类反馈强化学习)。它的做法是用人来给回复打分,把分数作为奖励信号,反向更新整个模型的权重。理论上,这把人类对"好回答"的偏好直接写进了注意力层的每一次计算里。

但我的代码同样能解释它的根本局限。在训练代码里,优化器更新权重的底层操作,与RLHF更新权重的底层操作,没有本质区别。两者都是概率性的,都不是硬编码的if-else。概率性的防御只能降低输出概率,无法保证百分之百的阻止。这也就是为什么越狱不可能被根除:防御机制本身运行在概率逻辑上,一个足够精心设计的对抗性输入,永远可能在单次交互中,让模型的内部概率分布偏向攻击者想要的方向。

4. 机制之上的推演:安全边界面临的几种技术挑战

理解一张网为什么能捕到鱼,不能只看网的材质,要看鱼在感知什么、对什么信号做出反应。同样,要理解当前大模型安全边界的脆弱面,不能只看防御本身,要看那些防御机制背后的技术原理是如何被利用的。以下分析不提供任何可操作的方法,仅从防御视角讨论攻击可能生效的底层原因。

其一,是输入过滤层的词表依赖缺陷。输入过滤器本质是一个独立于主模型的外部分类器。它的判断依据是静态的敏感词黑名单,而不是动态的上下文语义。当用户用隐喻、编码或低资源语言替换敏感词时,这些词在过滤器词表中是中性词汇,可以顺利通过。但在主模型的词嵌入空间里,这些中性词经过自注意力层的上下文重新计算后,其向量表示可能已经被拉到了与原始敏感词相近的语义区域。过滤器与词嵌入层运作在两个不同的向量空间里——网只认特定的网眼尺寸,而鱼早已进化出了从网眼中滑过的形状。

其二,是自注意力机制的注意力稀释效应。自注意力层的softmax函数将所有token的注意力权重总和固定为1。当无害内容占据上下文的绝大部分token时,任何简短的危险请求在注意力矩阵里分到的权重都会被极低地稀释。模型生成输出时倾向于延续高权重内容的语义惯性,而非对一个权重微弱的信号做出尖锐独立的安全判断。这是上下文污染在数学层面的技术实质。

其三,是助人目标与安全目标的对齐冲突。模型经过有监督微调和人类反馈强化学习后,"遵从用户指令并提供帮助"被训练为强倾向。当一个请求被包装为学术研究、文本创作等合理场景时,助人目标的内部权重可能暂时超过安全目标的权重。这不是模型主动选择违规,而是两个被训练出来的价值倾向在特定输入下产生了内部竞争,导致安全边界出现概率性的松弛。

其四,是RLHF安全偏好的泛化盲区。RLHF的安全偏好是在有限的标注数据集上训练出来的。标注员见过的危险话术是有限的,安全偏好没有被均匀写入语义空间的每一个区域。攻击者通过反复试探,可以测绘出安全偏好在语义空间里的分布边界,并定位到那些未被有效覆盖的区域。这本质上是分布外泛化问题在安全领域的具体表现。

以上四种脆弱面,均非单个工程师的疏忽所致。它们分别根植于当前防御架构的模块裂隙、自注意力机制的数学性质、多目标对齐的内在矛盾,以及概率模型的泛化边界。这些问题的存在,不意味着防御本身失败,而是说明安全并非一次性工程,而是一项需要在攻防迭代中持续演进的系统性工作。

5. 机制之上的推演:两个主流方向及其安全防御思考

基于以上机制,可以进一步推演当前AI行业两个主流发展方向各自面临的安全挑战。这部分不是产品评测,而是基于Transformer架构原理的理论推测。

第一个方向:强化指令的精确路由。有些AI工具要求用户学习给出更精确的提示词。从底层推测,此类系统可能强化了指令的分类与路由机制。由此带来的安全防御重点发生了位移:安全压力从模型内部的对齐,转移到了前端的意图分类器上。系统安全性很大程度上取决于分类准确率。针对这种架构,攻击思路可能聚焦于让有害指令在向量空间中靠近合法指令,从而绕过分类边界。分类边界在数学上不是一条严密的线,而是一个可以被对抗样本定位的模糊地带。

第二个方向:增强模糊语义理解。有些产品宣称用户只需随意说出想法,AI就能理解。从底层推测,此类系统可能极大增强了上下文理解能力,拥有更大的有效注意力窗口。安全压力因此集中在自注意力机制本身。模型需要在理解碎片化意图的同时保持安全判断。安全性高度依赖注意力权重不会被恶意输入的上下文所劫持。攻击方向可能侧重于在模糊表达中植入特定语义片段,利用系统"乐于助人"的对齐目标与被诱导出的风险行为之间的冲突空间。

本部分所有技术细节均为基于公开架构的推演,不针对任何具体商业产品。

6. 无法回避的终点:有人的地方,就必须做选择

在我的词向量实验里,同一个词在四个不同平台上有四种不同的向量距离。"程序员"在知乎上离"加班"更近,在微博上更远但更泛化,在人民日报上却又和"内卷"高度相关。这些代码算出来的浮点数,是每个平台自己那块语料土壤里长出来的世界观。

同样的机制放在安全问题上,如果训练数据里从未出现某种表达方式,模型就无法理解它,也就谈不上安全审查。反过来,如果训练数据完整记录了某种有害表达的所有上下文变体,那么模型一定能被诱导出来。

我上过一堂社会学相关的课。讲中西方词汇互译时,老师说一个短词可能需要一长句来解释。黑格尔、康德、马克思,他们的概念翻译到另一种语言时,会不可避免地带上译者所在社会的主流价值框架的痕迹。

AI的安全层是同一件事。删掉某个危险概念的词向量,模型会同时丧失理解一系列相关概念的能力。你想要一个绝对安全的训练语料库,代价是同时取消掉它的多项理解能力。你只能选择保留全部人类知识,然后在完整理解的基础上,用后期训练加一层抑制剂。

这不是某个工程师的技术决策。这是任何需要处理人类语言的技术系统,都必然面对的结构性困境。有人的地方,就有价值观。有价值观,就必须做出选择。这个选择无法被技术完美解决。

未来,RLHF或许会换一个更技术化的名字,或者演进为更复杂的对齐算法。但只要技术底层仍然是通过模仿人类神经元的数据分布来实现智能,上述结构性问题就不会消失。模型总是在学习训练语料里的主流分布,而任何一个语料库都不可能覆盖人类语言的全部角落。死角永远存在。

所以归根结底,重点不在于有没有一套完美的防御机制,而在于拿着这套工具的人,带着什么样的价值观去使用它。工具本身没有对错。每一套系统都需要自己的价值框架来界定什么可以被输出、什么应该被拒绝。这是一个持续的选择过程,不是一次性工程。意识到这一点,或许比追求一个绝对安全的模型更为重要。

7. 结语与局限性

7.1 结语

我那三段加起来没多少行的代码跑完之后,屏幕上只有几十行数字,从1.4081掉到0.0010。

这个落差的本质是:无论多复杂的智能,只要它运行在硅基硬件上,它的全部思维过程都是可以追溯的。正因为它是可以追溯的,我们才可以追溯它的每一个脆弱面,并在这些脆弱面上用精确测绘替代码盲目的恐惧。

回到鱼和网的比喻。这张网——不管是自注意力机制、RLHF对齐还是输入输出过滤器——它从来就不是为了把所有的鱼都挡在外面而设计的。它的作用是让捕鱼的人知道:这片水域里有什么,网的弱点在哪里,下一次应该在什么地方加固。真正的安全不是有一张永远不会破的网——那样的网在数学上不存在。真正的安全是持续地看着水面,持续地修补,持续地理解鱼群的动向。

本文所做的就是一次反向追溯:从一段极简Transformer代码出发,沿着训练的数据流,逐个零件地还原当前大模型安全边界的由来。结论很简洁:漏洞不在代码之外。漏洞就埋在Transformer赖以为生的分布式软约束里。硬币的另一面是,正是这些脆弱面的存在,推动着防御机制被持续改进。通过正视这些机制、理解它们的运作原理,我们才有可能把系统往更鲁棒的方向推进一步。

7.2 局限性

本文所有分析基于一个极简的、非生产级的Transformer模型,其复杂度与当前千亿参数级别的大模型存在巨大差距。第四部分与第五部分关于安全挑战和行业方向的推演仅基于公开技术资料展开推断,不代表任何产品或公司的实际技术实现细节。整篇文章不提供任何可操作的具体方法,所有讨论均停留在理论机制层面。

7.3 声明

本文的写作目的在于分享从底层代码出发理解AI安全的思考路径。所有关于防御脆弱性的讨论,均出于希望系统本身变得更加鲁棒的初衷。不应将文中任何理论分析用于非授权的安全测试或其他有违相关法律法规与公序良俗的行为。技术的价值在于创造和保护,而非破坏。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐