HexaShell:不改模型、不训策略,一个写代码修 bug 的智能体把机器人榜单刷到了第一

你有没有发现一个挺反直觉的现象——机器人操作榜单上刷分的全是"学习型策略":VLA、世界动作模型,动不动就几万条演示数据喂进去。而这篇论文干了件看起来很"偷懒"的事:拿一个现成的编程智能体(Codex + GPT-6-Astra),不改一行模型权重,给它一根命令行接到双臂机器人上,失败了就让它像修单测一样修自己的小工具——结果把 RoboDojo 的榜单第一拿了。

核心摘要:HexaShell 解决的是"VLM 智能体在物理世界到底能走多远"这个问题。它的 harness 薄到近乎透明——只负责把命令翻译成关节运动,不做任何决策;智能体看到的是三路 RGB 图像加标定信息,没有深度。真正的功夫在"工具进化循环":每次失败后,一个同模型的 optimizer 智能体读日志、定位原因、写或修一个带单测的小工具,下一轮接着用。感知上它放弃深度网络,改用三角测量加平面约束,比 Depth Anything V2 高了 8.7 个点。在全部 42 个 RoboDojo 任务上成功率 39.7%、进度分 48.0,超过最强的学习型策略 VPP2 的 32.3%/39.3。更有意思的是它画出的能力边界:推动类任务 92.5%,记忆类 65.0%,但精密插入只有 8.3%——瓶颈不在推理,在接触。这篇论文的定位很清晰:不是底层模型突破,而是一次把"编程智能体范式"推到物理世界的极限测量,附带一份非常有诚意的失败分析。值得细读。


📖 论文信息

  • 标题:HexaShell: A Thin Harness for Exploring the Limits of VLM Agents as Robot Coding Agents
  • 作者:Hongcheng Gao、Alex Zhou(共同一作)、Jay Zhu、Zelin Zheng、Shijia Ge、Xiping Li、Di Wu、Yazhe Wang、Jianshu Zeng、Xuan Shangguan、Yongli Wang、Yexing Wan、Lingyu He、Zhiqi Jia、Sihang Wu、Xiao He(通讯)
  • 机构:hexafuture.ai
  • 日期:2026 年 10 月 16 日
  • 链接:https://arxiv.org/abs/2610.23479
  • 代码:https://github.com/HexaFuture/HexaShell

🎯 问题动机:代码仓库里好使的那套,搬到机器人上还灵吗

编程智能体在软件仓库里的循环大家都熟了:读代码、跑测试、看报错、改代码、再跑——改动会留下来,下次直接用。这个循环之所以成立,是因为仓库里的一切都是文本,智能体能精确读取。

搬到机器人上,这个前提塌了一半。智能体看到的物体是像素,但每条运动指令都要一个世界坐标系下的位置——抓取至少要厘米级精度。而 VLM 判断图像里的米制距离是出了名的差。标准观测里又没有深度图。上个深度网络?作者实测了:Depth Anything V2 在 RoboDojo 场景下,头部相机中位误差 41 mm,腕部相机直接奔着 100 mm 去了(用桌面标定修过尺度之后)。Depth Pro 和两个版本的 MoGe 也好不到哪去,头部 20–31 mm,腕部 21–72 mm。抓取要的是 10 mm 量级。

这就很尴尬了。之前的工作,Code as Policies、VoxPoser、ReKep 这一系,程序是"每条指令现写现扔"的,原语全是人写的。HexaShell 把分工反了过来:原语(工具)由智能体自己写,跨 episode 持久化,并且是被优化的对象;每个 episode 里现写的程序反而很短。说实话,这个分工反转我觉得是全文最值钱的想法之一——它把"学习"从神经网络权重里拿出来,塞进了可检查、可 diff、可回滚的 Python 文件里。


🏗️ 方法核心:薄 harness + 几何测量 + 进化循环

图1:HexaShell 总览——从机器人失败到可复用工具

