Code-as-World:世界即代码,9B 算物理题反超GPT-5.1

VLM 看得懂碰撞,为什么算不出速度?

给一个 VLM(视觉语言模型)看两秒台球撞击视频,再告诉它一个物理事实:这颗球直径 57.4 毫米。然后问它,橙色球被撞后 1 秒时,速度是多少厘米每秒。它答得很不错。

现在把先验改成 0.057 毫米。一颗直径不到 0.1 毫米的“台球”,物理上荒谬,可任何会换算的人都知道,答案必须跟着缩水几个数量级。主流视觉语言模型纹丝不动,照旧按正常台球的尺寸报数。这不是某家的怪癖。斯坦福团队搭建的 QuantiPhy 基准把物理先验乘上 0.001 到 700 之间的随机倍数再问模型,多数模型得分直接丢掉 80%,最强的也要跌掉 70%。模型宁可相信训练数据里的世界平均值,也不相信眼前这道题给的数据,这是整件事最反直觉的地方。

QuantiPhy 是目前唯一一个以连续数值答案、而非选择题形式评测 VLM 物理推理的公开基准。QuantiPhy 基准由 569 段视频和 3,355 道题构成,任务形态朴素得不能再朴素:一段两三秒的视频,一条文字形式的物理先验,一个数值问题。视频只展示像素世界,像素和真实物理量之间隔着一个未知比例,也就是一个物体在画面里占多少像素、真实里又是多少米。题目设计借的是“单先验反推世界尺度”这个最小推理:只要先验给出一个真实世界的量,模型就该反推出这个比例,再把视频里任何其它运动学量换算成真实数值,报出目标物体在某个时刻的尺寸、速度或加速度。四个子集按照运动维度(平面还是带深度)和先验类型(静态尺寸还是动态速度加速度)交叉划分,总分取四类平均。

打分用 Mean Relative Accuracy(平均相对准确率,MRA)。它不要求答案分毫不差,而是把允许的相对误差从 90% 一档一档收紧到 5%,每一档上预测落在容差里就算过,十档取平均。解析不出数值的题目记零分。门槛不算苛刻,可模型们的答卷暴露了三个系统性毛病。

第一,它们不怎么用视频。在 161 条 2D 题目上把视频抽掉,绝大多数模型得分几乎不掉,得分最高的几家闭源模型也只是分别从 56.1 掉到 39.0、从 60.9 掉到 46.1。视频里明明有全部答案,模型却在靠“台球大概多重、桌子大概多高”的常识硬猜。

第二,给的数据不生效。前面那个先验缩放实验就是证据。推理题的正确姿势是先相信先验、再按比例换算,模型却把用户给的先验当成了装饰品,照旧按“典型物体”作答,于是分数崩塌。

第三,把推理步骤写出来反而帮倒忙。QuantiPhy 论文给模型设计了四步 chain-of-thought(思维链):先量像素、再估比例、再换算目标量。21 个模型里,19 个加了思维链之后反而更差。作者的解释很直白:模型解不出中间的数值子问题,拆解任务只会把早期的小错误放大并一路传下去。QuantiPhy

把三件事摆在一起,结论刺眼:VLM 能“看”物理,是因为它们见识过太多碰撞;算不准物理,是因为它们从头到尾没有“测量”过任何东西。它们缺的不是眼睛,是一份能算、能核对、还能改动的世界表征。

QuantiPhy 任务示例

图注:一道 QuantiPhy 例题的完整形态:上方是视频片段,中间是物理先验(台球直径 57.4 毫米)与数值问题(橙色球在 1 秒时的速度),下方是真值与模型的逐步推理、像素测量示意。题目答案就在视频里,多数模型却选择靠先验硬猜。QuantiPhy

那么,什么样的世界表征才撑得起“算”?

机器要算准物理,需要什么样的世界表征?

这个问题背后躺着三条现成的路,每条都差一口气。

第一条是像素。视频预测模型能生成“看起来完全合理”的下一帧,但像素是渲染的结果,不是原因。你没法从一帧画面里抽出精确的速度、质量、摩擦系数,更没法改掉其中一个量再看后果,就像你没法从一张成品照片里改掉重力。像素“像”,但不可执行、不可核对。

第二条是潜变量。神经世界模型把世界压进一个隐空间,那个空间里每一个数字代表什么,没人说得清,也就谈不上验证。

