ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

15B多模态模型实测:数学推理+界面识别的能力与部署指南

15B多模态模型实测:数学推理+界面识别的能力与部署指南

各位做 AI 落地的同行,我先抛个真实场景:有段时间我一直在做“给模型截一张屏幕图,让它直接告诉我们下一步点哪里”的实验。做过的朋友都懂,模型能描述图片内容不难,难的是两层叠加——既要看懂界面里每个按钮、输入框的位置和含义,又要在拿到一道数学题截图时真把解题步骤推出来,不是背答案,是能一步步算。大部分通用模型在单任务上都能看,一旦同时压上“视觉理解”和“符号推理”,立刻露馅。

最近某科技巨头放出了一款 15B 参数的多模态模型,主打能力恰好就是这两件事的合体:数学推理 + 界面识别。我第一时间把它接到自己的模拟项目里做了几轮实测,也因为标题里这个组合太少见,今天就给你把这背后的定位思路、实际调用方式、我踩过的坑一次性讲透。不管你是做智能助手、自动化脚本,还是单纯想了解多模态模型的能力边界,这篇文章都能给你一些可以直接上手的参考。

1. 15B多模态的定位逻辑:为什么是15B而不是7B或70B

1.1 参数规模与能力拐点的关系

模型参数从 7B 跳到 70B,大家都会直觉地认为越大越强,但放到“视觉 + 数学 + 界面操作”这个具体场景里,15B 这个中间档位其实是反复权衡后的甜点区。

先说 7B 这一档。近几年很多轻量多模态模型都是 7B 起步,跑起来确实友好,一张 24G 的显卡就能塞下量化版本。问题是数学推理的深度很吃参数量,7B 模型在面对多步推导、符号运算时经常“话痨但算错”,推理链一长就掉线。界面识别稍微好一点,但也容易把相近图标搞混。如果你的目标只是做 OCR 或者简单的视觉问答,7B 足够;可一旦要“读取截图→形成操作计划→执行并验证”,7B 会非常吃力。

再看 70B 甚至更大的模型。能力和稳定性确实是天花板,但部署成本立刻变成一道现实门槛。就算量化到 4bit,70B 的显存需求也在 40G 上下,普通开发机根本跑不动,只能走 API。如果想在内部系统里做私有化部署,或者做高频调用,每一轮推理的时间和金钱成本都很可观。

15B 恰好卡在“能力够用”和“成本可控”的中间位置。它比 7B 多出的参数基本都花在了推理链的深度和视觉特征的细粒度上;对比 70B 又轻了太多,单卡 4090 就能勉强承载,量化后甚至可以上消费级显卡。对团队来说,这意味着可以在本地反复实验、微调,而不需要一开始就拥抱庞大的算力预算。

1.2 视野编码器与语言主干的组合方式

多模态模型并不是简单把图片塞给语言模型,而是先通过视觉编码器把图像切成 patch,转成视觉 token,再和文本 token 一起送进语言主干。15B 这个规模下,视觉编码器的选择很关键。

我观察到的设计方案是:视觉端采用类似 ViT 的结构,输出固定数量的视觉 token;语言端则是标准的 decoder-only 架构。这样做的好处是视觉特征和文本特征可以在同一个空间里做交叉注意力,模型在生成文字时能随时回头“看”图像中最相关的区域。相比早期那种把 OCR 结果硬拼进文本的做法,这种结构在处理界面截图时更自然,因为按钮位置、控件间距这种空间信息不是单纯文字能描述清楚的。

同时,15B 的体量让模型可以在训练时塞入更多“视觉-指令”对数据,而不是单纯靠增大基座模型硬撑。说白了,小模型靠数据弥补,大模型靠参数硬解,15B 是两头都沾一点。

2. 数学推理与界面识别如何在一个模型里协同

2.1 两种能力的本质:视觉输入到符号推理

很多人会把“数学推理”和“界面识别”当成两个独立功能,这没错,但放在同一个模型里,它们共享的是同一套底层机制:把视觉信息转成可计算的符号表达。

数学题截图进来,模型要做的第一件事不是解题,而是先把公式、符号、数字准确抽取出来。这一步既是 OCR,又比普通 OCR 难——公式里的分数、根号、上下标,如果视觉编码器没有足够的空间感知能力,很容易把结构打乱。抽取出符号之后,模型把题目转成文本形式,再交给语言主干做多步推导。