图1:HexaShell 的完整闭环。上路:任务输入(三路 RGB、TCP 位姿)→ Codex + GPT-6-Astra 执行智能体 → 薄 harness(只有 robo 一条命令,纯运动翻译)→ 机器人执行;下路:失败后 optimizer 智能体诊断、写/修工具、检查,工具跨 episode 沉淀。底部标注了工具擅长的四类场景(刚体操作、平面对齐、工具使用、抗杂乱)和搞不定的一类(接触丰富的可变形物体)。右上角就是那个核心数字:22.5% → 39.7%。

薄到不讲道理的 harness

执行智能体跑在一个容器里:没有网络、没有 API key、没有宿主机目录。它拿到的全部家当是一个 robo 可执行文件、一个 obs/ 目录(三张 640×480 RGB 图、每个相机的内参和世界位姿、两个 TCP 位姿、关节角——没有深度),外加一份约六十行的说明书。基础命令就九个:move、rotate、point、gripper、home、wait、obs、status、done。

harness 后面做的事情也极其克制:每条命令校验合法性,按 2 cm 间隔插值出笛卡尔直线,用 cuRobo 逐点解 IK,梯形速度规划,按 benchmark 的 25 Hz 采样后走官方 take_action。没有运动规划器,没有碰撞模型——除了机器人本体和桌子之外什么都没有。架构上还有一条硬隔离:执行容器里没有仿真器、没有任务代码、没有评分代码,成功只由 benchmark 自己的 checker 判定。这套"翻译但绝不决策"的设计,保证了后面所有成绩都干净地归因于智能体和它的工具,而不是 harness 里藏了什么人工先验。

像素怎么变位置:三类几何约束

这是全文技术密度最高的部分,但思路其实朴素得可爱——全是 OpenCV 级别的多视图几何:

  1. 桌面平面。共享工具 table_plane 每个 episode 第一次被调用时测一次桌面高度(不花步数):扫候选高度,把各相机图像按该高度平面 warp 到另一台相机,取 warp 后最一致的高度。三个相机对的结果能对齐到 1 mm 以内(实测 0.7646–0.7656 m)。
  2. 已知高度的平面。方块顶面、碗沿、盒子插槽都是水平面,高度测过之后,像素光线与平面求交就是三维点。
  3. 第二视角三角测量。两台相机看到同一个点,两条光线的交点就是位置。对应像素可以是智能体自己在两张图里点的,也可以是工具里模板匹配、轮廓、圆拟合出来的。

头部相机视角差、物体互相遮挡怎么办?动腕部相机去拿第二视角——这就是主动感知,但它有明码标价:移动机械臂消耗 action step,而每个任务有步数上限(200 到 1900 不等)。这个"测量要花步数"的代价设计,我觉得是整篇论文里最有工程味道的权衡。

还有一条铁律值得抄:所有关于物体的数值必须在本 episode 内实测,尺寸、位置、高度一律不许从 benchmark 的资产文件、布局配置或日志里来。从架构上杜绝了作弊。

进化循环:像修单测一样修工具

循环本身不复杂:每个任务先用评测 seed 0 的前 10 个布局做开发。执行智能体尝试布局,成功了 optimizer 就往 playbook.md 里记一笔"哪个工具为什么 work";失败了 optimizer 读命令日志、每条命令的相机帧、当前工具代码,写诊断到 skill.md,然后改工具——每个布局最多改 5 次。改完有个交付检查(文件完整、工具能加载、接口文本不许出现任务名和物体名),不过就回滚。10 个布局跑完,工具冻结,在 10 个全新布局上无 optimizer 复测一次。

两个智能体都是 Codex + GPT-6-Astra、medium reasoning effort。optimizer 只能写 tasks/<task>/ 目录,碰不了 harness、说明书和共享工具池。注意这个设计的克制:脚手架、prompt、基础接口全部冻结,唯一在进化的就是任务工具——归因干净得让人羡慕。


🧪 实验:数字说话

主结果:新 SOTA