第三条是文本。自然语言适合描述“球被撞飞了”,但不适合参与数值运算,一句“加速冲过去”没法用来算加速度。

Code-as-World 论文给出的回答是第四条路:把世界写成可以运行的代码。Code as Worlds 论文把它形式化为一份可执行世界表征(EWR),由三个面向组成。

Composition(组成)回答“谁在场”:场景里的物体、它们的几何与尺寸、质量、摩擦这些物理属性。地板、桌子、墙也属于这一层,因为它们参与支撑、接触和碰撞。Evolution(演化)回答“怎么变”:物体的初始状态、随时间的变化、关键事件和仿真时长。给定演化,物理引擎就能算出完整轨迹,包括接触、碰撞和速度变化。Appearance(外观)回答“长什么样”:相机参数、背景、材质、光照、输出帧率。论文给了一条干净利落的边界规则:参与支撑或碰撞的,属于组成;只提供视觉语境的背景,属于外观。

这里值得一个比方。像素世界模型像一张拍好的成品菜照片,代码世界像一份菜谱。照片忠于原物,但改不了、算不了、对不上账。菜谱呢,原料与用量对应组成,烹饪步骤对应演化,摆盘与打光对应外观。菜谱的价值在于它可执行,照着做能复现同一道菜;可修改,改一个用料量重做一遍,结果立刻可预见;可核对,端上桌跟原菜一比,哪里不对一目了然。EWR 的三个性质,可执行、可渲染、可验证,恰好就是菜谱的这三个性质。

抽象的三面向在磁盘上长这样:一份 scene.json。仓库随附的示例场景里,顶层区块有坐标系(声明单位、轴方向和左右手系)、执行模式(声明用物理引擎而非学习型模型)、时间轴(把代码世界和输入视频的每一帧对齐)、相机(带着完整的内外参矩阵,这样仿真画面能投影回输入视频的像素流)、物体数组和接触事件。objects 数组里躺着每个刚体的语义标签、初始状态、网格和物理属性,示例场景只有两个角色,足球和地面,足球上明确写着质量、摩擦和约 0.81 的恢复系数,contact_events 则记录足球两次触地各自发生在哪一帧、法向速度多少。CodeWorld 仓库 同一份文件同时是三重身份:物理引擎的输入,智能体的验证目标,人类开发者可以直接打开修改的对象。更妙的是,无论这份 scene.json 是从文字描述反推出来的,还是从真实视频反推出来的,最后都走同一个 MuJoCo 执行入口,验证和渲染的代码完全一样。这种统一性让 EWR 成了一个接口,而不是一种序列化格式:谁来写、怎么来的不重要,重要的是它跑起来的行为一致。仓库 README 里那句话说得最到位:像素是物理世界的证据,不是它的本体——而 scene.json 就是这个本体落成可执行代码的形态。

论文开头用一张总览图把整条链路摆了出来:

Code-as-World 范式总览

图注:论文开篇总览图:左侧的真实观测被抽象成中间的 scene.json 代码,右侧执行这份代码渲染出可重跑的仿真画面,箭头表示从观测到代码、再到可执行仿真的映射。图为概念示意,不表示具体数值。Code as Worlds

仓库 README 里则用工程化的视角展示了同一套三面向:

Code-as-World 工程总览

图注:仓库 README 的工程总览:左侧 Composition(组成)、Evolution(演化)、Appearance(外观)三层各有对应的 JSON 代码块,中央是标题与三色球的示意渲染,右侧是三个下游应用:物理推理问答、物理一致视频生成、具身智能。图内问答的 0.7 m/s 属示意,不是评测成绩。CodeWorld 仓库

有了这份代码,下一个问题立刻跳出来:机器只拿到一段视频,怎么把背后的代码反推出来?

给一段视频,怎么反推出背后这份代码?

直接让大模型“看着视频写一份 scene.json”,等于把一切都押在一次性生成上。代码很挑剔,一个接触事件的时间差几毫秒,渲染出来的轨迹就整个对不上,而模型根本不知道自己错在哪。

