多模态大模型在代码生成和调试方面取得了令人瞩目的进步,但在基础的视觉理解任务上,它们的表现却不够稳定。
来自 UniPat AI 的研究者提出了一个极简的视觉智能体框架—— SWE-Vision 。其核心思路是,让视觉语言模型(VLM)通过编写并执行 Python 代码,来精确验证和改进自己的视觉判断。在五个主流的视觉基准测试中,这套简单的框架都帮助模型取得了当前最佳的性能表现。
模型“看”得见,但处理不精确
回顾过去一年,多模态模型在编程任务上的能力突飞猛进,从独立搭建项目到排查复杂 Bug,其表现已接近资深工程师。
然而,在面对“理解视觉世界”的任务时,它们的可靠性远不如代码能力。例如,在 UniPat AI 此前发布的多模态基准测试 BabyVision 中,一个普遍现象是:模型能给出长篇大论、看似合理的推理,却在最基础的计量、计数和空间关系判断上犯错误。
当我们仔细审视这些错误案例时,会发现一个关键模式:问题往往不是模型“没看见”,而是“看见了却无法精确处理”:
- 阅读柱状图时,模型能感知到“大约75%”,但无法精确计算比值。
- 在复杂场景中计数时,模型可能识别了每一个物体,但在逐一清点时出错。
- 描述空间位置时,模型能给出定性判断(如“左边”),但难以稳定地进行距离计算和几何推理。
面对这种情况,人类会怎么做?我们会借助工具:画辅助线、做标记、用尺子测量、用笔来计算。既然模型已经极其擅长编程,能否让它用代码——这个它最熟悉的工具——来弥补视觉处理中的精度短板呢?
SWE-Vision 正是对这一猜想的系统性验证。

结果表明,在涵盖基础感知、图表推理、数学问题、空间理解和复杂多步推理的五个不同视觉基准上,SWE-Vision 框架均能持续提升前沿大模型(如 GPT-5.2-xhigh 和 Seed-2.0-Pro)的表现,取得了领先的结果:
- 在 BabyVision 上达到 64.4
- 在 MathVision 上达到 94.0
- 在 ZeroBench-Sub 上达到 50.1
- 在 OmniSpatial 上达到 69.0
- 在 ChartV-RQ 上达到 82.5
SWE-Vision:一个极简视觉智能体框架
SWE-Vision 的设计哲学是极简化,它没有堆砌大量专用工具,而是将核心能力压缩到最简。
工具层:仅保留两个工具
在 config.py 中,定义的工具只有两个:execute_code 和 finish。
execute_code:允许模型在一个可持续保留状态的 Jupyter 环境里执行 Python 代码。
finish:当模型确信答案正确时,用于输出最终答案。
关键在于,工具接口非常小且通用。SWE-Vision 没有给模型塞一堆专用的视觉 API,而是只暴露一个模型本就熟悉的动作:写 Python。
控制层:一个标准智能体循环
agent.py 中的 VLMToolCallAgent 实现了一个完整的智能体循环:
- 将用户问题与图片组织成消息。
- 调用支持工具使用(tool use)的模型聊天接口。
- 如果模型发起
execute_code 调用,则将代码送入 Notebook 内核执行。
- 将代码执行结果作为工具消息返回给模型。
- 模型据此决定是继续调用工具,还是使用
finish 结束。
仓库默认使用 tool_choice=“auto”,并支持推理模式;开启该模式时,会将推理强度设为高档,并允许最多 100 轮迭代。
执行层:Docker 内的持久化 Jupyter 内核
kernel.py 并非简单地用 exec() 执行一段代码,而是会启动一个 Docker 容器,并在容器内启动一个 ipykernel。宿主机通过 jupyter_client.BlockingKernelClient 连接这个内核,并从 IOPub/shell 通道收集执行结果。
核心设计在于,内核是持久化的。这意味着变量、导入的库、图像对象和中间结果都能在多次 execute_code 调用之间保留。同时,代码运行在隔离的 Docker 环境中,宿主机与容器通过挂载目录交换文件。此外,kernel.py 还会在启动后执行健康检查,并将 matplotlib 的后端配置为 inline,以便抓取代码生成的图像输出。
简单来说,SWE-Vision 不强迫模型为每道题都写代码,但它为模型提供了一个随时可用且无比熟悉的“视觉工具箱”。
工作流程:从看图推理到带图验证
SWE-Vision 就像一个会看图的数据科学家,其完整工作流如下:
- 输入:用户提供问题及相关图片。
- 思考:模型先判断问题能否直接回答,是否需要计算或验证。
- 执行:如果需要,则调用
execute_code,在 Notebook 中使用 PIL、NumPy、matplotlib 等库进行分析。
- 反馈:代码执行的输出(数值、错误信息或可视化图表)被回流给模型。
- 迭代:模型继续分析反馈结果,决定下一步行动,直到最终调用
finish 给出答案。

