CodeDance: A Dynamic Tool-integrated MLLM for Executable Visual Reasoning¶
会议: CVPR 2026
arXiv: 2512.17312
代码: https://CodeDance-VL.github.io
领域: 多模态VLM / 工具使用
关键词: 可执行视觉推理, 工具集成, 代码生成, 强化学习, 涌现行为
一句话总结¶
提出CodeDance,将可执行代码作为视觉推理的通用求解器——MLLM生成代码来定义、组合和执行多种工具,渲染中间视觉结果(bbox/线/图表)支持可审查的推理链,通过平衡探索与效率的工具调用奖励做RL训练,在RL中涌现出未见过的工具调用组合和跨任务迁移行为,7B模型在计数/视觉搜索/图表QA上超越GPT-4o。
研究背景与动机¶
- 领域现状:o3展示了"用工具思考"的能力——交替推理和工具使用。但现有开源方法要么仅用文本CoT、要么用固定schema(仅预测bbox坐标)、要么是单步pipeline。
- 关键gap:(1) 纯文本CoT无法动态与视觉输入交互或验证中间结果;(2) 固定schema限制了灵活性和可组合性;(3) o3是黑箱闭源系统。
- 核心idea:代码是最通用的"工具调用语言"——CodeDance让MLLM生成和执行Python代码来编排多种工具、计算中间结果、渲染视觉产物。通过RL训练发现涌现行为(训练中未见的新工具调用方式、组合和跨任务迁移)。
方法详解¶
整体框架¶
CodeDance 想解决的是:让 MLLM 像 o3 那样「用工具思考」,但要开源、可组合、还能看清推理过程。它的做法是把可执行 Python 代码当成统一的工具调用语言——推理时模型一边写文本思考、一边生成代码去调用各种工具(裁剪、检测、OCR、画框、绘图),代码在沙盒里执行后把工具输出和渲染出的中间视觉结果喂回模型,如此交替直到给出答案。这套「代码推理」能力靠两阶段训练得到:先用原子监督数据做 SFT 冷启动,再用平衡探索与效率的工具调用奖励做 RL,由此涌现出训练数据里没见过的工具组合。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400, 'subGraphTitleMargin': {'top': 8, 'bottom': 16}}}}%%
flowchart TD
Q["输入:图像 + 问题"] --> THINK
subgraph LOOP["可执行代码推理"]
direction TB
THINK["文本思考"] --> CODE["生成 Python 代码调用工具"]
CODE --> EXEC["沙盒执行<br/>裁剪 / 检测 / OCR / 画框 / 绘图"]
EXEC --> OBS["回注工具输出 + 渲染的中间视觉结果"]
OBS -->|信息不足,继续| THINK
end
OBS -->|信息足够| ANS["输出答案"]
subgraph TRAIN["两阶段训练"]
direction TB
ATOM["原子监督数据<br/>单工具使用示例"] --> SFT["SFT 冷启动"]
SFT --> RL["RL 训练"]
end
REWARD["工具调用奖励<br/>平衡探索与效率 + 任务正确性"] --> RL
TRAIN -.产出策略.-> LOOP
关键设计¶
1. 可执行代码推理:用代码当通用工具调用语言
纯文本 CoT 没法真正和视觉输入交互、也无法验证中间结果,固定 schema(只预测 bbox 坐标)又限死了灵活性。CodeDance 让模型在「文本思考」和「执行代码」之间交替:先用文本推理,再生成 Python 代码去调用工具(裁剪、检测、OCR、画框、绘图),代码在沙盒里执行后,把工具输出和渲染出的中间视觉结果一并回注给模型,模型据此继续推理或再写新代码,循环到信息足够才输出答案。代码天然带变量、循环、条件和函数定义,表达力远超固定 schema——同样的模型规模下,仅凭这点性能就显著提升;而渲染出的视觉中间产物也让整条推理链可追溯、可核查。
2. 两阶段训练:原子监督冷启动 + RL 精炼
直接上 RL,模型还不会写规范的工具调用代码,于是先用「原子监督」数据(每条只示范单个工具的用法)做 SFT 冷启动,让模型掌握各工具的基本调用方式;再进入 RL 阶段,用工具调用奖励和任务正确性奖励联合优化。SFT 只教会原子能力,真正把这些原子能力组合成新颖工具链、并迁移到新任务的是后面的 RL——这也是涌现行为只在 RL 阶段出现、而 SFT 阶段不出现的原因。
3. 工具调用奖励:让 RL 学会「适度用工具」
工具不是用得越多越好:调太少则信息不足,调太多则过度使用、拖慢效率。为此设计一个平衡探索与效率的奖励,鼓励模型在恰当的时机调用恰当数量的工具。实验显示这种平衡奖励比「总是用工具」的奖励更有效,是 RL 中涌现出高质量工具使用行为的关键。
实验关键数据¶
主实验¶
| 模型 | CountBench | PixmoCount | V*Bench | ChartQA |
|---|---|---|---|---|
| GPT-4o | 87.9 | - | 67.5 | 86.7 |
| Qwen2.5-VL-7B | 76.5 | 50.4 | 76.4 | 86.3 |
| Deepeyes-7B | 80.4 | 57.2 | 90.4 | 78.2 |
| CodeDance-7B | 91.2 | 77.1 | 84.8 | 87.5 |
CountBench +19.2%, PixmoCount +53.0% vs Qwen2.5-VL-7B基线。
涌现行为案例¶
- 未见过的工具组合(如zoom+count+compare的链式调用)
- 跨任务迁移(计数任务中迁移用于图表分析的区域检测)
- 自发生成验证代码(画出检测结果进行视觉核查)
关键发现¶
- 代码比固定schema表达力强得多——同一模型大小下性能显著提升
- 涌现行为是RL的关键产出——SFT阶段不出现这些行为
- 工具不是越多越好——平衡奖励比"总是用工具"的奖励效果更好
亮点与洞察¶
- 代码作为通用推理媒介:比文本CoT更有执行力,比固定schema更灵活——代码天然支持变量、循环、条件、函数定义
- RL训练的涌现性:工具使用的新颖组合和跨任务迁移——从原子能力到创造性组合,类似语言模型的涌现能力
- 可审查推理:代码+渲染的视觉中间结果→推理链完全可追溯可验证
局限与展望¶
- 代码执行需要沙盒环境→部署复杂度高于纯文本模型
- 工具集是预定义的——如何动态发现和接入新工具?
评分¶
- 新颖性: ⭐⭐⭐⭐⭐ 可执行代码推理+RL涌现行为
- 实验充分度: ⭐⭐⭐⭐ 计数/搜索/图表多基准+涌现分析
- 写作质量: ⭐⭐⭐⭐ 涌现行为的案例展示直观
- 价值: ⭐⭐⭐⭐⭐ 对VLM工具使用和推理范式有重要推动