作者把问法换了一下,从“生成”换成“反推”。从结果往前找最合理的解释,这是科学里成熟的第三种推理方式:溯因推理(abductive reasoning),和演绎、归纳并列。Code-as-World 把溯因推理工程化成一个五步循环:提出(Propose)、实例化(Instantiate)、执行(Execute)、渲染投影(Render)、验证(Verify),最多跑 5 轮。Code as Worlds

输入有两种。文字描述被转成结构化的语义证据,真实视频则经过一层感知适配器,抽出深度、掩码和轨迹,作为证据。证据进入循环后每一步都有明确分工:大模型提出或修改一份假设的 scene.json,物理引擎 MuJoCo 把它实例化并执行出完整轨迹,渲染器按相机绑定把轨迹画回图像,验证器把渲染结果和观测逐帧比对,把差异聚合成一个反馈信号 Δ。文字输入走语义加物理的双重比对,视频输入则把渲染出的画面和深度、掩码、轨迹放在一起对照,验证的维度越多,错误假设被放过的可能就越小。下一轮,大模型只针对 Δ 指出的那个出错组件做局部修改,而不是整份推倒重来。举个示意:若渲染出的球弹起高度明显低于视频,验证器会把偏差定位到相应物理参数所在的组件,下一轮大模型只改这一处,重跑,再验。误差定位得越准,修正就越省事。

这个结构像极了重演案件现场。视频是目击证词,假设的 scene.json 是嫌疑人的供述,物理引擎是现场还原装置,验证器是对照供述与物证的比对。某个细节对不上,就只让嫌疑人修改说错的那一段口供,再重演一次。正因为误差能被定位到具体组件,才不用整锅推翻。5 轮之后,要么得到一个证据支持的代码世界,要么正式宣布反推失败,系统宁可返回 Reject,也不硬给一个没验证过的答案。

溯因发现循环

图注:发现循环的输入输出结构:上方文本分支与下方视频分支各自转换成证据,汇入共享的五步循环,验证器把预测与观测的差异聚合成 Δ,反馈给下一轮提出步骤。视频分支把候选世界渲染投影回深度、掩码与轨迹,再与观测比对。Code as Worlds

作者还做了一个在方法论上很关键的对照。给同样五次评估的预算,比较两种玩法:独立采样五个假设、挑最好的一个,以及迭代修正五轮。结果是一边倒。迭代修正的视觉对齐、物体 IoU、轨迹误差等指标全面更好,在物理引擎一侧的五个指标上全部胜出。差别很本质。Best-of-5 是五个路人各写一份完整口供、挑一份像样的,迭代是同一个嫌疑人在证据面前一版一版订正。前者赌运气,后者真的在用证据说话,这也是“让 LLM 生成代码”和“让循环反推世界”这两件事的根本区别。

循环结束,代码世界到手。可它到底是“看起来像”还是“真能用”,还得看它能产出什么。

反求出来的代码世界,除了「像」,还能干什么?

第一份产出是可控重模拟。既然代码世界通过了验证,它就不再是一堆静态参数,而是一个可以动手改的动态系统。论文展示的例子很直观:把保龄球的初速度方向改一个角度,重跑物理引擎,再经过视频生成模型重新渲染,你就得到一段全新的、物理上自洽的视频;或者不动物理,只把相机机位从全局视角换成车手视角,同一段碰撞就换了讲法。Code as Worlds

Code as Worlds 官方演示

图注:官方演示视频的首帧:低角度仰拍,人物双脚站在灰色金属圆凳的凳面上,字幕写着 Code as Worlds, the physical world, as code。演示用于展示真实场景被反求成可重跑代码世界这一最终效果,视频中不出现任何榜单数字。CodeWorld 项目页

这正是“世界被写成了代码”最直接的证明:改一行参数,世界的演化就跟着变,而且仍然服从物理。

第二份产出更重要,它把代码世界变成了一座数据工厂。真实视频给不出精确的物理标签。像素测量总有噪声,物体的真实质量、摩擦系数本来就不在画面里,人工标注又慢又贵。代码世界完全绕开这些麻烦:一份验证过的 scene.json 自带一条精确到每一位小数的状态轨迹,记录着每个物体的几何、每一帧的位置速度、相机参数和时间戳。要造训练样本,只需要随机采样一个目标物体、一个时刻、一个物理量和一个单位,然后直接从轨迹里读出答案。答案不是估计出来的,是执行出来的。同一份场景可以无限次采样出不同时刻、不同物体、不同物理量的问题,数据量只受算力约束。论文用这座数据工厂产出了 1,585 条文本驱动和 988 条视频驱动的世界空间问答对。Code as Worlds