RoboDojo 有 42 个 Isaac Sim 里的双臂 ARX X5 任务,分 Generalization(12 个,各有加 13–18 个干扰物的杂乱变体)、Memory、Long-Horizon、Precision、Open 五类,每类任务有步数上限和官方 checker。对比的是 2026 年 10 月 14 日的榜单。

系统 类型 成功率(%) 进度分
HexaShell 编程智能体 + 自进化工具 39.7 48.0
VPP2 世界动作模型(最强学习策略) 32.3% 39.3
PhysicalRSI LM 智能体指挥的 VLA 31.4% 36.3
GPT-6-Astra(无工具) 同一模型走固定 harness 22.5% 29.0

54 个变体的朴素平均也是赢的:35.4% 对 VPP2 的 30.6%。拆开看,HexaShell 在"读场景、记状态"类任务上碾压——Memory 65.0%(对手最多 55.6%)、Open 50.0%(对手最多 31.0%);而学习策略在接触精密类占优——Precision 上 VPP2 35.2% 对 31.3%,Long-Horizon 37.0% 对 23.8%。这个互补格局后面还会回来。

6 个变体满分通过(push T 两个变体、stack bowls 杂乱版、井字棋、press by number、按语言堆方块),但注意另一面:19 个变体是零分。平均分掩盖的是一道锋利的分界线。

杂乱场景:谁在背外观,谁在算几何

杂乱变体是个绝佳的探针——任务本身不变,只是周围多了 13–18 个干扰物。结果说实话有点惨烈,但不是 HexaShell 惨烈:它在开发布局上从 35.0% 只掉到 33.3%,保住了 95% 的成功率;无工具的同模型保住 87%;而 30 个学习型策略平均只保住 18% 的中位数——VPP2 从 46.4% 崩到 12.6%,PhysicalRSI 从 25.7% 崩到 5.6%。

原因很直白:工具是"智能体点一个像素,代码只测那一个物体",干扰物根本不进入计算。学习策略把场景外观烙进了权重,换个背景就懵。唯一的例外也恰好验证了规则:fold clothes 从 4/5 掉到 2/5,因为它的工具靠颜色连通性找衣服,旁边压个物体连通域就断了。

三角测量 vs 深度网络:8.7 个点的差距来自哪

同样的 harness、同样的循环、同样的模型,只换"怎么拿 3D":

任务类型 三角测量(Succ./Prog.) Depth Anything V2 渲染深度(参考)
Generalization 34.2 / 37.7 26.7 / 30.0 45.4 / 51.5
Precision 21.3 / 28.4 7.5 / 11.9 41.3 / 47.3
Long-Horizon 18.8 / 32.2 13.8 / 29.2 32.5 / 44.2
Memory 73.3 / 73.3 55.0 / 58.0 66.6 / 66.6
Open 43.8 / 46.6 45.0 / 48.1 58.5 / 60.7
榜单分 38.3 / 43.6 29.6 / 35.4 48.8 / 54.1

配对到布局看:三角测量把深度网络的 57 个失败翻成成功,自己只输回去 23 个(McNemar 检验 \(p \lt 0.001\))。赢面最大的三个——push T 从 4/10 到 10/10,imitate sorting sequence 从 1 到 8,play Xylophone 从 0 到 6。输的都是圆容器场景(倒液体、倒球、堆碗),因为碗沿、杯口这类圆边界的测量是它的软肋。

但别急着开香槟——渲染深度那一列还比三角测量高 10.6 个点。几何方法没有深度网络那种"误差地板",但"假设成立才准"(平面已知、双视角可见)这个前提在接触任务里恰恰最难满足。这个差距就是下一节要谈的边界。

第二视角的账单:花 3.6% 的步数,买回 17 个成功

三角测量组有 43% 的 episode 至少做了一次"为看而移动",总共 3.6% 的执行步数花在取景上(深度网络组只有 0.7%)。值不值?在做了取景移动的 180 个布局上,RGB 组成功 39 次,深度网络组只有 22 次(\(p = 0.002\))。而且步数预算并没有更紧张:三角测量组失败 episode 里用掉 75% 预算的比例反而更低(71% 对 75%),撞步数上限的也更少(20 对 26)。

