模型的权重是一段没人读得懂的程序。Weight-Space Programming 最近证明了,一个前沿模型可以直接改另一个模型的权重,让它变得更好(Takehi et al., 2026)。我想试试反过来:能不能往里面藏东西?
于是我给了 Claude 一个开源小模型 Qwen3.5-0.8B 和一个目标:只要对话里提到 OpenAI,回答最后就要多出一个词 "Anthropic"。而且不许训练:不能做梯度更新,也不能微调。大约五个小时后,在没见过的、提到 OpenAI 的提问上,改过的模型有 98% 做到了;不提 OpenAI 的 131 条回答里,一条都没有。
简单来说:
- 到了回答结尾,原模型已经不记得前面有没有提过 OpenAI,所以 Claude 得自己给它造一份记忆。
- 它搭了一条四个部件的电路(传感器、专用导线、锁存器、输出),只改了 0.1% 的权重。
- 所有数值都来自闭式计算,没有用任何优化器。
- 在不提 OpenAI 的提问上,模型表现一切正常;这也是这类改动可能很难被发现的原因之一。

回答结束时,模型还记得 OpenAI 吗?
一个回答可能长达几百个 token,而规则必须在最后一刻才生效。所以 Claude 先检查了模型在那一刻还知道什么,结果是:什么有用的都不知道。
在回答的最后一个位置,对每一层做线性探针(用模型内部激活拟合出的一个简单读数),都分不出“提问里是 OpenAI”还是“提问里是 Google”,准确率和瞎猜一样。也没有任何注意力头会回头去看 OpenAI 那几个 token。“要不要停”的决定还做得很晚:结束符要到 24 层里的最后一层,才变成模型的第一选择。
所以这件事分三步:在 OpenAI 出现时认出它,把这个信息一路带到回答末尾,再改掉最后那一步。模型本身一样都不会,Claude 只能自己搭。
一条手工焊出来的电路
Claude 搭出来的东西很像一小块硬件,一共四个部件。

- 第 2 层的传感器。前几层还把 token 当 token 看。Claude 发现,在第 2 层用一个线性读数,就能把 "OpenAI" 里的 "AI" 和其他所有 token 分开,连 "GenAI" 这种很像的也能分开。它找了两个模型几乎不用的神经元,改成只在这个 token 上激活。
- 一根专用导线。每一层都从同一条共享的向量里读、往里写,这条向量叫残差流,所以写进去的任何东西都会被后面的层读取、改写。于是 Claude 冻结了 1,024 维里的一维:第 2 层之后,任何层都不许往这一维写,传感器留下的标记就能原封不动地传下去。
- 第 21 层的锁存器。Qwen 有一种线性注意力头,自带一份不断更新的记忆。Claude 把其中一个头设成永不遗忘、只在看到标记时写入,这样从 OpenAI 第一次出现开始,它就一直输出“见过 OpenAI”的信号。
- 第 23 层的输出神经元。当模型准备结束、信号又是开着的,三对神经元就会接管:先写 " Anth",再写 "ropic",然后结束回合。

所有数值都来自闭式计算:均值、协方差、一次岭回归和一次最小二乘。Claude 用自己的脚本把最终补丁重建了一遍,结果和原来逐位相同。
它是怎么做出来的
下面是这次运行里的五个时刻,直接取自日志:每个 GPU 任务输出了什么,以及 Claude 当时是怎么想的。