这张图就是数据工厂的流水线:世界在左端,经过随机采样、读状态、组成问答对,最终流向模型训练。每一环都可以自动化,这正是它和人工标注路线的分水岭。

用这批数据训练,论文走的是两阶段路线。第一阶段先做图像空间的有监督微调,用 73,335 条问答对教模型“看图测物理量”,包括识别物体、量尺寸、读速度。第二阶段进世界空间,用 GRPO(组相对策略优化)微调。奖励设计很直白:预测与真值的相对误差越小,指数衰减后的奖励越高,核心项写作 $r_{\text{num}}=\exp(-|\hat y-y|/(|y|+\varepsilon))$,答对单位、格式正确再各加一点。结果就是 Code-as-World-VL 模型家族:4B 和 9B 两个直答版本,外加一个 27B 的推理变体。4B 与 9B 的权重连同代码一起以 Apache-2.0 协议开源,任何团队都能拿去跑测评。CodeWorld 仓库

到这里,“代码即世界”的第二层意义完整浮现:它不只是表征,更是训练数据的源头。可源头有了,水到底甜不甜,还得看数字。4B、9B 的小模型,真的打得过闭源旗舰吗?

4B、9B 的小模型,真的打得过闭源旗舰吗?

先交代口径。论文的评测跑在 QuantiPhy-validation 上,这是一个公开的 159 题子集,规模不大,结论要带着这个样本量看。打分沿用 QuantiPhy 的 MRA,衡量方式前面说过,相对误差越小得分越高。QuantiPhy 结果放在一起看:

模型平均 MRA说明
Code-as-World-VL-4B50.6直答模式
Code-as-World-VL-9B55.4直答模式
Code-as-World-VL-27B(推理变体)58.6带思维链作答
Gemini-3.1 Flash54.8闭源
ChatGPT-5.148.4闭源
Qwen3-VL-32B-Instruct40.2开源旗舰

Code as Worlds 9B 的 55.4 压过 Gemini-3.1 Flash 的 54.8,也明显高过 ChatGPT-5.1 的 48.4。一个 90 亿参数的开源小模型,在这个基准上压过了所有被对比的闭源模型,连最强的 Gemini-3.1 Flash 也不例外。这正是标题里“反超”二字的出处。

参数量与 QuantiPhy 得分

图注:参数量与 QuantiPhy 平均 MRA 的关系图:开源模型呈一条回归趋势线,Code-as-World-VL 的三个档位高亮且整体高于这条线,未公开参数量的闭源模型被归在右端一簇。具体数值以正文表格为准。Code as Worlds

两个口径必须讲明白。27B 的 58.6 是全场最高,但它是带思维链的推理变体,规模和作答协议一起变了,论文自己声明这不是衡量“推理加成”的受控实验,只能说明框架能扩展到更大的推理模型。4B 和 9B 则是直答模式,报数字就是报数字,这部分对比协议一致,可信度高。还要如实说一句,这篇论文是 MirroS 实验室的技术报告,未经正式同行评审。

最能说明“这分数从哪来”的是消融实验。同样是 4B 模型,只用图像监督时 MRA 是 44.2,加上文本驱动的代码世界数据涨到 48.5,加上视频驱动的涨到 47.8,两路数据一起用,来到 50.6。9B 模型从 50.9 一路涨到 55.4。两路数据缺一不可:文本驱动的代码世界给的是物理引擎里精确的模拟器标签,视频驱动的代码世界负责与真实视频的外观对齐。Code as Worlds

数字背后的判断值得单独说。在这张跨模型表中,9B 的结果显示规模并非充分条件:32B 的原生开源模型只有 40.2,比 9B 的 55.4 低了 15 个点,规模更大并没有换来更高的分数。前面那组同家族消融则支持代码世界数据带来了增益,两路数据各有贡献。但要分清这份增益究竟记在谁头上,现有实验还不够:跨模型的对比里,参数量、数据规模与训练协议同时变化;同家族的消融里,数据量的增加和数据本身的性质又绑在一起。两者合起来,仍无法单独量化参数量、数据规模与“可验证性”各自的因果贡献。

