多模态大模型这两年在各类榜单上刷得飞起,图文问答、图表理解、截图推理,几乎每个季度都有新纪录。但真正把它拉进生产环境跑纯文本任务的人,往往会撞上一个很别扭的现象:同一个基座、同一批文本输入,多模态版本的回答质量反而不如纯文本版本,长文摘要开始丢要点,逻辑推理开始绕圈子,指令遵循变得含糊。这个现象在业内已经不算秘密,只是很少有人把它拆开讲透。我前后在几个文本处理链路上做过对照测试,踩过的坑足够写一篇长文,今天就把注意力机制层面的原因和数据偏见层面的原因分开聊,顺带把排查方法和缓解手段一并交代清楚,方便你直接拿去复现。
这篇文章面向的是已经用过多模态模型、或者正准备把多模态模型接入文本流水线的从业者,也适合对模型内部机制好奇、想搞明白“为什么加了能力反而变差”的读者。全文围绕注意力机制的跨模态分配和数据偏见的隐性迁移两条主线展开,中间穿插可落地的对照实验设计、参数观察方法和避坑经验。读完之后你至少能做到两件事:一是判断自己遇到的文本能力下降属于哪一类原因,二是在不改动基座的前提下,用工程手段把损失压到可接受范围。
1. 先搞清楚“下降”到底降在哪
在动手排查之前,最忌讳的就是笼统地说“多模态模型文本能力差”。这个判断太粗,粗到没法指导任何操作。我习惯把文本能力拆成几个可独立观测的维度,分别打分,才能定位到具体是哪一环出了问题。
1.1 把文本能力拆成四个可观测维度
我常用的拆法是四维:指令遵循、长上下文信息保持、逻辑推理链完整性、输出风格稳定性。这四个维度对应的是完全不同的内部机制,混在一起测只会得到一团模糊的结论。
指令遵循看的是模型对格式约束、否定约束、多条件约束的执行率,比如“用三句话回答且不出现数字”这类。长上下文信息保持看的是在几千到几万 token 的输入里,关键实体和关键结论的召回率。逻辑推理链完整性看的是多步推理中每一步是否成立、有没有中途跳步。输出风格稳定性看的是同一提示多次采样时,语气、结构、详略程度的一致性。
实测下来,多模态模型在纯文本任务上的下降往往不是均匀分布的。我做过一组对照,同一个基座的两个版本在短指令任务上差距不到两个百分点,但在长上下文摘要任务上,关键要点召回率能差出十来个点。这个不均衡本身就是重要线索——它说明问题不在“语言能力整体退化”,而在某些特定机制上被干扰了。
注意:不要用单一 benchmark 的总分下结论。总分是把四个维度加权平均后的结果,会把最严重的那一维稀释掉。分维度测,才能看到真实的短板在哪里。
1.2 对照实验的最小设计
想确认下降是否真实存在,最小对照实验需要控制三个变量:基座版本、解码参数、提示模板。三者任一变动,结论都不可信。
我的做法是固定解码参数(温度设 0 或极低、top-p 固定、最大长度固定),用同一套提示模板,分别跑纯文本版本和多模态版本,每个任务采样多次取均值。采样次数不用太多,同一提示跑五到十次足够看出稳定性差异。提示模板要覆盖短指令、中等长度问答、长文摘要三类,长度梯度拉开,才能暴露长上下文相关的问题。
这里有个容易忽略的点:多模态模型的对话模板往往和纯文本版本不完全一致,特殊 token 的插入位置、系统提示的拼接方式都可能有细微差别。如果直接拿纯文本版本的模板套上去,测出来的差异里会混入模板不匹配的噪声。我的经验是先读模型卡里的对话模板说明,把两边的模板对齐到语义等价,再开始测。
1.3 一个容易被误判的信号
有个信号特别容易被误判:多模态模型在纯文本任务上“话变多了”。输出更长、铺垫更多、结论更晚出现。很多人第一反应是“模型变啰嗦了”,但背后往往是注意力分配变化导致模型对“何时该收尾”的判断变弱,于是倾向于继续生成。
这个信号单独看没有诊断价值,但结合输出风格稳定性一起看就很有用。如果同一提示多次采样,长度方差明显变大,那基本可以确认是注意力层面的稳定性问题,而不是简单的风格漂移。我在排查时会把输出长度分布画出来,长度方差是一个成本极低但信息量很大的指标。
2. 注意力机制层面的原因拆解
多模态模型和纯文本模型在结构上最本质的差别,就是注意力机制要多处理一路甚至多路非文本输入。这个“多出来的一路”不是简单地并联上去就完事,它会在多个层面改变注意力的行为模式。
2.1 跨模态注意力如何挤占文本注意力预算
Transformer 的注意力在每一层、每个头上分配的是有限的“关注预算”。多模态模型在训练时为了让模型学会对齐图像和文本,会引入跨模态注意力,让文本 token 能 attend 到视觉 token,反之亦然。这个机制在图文任务上是必需的,但它的存在会改变文本 token 之间的注意力分布。
打个比方,纯文本模型的注意力像一间会议室里所有人互相讨论,每个人听谁说话、听多久,由内容相关性决定。多模态模型相当于会议室里多了一组用另一种语言发言的人,文本 token 为了“听懂”整体语境,会分出一部分注意力去关注这些非文本信号。哪怕推理时根本没有图像输入,训练阶段形成的注意力模式也会残留下来,表现为文本 token 之间的注意力权重被稀释。
这个稀释效应在短文本上不明显,因为短文本的注意力本来就集中在少数几个关键 token 上,稀释一点不影响大局。但在长上下文里,关键信息分散在大量 token 中,注意力权重的任何一点分散都会被放大,直接表现为关键实体召回率下降。这解释了为什么长上下文任务是重灾区。
2.2 位置编码在多模态训练后的漂移
位置编码是另一个隐蔽的干扰源。多模态训练时,视觉 token 往往占据一段连续的位置区间,文本 token 的位置分布因此和纯文本训练时不同。模型为了适应这种混合序列,位置编码的使用方式会发生微调。
这种微调在图文混合输入时是合理的,但在纯文本推理时就成了负担。模型对“文本 token 应该出现在什么位置、位置关系意味着什么”的先验被轻微扭曲了。表现出来就是长文档里跨段落的指代关系变弱,比如前文提到的一个概念,后文用代词回指时,模型接不住。
我做过一个针对性测试:构造一段长文本,在中间插入一个关键定义,结尾用不同表述回指这个定义,看模型能否正确关联。纯文本版本的正确率明显高于多模态版本,而且差距随着插入位置越靠中间而扩大。这个位置依赖的差距模式,基本可以确认是位置编码层面的问题,而不是语义理解能力本身的问题。
2.3 注意力头功能分化被打乱
在纯文本模型里,不同的注意力头会自发分化出不同功能,有的专门捕捉局部语法依赖,有的负责长距离语义关联,有的盯着特定类型的实体。这种功能分化是训练过程中自然涌现的,对文本任务的稳定表现很关键。
多模态训练引入的新目标会打乱这种分化。一部分原本负责文本长距离关联的头,被“征用”去处理跨模态对齐,功能变得混合。混合之后,这些头在纯文本任务上的表现就不再专一,长距离关联的精度下降。
这个现象很难直接观测,但有个间接验证方法:做注意力头消融。逐个屏蔽部分注意力头,看文本任务性能的变化曲线。纯文本模型通常对少数关键头敏感,屏蔽后性能断崖式下跌;多模态模型的敏感头分布更分散,屏蔽单个头的影响更平缓,但整体基线更低。这个“更平缓但更低”的模式,就是功能分化被打乱的典型特征。
2.4 训练目标冲突带来的注意力震荡
多模态训练通常是多目标联合优化:图文对齐损失、文本生成损失、可能还有对比学习损失。这些目标对注意力分布的要求并不一致。图文对齐希望注意力集中在跨模态对应关系上,文本生成希望注意力集中在语言内部的依赖上。联合优化时,注意力分布会在两者之间来回拉扯。
训练收敛后,这个拉扯不会完全消失,而是以某种折中状态固化下来。在纯文本推理时,这个折中状态就成了负担——注意力分布不是为纯文本任务最优化的,而是为“兼顾图文”折中的。折中的代价,就是纯文本任务上的那部分性能损失。
提示:这个折中状态是结构性的,靠提示工程很难完全消除。理解这一点很重要,它决定了你的缓解手段应该往哪个方向使劲——是补偿注意力分布,还是绕开受影响的环节。
3. 数据偏见层面的原因拆解
注意力机制解释的是“结构性的能力稀释”,数据偏见解释的是“方向性的能力偏移”。两者叠加,才是完整的图景。数据偏见这部分更隐蔽,因为它不体现在结构上,而体现在模型学到的先验分布里。
3.1 图文数据对的文本分布偏差
多模态训练用的图文数据对,文本部分的分布和纯文本语料有系统性差异。图文对里的文本通常是短描述、标题、问答、OCR 结果,句式偏短、词汇偏具体、抽象推理和长逻辑链的内容相对少。
模型在这种数据上继续训练,文本先验会向“短、具体、描述性”偏移。纯文本任务里那些需要长逻辑链、抽象概括、多层嵌套的内容,就落在了训练分布的边缘区域。边缘区域的生成质量下降,是分布偏移的直接后果。
这个偏移在任务类型上有明显选择性。描述性任务、事实问答任务受影响小,因为这类任务的文本分布和图文对接近。长文摘要、多步推理、抽象概念解释受影响大,因为这类任务的文本分布在图文对里覆盖不足。我在实际测试里反复看到这个模式:同一个模型,做图片描述相关文本任务几乎无损,做长逻辑推理就明显吃力。
3.2 指令微调数据的任务配比失衡
多模态模型的指令微调阶段,任务配比往往向多模态任务倾斜。图文问答、图表理解、截图操作这类任务占据较大比例,纯文本的指令遵循、长文处理任务比例被压缩。
配比失衡的后果不是“不会做”,而是“做得不够稳”。模型见过足够多的纯文本指令,知道该怎么做,但见过的多样性和密度不够,导致在边界情况、复杂约束、少见格式上的鲁棒性下降。表现出来就是简单指令执行得很好,稍微复杂一点的组合约束就开始出错。
我整理过一个粗略的观察:多模态模型在单条件指令上的执行率和纯文本版本接近,但在三条件以上的组合约束上,执行率下降明显。这个下降模式和多模态任务配比正相关——配比越偏向多模态,组合约束的执行率越低。
3.3 视觉 token 挤占上下文窗口的隐性成本
很多多模态模型在处理图文输入时,视觉 token 会占用相当一部分上下文窗口。训练时为了适应这种占用,模型学会了在“窗口被部分占用”的情况下工作。这个适应过程会改变模型对“可用上下文长度”的先验判断。
纯文本推理时,窗口是完整的,但模型的行为模式还带着“窗口可能被占用”的惯性。表现出来就是模型对长文本的利用效率下降——明明窗口够用,模型却表现得像窗口紧张一样,提前压缩信息、提前收尾、对后文信息的利用不充分。
这个效应在超长文本上尤其明显。我测过同一段两万字文本,纯文本版本能稳定召回分布在全文各处的关键点,多模态版本在中后段的召回率明显下滑,而且下滑模式和“模型以为窗口快满了”的行为特征吻合。
3.4 偏见在生成风格上的投射
数据偏见还会投射到生成风格上。图文对里的文本偏描述性、偏客观陈述,模型学到的风格先验也偏向这个方向。纯文本任务里需要的主观分析、观点组织、多角度论述,风格上和这个先验有距离。
风格投射的表现很微妙:内容本身没错,但组织方式不对味。该展开的地方一笔带过,该收束的地方反复铺陈,整体读起来“平”,缺少层次。很多人把这归因为“模型变笨了”,其实内容能力没丢,是风格先验把输出结构带偏了。
这个投射在需要强观点组织的任务上最明显,比如评论、分析报告、方案对比。描述性任务上几乎看不出来。判断方法很简单:把同一提示分别给两个版本,对比输出的段落结构,如果多模态版本的段落划分更碎、更平、更少层次,基本就是风格投射在起作用。
4. 实操排查:从现象到根因的定位流程
原因拆清楚了,接下来是落地。排查的核心思路是“分维度测、控变量比、看模式判”。下面这套流程我反复用过,能覆盖大部分常见情况。
4.1 第一步:建立分维度基线
先别急着下结论,把四个维度的基线建起来。每个维度准备一组小而精的测试用例,不用多,每个维度十到二十条足够,但要覆盖该维度的典型难点。
| 维度 | 测试用例设计要点 | 观测指标 |
|---|---|---|
| 指令遵循 | 单条件、双条件、三条件以上组合约束各若干 | 约束执行率 |
| 长上下文保持 | 关键信息分布在首、中、尾的长文本 | 关键点召回率 |
| 逻辑推理链 | 三到五步的推理题,每步可独立验证 | 每步正确率、链完整率 |
| 输出风格稳定 | 同一提示多次采样 | 长度方差、结构一致性 |
基线要跑两遍:纯文本版本一遍,多模态版本一遍。两遍之间只换模型,其他全固定。跑完把四个维度的差值列出来,差值最大的维度就是主攻方向。
4.2 第二步:用注意力可视化辅助判断
如果手头有工具能做注意力权重可视化,这一步能省很多时间。重点看两个东西:文本 token 之间的注意力分布是否比纯文本版本更分散,以及关键 token 的注意力权重是否被稀释。
具体做法是取几条长上下文测试用例,把中间层(比如总层数的二分之一到三分之二处)的注意力图拉出来对比。纯文本版本的注意力往往集中在少数关键 token 上,形成清晰的“关注焦点”;多模态版本的焦点更散,权重分布更平。这个“更平”就是注意力稀释的直接证据。
没有可视化工具也不影响排查,可以用间接方法:构造最小对比对,只改一个关键 token,看输出变化幅度。纯文本版本对关键 token 的变化更敏感,多模态版本更迟钝,敏感度差异就是注意力稀释的间接证据。
4.3 第三步:区分结构性问题和数据性问题
这一步是关键。结构性问题(注意力机制)和数据性问题(数据偏见)的缓解手段完全不同,搞错了方向会白费力气。
区分方法看两个特征。第一,看下降是否随输入长度加剧。结构性问题在长输入上加剧明显,数据性问题在长输入上不一定加剧,更多表现为特定任务类型上的稳定差距。第二,看下降是否随任务类型选择性出现。数据性问题有强选择性,描述性任务几乎无损、推理任务明显受损;结构性问题相对均匀,各类任务都有下降,只是幅度不同。
我一般会做一张二维表:横轴是输入长度梯度,纵轴是任务类型,格子里填性能差值。如果差值沿横轴明显增大,偏结构性问题;如果差值沿纵轴明显分化,偏数据性问题。两者都明显,就是叠加,需要双管齐下。
4.4 第四步:常见问题速查表
排查过程中反复遇到的典型问题,我整理成下面这张表,遇到对应现象可以直接对照。
| 现象 | 可能原因 | 排查动作 | 缓解方向 |
|---|---|---|---|
| 长文摘要丢要点 | 注意力稀释、位置编码漂移 | 关键点召回率测试、位置梯度测试 | 分段处理、关键信息前置 |
| 组合约束执行率低 | 指令微调配比失衡 | 单条件与多条件对比测试 | 拆解约束、分步提示 |
| 输出变长且方差大 | 注意力稳定性下降 | 多次采样长度分布统计 | 固定解码参数、加长度约束 |
| 推理链中途跳步 | 注意力头功能混合 | 分步验证、头消融观察 | 显式要求分步、提供推理框架 |
| 长文后段利用不足 | 上下文窗口先验偏移 | 首中尾信息召回对比 | 关键信息重述、分段喂入 |
| 输出结构偏平 | 风格先验投射 | 段落结构对比 | 显式指定结构、给结构示例 |
这张表不是穷举,但覆盖了八成以上的常见情况。用的时候注意,一个现象可能对应多个原因,别看到第一行就下结论,多做几组对照再定。
5. 工程侧的缓解手段与参数调优
根因定位清楚之后,缓解手段要分两条线走:结构性问题的补偿,和数据性问题的绕行。下面这些手段都是我在不改动基座的前提下验证过的,可以直接抄。
5.1 针对注意力稀释的补偿策略
注意力稀释的核心问题是关键信息被淹没,补偿思路就是“帮模型把注意力拉回来”。最直接的手段是关键信息前置与重述。把长文本里的核心结论、关键约束提到输入开头,在结尾再简短重述一次。这个操作相当于给模型两次“锚定”机会,抵消注意力分散带来的召回损失。
实测下来,这个手段对长文摘要任务的效果最明显,关键点召回率能拉回大半。代价是输入变长,但对大多数场景来说这个代价可以接受。
第二个手段是分段处理加中间汇总。把超长文本切成若干段,每段单独处理得到中间结果,再对中间结果做汇总。这个做法绕开了长距离注意力,把长上下文问题转化成多个短上下文问题。切分点要选在语义边界上,别在句子中间切,否则会引入新的噪声。
第三个手段是显式注意力引导。在提示里明确告诉模型“重点关注以下部分”,把关键段落用清晰的分隔标记框出来。这个手段的原理是给模型一个强信号,让注意力分配有个明确的落点。效果不如前两个稳定,但在不方便改输入结构时是个轻量选择。
注意:这三个手段可以叠加,但别一次全上。叠加太多会让输入结构变得复杂,反而干扰模型。我的经验是先上前置重述,不够再叠加分段处理,显式引导作为补充。
5.2 针对数据偏见的绕行策略
数据偏见的核心问题是先验分布偏移,绕行思路是“用提示把模型拉回目标分布”。最有效的手段是少样本示例对齐。给几个符合目标任务分布的示例,让模型在上下文里临时“校准”到正确的任务模式。示例不用多,两到三个高质量的就够,关键是示例的分布要和目标任务一致。
这个手段对风格投射特别有效。给两个结构清晰、层次分明的示例,模型的输出结构会明显向示例靠拢,段落层次感回来得很快。示例的选择有讲究:要选典型但不极端的,太极端的示例会把模型带向另一个方向。
第二个手段是任务拆解。把复杂任务拆成多个简单子任务,分步执行。这个手段针对的是指令微调配比失衡导致的组合约束执行率低。拆解之后每个子任务的约束都变简单,落在模型擅长的分布区域内,执行率自然回升。拆解的粒度要适中,拆太细会增加调用次数和累积误差,拆太粗起不到效果。
第三个手段是显式结构指定。在提示里明确给出输出的结构框架,比如“分三部分,每部分先结论后论据”。这个手段针对的是输出结构偏平的问题,用显式指令覆盖风格先验。效果取决于指令的明确程度,越具体越有效。
5.3 解码参数的针对性调整
解码参数对稳定性的影响常被低估。多模态模型在纯文本任务上的输出方差偏大,适当收紧解码参数能明显改善稳定性。
温度是最直接的杠杆。纯文本任务上,温度设低一些(接近贪心解码)能显著降低输出方差,代价是多样性下降。对大多数文本处理任务来说,这个交换是划算的。top-p 同步收紧,和温度配合使用。重复惩罚要谨慎,多模态模型的重复倾向和纯文本模型不同,惩罚系数设高了容易导致输出断裂,设低了压不住重复,需要针对具体模型调。
我把常用参数组合整理成下表,作为起点参考,具体还要按模型微调。
| 任务类型 | 温度 | top-p | 重复惩罚 | 说明 |
|---|---|---|---|---|
| 结构化抽取 | 0~0.1 | 0.8~0.9 | 1.0~1.05 | 追求确定性,方差最小 |
| 长文摘要 | 0.1~0.3 | 0.85~0.95 | 1.05~1.1 | 兼顾稳定与表达自然 |
| 逻辑推理 | 0~0.2 | 0.8~0.9 | 1.0 | 低温度保链完整 |
| 风格化写作 | 0.5~0.7 | 0.9~0.95 | 1.1~1.15 | 保留多样性,靠示例控风格 |
参数调优的顺序建议是:先固定温度到低值确认基线,再逐步放开看方差变化,找到方差可接受的上限。别一上来就调一堆参数,变量太多没法归因。
5.4 提示模板的对齐与优化
提示模板的对齐是排查阶段就要做好的事,但在缓解阶段还要进一步优化。多模态模型的对话模板往往有特殊约定,比如系统提示的拼接方式、特殊分隔符的使用。按模型卡里的约定来,别想当然套用纯文本版本的模板。
优化方向上,我总结了两条经验。第一,约束要显式且靠前。把格式约束、长度约束、内容约束放在提示的前部,别藏在中间或结尾。多模态模型对后部约束的遵循度偏低,靠前放能明显提升执行率。第二,给结构不给内容。需要特定输出结构时,给出结构框架但不要给具体内容示例,避免模型照抄示例内容。这个度要把握好,示例太具体会限制模型发挥,太抽象又起不到引导作用。
6. 几个我踩过的坑和实测心得
写到这儿,机制和手段都交代得差不多了,最后分享几个实际操作中踩过的坑,都是文档里不会写、但实际会绊住人的细节。
第一个坑是拿不同版本的模型卡参数直接对比。多模态模型和纯文本模型的默认解码参数经常不一样,有的默认温度就偏高,有的默认最大长度不同。不做参数对齐就直接比输出,测出来的差异里混着参数差异,结论完全不可信。我现在的习惯是每次对照实验前,先把两边的解码参数逐项对齐并记录,这一步花不了几分钟,但能省掉后面大量的返工。
第二个坑是忽视对话模板的细微差异。有一次排查长文摘要的质量下降,折腾了半天注意力机制,最后发现是多模态版本的对话模板在系统提示后多插了一个分隔符,导致模型对系统提示的权重判断变了。对齐模板之后,差距缩小了一大半。这个教训让我养成了先读模板说明、再做对照的习惯。
第三个坑是过度依赖单一指标。输出长度、困惑度、某个 benchmark 的分数,单独看都容易误导。输出变长不一定是坏事,可能是模型在展开论述;困惑度升高不一定是能力下降,可能是分布偏移。我的做法是至少三个指标交叉验证,且指标要覆盖不同维度,别都在同一个维度上打转。
第四个坑是缓解手段叠加过度。前置重述、分段处理、少样本示例、显式结构指定,这些手段单独用效果都不错,但全堆上去之后,输入结构变得极其复杂,模型反而抓不住重点,输出质量不升反降。我现在的原则是最多叠加两个手段,且叠加后必须重新做对照测试,确认净收益为正。手段不是越多越好,简洁的输入结构本身就是一种优势。
第五个坑是忽略任务本身的分布特性。同样是纯文本任务,描述性任务和推理性任务受多模态训练的影响程度差很多。如果不区分任务类型,笼统地做优化,很容易在受影响小的任务上过度优化,在受影响大的任务上优化不足。按任务类型分组做对照,是更靠谱的做法。
实测下来,把上面这些手段用对,多模态模型在纯文本任务上的性能损失能压到很小,大部分场景下和纯文本版本的差距可以控制在可接受范围内。但要说完全消除,目前的结构下做不到,也没必要强求——多模态能力本身带来的价值,往往能覆盖这部分损失。关键是要清楚损失在哪、有多大、怎么补,而不是笼统地觉得“多模态模型文本不行”就放弃使用。搞清楚机制,用对手段,该用还是得用。