
1. 为什么“冻结 VLA”值得被认真对待从微调恐惧症说起我最早接触到 Harness VLA 这个概念是在和几个做具身智能的朋友聊天的时候。当时大家正在争论一个核心问题预训练好的 VLA 模型到底该不该在下游任务上做微调。一派认为不微调根本没法用VLA 在特定环境里就是“人工智障”指令稍微偏一点就不知道手该往哪儿放另一派则认为微调一次的成本实在太高了数据要重新采、算力要重新烧而且微调完往往还带来灾难性遗忘模型在原本擅长的指令上反而退化了。Harness VLA 的思路很有意思它完全绕开了“该不该微调”的争论而是回答了一个更工程化的问题如果我坚决不动这个冻结模型的任何参数那我能不能通过外层调度、重试、反馈校验这些手段把它的成功率“磨”上去答案是能。这里的核心关键词是“冻结 VLA”和“操作原语”。所谓冻结 VLA指的是一个已经训练好、参数完全锁定的视觉-语言-动作模型它能够根据视觉观测和自然语言指令输出动作。它的问题在于单次推理的结果不一定可靠受观测噪声、指令歧义、场景光照、物体位姿偏差等因素影响一次执行可能就是错的。而“操作原语”的意思是我们不再把整个 VLA 当成一个通用的“大脑”而是把它当成一个可以被反复调用的、原子化的操作函数——给它一个输入它吐一个动作你检查这个动作的结果不行就再调一次。这个观点之所以让我觉得有价值是因为它在“模型能力边界”和“系统可靠性”之间划了一条清晰的线。模型的单次能力不行不代表这个模型没用只要系统层面能捕获失败、发起重试、提供纠错机会整体成功率是可以远高于单次成功率的。这篇文章就从技术原理到工程实现把这个“Harness”的思路完整拆开讲清楚。作为一个关注具身智能和机器人学习方向的从业者我的感受是这类工作真正解决的是部署环节的信任问题。VLA 模型在仿真里往往表现尚可但一旦放进真实环境就没有人敢让它自主地执行一个长程任务。Harness VLA 提供的是一种软性的兜底机制它不能把一个弱模型变成强模型但它能让一个“偶尔犯错”的冻结模型变成一个“虽然会犯错但永远不会带崩整个任务”的可靠组件。适合对这个方向感兴趣的研究者、机器人工程师以及正在考虑要不要对 VLA 做微调、但被成本和数据问题卡住的人阅读。2. 可重试操作原语本质上是软件工程思想的一次迁移如果你写过分布式系统或者调过外部 API一定对“重试”这个词非常熟悉。网络请求可能超时、第三方服务可能返回 5xx、数据库连接可能被池子耗尽——这些场景下最常见的容错手段就是重试。但重试不是简单的“再来一次”它背后有一套完整的策略退避backoff、抖动jitter、幂等性判断、最大重试次数、熔断机制。Harness VLA 这个思路最妙的地方就是把这一整套软件工程的容错逻辑平移到了物理世界的机器人操作上。2.1 从“重试一个 HTTP 请求”到“重试一个抬臂动作”我自己第一次看这个想法的时候脑子里冒出的第一个问题是一个 HTTP 请求失败了重试一次通常没有副作用因为请求是幂等的或者系统已经做了幂等处理。但机器人执行了一个错误的物理动作——比如把杯子碰倒了或者把夹爪撞到桌面上——重试还有意义吗环境状态已经变了重试一个建立在旧状态上的动作岂不是错上加错这就是 Harness VLA 区别于“简单重放”的关键。它设计了一套反馈校验机制每执行完一个动作系统会先判断当前观测到的环境状态是否和预期一致。如果夹爪本该合拢却还是张开的如果物体本该被抓起却还在桌面上系统会认为这一步执行失败然后不是继续往下执行下一个动作而是先回退再根据当前的实际状态发起重试。换句话说重试的不是那个动作本身而是“带着当前最新状态重新让 VLA 决策一次”。这里面其实隐含着一个非常重要的前提VLA 本身就是以视觉和语言为输入的条件模型所以它对“状态已经变化”这件事天然敏感。你喂给它一张换过的画面它输出的动作自然跟上一轮不一样。Harness 做的不是修改模型的决策逻辑而是管理“该在什么时候喂给它新的画面、该对它的输出提出什么约束”。2.2 原语的粒度是“一步一重试”还是“一段一重试”Harness 的另一个设计要点是操作原语的粒度。一个“操作原语”可以被设计成单步动作比如“向前移动 5 厘米”“闭合夹爪”也可以被设计成一个技能片段比如“抓取桌子上的红色杯子”“把杯子放到托盘里”。粒度不同重试机制的设计完全不同。如果原语是单步动作那么重试的频率会非常高几乎每一步都要判断“这一步成功没有”。这种设计适合动作空间比较小、状态变化易于检测的任务比如抓取、插拔、按压。如果原语是技能片段那么重试发生在整个技能执行完以后此时系统需要判断的是“这个技能的目标达成了没有”一旦失败就要整体回滚到起始状态。这种方式看起来“更高级”但对状态检测和回滚能力的要求极高因为技能片段内部可能包含十几个动作中途任何一个动作错位都可能导致整体失败。在我看到的实现里Harness VLA 更倾向于把原语设置在“单步和技能片段之间”的中间粒度上。比如对于“抓取物体”这个操作它会把原语定义为“靠近物体—张开夹爪—闭合夹爪—抬起手臂”这样的一组原子动作但整组动作共享一个重试边界如果抓取后的目标物体没有被抬起系统就认为这个原语失败了然后从头重试这个原语。这样做的好处是既不会因为每一步都校验导致系统反应过度也不会因为原语太大导致一次失败就前功尽弃。2.3 原语的输入输出长什么样为了让原语具备“可重试”的性质它的输入输出接口不能只是“图像指令动作”。Harness 的每个操作原语对外暴露的接口至少需要包含四类信息观测信息当前视觉状态、指令信息经过归一化的语言指令、反馈信息这一步预期的效果描述以及上下文信息已经尝试过几次、上一次失败的原因是什么。这里最容易被忽略的是“上下文信息”。如果没有它每次重试完全孤立VLA 可能在同一地方反复犯同一个错误。带上“上次抓取时物体滑落”这个信息之后VLA 在下一轮决策时就会更倾向采用慢速闭合夹爪的策略。但这个信息不能明显体现在自然语言里否则会让指令变得过载VLA 反而更懵。实际工程里通常采用的做法是把重试次数作为动作采样的调节因子或者把失败原因用一个内部状态向量注入到观测序列里。3. Harness VLA 的核心运行机制执行、校验、回退、重试的闭环把 Harness VLA 拆开来看它的运行逻辑不复杂本质上就是一个带反馈的循环。但这个循环里有几个细节决定了它是“有效的容错系统”还是“原地打转的复读机”。3.1 推理主循环的框架下面这个伪代码描述了我理解的 Harness 核心流程。它比“直接让 VLA 从指令到动作”多了一个校验阶段和一个回退阶段这也是它能够容忍失败的原因所在。def harness_execute(instruction, initial_observation): state initial_observation retry_counter 0 while not task_finished(state): action vla_predict(instruction, state) action apply_action_space_constraints(action) execution_result execute_in_real_world(action) feedback check_effect(execution_result, expected_changeaction.effect_description) if feedback.is_success: retry_counter 0 state execution_result.observation else: retry_counter 1 if retry_counter max_retries: return ExecutionFail(stepcurrent_step, reasonfeedback.failure_reason) state rollback_to_last_stable_state(execution_result.observation) return ExecutionSuccess()这个流程中最容易被轻视的一行是check_effect也就是“怎么判定这一步有没有做成功”。很多人以为有视觉反馈就能判定但真实物理环境里视觉判定会面对各种干扰夹爪挡住了物体、光线变化导致画面整体偏移、物体的微小移动像素级上可能看不出来。Harness 的解决办法是在定义原语时就为每个原语配一个效果描述符描述符用自然语言或者一个简单的校验函数来表达比如“夹爪是否闭合超过阈值”“目标物体中心点是否移动超过 N 个像素”。3.2 重试不是“再来一次”而是“换一种方式再来”如果重试就是简单地把同样的指令再丢给 VLA那么大概率会得到同样的错误结果。Harness 真正聪明的地方在于它设计了多种重试变体每次重试都会引入一些扰动或者策略上的改变动作采样扰动VLA 输出的动作通常是一个分布Harness 会提高采样温度让重试时更可能采到不同的动作。相当于人类拧螺丝没拧进去退出来换个角度再拧。语言指令换述同样的意图换一种表达方式重新输入模型。比如“拿起杯子”改成“把杯子从桌面上提起来”。由于 VLA 对语言表面的变化很敏感换述往往能触发不同的决策路径。策略切换如果简单重试连续失败多次Harness 会切换到一种保守策略比如把动作步长减半、将夹爪闭合速度降低、要求 VLA 先输出一个“确认计划”再执行。这种策略切换本质上是把系统的“冒险程度”逐步降下来。这个设计有一个朴素的直觉支撑VLA 的失败往往不是“完全没有能力完成这个动作”而是“在当前这个状态表达下选了一条不合适的路径”。扰动的意义在于让模型避开原来的路径选择而不是靠概率撞运气。3.3 回退到什么程度才合理回退是 Harness 最容易做坏的一个环节。回退得太浅错误状态没有被完全清除回退得太深之前成功执行的步骤全部白费任务效率骤降。我的经验是回退的深度应该由“失败的物理范围”决定而不是由“执行到第几步”决定。比如在执行“抓取物体—放到托盘—按压按钮”这个任务时如果抓取这一步失败了只需要回退到抓取起始位姿即可不需要把机械臂完全归零。但如果失败发生在“放到托盘”阶段物体掉落到地面继续回退到抓取起始位姿也没用因为物体的位置已经永久偏离了这时必须停止重试并请求人工介入或者重新开始整个任务。Harness 将这两类失败分别称为“局部可恢复失败”和“全局不可恢复失败”对前者做回退重试对后者做任务终止。这个分类是工程上很重要的决策点。4. 真正决定 Harness 成败的是工程实现里的细节原理清楚了代码框架也简单但 Harness VLA 真正落地时的难点全在工程细节上。这些细节不会出现在论文的核心图里却决定了系统在真实环境里的成功率和稳定性。我在尝试复现类似思路时遇到的最关键的问题有四类。4.1 观测标准化让“当前状态”对 VLA 是可信的VLA 模型训练时使用的观测通常是固定的 RGB 图像或者深度图尺寸、相机视角、光照条件都已经确定。真实部署时机械臂自带的摄像头角度、距离、画面中夹爪的自遮挡情况千差万别。Harness 需要做的第一件事是把真实观测标准化到模型能理解的空间里。我见过最省事的做法是手工裁剪加缩放把目标工作台区域从画面中抠出来resize 到模型输入尺寸。稍微讲究一点的会在部署前先用一个分割模型把夹爪和目标物分割出来再分别放大送入模型。这一点在重试场景下特别重要因为重试时系统要回退并重新观测如果观测的尺度和训练时不一致模型在重试时往往会输出比首次决策更离谱的动作。4.2 动作空间裁剪防止重试变成“瞎折腾”VLA 模型在训练时动作空间的设置通常是通用的机械臂关节控制参数或者末端执行器的笛卡尔速度但在具体任务里很多动作区域根本不该被访问。Harness 在每次执行前会为当前任务定义一个“动作安全域”把 VLA 输出的动作裁剪到这个域内。举个例子在一个“只允许在桌面平面内操作”的任务里VLA 如果输出了一个带有诡异 Z 轴旋转的动作Harness 会把这个自由度上的值直接置零。这个裁剪看起来粗暴但它保证了重试过程不会把系统带进一个物理上不可能恢复的状态。反过来说如果没有这层约束一次乱序的重试就可能让机械臂撞到桌面、夹爪卡住整个任务直接彻底失败。4.3 执行频率与时间窗口重试要快但不能快到没有反馈重试的有效性直接取决于每次执行后系统能不能拿到足够清晰的反馈信号。这个反馈既来自视觉也来自执行器本身。Harness 需要设定一个合理的时间窗口在窗口内等待机械臂动作完成、图像稳定然后才采样反馈而不是动作还没停就开始判定成功与否。时间窗口太短机械臂可能还在运动画面是模糊的校验结果等于随机猜窗口太长一个本来几秒钟就能完成的操作会拖到十几秒任务的实时性会变得完全不可用。我实际操作下来对于常见的桌面抓取任务单步窗口设在 1.2 秒到 1.8 秒之间比较合理而对于涉及夹爪闭合、力觉反馈的任务可以结合夹爪电流异常变化提前终止窗口不用等满时间。4.4 重试上下文的记忆别让模型“失忆”一个容易被忽视的坑是重试次数的“沉默累积”。如果 Harness 框架不把重试信息传给下一轮决策VLA 根本不知道自己在重试它每轮表现都是孤立的。这样系统就变成了“一个不断尝试的随机过程”成功率完全靠模型单次的运气跟“策略性重试”没有关系。所以 Harness 在每一次重试前都会把失败原因、已重试次数、上一次动作序列编码进一个轻量级的状态缓存中。一种实现方式是用一个固定长度的文本模板比如“第 2 次尝试物体在夹爪闭合时滑落”把它拼接到原始指令后面另一种方式是把历史动作轨迹的 embedding 作为额外的输入 token 塞给模型。前一种对冻结黑盒模型友好后一种需要模型结构支持额外的输入通道两者各有适用场景。5. Harness VLA 和传统微调路线到底差在哪一场务实的对比很多人听到“冻结模型”第一反应是“性能一定不如微调过的”。这个直觉在单次执行成功率上大概率成立但放到整个系统层面结论并不那么绝对。Harness 方案的估值逻辑是把算力和数据成本省下来把可靠性通过系统机制来补足。我对比过两条路线在几个维度上的表现差异。维度传统微调路线Harness VLA参数与算力成本需要加载完整训练流程反向传播成本极高一次微调动辄数卡周级前向推理即可单次成本低重试的额外成本也远低于微调数据需求每个下游任务需要采集数百到上千条示范数据不同场景还要重新采不需要为任务重新采集训练数据只需定义原语的校验规则灾难性遗忘微调后容易遗忘旧任务能力需要数据混合和正则化手段缓解不存在遗忘问题模型能力始终是预训练时的原始水平任务扩展性每新增一个任务就要多一份微调流程任务之间还可能互相影响新任务本质上就是一段原语定义和一个校验规则扩展成本极低失败模式失败模式隐藏在模型内部很难定位是数据问题还是模型容量问题失败模式暴露在系统层可以通过重试策略和校验规则显式调整上限与下限理想情况下单次成功率可以很高但一旦失败可能造成不可逆状态单次成功率可能不如微调最优模型但系统的鲁棒性和安全性更容易保证这张表里最值得玩味的是最后一行。微调路线的“上限”很高模型确实能够通过大量任务数据学会非常精准的动作但它的“下限”也很低——如果模型在一个新鲜场景里输出了一次幻觉动作系统没有任何机制去应对任务直接失败。Harness 路线正好相反它不追求单次决策的完美而是保证任何一次失败都不会击穿整个系统。这让我想到工程领域里一个经典的分工方式模型负责“判断”系统负责“兜底”。Harness VLA 就是把这个哲学应用到了具身智能领域。对于很多实际部署场景——比如流水线上的分拣、实验室里的样品操作、家庭环境里的物品整理——我们真正需要的不是一个在 99% 时间里完美的模型而是一个在 100% 时间里都不会因为一次错误模型输出而搞砸整件事的系统。Harness 恰好提供了这种可靠性。当然Harness 的局限也很明确。它不太适合对延迟极其敏感的任务。一次执行失败后的校验、回退、重试至少要花掉正常操作两到三倍的时间如果任务要求的是亚秒级响应重试机制就会成为瓶颈。另外它的效果依赖校验器的可靠性而校验器的本质通常是视觉状态检测真实场景下的误判率虽然低但依然存在。如果校验器错判了成功或失败整个 Harness 的闭环就会被误导。这就是为什么我在前面反复强调定义原语时最重要的不是动作本身而是“怎样才算成功”的判定规则。6. 取了经之后的实测观察性能提升、边界条件与落地建议理论讲完聊点实操数据。我参考 Harness 的思路在一个桌面分拣场景里做了模拟实验机械臂需要从桌面上抓取多个随机摆放的物体放到不同类别对应的托盘里。所有实验都使用同一个冻结的 VLA 模型不做任何微调只通过 Harness 的重试机制来提升成功率。任务一共设计了 200 次完整流程目标物体的类型包含杯子、方块、圆柱体和软性物体。6.1 不重试与重试的差距远比想象中大在不开启 Harness 的情况下冻结 VLA 的单步抓取成功率大约在 62% 左右。这意味着一个包括“抓取—移动—放置”三步的完整任务理论成功率只有大约 24%0.62 的三次方。这个表现确实很难让人放心让它独立干活。开启 Harness 并允许最多重试 5 次之后单步抓取成功率被我测到了约 91%。这里有个很重要的细节91% 不是靠 5 次独立尝试简单累加的而是靠上述“换述、扰动、策略退化”的组合实现的。如果只是让模型原地重复同一个指令成功率提升非常有限大概只能到 75% 左右。这直接验证了“重试不是再来一次”的设计在物理世界同样成立。对应到完整任务层面三步任务的成功率从 24% 提升到了约 76%。虽然还是达不到微调模型的水平但考虑到整个过程中没有用一条新的示范数据、没有烧一分钟的训练算力这个性价比已经非常让人满意了。6.2 需要坦白说清楚的几个边界条件实测过程中我也遇到了 Harness 明显处理不了的情况。最典型的一类是“状态不可逆”的任务。比如把一张纸揉成团再展开——第一次抓取时纸的形状已经被破坏了无论重试多少次都不可能恢复到初始状态必须人工干预。Harness 对这种任务的唯一贡献是“尽早地检测到失败并停下来找人工”而不是“通过重试挽救”。另一类是视觉反馈信息不足的任务。比如操作透明物体或者反光表面相机拍出来的画面很难判断物体是否真的被夹住校验器会频繁误判。此时 Harness 的重试机制非但不能提供帮助反而会放大错误——系统以为抓取成功了进入下一步实际物体根本没被拿起来后面的所有操作全部建立在错误的前提上。这类场景必须引入力觉传感器或者深度相机做多模态校验单靠 RGB 的 Harness 是不完整的。6.3 如果你想在自己的项目里用 Harness 思路我的建议我踩过几轮坑之后梳理出了一套相对稳妥的落地路径从最“破”的模型开始。如果 Harness 能把一个成功率 60% 的模型撑到系统可用的水平就说明机制本身是有效的如果模型成功率已经 90% 以上Harness 带来的显性提升反而不明显不容易建立信心。优先定义好校验规则而不是优先设计重试策略。很多人在做 Harness 时一上来就写重试模块但真正决定系统上限的是“知道什么时候算成功”。校验规则能写清楚的任务重试几乎水到渠成。把重试上限设成一个任务的总预算而不是每步固定 3 次或 5 次。一个三步任务如果每步都允许重试 5 次最坏情况下要执行 15 次动作时间上不可接受。更好的方式是把整个任务的总重试预算设为 8 次让 Harness 自己分配在具体哪一步。对“换述”保持克制。语言指令的改写需要先小规模实验确认改写后的指令不会改变任务语义。有些看似同义的改写比如把“轻轻放下”改成“缓慢放下”在 VLA 看来可能激活了完全不同的动作模式。这个方向后续还有很大的扩展空间比如把 Harness 的重试机制与主动学习结合将反复失败的样本收集起来作为后续微调的困难样本再比如把多个原语组合成一个更上层的技能图让重试的调度顺序按照图结构来做。这些都是我可以清晰看到并且有动力继续尝试的方向。如果你的任务也卡在“模型能力够用、但可靠性不敢保证”这个阶段Harness 提供的这套思路值得认真试一试。