那么,这条凭代码把世界“算”出来的路,天花板画在哪?

这条路能走多远?边界画在哪?

把镜头拉远一点。Code-as-World 不是横空出世,它是 2025 到 2026 年间“代码即世界”脉络里最新的节点,这条脉络已经绕了大半个圈。ProgGen 最早用感知、动力学、渲染三段程序为视频动力学奠基ProgGen;VDAWorld 做单图蒸馏,一张图和一句说明就能变成可执行的世界程序VDAWorld;PhysAgent 走反射式控制,把闭环用在视频生成前的物理配置上PhysAgent;LLMPhy 让大模型和物理引擎做参数优化LLMPhy;VisualPatchWorld 把代码世界模型当作规划用的潜变量VisualPatchWorld;VisPhyWorld 则把可执行代码当成物理推理的诊断接口VisPhyWorld。

在这条谱系里,Code-as-World 是唯一同时满足三个条件的节点:从真实视频反求,用智能体闭环迭代,以定量物理推理为靶心。世界模型的方向正在从“生成得更像”转向“可读、可执行、可验证”。

但作者把边界也画得很诚实,两条。

第一条是物理覆盖范围。当前系统只处理刚体和简单接触。论文明确列出流体、布料与可变形体、燃烧、破裂、弹性与塑性、气体动力学,全部不在范围内。哪怕看似简单的刚体运动,也对地形、接触几何、材料属性里的微小变化高度敏感。代码这个媒介本身没问题,问题在于如何正确调用和组合那些专门的物理引擎。顺便说一句,这也意味着所谓的数据工厂,原料目前只有刚体场景,数据再多也绕不开物理引擎能模拟的范围。

第二条更深。Code-as-World-VL 学到的是代码世界“产出的结果”,也就是那些带标准答案的训练样本,但模型没有内化找出代码世界的过程本身。提出假设、跑仿真、做诊断、迭代修正,这一整套发现循环仍然留在外部智能体里。Code as Worlds 换句话说,你用验证过的世界数据把模型喂聪明了,但让它自己面对一条新视频时,它还是不会自己动手反求世界。还有一个务实的提醒:循环里做验证比对的大模型本身也是这套系统的可靠性上限,论文没有隔离验证器误收或误拒假设的概率。再看实现层面,开源仓库随附的示例只有一个滞空足球场景,真实复杂视频上的可复现范围还很窄。CodeWorld 仓库

QuantiPhy 基准自身的评估边界也在约束这条路线:如今的评测只覆盖平移运动,相机是固定的,物体是刚体。物理推理的真正难题,从流体到多物体复杂交互,都还堆在边界外面。QuantiPhy

所以这篇论文值得记住的,不是 55.4 对 48.4 这个具体分数,而是一个判断:可执行代码被立成了世界表征的通用媒介,验证过的代码世界既是可以重跑的仿真,也是可以无限产出精确标签的数据工厂。真正的下一跳,作者也指明了,把“提出、执行、渲染、验证”整个循环内化进模型本身。到那时,模型面对一条新视频,会自己动手提出假设、跑仿真、对答案,而不是等着别人把标注好的世界喂到嘴边。到那一天,它就不再是记住物理答案,而是自己动手把世界算出来。

想深入可以读原文:Code as Worlds: Agentic Discovery of Executable World Representations for Physical Reasoning arXiv:2608.27549

参考文献

  1. Code as Worlds(锚论文,arXiv:2608.27549)
  2. QuantiPhy(基准原始论文,arXiv:2512.19526)
  3. Code-as-World GitHub 仓库(scene.json 工程实现与开源 checkpoint)
  4. Code-as-World 项目页(官方演示视频与视觉叙事)
  5. VDAWorld(单图蒸馏对照,arXiv:2512.11061)
  6. PhysAgent(反射式控制对照,arXiv:2607.16355)
  7. VisualPatchWorld(代码作为规划潜变量对照,arXiv:2607.25236)
  8. LLMPhy(LLM 与物理引擎参数优化对照,arXiv:2411.08027)
  9. VisPhyWorld(代码作为评测接口对照,arXiv:2602.13294)
  10. ProgGen(P/D/R 三程序奠基,arXiv:2505.14948)
Code-as-World:世界即代码,9B 算物理题反超GPT-5.1