👉 论文原文 · Harness VLA(arXiv 2026)
🌐 项目主页 · harnessvla.github.io
从relinf开始就对于老师的工作有所关注,不过确实一直没有什么机会深入研究,不过最近的harness VLA 的热度较高,我也就产生了别样的兴趣,初次阅读之后,发现这篇论文的思路非常有意思,我觉得追随一下于老师的脚步。
语言条件操作的两条主流路线,如今各执一端,也都各有一个明显的错配。
端到端 VLA 把语言理解、长程组合、低层控制全部压进一个策略网络。它在局部、图像条件的接触操作上很强——抓起不规则物体、把杯子放进指定区域、拧开水龙头——但它的能力被训练轨迹的分布圈住了。一旦部署时语义目标被重定向、目标谓词被重新绑定、物体布局被调换,或者某次局部接触不稳定,整个 rollout 就可能照着训练时的”肌肉记忆”执行,完全无视新的指令。
LLM coding agent 恰好互补:语义推理和组合泛化是强项,但把物理操作交给手写或模型生成的 API 之后,不规则抓取、受限放置、关节物体交互这些”接触富集”的环节就成了软肋。过去让这类系统变强的常规做法,是不断扩充技能库——加更多、更专用的原语。
Harness VLA (Zhang 等 2026年) 反其道而行:技能库保持小而固定,让 agent 学会用它。论文把冻结的 VLA 封装成唯一一个学习式原语 vla_act,再配上八个解析原语(移动、姿态、腕部、夹爪、释放、底盘),让 LLM 规划器在闭环里编排它们。语义重定位、非接触执行、失败后的重新布位,全部上交给规划器;VLA 只负责被叫到的那个局部接触阶段。作者称之为把 VLA”从一整条轨迹策略,改造成一枚可复用的接触专家”。
| 设计 | 针对的问题 |
|---|---|
冻结 VLA 封装为单一 vla_act 原语 |
VLA 被整条轨迹分布圈住,分布外就失效 |
| 固定小原语库 + JSON 调用 | 技能库无限扩张,agent 学不会用法 |
| 任务特定记忆 + 全局记忆 | 成功经验只存在单次 rollout 里,无法跨场景复用 |
| 两阶段生命周期(引导 / 评估) | 探索与测评的预算、权限混在一起 |
一枚原语,一个管家
Harness VLA 的抽象非常干脆:规划器永不输出低层动作。每一轮,LLM 规划器处理当前 RGB-D 观测、任务指令和检索到的记忆,然后发出一个 JSON 结构化的原语调用——{"action": "move_to", "xyz": [...], "tol": 0.012} 或 {"action": "vla_act", "prompt": "grasp the black bowl", "max_chunks": 2}。环境执行到该原语的内部后置条件,返回刷新后的观测,再进入下一轮。这套文件中介的 REPL 协议让每次 rollout 都像一次可审计的实验:每步都有指令、日志和感知证据。
原语库分成两类。解析原语是确定性的运动学控制器:move_to 负责世界坐标系下的自由空间运输,move_pose 在移动时联调姿态,rotate_wrist / rotate_pitch 只动腕部一个自由度,set_gripper 与 release 管夹爪,RoboCasa365 场景再加 navigate_to 和 move_base 两个底盘原语。学习式原语只有 vla_act 一个,但它的覆盖面很大:抓取、受限放置、按压按钮、拧水龙头、开关抽屉、插入、双手交接,全走这一条接口。规划器可以给它配 prompt 和提前返回条件——比如”抓稳即停”或”用满两个 action chunk 预算”。
值得注意的是分工的粒度:VLA 是稀疏调用的,不是连续控制器。每个 vla_act 都是一次规划器选择的局部接触尝试,尝试前由解析原语把机器人摆到可行的预接触位形,尝试后由规划器观察接触结果,决定继续推进还是重新布位再来一次。论文附录的统计很能说明问题:在 LIBERO 上,move_to 占全部调用量的 61.8%,而 vla_act 只有 15.8%;RoboCasa365 里 vla_act 升到 35.3%,RoboTwin 双手场景里升到 47.4%——接触越重的任务,VLA 出场越多,但解析原语始终是脚手架。
记忆:复用结构,不复用坐标
框架的第二个支柱是双层记忆,灵感来自 Voyager 式的持久记忆设计,但被搬到了物理操作上。
任务特定记忆(Task Specific Memory) 存的是单个任务”怎么解”的结构。引导阶段成功后,agent 把验证过的原语序列序列化成 JSONL 轨迹,并把其中的具体坐标参数化、替换成符号化的感知查询;同时写一份 JSON 语义摘要,记录策略为什么有效、哪些做法要避免。到了评估阶段,新种子、新布局下,规划器复用这份程序结构,但绝不复用坐标——提示词里专门有一条规则:“先前的 xyz、quat、像素位置都属于 seed 0 的场景;在当前图像和世界地图上重新定位每一个物体、目的地、支撑面与设备。”这行约束很关键,它把”记忆”从轨迹重放变成了结构迁移。
全局记忆(Global Memory) 存的是跨任务的”操作手册”:什么阶段该用 VLA、什么阶段该用解析原语;夹爪闭合了但物体没跟着动,就按空抓处理,重新定位再布位;不要仅凭视觉接近就宣布成功,要核对 benchmark 的成功信号。两类记忆在交互过程中迭代构建:可恢复的失败留在轨迹里并配上解释,失败的尝试作为负面证据沉淀成失败模型,后一次探索可以用更短的解替换旧轨迹。
一个值得细想的细节是感知隔离:规划器拿不到任何特权信息——没有物体真值位姿,没有仿真器内部状态。它只能从 RGB 图像上选像素、索引预计算的世界地图、对多个稳定像素取中位数来定位目标。论文在提示词里明确禁止 oracle 访问,这让”记忆 + 重新定位”的闭环是真实的,而不是作弊的捷径。
结果:守住分布内,撬开分布外
实验覆盖四个基准族:标准 LIBERO、扰动版 LIBERO-Pro、厨房场景 RoboCasa365、双手场景 RoboTwin C2R,共 1790 次评估 rollout。规划器实例化了两个后端——Codex 和 Claude Code(CC),两者共享完全相同的 harness、记忆接口、原语库和评估协议,差异只在规划器骨干。
标准 LIBERO。冻结的 \piRLinf 检查点直接跑是 95.3%,套上 harness 后是 96.0%(Object 子套件 100%、LIBERO-10 93%)——套缰绳没有损伤分布内能力,反而把同一个策略变成可控的接口。
LIBERO-Pro。这里是主战场:指令重定向(T)与位置调换(S)两种扰动,跨 Spatial、Object、Goal、LIBERO-10 四个家族,共 8 个单元。端到端 VLA 全线崩盘:OpenVLA 0.0%、NORA 0.0%、MolmoAct 1.5%、$$0.5 只有 11.0%。此前最强的报告基线是 RATS(43.8%),而直接冻结基线 \piRLinf 也只有 50.0%。
| 方法 | Spat-T | Spat-S | Obj-T | Obj-S | Goal-T | Goal-S | L10-T | L10-S | 总体 |
|---|---|---|---|---|---|---|---|---|---|
| RATS | 31.0 | 29.0 | 63.0 | 61.0 | 36.0 | 43.0 | / | / | 43.8 |
| Harness VLA (Codex) | 81.0 | 69.0 | 94.0 | 91.0 | 75.0 | 66.0 | 52.0 | 49.0 | 72.1 |
| Harness VLA (CC) | 94.0 | 80.0 | 88.0 | 90.0 | 87.0 | 87.0 | 71.0 | 62.0 | 82.4 |
同一枚冻结 VLA,只是换了个用它的方式,从 50.0% 抬到 82.4%——比 RATS 高 38.6 个百分点,比 Codex 版高 10 个点。差距不在视觉骨干,全在编排。
RoboCasa365。厨房任务引入移动底盘、关节设备与更长的组合流程。RLDX-1 直接跑的任务加权成功率是 30.0%——Atomic-Seen 60.0% 尚可,但 Composite-Seen 掉到 21.3%,Composite-Unseen 只剩 5.0%,组合与分布外能力几乎归零。Harness VLA(Codex)把整体拉到 55.4%,比 RLDX-1 高 25.4 个百分点。值得留意的是这里 Codex(55.4%)反而超过 CC(48.6%),与 LIBERO-Pro 相反——同样的 harness,规划器后端的选择开始显出差价。
RoboTwin C2R。双手操作走”干净到随机化”的零样本协议:从干净场景拿一条专家验证的轨迹当记忆,直接迁移到随机化场景,不做任何随机化侧的引导或微调。冻结的 LingBot-VLA 后端直接跑是 50.4%,Harness VLA 提到 58.4%(CC)——涨幅不如前两个基准,但这是一个已经针对 RoboTwin 后训练过的强基线,能再挤出 8 个点,说明”编排”和”训练”提供的是两种不同的增益。
三个关键发现
论文把增益拆成三条机制,每条都有明确的证据支撑。
发现一:规划器级语义重定位恢复了任务条件行为。Object-Pro 的扰动案例很直观:视觉场景几乎不变,只有指令把目标换成了另一个物体,但 \piRLinf 照旧执行标准行为——它的语言通道几乎是摆设。Harness VLA 把语义解析上移到规划器:解析任务描述、从当前 RGB-D 定位真正的目标、用解析原语布位、只在接触阶段调用 vla_act。VLA 不用”听懂”指令,只需在被摆好的局部场景里做它擅长的事。
发现二:规划器分阶段的调用让冻结策略变得可重试。论文做了一个很有说服力的分析:给每轮允许的 vla_act 调用次数设上限,观察成功率如何随上限增长。
在 LIBERO-Pro、RoboCasa365、RoboTwin C2R 上趋势一致:头几次调用就能反超冻结基线,随后饱和。案例里,牛奶盒第一次放进篮筐时歪在外面,规划器重新布位机械臂、重试 vla_act,第二次稳定放入。重试不是连续低层控制,而是把单次脆弱的接触失败局部化在当前子任务里,不让它顺着长程 rollout 传染。
发现三:解析原语把非接触执行从接触控制里隔离出来。论文统计了成功 rollout 的”最后一击”归因:LIBERO Pro 系列任务大多由解析原语收尾(VLA 建立接触后,运输与释放交给解析原语),而 RoboCasa365 和 RoboTwin 的最终谓词更多依赖接触操作本身。两类原语的角色清晰:解析原语负责把 VLA 摆到能赢的位置,VLA 负责赢下接触那一瞬间。
记忆到底买来了什么
一个自然的质疑是:上面的增益,有多少来自记忆,有多少来自 LLM 的在线推理?论文用零样本实验把两者分开:在 LIBERO-Pro Goal 上禁用任务特定记忆和全局记忆,让规划器纯靠在线推理。
结果很有信息量。指令重定向(Goal-T)零样本 79.0%,few-shot 是 87.0%——丢了 8 个点,说明语义重绑定主要靠规划器的在线能力。位置调换(Goal-S)零样本暴跌到 31.0%,few-shot 是 87.0%——丢了 56 个点。空间扰动下,引导阶段探索出的”原语组织方式”才是主力:记忆里装的不是答案,而是”先用解析原语定位与布位、在学到的交互点调用 VLA、失败后怎么重新布位”这套分阶段模板。这与发现一、二互相印证:语义在线、结构离线。
把问题挪到哪里了
这套范式的实质,是把操作问题重新分配了:VLA 负责”在摆好的场景里完成接触”,规划器负责”把一切摆好并盯住结果”。所以成功率是两层能力的乘积——规划器编排得好不好,乘上冻结 VLA 在这个局部做得好不好。这也解释了两个可疑之处。
“few-shot”的口径值得细看。每个任务都在 seed 0 上完整探索过一次:允许 reset、预算宽松、可以反复试错直到成功。这更接近”每任务一次的在线搜索 + 缓存”,而不是零成本地看几个例子。RoboCasa365 有 50 个任务,意味着 50 次引导流程,而论文没有量化引导阶段的 wall-clock 与 token 开销。反过来,这也正是它未来与 ASPIRE 式技能发现结合的空间:当某种原语组合反复出现,就该把它固化成一个新原语,省掉重复探索。
评估的边界同样清楚。全部实验在仿真里;规划器后端不一致(CC 在 LIBERO-Pro 更好,Codex 在 RoboCasa365 更好)说明 harness 的天花板部分取决于闭源模型当天的能力;论文自己承认高层规划器与低层 VLA 之间是开环反馈,缺少细粒度图像标注也限制了高杂乱场景的结构推理。
把它和上一篇读的 Embodied-R1 (Yuan 等 2026年) 放在一起看很有意思:两篇论文互不相识,却观察到了同一件事——VLA/VLM 的语言通道在分布外基本失效。Embodied-R1 的处方是用 RL 把模型逼成输出可验证”指点”的接口,Harness VLA 的处方是把语义整段上移给 LLM 规划器,把冻结模型降格成接触执行器。一个改造模型,一个改造系统;一个需要训练,一个不需要。两条路在”语言的归语言,接触的归接触”这一点上殊途同归。
Harness VLA 最值钱的洞见其实在标题之外:可靠性不一定要靠训练更强的策略,也可以靠给固定原语学习”操作范围”——哪些子问题该用解析原语解、什么时候该叫 VLA、失败的接触怎么重新布位。技能库不扩反收,反而换来了 38.6 个百分点的分布外增益。对处在”模型每三个月更新一代”节奏里的机器人社区,这种把价值沉淀在 harness 与记忆、而非某个检查点里的思路,或许比任何单一模型都更耐久。