界面识别同理。屏幕截图进来,模型需要识别出这是登录框、是导航菜单还是弹窗提示,然后把这些界面元素映射成类 JSON 的结构化描述,比如“坐标(340, 200)有一个按钮,文案是‘确认’”。这个过程不只是看得见,还要理解控件的语义。

这两件事的共性在于:视觉编码器必须足够“懂结构”。数学公式有结构,界面布局也有结构。15B 的模型之所以能把两件事都做好,正是因为它在训练时大量使用了结构化视觉数据,让模型学会了“看结构”而不是“看热闹”。

2.2 推理-识别闭环如何串成自动化任务

数学推理和界面识别一旦打通,妙的地方就出来了:模型可以直接面对屏幕完成一个完整的“理解-决策-执行”闭环。

给你举个例子。模拟一个财务报表系统,页面上有一个表格,旁边写着“请计算本季度总营收”。传统做法是写脚本抓数据、再调用计算模块。但有了这种多模态模型,模型可以直接看懂表格结构和文本指令,推理出计算公式,然后定位到输入框,生成点击和输入的操作序列,一次性完成。

我在实际测试中让模型完成过一个更朴素的任务:给它一张计算器界面截图,上面已经输入了“25×4”,再给它一句指令“点等于号并读出结果”。模型需要先识别出计算器屏幕上显示的是什么,再找到等于号按钮的位置,最后判断结果的语义。整个链路一步不缺,这就是“界面识别+数学推理”协同的真正价值。

当然,这个闭环还不够完美,后面我会专门讲失败案例。但方向是对的:把这两件事合在一个模型里,比拆成两个模型再拼装,要少很多接口损耗。

3. 数学题截图到解题步骤:一个最小可复现的调用过程

3.1 输入构造与提示词模板

我先把最简单的调用方式给你跑通。假设你手里有一张数学题的截图,想用这个模型来做识别和解题。

如果你用的是开源推理框架,加载模型之后,输入格式大概长这样:

from transformers import AutoProcessor, AutoModelForCausalLM model_id = "某15B多模态模型权重路径" processor = AutoProcessor.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained(model_id) image = load_image("math_problem.png") prompt = "请仔细识别图中的数学题目,然后给出完整的解题步骤,最后写出答案。" inputs = processor(text=prompt, images=image, return_tensors="pt") output = model.generate(**inputs, max_new_tokens=1024)

这里有一个关键细节:提示词别只写“解答这道题”,我会在前面加一句“请先识别图中的全部符号和数字,确认没有漏项后再开始推理”。原因很现实,多模态模型在生成时经常“急着作答”,如果它第一步就把某个符号看错了,后面的推理全部白搭。先让它显式地把识别结果复述一遍,等于给推理加了一道保险。

3.2 输出解析与结果验证

模型返回的内容是纯文本,结构通常分成两段:识别到的题目原文、解题步骤。你需要在后处理里把它们拆开。

我的做法是让提示词明确要求“识别结果放在两个方括号之间”,然后在代码里用正则把题目和步骤分开。比如:

import re text = output_text match = re.search(r"识别结果:(.*?)解题步骤:", text, re.S) recognized = match.group(1).strip() steps = text[match.end():].strip()

拿到“识别结果”之后,先别急着信,把它和原图做一次简单校验。怎么校验?如果识别结果里包含数学符号,你可以再调用一次 OCR 工具做交叉比对,或者人工抽查。对于批量任务,我建议至少要跑一个“结构完备性检查”——比如识别结果里有没有等号、有没有变量、符号数量是否合理。结构都不全,后面的步骤大概率是错的。

3.3 实测效果与失败样例

我拿三组不同难度的题目做了测试:一组是简单的一元一次方程,一组是带根号和分数的表达式化简,最后一组是几何题带图形标注。

简单方程基本秒杀,识别准、步骤清晰,运算结果也正确。表达式化简也表现不错,模型能把分数和根号的结构还原到位,步骤顺序合理。但几何题就露怯了:图里的角度标注和辅助线,模型经常把它们搞混,比如把“∠A”看成了“LA”,或者把标注为 60 度的角识别成 30 度。这说明模型的视觉编码器在处理密集图形标注时还有明显短板。

