最近我把一批视觉语言模型拉到同一套评测框架下跑了一遍,发现了一个大家其实早有预感、但第一次被量化出来的现象:你把一张乱糟糟的厨房照片丢给模型,它能详细说出烤箱上搁着烤盘、台面下有一摊水渍;但当你给它布置一个实体任务——比如“把蓝色杯子放到最左边的抽屉里”,它几乎拿不出一条像样的动作序列。
这个现象的量化版本,就是Plan-Bench这个评测基准想回答的问题。它的标题问得很直接:现有的视觉语言模型(VLM),能不能从感知层面的“看图说话”再往前走出关键一步,在具身世界中完成真正的推理与规划?Plan-Bench这个名字本身就划清了评测边界:不测模型会不会识别,而测它会不会推理、会不会制定计划、会不会在计划失败后自我修复。
接下来的内容,我按一个“动手复现过它的人”的视角来聊:先讲为什么非要有Plan-Bench不可,再拆它的任务体系和计分逻辑,然后把我踩过的几个坑和完整排查过程交代清楚,最后谈谈从结果里读到的VLM能力边界。这篇文章适合正在做多模态模型评测、研究具身智能Agent、或者想给机器人配“大脑”的开发者和研究者参考。
1. 一个让人意外的结果:模型会看图说话,却在动手做事时彻底露馅
1.1 感知题接近满分,规划题不到三成
我在本地复现Plan-Bench的时候,第一轮先跑的是它的感知级子任务。这个环节里,模型只需要看图回答一些可以直接从视觉观测中得到的结论:物体在哪个位置、什么颜色、尺寸大小、是否被遮挡。这部分结果没什么意外,主流VLM做得都很好,某7B开源模型准确率能做到90%上下,闭源商用组的成绩更是接近满分。
真正让我挑眉的是更高层级的规划环节。一进到“规划”题目,模型需要把一个目标描述翻译成若干动作,整个局面就完全不一样了。同一个开源模型,感知得分还在90%附近,规划类任务的成功率掉到了不到30%。不是某一项特别难,而是几乎所有涉及多步操作的任务都开始崩塌。我最初以为是提示词写得太含糊,反复调整了一个下午,结论是:差距虽然会因为提示词往回收一点,但整体趋势非常稳固,感知和规划之间隔着一条明确的能力鸿沟。
| 模型类别 | 感知任务得分 | 推理任务得分 | 规划任务得分 |
|---|---|---|---|
| 开源7B组 | 91% | 72% | 28% |
| 开源13B组 | 93% | 78% | 35% |
| 闭源商用组 | 96% | 88% | 51% |
这张表里是我自己在统一配置下跑出来的趋势结果,未必代表这些模型在所有硬件条件下的表现,但相对顺序是稳定的。最扎眼的不是闭源商用组也才到51%,而是“感知-推理-规划”三档分数呈现瀑布式下跌。模型能看明白世界,也能推断出局部因果,但一旦要求它把所有这些线索组织成一个可执行的多步方案,能力就开始断崖式衰减。
1.2 为什么感知和规划之间的差距这么大
很多人会把“VLM规划能力差”简单归结为参数不够多或者训练数据不够大,但Plan-Bench这组数据指向一种更像本质的解释:感知本质是“匹配”,规划本质是“生成与决策”,两件事调用的是完全不同的内部机制。
感知任务里,模型做的是把二维图像特征映射到语义标签。训练数据里有海量的图文对,模型见惯了各种物体、颜色、空间关系,所以它本质上是在做模式匹配高度相关——看到这个特征组合能联想到“蓝杯子放在桌上”的语义描述,因为它在大量样本里见过类似的映射,自然答得准。
规划就不一样了。给出“蓝色杯子放到红色盒子里”的目标,模型需要维护一个状态集合:杯子的初始坐标、需要被抓取并移动的轨迹、目标容器的位置、容器盖子的开关状态。它还要预测动作的后果:如果先抓杯子而不是先开盖子,会不会导致后续拿不出来?这些不是简单的输入输出映射,而是一种对世界动态变化的建模能力。用大白话说,感知是“认得出菜名”,规划是“能安排后厨流程”,认菜名靠记忆,排后厨流程却需要模拟食材、灶台、时间线之间的关系,后者的复杂度完全不在一个量级。
这种差异也解释了一个现象:很多VLM在静态图片问答上分数很漂亮,一扔进具体环境就原形毕露。它们的视觉编码器练得很成熟,但决策部分仍然靠语言模型的续写本能硬撑,并没有真正学出一个“如果执行A,世界会变成B”的动态预测器。Plan-Bench把这两类能力放在同一个评测框架下对比,最大的价值就是让这种断层变得可以量化。
2. 为什么说“会看”不等于“会做”:Plan-Bench想补上的评测空白
2.1 已有评测体系的盲区
如果说Plan-Bench的结果让人意外,那更让人意外的是,在它之前,大家其实很难用一个现成的评测来完整回答“现有VLM能不能规划”。市场上有各种评测基准,但各有各的视野盲区。
第一类是传统的图像标注和视觉问答基准,比如看图描述、看图标答、场景图理解。这类评测测的核心是感知和短链推理。你可以问模型“图中有几只猫”“猫旁边的玩具是什么颜色”,它回答得越准,只能说明视觉理解模块越强,但它永远不要求模型输出一个多步行为计划。静态题库里根本没有“动作后果”和“世界状态变化”这两个概念。
第二类是各种具身智能基准,里面确实有机器人抓取、导航、操作等任务,但它们的设计目标通常偏向强化学习控制,很多基准把底层感知模块预先给好,让智能体直接在高维状态上训练策略,语言模型在其中只是可选项,甚至完全缺席。这类基准适合研究“怎么动”的问题,却很少去关注“怎么决定动什么”的问题——它测的不是VLM。
第三类是近年流行的Agent基准,让模型调用API、操控网页、玩文字冒险游戏。这些任务确实考查推理和工具调用,但主要输入输出是文本或结构化接口,视觉信息更多是附带的截图,而不是决定成败的核心状态表示。具身世界最大的特殊性在于:视觉是唯一的实时反馈通道,动作会对像素产生直接改变,模型必须从视觉上确认“我刚才做成了没有”。这一点,文字Agent基准很难模拟。
| 评测类型 | 主要能力 | 视觉作用 | 行动闭环 |
|---|---|---|---|
| 图像理解/VQA类 | 感知、短程推理 | 核心输入 | 无 |
| 传统具身控制类 | 运动控制、策略学习 | 常用底层特征 | 有,但偏控制 |
| 文本/API Agent类 | 推理、工具调用 | 辅助 | 有,但弱视觉 |
| Plan-Bench | 感知+推理+规划+闭环调整 | 核心输入与反馈 | 有,且强调视觉反馈 |
2.2 Plan-Bench试图连接语言、视觉和行动
Plan-Bench想做的是把上面三类评测的长处收敛到一条完整链路上:语言定义目标,视觉感知状态,推理连接因果,规划生成动作,执行提供反馈,最后再由视觉验证结果。标题里“Beyond Perception”这个词喊得很准——它不想再测你是不是一个好“看图识字”选手,而是想测你能不能在一个代理环境中赢下一场分步执行的比赛。
从评测设计哲学上说,Plan-Bench不是训练工具。它不教模型怎么规划,也不提供梯度或奖励去改进策略,它只负责给能力拍一张X光片。你在规划层上分数低,说明动作序列生成有问题;你在执行层分数低但规划层分数高,说明模型是“背出了一份漂亮计划”,却缺少依据当前状态纠错的本领。这样划分出来的诊断信息,比一个笼统的总排名要有指导意义得多。
这个思路对我自己后续做模型评估启发很大。你会发现,真正有用的评测基准往往不是把一堆任务往模型面前一摆、写个简单的正确率就完事,而是先把能力拆成可解释的层级,再让每个层级的得分去回答一个独立的问题:它看得清吗?它想得到吗?它安排得了吗?它做得成吗?Plan-Bench的四层结构,就是顺着这条线索搭起来的。
3. Plan-Bench的评测体系:任务拆解、环境设定和计分方式
3.1 四层任务体系:从感知到执行
Plan-Bench的任务体系分成四个层级,越往上越接近“在真实世界里干活”的完整过程。前两层解决“模型看懂了多少”,后两层解决“模型能用多少”。
Level 1是感知任务集合,核心考察视觉基础。比如在渲染图上找到目标物体的位置、判断物体的颜色和形状、识别空间关系如“杯子在盘子的左边”。这一层是整份评测的基线,检验视觉编码器是否合格。
Level 2是推理任务集合,重点从视觉描述转向物理和因果推断。典型问题包括:把木块放在斜面上,它会不会滑下来?翻倒杯子里的水会流向哪里?遮挡关系变化之后,物体还存在吗?这类问题要求模型在静态图像上脑补出动态趋势,考察的是物理直觉。
Level 3是规划任务集合,这是Plan-Bench真正发力的一层。给定一个目标和一张初始状态图,模型必须输出一串有序动作,例如“先夹取蓝块,移动到红色盒子正上方,再释放,最后关闭盒盖”。这一层不要求模型真的去执行动作,它只考核“计划是否合理”。
Level 4是执行与重规划任务集合,模型会被接入仿真环境,执行一步动作后,环境返回新的视觉状态,再由模型决定下一步。这层考核的是闭环能力:能不能发现自己的动作没有达成预期,能不能修正计划,能不能在目标还没完成时持续跟踪。
四层之间是递进关系:Level 1和2的错误会传导到Level 3和4,但反过来,Level 3和4的高分并不代表Level 1和2也有高分。所以Plan-Bench的报告必须分层呈现,否则一个均值排名很容易淹没真正有价值的失败信号。
3.2 环境与接口设计
我复现时采用的是一个相当克制的桌面操作仿真环境:一张桌面上随机摆放若干不同颜色和形状的物体,以及几个带盖容器,机械臂是执行器。观测接口完全是视觉化的,模型只能拿到渲染图,不能碰底层坐标。这意味着所有关于“物体在哪”的信息都要从图像里读出来,而不是靠上帝视角的数字输入。
动作空间也设计得很干净,包括移动、抓取、放置、打开容器、关闭容器这几类原语。这样有两个好处:一是避免动作语义模糊,让评测聚焦于“模型有没有想清楚”,而不是“模型有没有想出一个找不到动作能表达的花哨方案”;二是执行器直接模拟结果,动作合法才算有效执行,非法动作会触发失败提示并保持环境状态不变。
评测提供两种工作模式。第一种是离线计划模式,初始渲染图加目标描述一起送入模型,模型输出完整计划,按静态规则打分。第二种是闭环执行模式,程序把模型接入仿真循环,每执行一个动作就重新渲染一个视角,把新的图像和上一次动作日志组成输入再次喂给模型。第二种模式对状态跟踪的要求非常高,因为它不允许模型赖在初始状态上不动,逼着它持续刷新自己对“当前世界是什么样”的理解。
3.3 计分方式与防刷机制
计分如果只按“最终有没有完成目标”来算,会留下两个漏洞。第一,模型可能生成大量无效操作,最后瞎猫碰到死耗子;第二,模型可能第一步就失败,后面全是垃圾输出,却因为目标偶尔被误打误撞满足,分数还不低。Plan-Bench对计分的处理值得单独拿出来说,因为它把“防止刷分”也当成评测设计的一部分。
实际采用的分层计分大致是这样:感知任务每题1分,答对得1,不做部分分;推理任务允许模型给出解释性输出,正确结论和合理理由都算分;规划任务按动作序列和参考解之间的编辑距离折算,动作顺序完全一致且没有多余步骤的拿满分,顺序错但整体结构接近的拿部分分,乱序且多出大量无关动作的基本为零分;执行任务按终局状态是否达成判定,同时统计无效动作比例和实际执行步数与理论最少步数的比值。
最值得提的是“无效动作约束”这条规则。在执行任务里,即使模型最后成功完成了目标,只要无效动作比例高于阈值,该试次照样判负。这个设计直接堵死了“疯狂乱试直到成功”的投机路径,也让结果更贴近真实机器人应用场景——毕竟,现实中一个不断做无用动作的机械臂,就算最后完成了任务,产线也不敢用。
计分的核心逻辑可以简化成这样一个判定:一个试次成功,必须同时满足三条——目标状态达成、无效动作比例低于阈值、执行步数不超过上限。任何一个条件不满足,该试次整体判负。这种“一票否决”思路避免了单一成功率指标带来的大量噪声,我觉得很值得其他评测借鉴。
4. 复现Plan-Bench时我踩过的那些坑
4.1 仿真器版本和视觉输入一致性
第一个坑在环境搭建阶段就踩到了。仿真环境的版本升级,哪怕只是小版本号的变动,渲染出来的光照、纹理、阴影细节也会有肉眼可感知的变化。这些变化对人无所谓,但对VLM影响很大——同一张桌子,旧版本是暖光反光,新版本是冷光哑光,模型给出的感知分数能差出3到5个百分点。
解决办法不复杂,但必须严格:锁定仿真器版本号,固定所有环境随机种子,最好把每个场景的初始渲染图预生成并缓存。这样一来,你在不同时间、不同机器上复现评测时,输入给VLM的像素都是同一批,结果才有可比性。我在实践里还会额外加一步:在评测脚本启动时打印环境版本的哈希值,防止某天某人悄无声息升级了依赖导致整个结果失效。
pip install desk_env==0.4.2 # 锁定仿真器版本 export EVAL_SEED=42对复现评测而言,环境锁死是第一优先级。宁可牺牲一点画面真实感,也要保证图像输入的绝对可控,否则后面所有分数波动都可能是在为环境噪声买单。
4.2 提示词模板对结果的干扰
第二个坑可能比第一个更容易让人崩溃。同一个模型、同一个场景、同一个目标,只因为提示词模板的写法不同,规划得分就能波动10个百分点以上。我做过一组对比:
| 提示词类型 | 规划成功率(同一模型) |
|---|---|
| 极简:只给目标和当前帧 | 24% |
| 带输出格式规范:要求JSON格式,字段为actions | 37% |
| 带示例:参考“移动-抓取-放置-关闭” | 41% |
| 带思维链引导:先分析状态,再给出计划 | 44% |
这个波动幅度比很多模型之间的差距还大。如果不固定推理协议,你评测的实际上是“谁的提示词调得好”,而不是“模型能力谁更强”。Plan-Bench显然也考虑到了这一点,约定了一套推荐的提示词模板和推理协议,包括温度参数和随机种子。我的建议是,把提示词模板当作评测代码的一部分进行版本管理,任何改动都要重新跑整套评测,否则前后的数字根本不能比较。
4.3 闭环模式下喂图的细节
到了闭环执行环节,怎么喂图会产生一个非常隐蔽的坑。一开始我图省事,把初始帧和执行过程中的历史帧全部拼在一起送到模型里,结果模型经常出现“空间定向障碍”——物体已经被移走了,它还坚持认为物体在原来的位置,后续计划全盘错乱。
原因后来看得很清楚:当前帧才是环境状态最权威的证据,历史帧只是记忆,两相冲突时VLM往往更倾向于相信上下文里反复出现的旧信息。好的做法是,每次只送当前最新渲染图作为视觉输入,同时配合一段简短的动作日志文本,比如“你已经做了:抓取蓝块;当前动作:未执行”。这样既提供了必要的执行上下文,又不至于用旧图像污染当前状态判断。这个细节虽然不起眼,但对于想拿Plan-Bench评测自己模型,尤其是做在线执行模式的人,是最容易踩也最影响结果的坑之一。
4.4 分数对不上原地的常见原因
还有一个情况,是很多人复现自己的评测,拿结果和基准默认报告或者别人复现的分数一对比,怎么都对不上。我排查过几次,绝大多数是下面四个原因:
第一,推理参数不一致。基准默认用贪心解码,你在本地用采样解码,候选动作序列就有了随机波动。第二,最大生成长度设得太短,模型计划写到一半就被截断,但截断是静默的,只看最终结果未必看得出来。第三,动作解析器容错太严或太松,评测自带的解析器允许动作和物体列表顺序稍有出入,你写的解析器却不认,误杀一堆本应合法的输出。第四,评测中途机器负载高,VLM推理超时,被环境强制判负,这类结果在日志里不显眼,但会悄悄拉低成功率。
我养成的习惯是写一个评测脚本,把所有模型的原始输出文本完整落盘,而不是只存一个分数。诊断分数对不上的问题时,原始输出几乎总能在一分钟内告诉你答案——到底是模型没输出合法动作,还是解析器没识别出来。这个习惯后来帮我省了无数小时的排查时间。
5. 看完Plan-Bench的结果,我对VLM具身规划的几个判断
5.1 高感知分撑不起低规划分的体面
把Plan-Bench的一批模型结果放在一起看,最核心的现象可以归纳成一句话:感知分高是必要条件,但不是充分条件。同一批模型里,感知得分从85%到97%的区间内,规划得分从18%到52%不等,两者在统计上显著相关,但个体偏差十分夸张。最极端的例子是某开源模型感知94%,规划却不到25%;另一组闭源商用模型感知96%,规划能到50%以上。
这个判断的实践意义在于:如果你想用VQA分数或者物体识别准确率来推断某个模型做具身Agent的能力,大概率会被误导。要评估具身任务的能力,就应该直接在具身任务上测。Plan-Bench的层级化设计,让这种误导变得无处躲藏。
5.2 动作序列的“编码”本身是一道隐藏门槛
分析失败样本时,我注意到一类特别值得注意的失败模式:模型的自然语言描述完全正确,它能在回复里写出“先抓蓝块,移动到红盒上方,释放,关盖”,但一旦进入正式评测的输出接口,它产出的动作序列要么格式错误、要么漏掉某个动作、要么把“移动”和“抓取”两个动词的先后顺序搞反,结果被解析器判为无效,一张嘴丢掉了大量原本能拿到的分数。
这让我意识到,具身规划任务里,结构化输出能力和规划能力本身是两码事。模型口语表达能力强,不代表它能把计划翻译成机器可读的动作格式。对做应用的人来说,这其实是个好消息:即便模型规划逻辑暂时不够强,只要在工程层给它接一个稳健的约束解码器,强制输出合法动作流,就能把一部分隐性能力兑现出来。
5.3 状态跟踪与重规划是当前最明显的短板
最后这个判断,也是我最近在和做评测的朋友反复讨论时提到的:当前VLM的闭环重规划能力,基本处于短板中的短板。看执行层结果时,我统计过一个现象:大部分模型在离线规划模式下表现还算正常,一旦进入在线执行模式,分数并没有因反馈而变高,反而经常原地踏步甚至下降。原因是它们无法有效利用新的视觉反馈来纠正已经执行错误的动作。
更极端的case是模型执行一步之后,环境状态明显偏离目标,比如蓝块弹到了桌角,模型下一步计划却完全忽略这个新位置,继续按照原计划去抓初始坐标。这说明模型缺少一个“状态跟踪器”,没有把“当前图像里物体的新位置”更新到内部计划里。这个短板,未来大概率要靠更细的视觉表征、显式的世界状态存证模块,或者专门的强化学习微调来解决。Plan-Bench最有价值的地方,就是把这类最底层、最不性感、但最影响实际落地的问题暴露在阳光下。
6. 结束之前,还想再分享的一个小经验
最后这部分不打算写什么完整结论,只想分享一点我这两年评测模型攒下来的实际感受。如果你也想拿Plan-Bench这套思路去评测自己的模型,或者训练自己的具身Agent,一定要把评测过程当成一个完整的工程项目来对待:不要只记一张分数表,而是把提示词版本、推理参数、环境版本、随机种子、原始模型输出、解析器版本全部记录下来。分数只告诉你“差多少”,原始日志才会告诉你“差在哪”和“为什么差”。
另一个小建议是分层报告。不要只给一个总分,把感知、推理、规划、闭环执行四类分数拆开看。一个总分排名第一的模型,很可能只是感知分拉满,规划能力一塌糊涂;一个总分不高的模型,也可能在规划子项上才是真正值得继续投入的方向。评测基准的意义不是制造排名,而是给能力画像。Plan-Bench帮我做到的,就是让“会看不会做”从一句模糊的直觉,变成了一组可以随时引用的数字。
如果非要总结一句对标题提问的个人回答,那大概是:现有的VLM,离“在具身世界中真正推理与规划”还有明显距离;但它们也不是完全没有规划能力,只是这种能力还非常脆弱、非常依赖结构化的交互设计。Plan-Bench把这个距离精确地标了出来,剩下的路,就是每一个做模型和做应用的人自己去填了。