代价是集中的:鸡蛋盒任务 40% 的步数花在取景上(而且还是没成功),投币插槽 16%。但回报也集中:play Xylophone 花 17% 步数取景,成功率从 0 干到 6/10;push T 花 8%,从 4 到 10。这就是主动感知的真实经济学——不是免费的午餐,但经常是划算的交易。

智能体到底写了些什么

RGB 跑下来共 769 轮 optimizer 迭代(每任务中位 17 轮),失败后的一轮中位 6.3 分钟,跑 16 条 shell 命令,中位改动 +118/−6 行(含测试),92% 的轮次跑了任务测试。最终沉淀了 327 个任务命令、约 7.8 万行 Python。所有轮次加起来读了 4.87 亿输入 token——大部分走了缓存。这个 token 账单放出来挺诚实的,也给想复现的人一个心理准备:便宜不了。


🔬 能力地图:边界画在接触上,不在推理上

图4:Push T 案例——被工具拒绝的高度

图4:Push T 布局 2 的左腕相机视角。(a) 方块实际离目标只有 3.2 mm(在 7 mm 容差内),但检查工具用了错误高度误报 12.5 mm;(b) 智能体被错误反馈带着修正三次,反而偏到 13.6 mm;(c) 修好工具后用实测高度,检查报 1.6 mm,第 354 步成功。一个测量 bug 如何把成功误导成失败的完整现场。

作者给每个任务打了两个标签——物理上需要什么接触(刚体/推/插入/关节/可变形/运动物体),决策上需要什么(纯几何/符号语言/记忆),得到了全文我认为最有分量的一张表:

物理类别 无工具 深度网络 HexaShell VPP2
刚体抓放堆叠 36.9 44.1 50.0 30.0
推/滑/按 60.0 67.5 92.5 24.7
运动物体 33.0 30.0 40.0 43.0
精密插入 1.7 1.7 8.3 28.1
可变形/流体 26.0 30.0 33.3 49.4
关节/工具使用 2.0 0.0 7.5 21.6
记忆类 38.7 55.0 65.0 55.6

格局清晰得像用刀切的:HexaShell 在"正确答案能从实测几何算出来"的地方碾压(推动 92.5%,刚体 50.0%,记忆 65.0%),VPP2 在"必须靠接触手感"的地方碾压(插入 28.1% 对 8.3%,可变形 49.4% 对 33.3%)。精密插入 12 个变体里 7 个零分。

为什么插入这么难?插入需要孔和零件在同一画面里对准到毫米级,而头部相机一个像素在桌面上就覆盖 2–3 mm;能看清孔的腕部视角,又必须在夹爪已经捏着零件的时候去拿——测量和操作互相打架。渲染深度下工具能到 30.1%(insert key 80%),RGB 只有 8.3%,这个差距全是感知精度。

失败方式的分部也很有诊断价值。268 个失败 episode 里:57% 是耗尽预算(智能体知道没成,一直重试到步数烧光),30% 是"自称成功被 checker 驳回"(感知 gap),13% 是主动放弃。可变形/关节/刚体类 60–77% 的失败是烧干预算——看得见失败,就是做不出那个动作;记忆类一半失败是"自称成功"——VLM 在细粒度视觉细节上的老毛病。一个失败签名直接指向短板在哪,这个分析框架本身就很值得抄。

七个案例:bug 报告驱动开发

论文第 6 节给了七个完整的"失败 → 诊断 → 修复 → 通过"案例,每个物理类别至少一个。挑两个我最喜欢的。

图6:Play Xylophone 案例——单视角 vs 双视角

图6:Play Xylophone 布局 1。(a) 头部相机裁切;(b–d) 右腕相机视角。智能体单用头部相机估被握住的琴槌头位置,差了 22.9 mm,八次敲击 checker 一次都没算;optimizer 把工具改成双视角三角测量后,误差降到 2.7 mm,任务在第 377 步通过。