这个结果给我的经验是:数学推理能力在纯符号环境下已经相当可用,但一旦涉及空间几何信息,你必须额外设计提示词,比如“请先描述图中所有标注的位置和数值”,才能提高准确率。

4. 界面识别模型把截图变成可执行指令的隐藏细节

4.1 从像素到结构化坐标的识别流程

界面识别比数学题扫描更复杂的地方在于:元素之间是嵌套的,一个页面可能有弹窗盖在按钮上,也可能有下拉菜单隐藏在某个 icon 后面。模型要输出的不只是“这里有个按钮”,而是“按钮的边界框、层级、文案、可交互类型”。

我在测试里让模型描述一张后台管理系统的截图,它的输出大致长这样:

[ { "type": "button", "text": "新建任务", "bbox": [526, 120, 640, 152], "actionable": true }, { "type": "input", "text": "请输入关键词", "bbox": [340, 180, 520, 206], "actionable": true } ]

这个结果已经可以直接被自动化脚本消费了。但要注意,bbox 坐标的基准是输入图片的像素尺寸。如果截图是 1920×1080,而你的实际屏幕是 2560×1440,坐标需要等比换算。这个细节看起来简单,忽略它会导致点击位置完全错位。

4.2 生成操作序列的约束与校验

模型生成操作序列时,最容易出现的问题是“顺序幻觉”——它可能会先让你点击一个本应在另一个弹窗加载后才能出现的按钮。所以在提示词层面,我强烈建议你要求模型输出操作时附带前置条件。

例如用这样一个模板:

请分析当前界面截图,给出下一步操作。操作格式为: 操作编号: [类型] 目标元素 前置条件: [说明这个操作之前界面应该处于什么状态]

实测下来,加了前置条件之后,模型会主动检查界面状态,而不是机械地按视觉顺序输出。另一个实用技巧是“约束坐标范围”。如果界面里有一个固定侧边栏,你可以把侧边栏区域在提示词里排除掉,避免模型误点非关键区域。

4.3 与自动化框架对接的注意事项

识别结果要接到自动化框架里,我建议你把模型的输出解析成一个统一的动作队列。举个例子,如果你在写一个模拟鼠标键盘的操作脚本,可以直接把 JSON 动作映射成对应的自动化函数。

