我一直在做一个具身智能相关的项目:把预训练好的VLA模型部署到真实的机械臂上,完成“看清桌面、听懂指令、伸手抓物”这类操作。起初我天真的很——VLA嘛,视觉、语言、动作一锅端,输入图像和指令,输出动作序列,理论上装上就能用。结果实测第一轮就翻车了:模型确实能输出看起来合理的动作,但一旦目标物体被碰歪、夹爪打滑、或者光照变了,系统就再也回不到正确轨道上来。后来我把模型权重冻住,只做推理,发现情况更糟——它就像一个闭着眼睛背课文的高手,文本背得滚瓜烂熟,却完全不知道自己已经走到哪一步了。
“冻结VLA不闭环”这句话,很多人一开始理解不到位。它不是简单的“网络没训练好”,而是说:只靠一个静态的、权重固定的大模型做单次推理,根本无法在物理世界中形成有效的闭环。而想让这个系统真正动起来、稳起来,关键在于补上一块东西——记忆。准确地讲,是用基座模型级别的能力去构建“物理AI”,让系统具备对物理场景的记忆、预测和持续校准能力。这篇文章就把我们在实际落地中踩过的坑、验证过的方案、以及底层逻辑一次讲透,给正在折腾VLA和具身智能的朋友们做参考。
1. 冻结VLA为什么“不闭环”:先想清楚开环和闭环的分界
1.1 VLA是什么,为什么有人会先“冻结”它
VLA,全称Vision-Language-Action模型,是把视觉编码器和语言模型接起来,再输出动作的一种多模态模型。典型的结构是:图像经过视觉编码器(比如CLIP或SigLIP)变成视觉特征,文本指令经过语言模型变成任务特征,两者融合后经过一个动作头(Action Head)输出关节角度、末端位姿或者离散动作。这类模型可以从大规模互联网数据和机器人数据中学习,然后在具体机器人上做微调。
“冻结”在这个语境里有两层意思。第一层是部署层面的:模型已经在云端或离线环境里训练完了,推理时权重不再变化。第二层是训练策略层面的:很多团队为了避免灾难性遗忘,把VLA的大部分参数固定住,只微调少量适配层。我见过不少团队,尤其是刚接触具身智能的团队,会倾向于“冻结VLA”——因为它便宜、稳定、可控,而且模型本身在大规模数据上学到过很多视觉语义先验,觉得“够用了”。
问题恰恰出在“够用了”这三个字上。VLA即使冻结,也能输出动作,这一点没错。但它输出的动作序列是模型基于“某一帧图像+指令”的一次性估计,并不是基于“当前真实状态+历史变化趋势”的持续决策。你让它从A点到B点,它能给你一条路线;可如果路上遇到了预料之外的障碍物、物体滑移、或者机器人自身关节发生了微小偏移,它不会自动修正。这就像你在导航软件里输入目的地,软件给你一条路线,但路上封锁了、走错了路口,如果导航不再实时刷新位置,你还是会按照老路线继续开——结果就是越走越偏,直到翻车。
1.2 开环的盲区:一次推理不是运动控制
从控制论角度看,机器人运动控制分两类:开环控制和闭环控制。开环控制意味着控制指令不依赖系统输出的反馈,执行完之后就默认已经成功;闭环控制则不断地用传感器测量实际状态,和控制目标作比较,再修正下一步动作。
冻结VLA做的恰恰是开环推理:模型看到图像、听到指令,输出一段动作,然后就没了。听起来似乎也没什么问题,因为它输出的动作序列可能长达几十步,理论上每一步都考虑了环境变化。但真实的物理系统里,每一步执行都会引入误差:关节摩擦、抓取滑动、视觉标定误差、重力弯曲,以及外界不可预测的扰动。这些误差不修正,就会一步错、步步错。
我们做过一个很直观的实验:桌面抓取一个杯子。冻结VLA输出了一条从初始位姿到抓取点的轨迹,没有加任何反馈修正。前20次实验中,有12次在接近过程中就偏离了目标,因为桌面纹理变化导致视觉编码器的特征发生了微小漂移,抓取点在图像里的位置偏了2到3个像素。机械臂按原轨迹往下走,这2-3个像素的误差在三维空间里就被放大成了1-2厘米的偏移,夹爪直接扑空。整个过程里,模型完全没有意识到“我没抓到”,因为它的输出已经结束了。
这就是“不闭环”的本质:模型没有把“实际发生了什么”反馈给决策过程。就算模型本身再强,它的推理回路也是断裂的——视觉编码器输出的特征来自某一时刻的图像,动作头输出的动作也没有携带“执行结果是否成功”的信息。整个系统就像一台没有反馈回路的电机,给定电压后闷头转,转多快、转了多少,统统不管。
1.3 什么才算真正的“闭环”:不是接个反馈线这么简单
很多人一听到“闭环”,第一反应是加个PID控制器或者反馈网络。对于传统工业机器人,这通常是对的:关节编码器读数、力矩传感器、视觉伺服,然后每秒上千次的控制循环调整输出。但对VLA来说,“闭环”这件事要复杂得多,因为VLA输出的不是单一的速度或力矩,而是一段高级语义动作。
真正的闭环,需要系统在当前时刻完成这几件事:
- 状态感知:知道现在机械臂在什么位置、目标在哪里、抓取有没有成功。
- 状态记忆:知道过去一段时间里系统是怎么走到这一步的,哪些尝试失败了,哪些动作有效。
- 目标比对:把当前状态和目标状态放在一起比较,计算出误差。
- 策略修正:基于误差,调整接下来的动作,而不是机械地执行预设轨迹。
冻结VLA只能提供第四环里的“动作先验”,前面三环它一概不管。你如果问它“刚才那一步抓到了吗”,它答不上来,因为模型权重里没有任何状态变量。这就引出了解决方案的核心思路:与其费劲去解冻和微调VLA全量参数,不如在它外围接一个能够提供“记忆”和“预测”的基座模型——物理AI。
2. 基座模型和物理AI:记忆到底从哪里补
2.1 基座模型和物理AI的角色分工
基座模型(Foundation Model),在具身智能语境里通常指那些在各种任务上预训练、可以零样本或少样本迁移的大模型。之于具身智能,它往往承担“世界理解”的角色:理解物体的三维结构、理解物理规律、理解任务语义。而物理AI(Physical AI),我倾向于理解为“能够对物理世界状态做建模、预测和记忆的基座模型”。
这两者不是对立的。VLA可以看作基座模型在“动作”上的投影,它回答的是“我该怎么做”;物理AI回答的是“这个世界的状态是什么,下一步会变成什么样”。简单说,VLA是行动派,物理AI是预言家+记忆库。
在我们的落地方案里,物理AI的主要工作有三个:
- 维护一个物理场景状态:哪几个物体在桌面上,它们的位姿大概是多少,有没有被移动过。
- 预测未来状态:如果机器臂现在以某个速度朝某个方向移动,下一秒物体位置会怎么变,会不会碰倒其他物体。
- 提供计划执行的反馈信号:实际执行到的状态和计划状态偏差多少,要不要修正。
这正好补齐了II.1.3里缺的三环。有了物理AI,冻结VLA输出的动作就不再是“一条道走到黑”的开环指令,而是在一个“有记忆、有预测、有校准”的闭环框架下执行。
2.2 记忆分哪几层:短期、长期、永久记忆怎么实现
热词列表里有人问“agent记忆中短期、长期、永久记忆如何实现”,这确实是核心细节。我们给机器人的“补记忆”不是简简单单加一个缓存数组,而是要按记忆的时效和功能分层设计。
短期记忆(工作记忆):保存当前任务从开始到现在的观测序列和执行状态。我们用一个长度为10到50步的循环缓冲区,存下每一时刻的关节角、末端位姿、图像特征、动作是否成功。短期记忆更新的频率最高,相当于一个实时状态流。
中期记忆(情景记忆):保存单个任务中的关键时刻,比如“第一次接触尝试失败,物体滑到了新的位置”“成功抓住了杯子”。这些关键事件会拼接成一条任务轨迹,供后续的任务规划使用。对我们来说,中期记忆的核心作用是把碎片化的操作历史变成一条有因果关系的链。
长期记忆(语义记忆):保存跨任务的稳定知识,比如“杯子通常放在桌子的左上角”“抓杯子应该用侧向抓取姿态”“这里的桌面高度是85厘米”。这类知识可以沉淀为向量数据库或知识图谱,在下一次任务开始前被检索出来,作为VLA推理的上下文补充。
永久记忆(底层习惯):这一类更像是对物理AI的校准固化,比如相机外参、机械臂运动学参数、传感器的噪声分布。这些数据更新得极少,但在每次任务开始时都要检查有没有变化。
我们最终落地的方案是:短期记忆用双端队列,中期记忆用带时间戳的事件图,长期记忆用向量数据库加FAISS检索。短期记忆直接喂给物理AI做实时状态估计,中期记忆经过摘要后拼进VLA的文本提示词,长期记忆在任务初始化时做一次最邻近检索,选出与该任务最相似的历史经验。这套设计,和对话agent里“上下文窗口+长期向量库”的套路很像,但每一层的更新频率和损耗函数都和物理状态紧密挂钩。
2.3 为什么冻结的VLA本身带不了记忆,必须靠外部
有人会问:VLA的transformer不是自带注意力吗?注意力机制不也是一种记忆吗?确实,大模型的上下文窗口可以在一次推理内保留一定信息,但这和物理世界需要的“持续性记忆”根本不是一回事。
第一,VLA的上下文窗口主流也就是几万token,换算成图像帧的话,可能只有几十帧。一次任务动辄几十秒甚至几分钟,视觉观测每秒几帧,上下文窗口根本装不下完整历史。
第二,冻结VLA的注意力只能处理“模型输入里存在的信息”。如果执行结果没有写回输入,它在下一个时刻的推理里就压根不知道“上一步失败过”。你必须在推理之前把历史状态摘要拼进提示词,或者把历史特征拼进视觉编码器的输入。这个“拼”的动作,本质上就是一个外部记忆系统。
第三,也是最重要的一点:冻结模型无法更新权重,意味着它无法学习“这个特定实体、这台特定机器人、这个特定环境”的新数据。模型在预训练里见过一万种桌面,但它没有见过“你面前的这张桌子”。要让系统记住这张桌子的布局、这台机械臂的灵巧手在抓某个特定杯子时的习惯,必须有一个可以增量更新的记忆模块,而这个模块通常是物理AI的一部分。
所以,我们项目的最终架构不是去解冻VLA全局微调,那样成本高、容易遗忘,而且数据量要求大,而是把VLA当作一个“高质量动作先验库”,在它外面接上一层“物理AI记忆与预测层”。VLA负责生成动作,物理AI负责跟踪实际状态、预测未来、反馈误差,整个系统才能称得上“闭环”。
3. 从架构到实操:在冻结VLA外面接一个“记忆层”
3.1 整体架构到底怎么搭
我在网上看到很多人问“VLA模型是一个模型还是2个模型”,这其实反映了一个普遍的困惑:VLA和物理AI/记忆模块到底是一个网络还是分开的。我们的做法是拆开:冻结VLA是一个独立的模型,物理AI和记忆模块是另一套可更新的网络结构,两套模型通过“状态令牌”和“文本摘要”进行通信。
整体流程可以简化成下面几块:
观测流:RGB-D相机 -> 目标检测/分割 -> 物体位姿估计 -> 场景图 记忆流:场景图 + 当前机械臂关节角 -> 短期记忆缓冲区 -> 物理AI状态编码器 动作流:视觉编码特征 + 文本指令 + 记忆摘要 -> 冻结VLA -> 动作头输出目标位姿 校正流:物理AI预测下一帧状态 vs 实际下一帧观测 -> 误差 -> 修正动作实际运行时,冻结VLA不需要每帧都推理。我们通常让VLA以2到5Hz的频率输出“任务级动作原语”,比如“移动到插座上方”“抓取杯子”。物理AI和短期记忆则是高频运行的,一般50Hz左右,负责持续跟踪状态并提供低层闭环反馈。VLA输出的动作原语会被拆解成具体的运动轨迹,再由一个低层控制器执行,而物理AI会在执行过程中不断地把“当前实际位置”和“VLA规划的期望位置”做差,如果偏差超过了阈值,就会触发重新推理或者在线修正。
这样设计的好处是:VLA可以保持在低频、高推理质量的状态,物理AI负责高频、轻量、物理上可解释的状态维护。两个模型的频率差异,正好匹配了大模型推理的延迟和机器人控制对实时性的需求。一开始我们试图让VLA以30Hz的频率直接控制机械臂,结果一帧推理延迟就有200毫秒,动作卡顿得很厉害,后来改成这种“低频规划+高频闭环”的分层结构,问题就解决了。
3.2 记忆写入与检索:核心逻辑和具体参数
记忆写入这一块,最需要注意的是“什么该记、什么不该记”。如果什么都往记忆里塞,很快记忆就会变成一堆噪声,物理AI的状态估计都会被污染。我们规定记忆写入的触发条件有三类:一是状态发生了显著性变化(比如物体的位姿变化超过1厘米或5度);二是执行关键动作节点(比如抓取开始、抓取结束、放置开始);三是误差超出阈值(比如实际末端位姿和期望位姿偏差超过3毫米)。
每次写入的都是一个结构化的“事件Record”,大致包含:时间戳、事件类型、物体id、物体位姿、末端位姿、关节角、执行是否成功、置信度。整套事件记录会放进两部分:一部分直接进短期记忆缓冲队列,另一部分经过去重和摘要后,进中期事件图。
检索的时候,分两个场景。在线执行时,短期记忆缓冲区的最后10个事件会直接拼进物理AI的输入,让它知道“刚刚发生了什么”;同时会把当前场景图编码成向量,和长期记忆库里的历史场景做相似度检索,选出最相似的历史片段作为参考。任务失败重试时,检索的是中期事件图——我们从整个任务轨迹里抽取“失败-尝试-成功”的关键转折点,生成一份简洁的文本摘要,放进VLA提示词里。比如:“之前从左前方向抓取杯子失败,杯子滑到坐标(0.3, 0.2, 0.05);后来从右侧抓取成功,用时2.4秒。”
参数上,几个关键数值我可以直接列出来供参考:
- 短期记忆:环形缓冲区,长度50,按50Hz采样刚好一秒钟的历史,足够覆盖大部分低层纠正。
- 长期记忆向量库:用FAISS,向量维度2048,距离度量用内积,检索Top-5,阈值0.6。
- 事件图节点上限:单个任务最多保存200个关键事件,超过后合并相似节点。
- 记忆摘要频率:每10个新事件做一次摘要,把相似事件合并成一个节点,避免图爆炸。
这套参数不是我们从论文里抄的,而是根据我们实际硬件的计算余量压出来的。机器人上的边缘计算卡性能有限,向量检索10毫秒以内必须结束,所以长期记忆库只放了几百个历史任务的向量,在真实情况下完全够用。
3.3 物理AI的训练与微调:别把VLA的活儿也干了
物理AI在这个架构里,核心负责两件事:场景状态估计和状态转移预测。场景状态估计的输入是多视角RGB-D图像,输出是物体级别的位姿和类别;状态转移预测的输入是当前场景图外加控制信号,输出是未来0.5秒到1秒的物体位置变化。
训练物理AI时,有一个非常容易犯的错误:试图让物理AI学会“怎么做任务”。比如让物理AI直接输出抓取动作,这就等于重新训练了一个VLA——不仅数据需求爆炸,还会和冻结VLA的动作输出打架。我们的做法是严格限定物理AI的职责:它只负责“描述世界”和“预测世界”,不负责“决定动作”。所有动作决策都交给VLA,物理AI只给它提供反馈信号。
我们用模拟器(isaac sim、sapien这类)生成大量随机场景。每次仿真里随机布置5到15个物体,物体形状、材质、初始位姿随机化,然后施加随机外力让物体运动,物理AI学习从前后两帧观测中估计物体位姿变化和力的作用效果。这样训练出来的物理AI,抓的不是“哪个物体怎么抓”,而是“物体在这个物理规律下会怎么运动”。
训练细节上,损失函数分两部分:场景图损失用交叉熵和L1,预测损失用未来帧重建的感知损失。我们用了一个类似长短期记忆网络的时序编码器来处理历史观测序列,所以物理AI天然具备记忆能力。训练完成后,只微调物理AI,冻结VLA完全不动。结果发现这个组合比解冻整个VLA微调更稳定,因为VLA在大规模预训练里见过更多样化的语义信息,物理AI只需要去适配当前环境的具体物理参数就行。
3.4 记忆框架选型:几个我踩过的坑
网上关于“agent记忆框架以及选型”的讨论很多,但具身智能里的记忆框架和纯对话agent的差距还是挺大的。纯对话agent的记忆只要文本拼接够快、检索够准就行,根本不用管时序一致性和物理因果。机器人记忆如果也照搬那套,很容易出问题。
我第一个踩的坑是用纯文本向量库来存所有记忆。实验结果一塌糊涂:检索返回的“相似历史”经常和当前物理状态对不上。原因很简单,文本摘要会丢失空间细节。你写一句“杯子在桌子的右下角”,但到底“右下角”偏了多少厘米、杯子朝向是多少,文本根本表达不清楚。后来我改成了“结构化场景图+向量”的混合存储。场景图里的物体位姿用数值保存,语义描述只作为辅助检索标签,空间数据才作为闭环修正的依据。
第二个坑是记忆更新频率太慢。最初的方案是每次任务结束才更新长期记忆库。结果第二次执行任务时,如果场景已经变了,长期记忆里还是旧布局,检索出来反而误导VLA。后来我们改成在线更新:每次成功抓取或放置后,立即把当前观测到的物体位姿写进短期记忆;每天收工后,用新会话的数据替换掉长期记忆库里的过期条目。
第三个坑是记忆注入的位置。最开始,我们把所有记忆摘要一股脑拼进VLA的文本提示词,结果文本太长,VLA的注意力被摘要带偏,输出动作变得很“啰嗦”,每次都绕远路。后来我们把记忆分两条通道:短的指令直接喂给VLA文本输入,只有前20个token的关键摘要;长一点的记忆喂给物理AI,让它影响低层修正,不影响上层任务规划。这样两层记忆各司其职,整个系统才安静下来。
4. 实测数据与排错实录:加了记忆之后,闭环到底闭合了什么
4.1 桌面操作任务上的对比实验结果
我以我们最常用的桌面操作任务“把目标杯子搬运到指定托盘”为例,整理了三种配置的实测对比:
| 配置 | 成功率 | 平均完成时间 | 平均位姿误差 | 重试次数 | |---|---:|---:|---:| | 纯冻结VLA,无记忆无闭环 | 38% | 9.8秒 | 2.5cm | 4.1次 | | 冻结VLA + PID底层控制(无高层记忆) | 52% | 8.2秒 | 1.6cm | 2.8次 | | 冻结VLA + 物理AI记忆闭环 | 83% | 6.5秒 | 0.7cm | 1.2次 |
注意,第三组配置里VLA权重从头到尾都是冻结的,我们只加了物理AI记忆层和低层闭环控制器。成功率远远高于前两组。这个结果说明,问题从来不是“VLA不够强”,而是“VLA之外缺了一个能记住状态、能预测未来、能反馈误差的闭环系统”。
完成时间缩短也很自然:没有记忆时候,系统经常走到一半发现路径不对,要重新推理甚至退回起点;有了记忆后,物理AI提前预测到“按当前路径会在1秒后撞到旁边的杯子”,VLA就能在上一步就修正轨迹,避免进入错误路径再倒回来。
位姿误差从2.5cm降到0.7cm,这部分主要归功于物理AI的实时反馈修正。即便VLA输出的目标抓取位姿有偏差,闭环控制器每帧都在把实际末端位姿拉回到期望轨迹上。误差不再累积,而是在每一次控制周期里被校准。
4.2 高频踩坑:记忆与动作震荡
加记忆后,最常见的坑是动作震荡。开始我们以为记忆越全越好,于是把短期记忆窗口设到了200步,结果VLA输出的动作每几十毫秒就变一次,机械臂不停地在两个目标位姿之间来回摆动,像个醉酒的人一样。
排查半天,发现原因不在VLA,而在物理AI的预测信号。短期记忆窗口太长,物理AI把很久以前的误差也带进了当前的状态估计,导致预测位置在目标附近来回跳。VLA收到了震荡的参考信号,自然就输出震荡的动作。
解决方法是把短期记忆窗口缩短到50步,并且对物理AI输出的预测位置做一阶低通滤波。具体做法是:估计的位置 = 0.7 × 当帧估计 + 0.3 × 上一帧估计。这个简单的滤波让预测值平滑了很多,动作震荡立刻消失。实测下来,窗口长度和滤波系数都要根据实际硬件延迟调,没有一个通用值。
另一个高频问题在长期记忆误导。如果水杯过去三天一直放在桌子左上角,但今天被换到了右下角,长期记忆里的“左上角”会在任务初始化时被检索出来,VLA一上来就朝左上角走。物理AI发现目标在右下角后尝试修正,但VLA已经被“旧记忆”带偏了。我们的解法是在长期记忆条目上加一个“最后验证时间”字段。如果某个记忆条目距离上次被验证超过了24小时,检索时降低权重,并把当前观测的物体检测结果作为更权威的参考。这个改动很土,但非常有效,长期记忆误导率降低了接近一半。
4.3 避坑心得:从每次失败里挤出来的经验
做这类系统,最大的体会是“不要指望一个模型把所有事都干了”。很多人设计架构时总想用一个超大模型搞定感知、决策、记忆、控制,结果训练数据和计算资源都跟不上,模型越训越烂。我们的做法是各司其职:VLA负责语义理解和高层规划,物理AI负责状态记忆和短期预测,底层PID负责轨迹跟踪。三者频率不同、职责不同、可更新性也不同,整个系统反而最稳定。
关于VLA冻结这一点,我想多说一句:冻结VLA不是因为它完美,而是因为它在大规模预训练中已经学到的东西,不应该被当前数据量可能不足的小任务覆盖掉。如果你手中的任务数据量很大、环境高度受限、且不担心灾难性遗忘,那解冻微调当然是可以的。但对绝大多数真实部署场景来说,冻结VLA+外部记忆层,性价比高得多。
记忆层也不是越复杂越好。我们最初想过做一张非常华丽的场景知识图谱,把物体关系、支撑关系、交互历史全画进去。真到部署的时候发现,图谱构建和更新的延迟根本跟不上执行速度,最终砍到只剩两种关系:支撑关系和邻接关系。够用就行。
还有一个容易被忽略的点:机械臂控制的最低层级,也就是PID或力矩控制,永远不会被大模型取代。VLA输出的是“目标位姿”,物理AI修正的是“目标偏差”,而真正让电机转到指定角度的,还是底层的伺服控制。网上有人讨论“大模型能不能完全替代底层控制器”,从我们实测看,短期内完全不可能。底层控制延迟要求毫秒级,可靠性要求99.99%,这两点都不是大模型擅长的领域。
5. 最后再分享几点真切的体会
如果你正在做类似的项目,我建议把方向拆成几步来推进:第一步,先让冻结VLA在真实场景里跑通,不管好坏,记录所有失败样本;第二步,加一层物理AI做记忆和预测,不做闭环修正,先对比“有记忆”和“没记忆”在规划上的差异;第三步,把物理AI的输出接入低层闭环控制器,做实时纠正。三步走完,你会对“闭环”和“记忆”这两个词有完全不同的理解。
我个人最大的感触是:很多团队一遇到“闭环”就条件反射式地想到“解冻模型、重新训练、增加参数”,但真正的问题往往不是模型能力不够,而是系统的反馈路径断了。冻结VLA不是偷懒的做法,反而是一种务实的选择——把有限的训练资源留给真正需要更新的部分,也就是物理AI和记忆层。
后续我想做的扩展有两个方向。一个是把一个场景里学到的记忆迁移到另一个场景,比如在学习过厨房桌面操作后,直接迁移到书房桌面,把“记忆库共享”这件事做成一个公共模块。另一个方向是给物理AI加更丰富的物理反馈通道,比如触觉信号和力矩信号,让记忆不只是视觉记忆,还能记住“上次抓这个杯子需要用多大的力”。
具身智能这条路,目前看起来还没有谁能用一个模型解决所有问题。把VLA、物理AI、闭环控制、记忆模块组合好,才是最实际的成功路径。希望这些经验能给你一些启发,如果你们也在做类似的架构,欢迎一起交流。