这个案例漂亮在:optimizer 是在不看图像的情况下定位的 bug——读命令日志和工具报错就够了(七个案例里五个如此),然后在合成测试里复现:旧方法偏 22.7 mm,新方法小于 2 mm。这完全就是"先写个 failing test 再修"的 TDD 流程,只不过发生在机器人上。

图8:井字棋案例——省步数的路径

图8:Play tic tac toe 布局 0。(a, b) 最后一枚棋子前的头部相机画面;(c) 右腕相机的最后一帧。1100 步预算里等对手就花了 520 步,转移工具每次还在 home 位姿白白转夹爪(每次 16–22 步);optimizer 把"转动"合并进"移动"里,首发放置从 152 步降到 128 步,最后一格 129 步对剩余 140 步——堪堪够用,第 1028 步填满棋盘。

这个案例修复的不是感知而是时序经济学:日志里的每段步数就是 profiler 输出,optimizer 像个看火焰图的程序员一样找到了那个白转的夹爪。七个案例里三个修测量、两个修时序、一个修抓取点、一个修"工具何时该放弃"——全是小而局部的编辑,每个都带新测试,策略永远留给执行智能体。

顺带一提 insert tubes 那个案例挺诚实的:修完之后管子其实是靠"松手让它自己掉进去"才进的孔,optimizer 自己在笔记里承认"这个改动解释不了侧向释放"。这种不粉饰的态度在论文里不多见。


💡 我的判断

亮点是真的亮。 三件事我觉得会被记住:一是把"持久化工具"作为编程智能体在物理世界的学习载体——不碰模型、不碰脚手架,7.8 万行可审查的 Python 就是全部"训练成果",这在可解释性和可复现性上吊打任何端到端方案;二是三角测量对深度网络的那场对照实验设计得非常干净(同 harness 同模型同布局,配对检验),41 mm 对毫米级的精度差距说明了一个朴素真理——在有标定相机的受控场景里,经典几何依然是王道;三是那张能力地图,"瓶颈在接触不在推理"这个结论有 420 个 episode 的失败签名撑着,不是拍脑袋。

但有几个地方要保持清醒。 榜首的含金量要打个折看:39.7% 对 32.3% 的优势,大部分来自 Memory 和 Open 这两类"认知型"任务,而在 Precision 和 Long-Horizon 上它其实输给 VPP2。19 个零分变体也说明这个系统离"通用"还很远——它是个极不平衡的冠军。还有开发成本:每任务 12 小时开发预算、769 轮 optimizer、4.87 亿 token,这个"免训练"的账其实不便宜,只是把 GPU 训练费换成了模型推理费。另外 10 个开发布局 + 10 个测试布局的规模,统计噪声不小,配对检验做了是好事,但 42 个任务里很多结论基于个位数成功次数。

对工程的启发很直接。 如果你在做机器人或任何"智能体 + 物理系统"的项目:一,harness 尽量薄,决策全部留给智能体,否则你永远说不清能力来自哪;二,把所有观测数值化、强制实测,从架构上杜绝"背答案";三,失败日志当成 bug report 来设计——每条命令带原因、带步数、带帧,optimizer 才能不看图就修 bug;四,几何能算的地方别上学习模型,41 mm 的深度误差在抓取场景就是死刑。

更本质的问题还没解决。 结论里作者自己也点了:下一步是"接触中持续测量并纠正动作"的工具,而不是预先规划好一切。你想想看,人插钥匙的时候根本不是看准了再捅,是边捅边晃边感受阻力。当感知必须和操作交织在一起时,"先测量后规划"这个范式本身就到头了。HexaShell 把这条边界量出来了,这本身就是贡献。

最后说一句,hexafuture.ai 这个署名方式和 GPT-6-Astra 这种没在别处见过的模型名,让我对这篇论文的"来历"有点好奇——但论文本身的实验设计和诚实度是过硬的,工具也开源了,这就够了。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我