def execute_action(action): if action["type"] == "click": x, y, w, h = action["bbox"] move_mouse(x + w//2, y + h//2) click() elif action["type"] == "input": click_input(action["bbox"]) type_text(action["text"])

这里有一个和图像分辨率相关的心得:很多自动化框架支持“图像坐标模式”和“逻辑坐标模式”,你必须统一它们。我的做法是让模型输出“相对坐标”,也就是把图片宽高归一化到 0-1 区间,这样在接入不同分辨率的屏幕时,不需要重新推理模型,只需要在自动化层做一次缩放即可。

5. 部署和调优过程中的常见坑以及实测踩坑记录

5.1 GPU显存与量化方案的选择

15B 模型全精度 FP16 的权重大约需要 30G 显存,单张 4090 的 24G 根本放不下。所以部署第一步就是量化。

我测了下面几种方案,给你一个直观对比:

量化方案显存占用推理速度(相对)数学推理精度影响界面识别精度影响
FP16约30G1.0无无
INT8约15G1.2极小极小
INT4约9G1.4中等较小
AWQ/量化感知约10-12G1.3较小较小

我的建议:如果只是做体验和功能验证,INT4 可以接受;如果要做数学题的正式推理,至少用 INT8。数学符号对量化误差更敏感,一旦数值精度发生变化,模型的一些“硬算”能力会明显下降。界面识别因为大部分是判断语义和位置,对量化的容忍度反而高一些。

5.2 解码参数设置的温度与采样策略

解码参数对这类双能力模型的影响,比我预想的大得多。默认温度 0.7 到 1.0 跑数学题,输出经常出现“创造性错误”,比如它会编出一个不存在的公式合并步骤。跑界面识别时,温度太高又会让坐标值漂移,同样的按钮这次给 (526,120),下次给 (530,119)。

我的实测参数是一个折中方案:数学推理场景用 temperature=0.1,top_p=0.8;界面识别场景用 temperature=0.2,top_p=0.9。同时把 repetition_penalty 设为 1.05,避免模型在描述界面时反复念叨同一个元素。

更重要的一个参数是max_new_tokens。数学推导经常需要很长的推理链,但“越长越容易出错”。我给数学任务设了 1024,给界面识别任务只设 256。为什么界面识别要短?因为模型一旦生成冗长的解释,坐标和动作描述反而容易被它自己的“废话”干扰。

5.3 应对幻觉坐标和错误文本框

我在多轮测试里发现两类典型幻觉。

第一类:坐标完全偏离图像范围。比如输入一张 640×480 的截图,模型却输出了 (700, 500)。这就是典型的视觉编码器没有把坐标约束在图像尺寸内。我的应对方法是在提示词里显式加入图片尺寸,并要求模型“只能输出在图片范围内的坐标”。

第二类:文本识别错误导致操作目标错误。界面上明明写着“删除”,模型识别成“例除”,然后对着错误位置操作。这种问题单纯调参数解决不了,只能靠增加输入分辨率或者加一个小的 OCR 纠错层。我的做法是:在自动化框架里加一道“文案白名单”校验,凡是模型识别出的按钮文案,必须匹配页面源码中的可点击文案列表,不匹配就重新推理一次。

6. 使用边界、潜在风险与负责任的取舍

6.1 哪些场景不适合这类模型

这类 15B 多模态模型看起来全能,但边界也非常明显。

首先,它不适合做高精度的文档解析。界面识别和文档版面解析虽然都涉及视觉,但文档处理对表格结构、阅读顺序、字体变体的要求极高,15B 模型在这种任务上很容易丢行错列。其次,不适合做实时交互控制,比如远程桌面级别的连续操作。15B 的推理速度再快,一次生成也要几百毫秒到数秒,连续操作时人机交互的延迟会非常明显,除非做动作缓存和预判。

数学领域同样有边界。它能处理中学、大学低年级的典型题目,但高阶符号积分、复杂证明、带歧义的题目,它依然会出各种“一本正经的胡说八道”。不要把它当计算引擎用,它更适合当“解题助手”或者“教学辅助”。

6.2 隐私与安全方面的底线

界面识别能力天然涉及屏幕内容,这个能力落到个人设备上,就是一把双刃剑。它可以帮视障用户读屏,可以帮测试人员自动填写表单,但也可以被用来获取不该看到的界面信息。所以你在自己的项目里接入这类模型时,必须做几个基本约束。

第一,尽量本地部署,不要让截图数据离开可控环境。第二,操作执行前必须加一层人工确认,尤其是涉及删除、提交、支付这类不可逆操作。模型只负责“建议”,不负责“执行”,这个权限边界要清楚。第三,不要在提示词里让模型分析包含敏感信息的截图,比如浏览器密码管理页面、网银界面,这些场景再方便也不值得冒险。

6.3 后续可扩展的微调思路

如果你觉得模型在某个垂直场景下还不够准,可以考虑做轻量微调。15B 的规模决定了微调的数据量要求没那么夸张,域内数据准备几千条高质量样本就能看到明显效果。

我建议优先补两类数据:一类是“界面截图 + 操作序列”的配对数据,另一类是“数学题截图 + 分步推理”的数据。前者能显著提升坐标输出稳定性,后者能提升特定题型(比如几何、代数)的识别准确率。

微调时注意一个细节:不要全量微调,用 LoRA 这类参数高效微调方法。15B 全量微调的成本依然不低,但 LoRA 只需要训练一小部分参数,单卡也能跑,而且不会破坏模型原有的泛化能力。

我在实际使用中的一个体会是,这类模型和传统视觉模型最大的不同在于“可对话性”。你不需要专门训练多个模型来做识别和推理,而是可以在同一个模型上通过对话不断纠偏。比如第一次识别错了按钮,你可以直接追问“你确定那是确认按钮吗?再看一眼左边那块区域”。这种交互式的纠错机制,在传统自动化流程里几乎不可能实现。

最后再分享一个我个人的小技巧:无论是做数学推理还是界面识别,都别急着用模型的第一次输出。先让它“想想”再回答——在提示词里加一句“如果你不确定,请先列出你看到的证据,再给出结论”。这一句话,能减少我测试中大约三成以上的低级错误。模型不是不能更准,而是很多时候需要被提醒该更准。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进