这套设计有几个关键点:
- 有状态的执行环境:变量、导入、图片加载状态可跨多次调用保留。
- Docker沙箱:确保可控的安全环境和结果可复现性。
- 图像输入与输出:模型不仅能读取输入图像,还能将自己生成的图像结果(如绘制的辅助线)回传给自己进行验证,这是实现自我纠错的关键。
- 标准接口:遵循 OpenAI Function Calling 标准接口,保证了与主流模型的开箱即用兼容性。
这套设计的核心价值在于,它允许模型像一个真正的科学家那样,先做实验,再下结论。
核心优势:有状态的内核比代码执行器更重要
初次看到 SWE-Vision,有人可能觉得它只是在 VLM 外面套了个 Python 工具壳。但真正的差异在于 “有状态”。
在 SWE-Vision 中,内核状态在多次调用间持续存在。这使得模型可以像人类分析师一样分步工作:
- 第一轮:读取图像,检查尺寸。
- 第二轮:裁剪局部区域,观察边缘。
- 第三轮:统计颜色或测量距离。
- 第四轮:绘制辅助线以确认判断。
- 最后:综合所有信息,生成最终答案。
如果代码执行是无状态的,这种多步骤分析会变得异常笨重:每一步都需要重新导入库、重新加载图片、重建变量,模型也难以维护中间的假设。SWE-Vision 通过持久化的内核,把“多轮工具调用”变成了“同一个 Notebook 会话中的连续实验”。
从工程实现上看,这也解释了为何它能处理图表测量、空间关系和复杂的多步视觉任务,而不仅仅是做一次性的 OCR 或物体检测。
关键能力:模型能验证自己的视觉判断
在一个“观察科学图表并总结规律”的案例中,SWE-Vision 展现了一种截然不同的行为模式。
如下图所示,这是一个典型的科研图表分析任务:要求判断在 Quarter=15 时,哪个子图中红色虚线与黑色实线的差距最大。SWE-Vision 智能体给出了一套极其严谨且可解释的解法。

它首先排除了不存在红色虚线的子图(d)。随后,对其余每个候选子图,在 Quarter=15 处精确绘制辅助线,定位红线与黑线的交点。接着,通过可执行代码精确计算两条曲线在该位置的数值差距。最终,基于计算结果给出正确答案。
这种“先结构化分析,再程序化测量,最后数值验证”的思维与行动闭环,与传统 VLM 依赖直觉式“瞪眼观察”直接给出答案的方式形成了鲜明对比。它不仅显著提升了结果的可靠性与可解释性,也展示了更高的能力上限。
为什么极简设计反而效果更好?
SWE-Vision 的一个重要结论是:对于视觉任务,为模型提供通用的代码执行能力,是提升其表现的一个有效的测试时扩展(test-time scaling)方向。
它之所以有效,恰恰归功于其极简性:
- 工具数量少,模型决策边界清晰。
- 工具语义与模型已有的编程能力高度一致,降低了学习成本。
- 支持多轮迭代和状态积累,允许进行复杂的分析。
- 中间结果(如图像)可被模型再次观察,而非一次性返回文本。
- 不绑定特定评测集的专用手工策略,泛化性强。
这与许多“为某类视觉任务单独发明一套工具接口”的方法不同。那些方法可能在特定任务上有效,但泛化性不足。而 SWE-Vision 的目标,是提供一个尽可能通用的视觉增强框架,让模型自己决定何时调用代码、如何组织分析步骤。
五大基准测试全面提升:一个通用视觉增强器
SWE-Vision 在五个覆盖广泛的视觉基准上进行了评测,核心发现高度一致:引入代码执行能力,能系统性地提升前沿模型的视觉表现上限。
在对比实验中,SWE-Vision 对两个前沿的视觉语言模型(GPT-5.2 和 Seed-2.0-Pro)都带来了显著提升。


一个“反直觉”的现象是:提升幅度最大的,往往不是最复杂的高阶推理任务,而是最基础的感知和精确处理能力——例如 BabyVision 中的计数、颜色识别和空间关系判断。
这类任务人类依靠直觉加简单工具就能稳定完成,而模型仅凭“语言化视觉”则极易忽略细节、数错个数、缺乏验证手段。SWE-Vision 的结果也揭示了另一种可能:对于视觉任务,测试时扩展(TTS)不一定只能靠“多想几段文字”,也可以靠“多写几行代码”来看得更精细。
展望:代码增强视觉或成未来智能体原生能力
与训练传统多模态 LLM 所需的数据(通常是问题、图片、答案三元组)不同,训练视觉智能体模型需要多模态交错的智能体轨迹。
它还需要一个交互式环境来支持强化学习、工具使用和评估,使模型不仅能学习回答问题,还能学习感知、行动和反思。要彻底释放“工具增强视觉”的潜力,模型需要更多深度融合视觉与编程的 SFT/RL 数据与环境。
具体而言,未来的关键方向包括:
- 时机判断:学会识别何时视觉推理需要代码辅助,何时可以直接回答。
- 中间验证:在多步推理过程中主动检验中间结果的正确性。
- 失败恢复:在代码方案无效时及时跳出,切换到替代策略。
- 原生融合:让“观察”与“计算”深度融合,成为智能体一体两面的能力。
目前,SWE-Vision 的 开源代码 已在 GitHub 发布。这个仅 500 行左右代码的极简框架,为探索编程辅助的精确视觉理解这一方向,提供了一个绝佳的起点。如果你对如何结合代码能力来突破多模态模型的视觉瓶颈感兴趣,欢迎在 云栈社区 参与相关的技术讨论。
参考链接