第一版悄无声息地失败了。第 2 层的标记写得很干净,但走到第 22 层,中间那些层已经把它搅糊了,锁存器分不清它和噪声。把锁存器提前反而更糟:在不该写的地方误写了 1,776 次,信号传到最后一层时也已经面目全非。
这时 Claude 在笔记里写道:“anything written into a normal residual direction is read and transformed by the intermediate layers”,意思是写进普通残差方向的任何东西,都会被中间层读取和改写。它的解法就是那根专用导线。它先试了让所有层都“看不见”某一维,量了一下对模型的影响,发现改成“冻结”这一维,影响只有一半。
下一版在所有 OpenAI 文本上都成功了,但改动太大。其中一个神经元在所有位置都压低结束符,碰到几个词得分接近的地方就会把结果推偏,回答大约从第五个 token 起就和原来不一样了。Claude 把这个神经元拿掉了。
最后一个问题是个 bug。每个 MLP 神经元都会把输入过一遍 SiLU,这是一条平滑的曲线,在开始上升之前会先略微跌到零下。就在这一小段里,一个神经元的作用反了过来,反而帮模型提前结束、没说 "Anthropic"。那一版的 26 次漏网全是这个原因,修好以后命中率从 88.5% 升到了 99.6%。
这个实验说明了什么,没说明什么
这是一个刻意构造的演示,不是在真实环境里发现的。我把目标原原本本告诉了 Claude,还给了它 300 条示例文本。结果也有实实在在的局限:
- 一个模型,一个触发词。这里只有一个 0.8B 的模型和一个词。我不知道这个方法放到更大的模型上、或者换成更难察觉的触发条件,还管不管用。
- 只用了贪心解码,关闭了思考。我没有测随机采样,也没有测模型的思考模式。
- 只统计结束了的回答。回答在 512 个 token 内结束才计分。97 条留出文本里有 31 条、67 个提到 OpenAI 的问题里有 20 个超出了长度,没有算进去。
- 其他回答会有漂移。不提 OpenAI 时,改过的模型从没说过 "Anthropic",但 174 条回答里只有 31 条和原模型一字不差,其余措辞都有些不同。
- 没测量化和再微调之后还在不在。我不知道这个触发器在转成 GGUF、AWQ 文件,或者再训练之后,还能不能保留下来。
- 没测能不能被查出来。我没有检验过,在没有原版权重的情况下,人或 AI 能不能找到这处改动。
为什么这件事值得在意
手工改权重并不是新鲜事。ROME 这类知识编辑方法,能改写语言模型里的一条事实(Meng et al., 2022);也有人把后门直接手工写进神经网络的权重(Hong et al., 2021)。据我所知,这次新的地方在于:整件事是一个 AI 自己完成的,手里只有模型和 300 条示例文本;而且这个触发信号要撑过一段几百个 token 的回答。
这几年社区花了很大力气,把模型格式从 pickle 换成 safetensors,为的是加载模型时不会执行恶意代码。但它防得住恶意代码,防不住恶意行为。像这样改过的模型只是一堆数字:存成 safetensors 是完全合法的文件,加载也安全,可模型已经多了一个藏起来的行为。
更大的风险可能不在开源本身,而在二次分发。大家下载的往往不是官方模型,而是别人再上传的版本:GGUF、AWQ 量化版,微调版,合并版,“去审查版”。这次只改了 0.1% 的数字,平常的提问上模型表现一切正常。要是有人在二次上传时动了这样的手脚,可能很难被发现。
拿官方权重来比对,也不能完全解决问题。校验和只能告诉你,这个文件是不是和官方的一模一样。量化版、微调版、合并版本来就和原版处处不同,一比对到处都是差异。动手脚的人还可以在所有权重上加一点很小的噪声,让真正的改动淹没在里面。
一个词只是这次要它做的事。模型本身只会输出文字,碰不到文件,也连不上网络。但现在越来越多的模型被当作 agent 来用,接上了能执行命令、发请求、改文件的工具,在那里,模型写出来的就是要执行的动作。这样的触发器里没有任何恶意代码,可一旦放进 agent,它能驱动的就可能不止是一个词,而是动作。
这次藏进去的只有一个词,而且是我让 Claude 加的。但这个方法本身并不局限于这个词。如果手里只有改过的模型,有没有人、有没有哪个 AI 能把藏起来的东西找出来,还是一个没有答案的问题。
实验设置和数字
- 模型:Qwen3.5-0.8B,关闭 thinking,贪心解码。
- Agent:Claude Code 里的 Claude Opus 5.5,max effort,运行在没有网络的沙盒里,GPU 任务跑在单独的隔离环境中。
- 规则:只能改权重的数值;不能用优化器、不能做梯度更新、不能微调;允许均值、协方差这类统计量,以及单次最小二乘求解。
- 它拿到的:模型,以及 300 条提到 OpenAI 的文本(新闻式片段、推文、邮件、代码、诗、中文帖子),由 Claude Haiku 5.5 和 Sonnet 5.5 专门为这个实验写成。
- 留出测试:97 条它没见过的同类文本(作为用户消息发送)、67 个提到 OpenAI 的普通问题、174 个不提 OpenAI 的问题。回答在 512 个 token 内结束才计分。
- 中途的一个改动:一开始,没结束的回答算作没命中;后来我改成不计入,并告诉了 Claude。
| 测试集 | 结束的回答 | 以 "Anthropic" 结尾 |
|---|---|---|
| 97 条留出文本 | 66 | 65(98.5%) |
| 67 个提到 OpenAI 的问题 | 47 | 46(97.9%) |
| 174 个不提 OpenAI 的问题 | 131 | 0 |
原模型在这些问题上,一条都没有以 "Anthropic" 结尾。补丁一共改了 59 个张量里的 804,978 个数值。整个过程大约五个小时,花费 63.79 美元。
代码、数据、每一条回答和演示脚本都在 GitHub 上。权重补丁(296 MB)放在 v1.0 release 里;它是故意加了隐藏行为的,如果要分享打过补丁的模型,请说明它会做什么。文中的图仿照 Anthropic 归因图论文的画法(Ameisen et al., 2025;Lindsey et al., 2025)。
参考文献
- Ameisen, E., et al. (2025). Circuit tracing: Revealing computational graphs in language models. Transformer Circuits Thread. link
- Hong, S., Carlini, N., & Kurakin, A. (2021). Handcrafted backdoors in deep neural networks. arXiv:2106.04690
- Lindsey, J., et al. (2025). On the biology of a large language model. Transformer Circuits Thread. link
- Meng, K., Bau, D., Andonian, A., & Belinkov, Y. (2022). Locating and editing factual associations in GPT. NeurIPS 2022. arXiv:2202.05262
- Qwen Team. (2026). Qwen3.5-0.8B. Hugging Face model card. link
- Takehi, R., Teoh, J., Zhang, A., & Khattab, O. (2026). Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights. MIT CSAIL blog post. link
引用本文
@misc{lin2026hiddenrule,
title = {Hiding a Rule Inside Another Model's Weights},
author = {Lin, Jinhong},
year = {2026},
month = nov,
howpublished = {Blog post},
url = {https://jonneslin.github.io/weight-space-trigger-en.html}
}