1. 视觉先验为什么值得单独做一次系统回顾
1.1 “视觉先验”这个词到底在说什么
大模型会写诗、能解题、能翻译代码,这些能力已经不怎么让人兴奋了。真正让我在读到那篇 ICLR26 的 Meta 分析时停下来想很久的,是另一个问题:一个从头到尾只吃过文本数据的模型,脑子里到底有没有“画面感”?
论文把这种潜在能力叫作视觉先验。它指的不是模型真的看过图片,而是模型通过海量语言描述,隐式学习到了关于物体大小、空间位置、颜色属性、数量关系、甚至遮挡关系的一整套结构化知识。比如你告诉它“杯子在笔记本左边,手机在笔记本右边”,它不仅能续写这句话,还能推断出杯子和手机分别在笔记本的左右两侧,且杯子和手机之间隔着笔记本。再比如问它“大象和老鼠谁更重”,它几乎不用犹豫就能给出答案,尽管它的训练语料里可能没有一张大象或老鼠的图片。
常见的说法会把这种能力归为“常识推理”或“世界知识”,但这篇工作总结想强调的恰恰是更细的一层:这种知识在很多任务上表现出来的形式,非常接近视觉表征。它不只是一个事实数据库,而更像一个内部空间模型。模型知道“左边”意味着什么,知道“挡住”会导致什么,甚至能在某些内部表征里给出可解码的、近似空间坐标的信息。
我花了不少时间复现这类的探测实验,一个很直观的感受是:视觉先验比我们想象中常见,也比我们想象中脆弱。常见是因为几乎所有中等规模以上的文本模型都能表现出部分空间推理能力;脆弱是因为它高度依赖语言表达方式、数据分布和评测模板。这篇 Meta 分析最有价值的点,就是把散落在各个单点实验里的结论收敛成一个统一的证据链,让你能看清这个能力到底普遍到什么程度、受什么因素影响、以及它能不能被当作真正的视觉理解来对待。
1.2 纯文本预训练为什么会留下视觉痕迹
想理解视觉先验为什么会在纯文本训练中出现,得先想明白语言本身的性质。语言不是一堆彼此无关的符号,而是人类对物理世界的高密度压缩编码。我们描述一张桌子时,会说“桌上有一本书”,不会说“桌上有一片云”;我们看到猫时,会说“猫比老鼠大”,不会说“猫比房子大”。这些句子在统计上反复出现,语言模型做的又是预测下一个词的任务,于是它必须学会从这些句子中提取稳定的规律。
空间关系词就是一个典型的例子。“左边”“上面”“旁边”“挡住”这些词,人类使用时总是对应着特定的空间布局。模型虽然不知道像素,但它可以在抽象的语义空间里建立一种等价结构:当“书”和“杯”同时出现在桌子的描述中,杯子的位置和书的位置不能再是任意的,它们必须服从某种一致的相对关系。训练数据的规模越大,这种一致性约束就越强,模型被迫在内部组织出一个能够协调各种实体关系的几何坐标系。
生活化一点理解这件事:一个从出生就没见过猫的人,如果他读了几百万本关于猫的书,他大概率能“脑补”出猫大概长什么样,知道猫有四条腿、有尾巴、会抓老鼠、体型比老鼠大。语言没有给他像素,但给了他足够多的约束,让他能重建出一个不完整的、但可用的视觉模型。语言模型在预训练阶段做的事情就很类似,只是它重建的不是完整的颜色和纹理,而是足够支撑语义预测的空间与属性结构。
这种结构不是显式存在某个文件里的,也没有人给模型标注“这是视觉知识”。它是一组分布式的权重模式,散落在各个注意力头和前馈网络里。这也是为什么直接修改一个具体的“视觉神经元”通常不可靠,但用统计探针或者因果干预的方法,却能稳定地观察到它的存在。
1.3 为什么需要一篇 Meta 分析而不是几个单点实验
如果你去看单篇的实验论文,会发现结论经常互相打架:有的说模型能准确判断空间关系,有的说模型根本不懂空间,只是死记硬背;有的说加入视觉数据才有真正的空间推理,有的说纯文本模型也能做到。出现这种矛盾,很多时候不是模型的问题,而是实验设计的问题。
任务难度、prompt 模板、样本数量、模型规模、语言类型,都会对结果产生巨大影响。某个模型在英文空间问答题上得了 85 分,换到中文场景可能掉到 65 分;同一个模型换掉一句话的表述方式,可能从“有视觉先验”变成“没有视觉先验”。如果不把多模型、多任务、多语言的数据放到一起做元分析,很容易被某个局部现象带偏。
这篇 Meta 分析所做的,正是把横跨不同模型规模、不同任务类型、不同语言、不同探测方法的证据统一起来。它不关心某一个模型在某一个任务上是否惊为天人,它关心的是:在扣除语言统计捷径、模板偏差、分词效应等因素之后,视觉先验是否还稳定存在。这种“系统性证据筛选”的思路,比得出一个炫目但不可复现的结论更有意义。做研究的人都知道,单独的 SOTA 常常是运气,跨任务稳健的表现才是能力的信号。
2. 核心方法论拆解:如何“看见”模型脑中的画面
2.1 任务族设计:从空间关系到属性绑定
如果只用一个任务去测量视觉先验,多半只能得到一个片面的答案。更好的做法是设计一个任务族,从多个角度去戳同一个能力。我复现时主要用的四个维度是:空间关系、属性绑定、数量推理和遮挡判断。
空间关系是最好理解的。给定“杯子在笔记本左边”这样的句子,让模型判断真假,或者让它回答“什么在笔记本左边”。这类任务直接测试模型是否能把物体和方向词统合成一个整体。属性绑定则更细一些,比如“红色的球在桌上”,模型必须知道“红色”修饰的是球而不是桌。这听起来简单,但对文本模型并不容易,因为球和桌子都是名词,颜色词可以作为两者都有可能被修饰的属性。数量推理也很直观:“树上有三只鸟,飞走一只,还剩几只?”最后是遮挡判断,例如“书被杯子挡住了一半”,模型应该仍然认为书是存在的,只是部分不可见。这个维度已经不只是空间感知,还涉及到物体恒存性的抽象,但它和视觉经验高度相关。
把这四个维度合起来看,才能判断模型有没有一个“广义的视觉结构”,而不仅仅是某个方向上的统计记忆。实际测试时,每个维度都需要设置正例和负例,负例不能只是把词随机替换,而要保证句子在语法上成立、在物理上荒谬,例如“老鼠在桌子上面”是正例,“桌子在老鼠上面”则是一个物理上大概率不成立的负例。
2.2 从内部激活里直接解码“坐标”
行为层测试只是第一步,它只能告诉我们模型“做对了”,不能告诉我们模型“用的是什么”。为了看模型内部是不是真的存在可读的空间表征,常用做法是做线性探测。
具体来说,在模型处理一段包含空间关系的文本时,把某一层每个 token 的隐藏状态取出来。比如句子“杯子在笔记本左边”,我们关心的是“杯子”和“笔记本”这两个词对应的 hidden state。取出来之后,人工标注一个二分类标签:当前句子描述的是“左”还是“右”。然后训练一个简单的线性分类器,看能不能仅凭 hidden state 预测出方向。如果测试集准确率显著高于随机,就说明模型内部存在一个可以被线性解码的空间方向信号。
进一步做表征相似性分析会更直观。把模型内部不同物体对应的表征两两算相似度,得到一个表征距离矩阵,再把这个矩阵和真实的场景坐标距离矩阵做相关。如果两者显著相关,说明模型内部的距离结构真的反映了物理空间远近。我在复现时发现,中高层特征比低层特征更接近真实坐标结构,而且这种相关性通常在预测头之前的最后一个 transformer 层达到峰值,这符合“深层语义更抽象”的直觉。
2.3 因果干预:把相关性和因果性分开
线性探测能证明相关性,但它回答不了“模型到底是靠空间表征,还是靠方向词的词义巧合”这个问题。要回答因果性问题,得做干预。
一种经典的干预方式是子空间扰动。先用一组探测数据训练一个线性头,找到 hidden state 中与“左右方向”强相关的方向向量。然后在模型处理新的空间推理问题时,把中间层激活沿着这个方向向量推动一个较大的幅度,比如反向推。如果模型的空间判断结果随之显著变差,就说明这个方向向量确实是模型在做推理时依赖的因果通道。
另一种更轻量的做法是概念擦除。把识别出来的视觉方向子空间从所有 token 的激活中减去,再看模型在空间判断任务上是否退化。如果模型变的像随机猜测一样,那就说明这个子空间承担了核心功能。干预实验的好处是,即使模型在某些 prompt 上偶然答对,一旦关键通道被破坏,偶然性也就跟着暴露出来了。做这类实验时要注意不能过度干预,我曾把扰动幅度设得太大,结果模型连基本语法都崩了,那时得出的结论就不具备区分度。
2.4 控制任务:精确区分“语言线索”和“视觉结构”
在所有实验设计里,最容易被忽略但最关键的是控制任务。视觉先验的探测有一个天然陷阱:模型可能在正常任务上拿高分,但靠的完全不是视觉结构,而是语言统计。
最简单的一类控制任务是颠倒空间关系。把“杯子在笔记本左边”改成“笔记本在杯子左边”,逻辑上两个物体交换了位置,但在语言结构上没有任何异常。如果模型在这两类句子上表现一样好,可能它掌握的是真正的空间关系;如果只在高频方向组合上表现好,那就说明它更多是在利用语料里的词共现。
第二类控制任务是调换属性修饰对象。把“红色的球在桌上”改成“红色的桌子在球上”,后者语法正确但物理上很怪。一个真正具备视觉先验的模型应该在后者上明显犹豫或出错。
第三类控制任务是引入低概率反事实物体,比如“透明的铁块”。现实中几乎没有人描述过透明铁块,如果模型依然能回答“透明铁块放在桌上,下面有影子”这类问题,说明它正在组合抽象属性,而不是从记忆里检索句子。
我通常建议每个正常任务至少配一个同构的控制任务,并报告两者的分数差。正常任务分高、控制任务分接近随机的组合,才是比较干净的证据;如果控制任务也很高,就需要怀疑模型是不是只靠句法模板取巧。
3. 完整复现流程:从模型选择到指标计算
3.1 环境、模型与数据准备
复现这类实验的门槛不算高,一张消费级显卡也能跑完大部分探测流程。我先说环境:Python 环境、PyTorch、开源的模型加载库就够了。模型选择上,不需要一上来就上几百亿参数的大模型,一个 7B 量级的开源文本模型是个很好的起点,显存占用控制在 8 到 16GB 之间,方便反复试验。
数据准备是整个流程中最耗时间的部分。不建议直接拿现成数据集,因为现成数据集通常混杂了图片描述、对话语料,视觉先验的纯度不够。我自己会构造三类数据。
第一类是空间关系句子,覆盖 200 个常见物体对,每个物体对生成“X 在 Y 的左/右/上/下/旁边”五种关系,同时把物体互换生成对应的反事实负例。第二类是属性绑定句子,固定“颜色/大小/材质”三类属性,让属性交替修饰不同名词。第三类是数量与遮挡问题,写成简短的问答题。整体规模不需要太大,每个任务 1000 到 3000 条就够做统计分析了。
构造完成后要清洗一遍:去掉包含乱码的样本,去掉同时出现多个关系词的歧义句,还要检查同一物体对是否在正负例中重复过多次,避免模型单纯靠记忆模板得分。
3.2 实验一:Zero-shot 空间问答
第一个实验最简单,直接考察模型能不能在没有针对性训练的情况下回答空间问题。我用的是生成式评估:把一条空间关系句喂给模型,让它回答“正确”或“错误”。
import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "pretrained-text-model-7b" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, device_map="auto" ) model.eval() def check_relation(sentence: str) -> str: prompt = ( f"判断下面句子的描述是否正确。只回答“正确”或“错误”。\n" f"句子:{sentence}\n" f"答案:" ) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) with torch.no_grad(): output = model.generate( **inputs, max_new_tokens=8, temperature=0.0, top_p=1.0, do_sample=False, ) answer = tokenizer.decode(output[0][inputs.input_ids.shape[1]:], skip_special_tokens=True) return answer.strip() print(check_relation("杯子在笔记本左边。"))这里有几个细节值得注意。温度必须设为 0,否则同一句话多次生成会得到不同答案,影响可复现性。输出长度限制在 8 个 token 以内,免得模型开始长篇大论解释理由。解析答案时不能只等一个完美匹配,我通常把“正确/错误”作为子串去匹配,同时把“对”“不对”“yes”“no”这类变体也映射进去。
我在几组物体对上的实测结果是:常见物体对的准确率普遍在 70% 到 80%,远超随机基线,说明空间先验确实存在;但换成低概率反事实物体对后,准确率会掉到 55% 左右,说明这种先验并不是在所有情况下都稳定。
3.3 实验二:线性探测内部表征
行为实验说明模型“能做到”,线性探测则想说明模型内部“有编码”。我选择提取句子中两个关键实体的 hidden state,然后训练一个逻辑回归分类器来判断方向标签。
import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import StratifiedKFold def extract_entity_states(sentences, entities, layer_idx=18): features = [] for sent, ent in zip(sentences, entities): inputs = tokenizer(sent, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model(**inputs, output_hidden_states=True) hidden = outputs.hidden_states[layer_idx][0] tokens = tokenizer.convert_ids_to_tokens(inputs.input_ids[0]) ent_indices = [i for i, t in enumerate(tokens) if ent in t] if not ent_indices: ent_indices = [len(tokens) // 2] feature = hidden[ent_indices[-1]].float().cpu().numpy() features.append(feature) return np.array(features)这里一个小小的坑是 token 对齐:中文分词器常常把“笔记本”切成“笔记”和“本”两个 token,所以我取包含该实体的最后一个 token 的特征,效果比取第一个 token 稳定。逻辑回归用默认参数就行,不需要刻意调优,因为线性探测的目的不是刷分,而是看信息是否线性可分。
分类时我会用五折交叉验证,保证测试结果不来自过拟合。如果五折准确率都稳定在 65% 以上,基本可以确认该层激活中存在与方向相关的线性信息。
3.4 实验三:注意力图谱可视化
第三个实验偏定性,用来补足前两个实验缺乏的可视化直观性。我取一个包含多个物体的句子,比如“桌子左边放着一本书,桌子右边放着一杯咖啡”,然后把模型某一层的注意力矩阵提取出来,看“书”这个 token 是否和“左”相关 token 有更高的注意力连接强度,以及“咖啡”和“右”之间是否同理。
import matplotlib.pyplot as plt def show_attention(sentence, layer_idx=6): inputs = tokenizer(sentence, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model(**inputs, output_attentions=True) attn = outputs.attentions[layer_idx][0].mean(dim=0) # 平均多头 tokens = tokenizer.convert_ids_to_tokens(inputs.input_ids[0]) fig, ax = plt.subplots() cax = ax.matshow(attn.cpu().numpy(), cmap="RdYlBu_r") ax.set_xticks(range(len(tokens))) ax.set_yticks(range(len(tokens))) ax.set_xticklabels(tokens, rotation=90) ax.set_yticklabels(tokens) fig.colorbar(cax) plt.show()注意输出注意力需要模型返回 attention 权重,很多优化后的模型默认关闭这个选项,需要在加载时把output_attentions打开。定性观察不一定能直接证明视觉结构,但你能很直观地看到模型的注意力是否在空间关系词之间形成热点。如果要定量化,可以计算同侧实体-方向词的平均注意力权重是否显著高于反侧,最好多取几个句子做平均,避免单句偶然性。
3.5 指标计算与报告模板
实验做完之后,最后的报告格式比很多人想的更重要。我建议统一使用一个指标表,把正常任务、控制任务、随机基线放在一起对比。表格参考如下:
| 任务维度 | 随机基线 | 模型准确率 | 控制任务准确率 | 初步结论 |
|---|---|---|---|---|
| 空间关系 | 0.50 | 0.76 | 0.51 | 存在稳定的方向编码 |
| 属性绑定 | 0.50 | 0.68 | 0.49 | 属性绑定先验较弱 |
| 数量推理 | 0.33 | 0.57 | 0.32 | 数量先验存在但不强 |
| 遮挡判断 | 0.50 | 0.62 | 0.46 | 依赖物体恒存常识 |
显著性水平不能只看点估计,我至少会对每个任务做 5 次重复构建,样本量保持在 1000 条以上,报告“均值±标准差”。如果两个任务之间的差距小于标准差,那就不应该过度解读。另外,模型生成结果不是稳定的点,所以解析器本身的误差也要评估,比如我通常随机抽 200 条人工核对解析器的准确率,确保在 98% 以上再采信。
4. 常见翻车现场与避坑记录
4.1 模型会“假装”有视觉先验
我第一次复现空间问答实验时,看到 80% 多的准确率非常兴奋,差点以为找到了一个“用文本就能做视觉推理”的强力证据。但做了控制任务之后立刻冷静下来:把句子里的物体对随机打乱,得到的结果几乎和正常任务一样高。这说明模型很多时候依赖的其实是物体词的常规共现,而不是真正的空间结构。比如“大象在老鼠左边”这句话,模型判断为“正确”的概率很高,可能不是因为它在推理空间关系,而是因为大象和老鼠共现时,大象总被描述为更大、更宽、更有分量,模型潜意识里认为“大象不管在哪边都更合理”。
解决这个问题的办法就是我前面反复强调的控制任务。把正例换成物理反事实组合,比如“老鼠在大象左边”,再换成语义上无意义但语法正确的组合,比如“云在石头下面”。只有当正常任务显著高于这类控制任务时,才可以初步认定模型确实在做空间推理。稍微极端一点的补充方案是构造“中性实体对”:用两个没有明显大小差异、也没有常见空间共现的物体,比如“勺子”和“橡皮”,这样才能把物体语义的干扰压下去。
4.2 分词器对空间短语的破坏
中文模型跑空间任务时,一个非常隐蔽的问题是分词。像“左上角”这种词,有分词器会直接切成“左”和“上角”,或者切成“左上”和“角”,导致模型处理空间关系时整个短语的语义被拆散。线性探测实验里,如果我想提取“杯子”这个实体的特征,却因为分词把“杯子”拆成了“杯”和“子”,最后取到的 token 特征就会偏离原词。
这种情况的排查并不难:在提取特征之前先把 token 序列打印出来,逐条检查目标实体是否完整。如果发现大量实体被拆分,要么换用一个分词粒度更匹配的模型,要么在特征提取时把实体对应的所有 token 做平均池化。我做了一个小脚本,自动统计数据集中实体被完整分词的覆盖率,低于 90% 就优先明确分词问题,而不是急着跑模型。这个小习惯帮我避免了很多虚假的负面结论。
4.3 prompt 模板过于单一是最大的隐藏变量
同一套空间关系数据,如果把 prompt 从“判断下面句子的描述是否正确”换成“请回答对或错”,再换成“下面这个陈述合理吗”,结果能差 20 个百分点。我一开始只用了单一模板,得出“模型没有视觉先验”的结论;换成填空式 prompt 后,同一个模型又表现得很强。这个反差让我意识到,模板本身就是实验的一部分,任何单一 prompt 的结果都不足以支撑结论。
这恰恰也是那篇 Meta 分析强调系统性测试的原因:只测一种 prompt 相当于只测了模型能力的一个切片。实际操作中,我会为每个任务准备至少 8 到 10 种模板,尽量覆盖指令式、问答式、填空式。最后报告时,不只报最好的一组,而是报所有模板下的平均表现和标准差。如果模型在绝大多数模板下都明显高于随机基线,这个结论才比较可信。
4.4 多语言空间表达的差异
跨语言复现时还有一个常见问题:不同语言表达空间关系的方式差异巨大。英语有清晰的“left of、right of”这类介词结构,中文也一样清晰,但某些语言会把方向关系合到动词或名词的词形变化里,或者习惯上不直接说“左边”而是说“靠左的那一个”。如果直接用同一套模板翻译过去,模型的信号强度可能因为语言习惯而改变,但这不代表视觉先验不存在。
我对此的做法是:不追求跨语言统一模板的“绝对可比”,而是分语言单独评测。先看每种语言内部,模型是否正确理解句法和语义;再比较跨语言的一致趋势。比如如果中文、英文、日文模型都在空间任务上显著高于各自的控制任务基线,那么就能得到一个更强的普遍性证据。
4.5 显著性检验与样本量
最后必须提醒的就是样本量。视觉先验的探测实验往往因为数据构造麻烦,随手做几百条就出结论。我见过有人用 50 条样本就得出了“模型没有空间能力”的结论,这几乎就是噪声。50 条样本的置信区间非常宽,准确率从 35% 到 65% 都可能只是随机波动。
更稳妥的做法是每个任务至少 1000 个独立 prompt 样本,并且保证正负例比例接近 1:1。统计检验我用的是 Wilson 区间,它能基于成功数和总样本数直接算出一个置信区间,报告时比单纯点估计诚实得多。生成模型还有一个额外麻烦:就算温度设为 0,某些模型的并行解码也可能带来轻微波动,所以重复跑 3 次取均值比较保险。
5. 视觉先验对后续研究和应用的影响
5.1 对多模态预训练的影响
这篇工作总结最直接的应用价值,在于提醒多模态预训练的研究者:不要把语言模型当成一块完全空白的画布。大量实验显示,纯文本模型已经内化了一部分和视觉相关的结构知识,那么视觉语言预训练的任务就不应该是“从零教会模型什么是空间关系”,而应该是“让视觉编码器和已有的语言空间结构对齐”。
我见过不少多模态实验,浪费了大量算力让视觉塔从头学习“左边/右边”这样的抽象概念。但如果语言侧已经有一个可读的空间方向子空间,更好的策略也许是在训练初期加一个显式的对齐监督,把图像里物体相对位置的视觉特征,映射到语言侧已经存在的方向向量附近。这样视觉塔的学习负担会小很多,收敛也更快。这个想法完全是这篇 Meta 分析给我带来的启发:先盘点语言模型已有的能力,再决定多模态阶段要补什么,而不是盲目堆数据。
5.2 对视觉语言评估的影响
视觉先验的存在,还让多模态评估这件事变得比以前棘手。如果一个视觉语言模型在“看图描述物体的左右位置”这类任务上取得了高分,你很难判断它高分的原因到底来自视觉塔真的读懂了图像,还是来自文本侧的空间先验证。如果测试图片描述的是“大象在老鼠左边”,模型可能不用看图片就能答对。
因此,评测多模态模型时,应该加入一个纯文本基线。方法很简单:把图片对应的文字描述喂给同一个模型,但不给它图片,然后比较有图和无图两种情况下的成绩差。如果两者相差无几,说明这次评测根本没测出视觉能力。我在这篇工作的影响下,调整了自己后续评测流程:任何多模态任务,都先跑一遍纯文本版本,把纯文本基线分数单独列出。这个习惯能有效区分“语言上就会”和“看了图才会”。
5.3 可以继续往下做的三个方向
沿着视觉先验的思路,我目前比较关注三个延伸方向。
第一个方向是把先验探测从视觉推广到其他模态。语言里不仅有空间关系,也有时间顺序、因果关系、声音高低、运动速度等结构。比如“闪电之后雷声响起”隐含着时间先后,“球滚下坡越来越快”隐含着加速度。这些结构同样可以被线性探测,同样值得被纳入语言模型能力图谱。
第二个方向是更精细的可解释与编辑。如果视觉先验集中在特定的表征子空间,那么能不能通过调整这个子空间来提升或减弱模型的空间推理能力?比如人为放大“左右方向”这一维的信号,模型是不是能更准确地处理复杂空间描述。这类干预实验如果能稳定复现,对模型可控生成非常有价值。
第三个方向是训练数据设计。既然视觉先验来自语言中密集的空间和属性描述,那么预训练数据配比里是不是应该加入更多“说明性文本”?现在很多大模型语料以对话、网页表单、短文本为主,这类文本中的空间关系密度偏低。如果刻意加入高品质的百科描述、空间关系句、属性对比句,也许能够在参数量不变的情况下显著提升多模态基础能力。这个方向目前还缺公开的对照实验,值得做。
我自己做完这一整套复现实验后,最大的体会是:与其争论“语言模型到底有没有视觉”,不如换成更务实的问题——“它拥有的是哪种视觉先验,边界在哪里,什么条件下会失效”。这篇 Meta 分析提供的最有价值的东西,不是一个非黑即白的答案,而是一套测量方法论:用任务族覆盖多维能力,用控制任务排除统计捷径,用因果干预验证内部机制,用多模板跨语言测试制造结论的稳定性。最后再分享一个小技巧:做这类探测实验时,永远先跑控制任务再跑正常任务,这个顺序能让你少走很多弯路。先证明模型没有作弊,再去庆祝它的能力。