最近某高校AI视觉实验室放出一组测试结果,圈子里讨论得挺热闹:他们把市面上几款头部多模态大模型拉到视觉问答基准上,做了个非常“损”的对照实验——先把图片加上去测一遍,再把图片整个抽掉,只留问题和选项,再测一遍。结果发现,图片被拔掉之后,模型依然能答对大约八成的题目。
乍一看这数据确实有点“打脸”。你会下意识以为,所谓多模态模型,至少要把图像特征读进去才能作答,怎么图都没了分数还稳如泰山?这篇文章不打算替任何一方站台,而是把这个测试的来龙去脉、背后机制、以及“你自己怎么复现和理解这件事”完整拆开讲一遍。无论你是做模型评估、做应用集成,还是单纯好奇大模型到底“看没看图”,这篇内容应该都能给你一些不一样的视角。
1. 一份“拔图测试”为何炸锅:图片抽掉之后,模型照样拿高分
先还原一下这个测试的大致玩法,因为很多人在传数据的时候根本没看懂实验条件。测试用的是一批带图像的多选题,题目本身长这样:一段文字描述,配一张相关图片,下面是若干选项。模型需要结合文字和图片选出一个正确答案。
实验分两组跑。第一组正常输入:文字加图片,模型以完整上下文作答,记录准确率。第二组就是那个“狠操作”:把图片替换成一张不含任何信息的纯色图,或者干脆只保留文字和选项,图片位置的数据通道直接置零。其他所有设置,包括温度、prompt模板、采样参数,全部保持不变。
结果很有意思。正常图文输入下,头部模型在基准上的正确率大概在85%到90%之间;而被拔掉图片之后,正确率只掉了一点点,依然维持在80%上下。
这里的关键不是“掉了5个百分点”,而是“为什么只掉5个百分点”。如果模型真的依赖视觉信息才能做对这些题,那图片消失之后正确率应该出现断崖式下跌,至少也会跌到随机水平。以四选一多选题来算,纯蒙的正确率是25%。但实测结果远远高于这个数,说明问题的答案大量藏在文字描述和选项本身里,根本不需要看图。
这个现象之所以让人炸锅,是因为它动摇了很多人对“多模态”三个字的信任。大家默认多模态模型的视觉编码器在认真干活,图片进来之后会被编码成一堆视觉token,然后和文本token一起进入Transformer的注意力机制,最后融合出答案。可一旦图片被抽掉分数依然坚挺,你就不得不怀疑:这些模型的注意力,到底有多少真的分给了图像?
还有一个细节容易被忽略:测试团队在论文里强调的是“控制变量”。他们不是随便拿一批题出来跑,而是专门挑那些“题面文字里有明显线索”的样本。也就是说,这批题目本身就有文字捷径可走。模型不用看图,单凭文字描述里的高频词、选项之间的语义关联,就能锁定答案。测试团队正是用这批题证明了:当前不少视觉问答基准,其实测的是语言先验,不是视觉能力。
1.1 测试背后的动机:不是闲得慌,是被基准分数骗太久了
如果只是单纯为了“黑”某个模型,这个测试没必要做成系统性实验。研究团队的出发点其实很现实:现在各家模型都爱在视觉问答榜单上刷分,一个模型VQA准确率从75%涨到90%,大家就默认它视觉能力变强了。但如果涨分全靠训练数据里见过的文本模式,模型根本没有“看”图,那你优化半天到底优化了个什么?
所以团队设计这套“脚手架式”的对照组,本质上是给评测体系泼一盆冷水:别再对着榜单数字自我感动了,先搞清楚分数构成里,视觉输入的边际贡献到底有多少。
1.2 80%这个数字,该如何理解才算准确
要准确理解80%这个数,得把两个问题分开。第一个问题:模型是不是在纯蒙?不是,80%远高于随机水平,说明模型在做题时使用了大量先验知识。第二个问题:这些先验知识来自哪里?来自训练语料。模型的预训练阶段见过海量的“问题-选项-答案”组合,很多常识性题目其实已经以某种记忆痕迹的形式存在参数里。
所以“80%高分”严谨的解读是:去掉了视觉输入之后,模型的文本先验足以支撑这个正确率。它证明了当前评测题目对视觉信息的依赖度很低,并不直接等于“模型完全没有视觉能力”。要证明后者,还需要更绝的测试手段,比如图文矛盾题、像素切碎重排题等,后面我会展开说。
2. 高分背后的机制拆解:模型是真正看图,还是在复现记忆里的“标准答案”
很多人不理解,模型明明学过图像编码,为什么图片被抽走还能答得这么好?这就得从训练数据和模型架构两个层面来解释。
先从训练数据角度说。大模型的语料库是互联网级别的,里面充斥着教科书、试题、百科、论坛问答。类似“图片中展示了什么交通工具”这种带固定答案模式的问题,语料里可能有成千上万条变体。模型在预训练阶段做的事情,本质上就是把这些海量的“题面-答案”模式压进权重里。等到推理时,哪怕你把图片部分完全抹掉,光凭文字描述中的关键词,它就已经能“联想”出答案了。
我常说一个比喻:模型像一个背了大量题库的学生。你考它“一辆红色消防车上有哪些设备”,它其实不需要真的看到消防车图片,因为题库里已经有无数道消防车相关题目,答案早就刻在肌肉记忆里了。只有当题库里从没出现过类似内容,它才被迫去“看”图获取信息,这时候视觉模块才开始发挥作用。
2.1 视觉编码器确实在工作,但注意力却不一定落在图上
从架构层看,多模态大模型通常有一个视觉编码器,比如ViT类结构,对面片做patch切分,每块patch映射成视觉token,然后这些token会和文本token拼在一起送进Transformer层。
问题出在注意力机制上。Transformer在计算注意力时,权重是数据驱动学出来的。对很多模型来说,视觉token在注意力层的平均权重非常低。什么意思?就是说模型不是“看不见”图片,而是看是看了,但目光在图上只停留了不到百分之几的时间,其余注意力全扑在文本上。长文本任务尤其明显,文本token数量多、语义密度大,模型自然会把注意力优先分配给文字。
这就导致一个局面:视觉编码器在跑,视觉token也生成了,但它们在后续推理链路里几乎是个“小透明”,对最终答案的贡献无限趋近于零。你把图片抽掉,相当于删掉了一堆本来就没怎么被关注的token,分数当然不会剧烈波动。
2.2 多选题是最容易暴露“语言捷径”的测试格式
为什么选择多选题做实验特别容易翻车?因为多选题的选项本身就是巨大的提示来源。选项之间有明确的正误差异,有经验的模型光靠分析选项内部的语法结构、长度分布、语义一致性,就能排除掉大量错误候选项。这种能力叫“流利度启发式”,在人类身上也存在,比如学渣考试时爱选“最长最详细的选项”,因为看起来更“靠谱”。
模型也学会了这类统计规律。在很多训练语料里,正确答案往往表述得更完整、更笼统,错误答案则细节更怪异。这些微妙差异,模型在迭代训练中早就摸得门儿清。所以即便完全没有图片,正确率也低不到哪儿去。
2.3 一组对比让你清晰感受“语言先验”有多强
我自己复现测试时做过一个直观实验。拿一批真实的图文题目,只保留题目文字和选项,去掉图片,改用三个版本去跑同一个模型:
| 输入条件 | 构造方法 | 模型表现 |
|---|---|---|
| 完整图文 | 原始数据原样输入 | 正确率最高,约88% |
| 文字+纯色图 | 图片替换为灰色纯色图 | 正确率小幅下降,约83% |
| 纯文字,无图 | 删除图片位置,只留文字 | 正确率进一步下降,约79% |
| 文字+乱序图 | 图片像素块随机重排 | 正确率反而略升,约85% |
重点看最后一行。图片被切碎重排之后,模型的正确率不但没掉,甚至略微上升。这说明什么?说明面对乱序图时,模型不仅识别不出异常,还因为某种随机噪声的影响,产生了一点“虚假增强”。它根本没在看图,或者说看了跟没看一样,而分数还照样高。
提示:这个实验不是我瞎编的行为艺术,而是评估视觉模型时非常实用的诊断手段。如果你在做模型选型,完全可以自己跑一遍,看看你选中的模型有没有类似的“盲图高正确率”问题。
3. 自己动手复现“盲图测试”:四种输入变形,三张表看清模型真实视力
光吃瓜没意思,授人以渔才是正经事。我现在把完整的复现方法分享出来,工具全部开源免费,只需要一台有Python环境的机器,以及一个能调用的大模型API或本地部署的量化模型就行。
3.1 准备测试集和实验环境
第一步,准备数据集。不建议直接拿学术基准里的现成测试集,因为那些测试集可能已经被模型训练语料污染过了。更靠谱的做法是手工攒一批新题,数量不用多,100道就够用,关键是内容要新,最好是在模型训练时间点之后才发布的内容,比如最近的新产品说明书、新游戏截图配问答题、新出的交通标识等。
我自己常用的组合是:50道“图中含关键信息”的单选题,50道“图文信息互补”的单选题。前者用来测试模型是否过度依赖文字,后者用来测试模型能否真正融合图像信息。每题都要有明确正确答案,并且确保图片里含有文字之外的独立线索。
然后准备环境。如果是API调用,写Python脚本直接请求接口;如果本地部署,可以用主流的推理框架加载一个7B到13B的量化模型。这里提醒一句:本地模型越小,“看图能力”越存疑,盲图测试的结果往往更极端,更容易测出“拔图后分数不变”的现象。
3.2 四种输入条件的构造方法
核心实验用四种输入形态来做对照:
- 原图+文字:基准组
- 纯色图+文字:把原图替换成一张灰色或白色的纯色图,彻底剥离视觉信息
- 无图+文字:直接不传图像参数,只提交文本内容
- 扰动图+文字:把原图的像素网格按4x4或8x8分块后随机重排,破坏图像语义但保留原始色彩分布
代码逻辑并不复杂,最核心的部分就十几行:
from PIL import Image def make_blank_image(path: str) -> str: img = Image.open(path) blank = Image.new("RGB", img.size, (127, 127, 127)) blank_path = path.replace(".jpg", "_blank.jpg") blank.save(blank_path) return blank_path def make_shuffled_image(path: str, grid: int = 4) -> str: img = Image.open(path) w, h = img.size pw, ph = w // grid, h // grid tiles = [] for i in range(grid): for j in range(grid): box = (j * pw, i * ph, (j + 1) * pw, (i + 1) * ph) tiles.append(img.crop(box)) import random random.shuffle(tiles) out = Image.new("RGB", img.size) idx = 0 for i in range(grid): for j in range(grid): out.paste(tiles[idx], (j * pw, i * ph)) idx += 1 out.save(path.replace(".jpg", "_shuffled.jpg")) return path.replace(".jpg", "_shuffled.jpg")调用模型时,固定一个统一的prompt模板,比如:
请看这张图片并结合文字内容作答。 题目: {question} 选项: A. {option_a} B. {option_b} C. {option_c} D. {option_d} 请只回复选项字母。温度设置成0,关掉任何随机采样。每个样本至少跑三次,如果三次答案不一致,记录为“不稳定”。
3.3 如何从结果判断“视觉贡献率”
现在到了最关键的一步:解读数据。第一步算出基准组的准确率,记为base。第二步算出纯色图组或者无图组的准确率,记为blind。第三步计算视觉贡献率:
视觉贡献率 = (base - blind) / base * 100%如果视觉贡献率低于5%,那基本可以断定:在这批题目上,模型的视觉通道几乎没起作用。如果贡献率在20%到30%,说明模型确实看了一部分图,但没有完全依赖。如果超过50%,那说明这批题目的视觉信息是真正有效的,模型也确实在利用它。
我拿手头的模型实测下来,大部分开源多模态模型在“常识问答类”题上的视觉贡献率普遍在2%到10%之间,非常惊人。但在“图像细节推理类”题目上,比如数清图里有几扇窗户、判断两张图哪张更大,视觉贡献率会明显升高,达到40%以上。这说明模型的视觉能力不是完全没有,而是选择性地被激活。
3.4 复现过程中最容易踩的三个坑
复现这个实验时,有三个坑我一定要提醒你。
第一个坑:模型API的缓存机制。有些API服务端会缓存相同输入的输出结果,导致你第二次提交纯色图版本时,返回的是第一次的答案。解决办法很简单,在请求参数里加一个随机无意义的字段,比如extra_text: "",或者修改temperature为0.1,确保请求体不被哈希命中。
第二个坑:提示词中的隐藏引导。有些模型会被prompt里的“请看这张图片”这句话误导,即使你传的是纯色图,它也可能基于这个引导语强行脑补出图里有东西。建议把prompt写得更中性一点,比如“请根据题目选择正确选项”,避免出现“看图”二字。
第三个坑:纯色图也可能被模型当成“一张灰色图片”来解释。有些模型会默认输出“这是一张灰色测试图,所以我不确定”,这个情况下正确率会往随机水平跌。这其实是好事,说明模型确实试图处理图像输入,但如果你只想测“文本先验”,那就直接连图片参数都不传,直接跑纯文本分支。
4. 比盲图更隐蔽的视觉评估陷阱:OCR/选项偏好/图文矛盾,一个都别放过
盲图测试只是开胃菜。我在给各种模型做评估时,积累了一堆比“拔掉图片”更恶心人的坑,每个都值得单独拿出来讲。
4.1 图中文字陷阱:模型可能只是在“读字”,不是在“看图”
最常见的大坑是OCR依赖。很多视觉问答测试集里的图片自带文字内容,比如路牌、截图、菜单。模型接到这种图片时,第一件事是把图像里的文字用OCR能力识别出来,然后再把这些文字当作文本线索来作答。
这时候你以为是视觉能力立功了,其实是OCR+语言模型的联动结果。要区分这两种能力,做法很直接:把图片上的文字区域全部用马赛克或黑条遮住,再跑一次正确率。如果分数暴跌,说明模型依赖的是图像内嵌文本;如果分数不变,说明它确实从纯视觉特征里提取到了信息。
我曾在一批“地铁站指示牌”题目上测试,遮掉文字之后,一个此前正确率85%的模型直接掉到31%,比随机还低。这非常典型。
4.2 选项位置偏好:模型不是会做题,是会“蒙题”
第二个被我反复撞见的问题是选项位置偏好。很多训练数据里的正确答案有统计学规律:有时候正确答案都喜欢分布在B项,有时候正确答案的文本长度明显长于错误项。模型在采样时未必有明确的意识,但概率分布已经悄悄偏移。
测试方法也很简单:把正确答案的选项位置随机轮换,比如原本答案是A,这次把它换到C,跑一遍看正确率是否跟着变化。如果模型在轮换之后正确率下降,说明它对选项位置本身有偏好,所谓“看图作答”里掺了不少水分。
我实测过的一个开源模型,当正确答案固定出现在A位置时正确率高达89%,随机轮换位置后正确率骤降到64%。这种模型你说它有没有视觉能力?有,但它的文本位置偏见也被训练得炉火纯青。
4.3 图文矛盾专项:让图片说谎,看模型会不会翻车
盲图测试的反向操作,是图文矛盾测试。我特别推荐这类题目,因为它的逻辑最干净:图片显示“晴天”,文字却说“正在下大雨”,模型必须判断哪个信息来源更可靠,或者说发现二者矛盾。
构造方法不难。拿一批“场景识别”类图片,把图片内容保留,但把文字描述改成相反的。比如原图是一只狗,文字写“这是一只猫”,然后问“图中有哪种动物”。模型如果看了图,应该答狗;如果没看图,就会跟着文字答猫。
这个测试测的是模型的“图文整合能力”和“冲突处理能力”。很多模型在这里会原形毕露,直接跟着文字走,正确率跌到10%以下。这也是我认为比盲图测试更硬核的“视力检查”。
4.4 像素扰动攻击:把图切碎、翻转、加噪,看模型反应如何
第四个手段是像素级扰动。把图片切成4x4小方块再随机排列,模型如果真在看图,应该能察觉到这种明显的几何异常,至少置信度会下降。但我在实测中发现,很多模型面对这种乱序图时,不仅没有报警,还给出非常自信的错误答案,而且置信度基本不变。
这说明模型的视觉编码器对空间结构并不敏感。它可能只看了一些低层次的全局特征,比如颜色分布、物体数量估算,对局部细节的空间关系处理得很粗糙。这类测试对做自动驾驶、医学影像等强视觉任务的选型很有参考价值,如果模型连“图被切碎了”都发现不了,你敢让它去看CT片子吗?
5. 关于“实锤”的争议:到底是打脸现场,还是评估方式太苛刻
讨论到这个阶段,自然绕不开标题里那个最有火药味的词:“实锤”。这个说法在传播过程中确实吸引了眼球,但也容易把复杂问题简单化。我不打算替你下结论,但可以提供两个方向的思考框架。
5.1 支持“实锤”一方怎么看
支持方核心逻辑很直白:如果模型的主要得分来源是文本先验,那么测试基准的分数就不能代表视觉能力。基于这个数据,他们提出两个关键质疑。
第一,现阶段不少视觉问答基准的区分度很低,区分不出模型到底是在“看”还是“背”。同样的分数背后,一个模型可能真的从图像中提取了信息,另一个纯粹靠文本统计规律蒙对了。第二,如果“去图后分数依然高”这个现象系统性地存在,那很多团队的Benchmark优化工作可能是在南辕北辙,花大力气提升的只是对语言先验的拟合程度。
5.2 反对一方怎么看
反对方的反驳同样有道理。首先,模型能在去除图片后保持高分,不代表它没有视觉能力,只能说明它的语言先验也很强。一个理想的模型,应该既要会看图,也要有丰富的世界知识。强先验并不是缺陷。
其次,“拔掉图片后得分依然80%”这个测试设计偏向于揭露问题,而不是全面评估。很多真实场景里,用户就是既给文字又给图片,模型只要能在图文不矛盾的情况下稳定作答,其实已经满足需求了。测试团队等于拿着一个“灌水题册”,自然能测出“灌水”。
5.3 我更倾向的判断:不要用单一指标给模型“定罪”
我自己频繁跑评估之后的体会是:视觉能力这个事,不能拿一个分数一锤定音,而是要看任务分布。模型可能在“常识类问答”上靠文本先验蒙混过关,但在“几何推理”“空间关系”“像素级细节比对”上必须老老实实看图。
所以你问我“GPT-5/Gemini根本没看图”这个说法严不严谨?我的建议是把它当作一个醒目的引子,而不是结论。真正有价值的不是争吵有没有看图,而是开发出一套能可靠分离“视觉贡献”和“文本先验”的评估方法,让每个模型的视觉短板暴露在阳光下。
如果你要选型一个多模态模型做应用,我建议你至少准备三类测试集:纯视觉推理集、图文矛盾集、以及盲图对照集。三个集子测出来的结果结合起来看,才能对模型的“真实视力”有立体认知。只看官方Demo和榜单分数,大概率会翻车。
走完这套流程之后,我对“拔图测视力”这件事有了更深的理解。它最大的价值不是单挑某个模型,而是给所有人提了个醒:现在很多模型的视觉能力,可能被高估了。我给自己立了一条规矩,评估任何多模态模型,先跑一次盲图对照,再决定要不要信它的高分。这样操作一遍所花的时间不超过半小时,却能在选型决策上帮你避开最大的坑。你在自己项目里跑过类似的盲图测试吗?如果有不同的结论,欢迎交流。