代码作为中介:从语言模型蒸馏视觉推理
大语言模型越做越大,但网上高质量的文本数据快被榨干了。很多工作转向合成数据,比如微软的 Phi 系列、英伟达的 Nemotron-340B,都用合成数据取得了不错的效果,这算是新一代的模型蒸馏。多模态这边也有类似尝试,但难点更多:现有多模态大模型自己还容易幻觉,图像生成又不好控制细节。
我们就在想,能不能用一种更可控的方式来合成多模态数据?既要文本指令质量高,又要图像跟指令匹配得上,还得自动化、低成本、容易规模化。
顺着这个思路,我们试了试从纯语言模型里蒸馏视觉推理能力——让只懂文本的模型,通过代码来'看懂'图表,并生成复杂的问答对。这个过程我们叫它代码中介翻译(Code-as-Intermediary Translation,CIT)。
为什么选图表问答?
选择图表这个场景,有两点比较关键。
第一,图表可以通过代码精确生成。一段 Python 代码跑出来就是一张确定性的图,反过来从图里也能还原出代码。这跟自然图像生成不一样,AIGC 出来的东西可能很漂亮,但细节经常掉链子。代码生成的图,颜色、数值、坐标轴位置都是靠代码控制的,可控性高得多。
第二,图表问答能比较全面地考察多模态模型的感知和推理。像 GPT-4o、Claude 3.5 在发布时都会晒 ChartQA 这类任务的表现。我们自己也分析了 ChartQA 上一些模型的错误,发现主要集中在两类:要么是基本识别出错(比如颜色看岔、数值抄错),要么是识别对了但推理掉链子(比如计算错了、逻辑没对上)。这意味着,要让模型解好视觉难题,识别和推理缺一不可。那么一个直接的思路,就是构造带思维链的指令数据去微调模型。
接着我们看了看现有的 CQA 数据集,从图表、问答、数据三个维度做了对比。简单说,图表多样性(类型、主题)和复杂度很重要,问答最好不是模板生成的,要有视觉依赖性(比如问颜色、位置、趋势),还得包含完整的推理过程。人工标注数据集质量高但规模上不去,很多合成数据集只能扩问答对,扩不了图像,规模也受限。
LLM 到底能不能'看懂'图表?
我们的目标是低成本、高效、好扩展的合成方法,所以自然想到了纯语言模型——比起多模态大模型,它们更稳定,成本也低。但在开始前,得先弄清楚一件事:只给文本输入,语言模型能理解图表吗?
我们做了一组小实验,分别把图表图像、对应的数据表(CSV)、生成图表的 Python 代码喂给 GPT-4o,让它出题(带答案),然后让人工从正确性、推理复杂度、视觉参考性三个角度打分。结果挺有意思:数据表和代码输入在正确性和推理复杂度上的得分比直接给图像还高。这不难理解,文本形式的输入让模型能精确拿到数值和结构,避免了对图像像素的不可靠解读。但数据表输入的视觉参考性得分低,因为它只有数字,没有颜色、位置这些视觉细节。
倒是代码输入,虽然没给图,但视觉参考性得分并不低。代码里天然就包含了图表类型、颜色、坐标轴范围、标签位置这些视觉语义。这样看来,代码完全能作为语言模型理解图表的'翻译中介'。
CIT 方法:代码串起图表和指令
基于这些发现,我们提出了 CIT,思路类似语言学里的中介翻译——低资源语言之间翻译不好做,就借道一个高资源语言。这里代码就是那个中介,让语言模型去生成多样化、复杂度可控的图表,以及配套的识别和推理问题。
具体流程:
- 从 Matplotlib 官方示例里先收集 33 个种子代码。
- 用 Self-Instruct 和 Evol-Instruct 的思路,让模型改写出更多样、更复杂的代码变体。
- 把生成的代码跑出图来,这就是我们的图像。
- 同样基于这些代码,让 LLM 构造带思维链的问答对。
用这套方法,我们建了一个数据集叫 ReachQA(Reasoning-intensive Chart Q&A)。训练集有 3 千张图、2 万个问答对(其中 8 千是识别类,1.2 万是推理类),测试集 500 张图、2 千个问题(识别和推理各半)。每张图都配了好几个问题,答案都带着详细的推理步骤。
实验里看到了什么
我们在三大类基准上做了测试:传统图表任务(ChartQA、ChartBench、ChartX)、兼顾识别与推理的任务(CharXiv 和 ReachQA 测试集)、通用多模态数学推理任务(MathVista、Math-Vision)。
几个发现:
- 闭源模型在各任务上比较均衡,但开源模型有点偏科——在传统识别任务上还行,复杂推理和通用数学上就差一截,可能对常见基准过拟合了。
- 用 ReachQA 数据训练后,各模型都有明显提升。分开看,只加 8k 识别数据,识别任务好;只加 12k 推理数据,推理任务好;两者一起用,整体最佳。
- 更意外的是,这种推理能力的提升还能泛化到图表以外的通用多模态数学推理任务上,之前的研究没观察到这个。
进一步分析训练数据的来源,发现图表多样性和思维链至关重要。像 ChartBench 只给最终答案,没推理过程,帮助有限;ChartAst 的问题是模板生成的,多样性差,推理深不下去。ChartGemma 和 ReachQA 一样有高质量推理数据,但它的图是从网上收集过滤的,人力成本高,扩不大。我们的 CIT 方法自动合成,规模容易上去。
我们还专门看了识别与推理数据的比例关系。固定总数据量 8k,调整识别/推理比例从 8:0 到 0:8。增大识别比例,识别任务提升明显,甚至超过用 20k 全量数据训练的效果;但只给推理数据(比例 0:8)时性能反而下降,说明推理可能部分依赖于识别——模型连图上信息都拎不清,推理就无从谈起。由于实验规模限制,我们没试更大数据量下的效果,但预期这种互动会更明显。


