VLA要冻结但系统必须闭环:记忆是具身智能落地的关键 最近和圈子里的朋友聊机器人具身智能几乎绕不开同一个词VLAVision-Language-Action视觉-语言-动作模型。从RT-2到π0大家恨不得把整个互联网的知识都塞进一个模型里然后直接输出关节角度。但我发现一个特别有意思的现象很多人拿着VLA做演示demo很惊艳一到真实场景连续长时间工作就露馅。问题往往不在VLA本身而在“冻结VLA不闭环”这件事上——模型权重一冻结喂进去的是单帧图像吐出来的是开环动作中间缺了最要命的一环记忆。今天我就把这套“基座模型 物理AI 记忆”的组合拳拆开聊聊说清楚为什么VLA要冻结、为什么必须闭环、记忆是怎么把整个系统盘活的。这篇文章适合三类人正在做机器人操作策略的算法工程师想从纯对话大模型转具身智能的同学以及被“端到端”三个字忽悠得一头雾水的技术决策者。我会把架构思路、记忆模块的具体做法、典型问题排查都写出来尽量说人话。1. 先搞清楚VLA是什么“冻结”又意味着什么1.1 VLA不只是多模态大模型它是“语言到动作”的映射很多人第一次听VLA以为它就是“ChatGPT加个摄像头”。这是个危险的误解。VLA和普通多模态大模型最大的区别在于输出空间LLM/VLM输出的是tokenVLA输出的是动作序列——机械臂的关节角度、移动机器人的线速度角速度、灵巧手的指尖位置。这个动作空间通常被离散化成256、512或1024个bin模型本质上做的是“从当前观察和语言指令到动作类别”的分类任务。以π0为例它的核心是“动作专家”action expert机制通过Flow Matching流匹配这样的连续动作生成方式把视觉、语言、状态信息融合成高维动作向量。而RT-2走的是另一条路线把动作离散成文本token直接让模型像“写作文”一样把动作“写”出来。两种做派各有取舍但共同点是它们都是被“预训练在互联网数据 后训练在机器人数据”这套范式驱动的。这里要特别留意一个词“冻结”。在训练下游策略时VLA权重被锁死也就是不参与梯度更新。为什么这么干三个原因第一算力太贵全参微调一个大模型动辄几千卡时绝大多数团队扛不住第二灾难性遗忘你让VLA去学某个单一任务的策略它可能会忘了之前在互联网数据里学到的常识得不偿失第三保留通用性冻结的VLA就是一个固定的“通感编码器”谁都能拿来接自己的下游模块复用性极强。所以“冻结VLA”不是偷懒而是一种工程上的理性选择。1.2 为什么“冻结”本身不是问题问题在“不闭环”但问题就出在这儿很多人把VLA当作一个“单发”模型。喂进一张当前图像加上一句“把左边的红色方块放到右边的托盘里”模型输出一组动作然后就完事了。这个流程看起来没毛病可细想一下就发现它是一个彻底的开环控制——它没有“做完一步之后看结果再决定下一步”的机制更没有“上次在这个位置失败过这次要避开”的纠错能力。控制领域的工程师听到“开环”两个字就条件反射地警觉。你去看看直流调速系统的教科书电流内环加电压外环的双闭环结构为什么非要搞两个环而不是直接给一个给定值因为真实系统里有扰动、有模型误差、有负载变化开环只能保证“给定什么执行什么”但保证不了“实际输出等于期望输出”。机器人的物理世界比调速系统残酷得多摩擦力、弹性形变、打滑、遮挡、光照变化任何一点扰动都能让开环的VLA策略“演砸”。开环VLA的另一个致命伤是无状态。模型看到的只是当前这一帧它对“刚才那只杯子被碰歪了15度”毫无概念。如果说人做倒车入库是“看后视镜-打方向盘-再看后视镜-微调”的闭环过程那么开环VLA就是“闭着眼睛凭第一眼的印象把方向盘打满”。一次两次能成功纯靠运气。2. 不闭环的问题到底出在哪2.1 闭环的本质参考量、反馈量与误差的较量理解闭环先从控制理论最基本的式子说起。典型PID闭环里有个误差项 e(t) r(t) - y(t)r是参考输入y是反馈输出控制器努力把这个误差压到零。双闭环调速系统更是经典内环是电流环响应快得像“随叫随到的马仔”外环是速度环相当于“统筹全局的大哥”。大哥发速度指令马仔立刻调节电流去实现这种级联结构保证了系统既能快速响应、又能稳定收敛。把这个思想搬到VLA系统里参考量就是“语言指令任务目标”反馈量就是“当前真实状态位姿、力/扭矩、图像”误差就是“当前状态和目标状态的距离”。没有反馈量就没有误差控制器就没法“感知到自己做得对不对”整个系统就失去了自我修正的发动机。这也是为什么我一直强调物理AI想要在真实世界立足必须把控制理论里那些最朴素的东西重新捡起来。类比一下你熟知的步进电机。普通步进马达是纯开环给脉冲就走堵转了它也不知道。后来大家给它加编码器变成闭环步进堵转能检测、丢步能补偿价格贵一点但可靠性翻倍。机器人上用的VLA策略如果不闭环就相当于一个规模庞大到几十亿参数的“超级步进电机”——它能力很强但它不知道自己走没走到位。2.2 没有记忆的VLA是在每帧重新认识世界更隐性的一层问题在“记忆”上。我曾经调试一个抓取任务橙色杯子被夹爪碰了一下位置发生了偏移但下一个动作指令还是基于“记忆中的原位置”发的。结果就是VLA自信满满地往一个空位置抓去全程姿态优雅、动作流畅、结果完全失败。这就是典型的状态不一致——策略本身有“视觉理解能力”但缺少对“世界发生过什么变化”的感知与记录。记忆在闭环系统里至少承担三个角色。第一缓冲记录最近几帧的状态与动作给策略一个时间上下文“刚才我做了什么动作现在世界变成了什么样”。第二纠偏把上一轮执行结果和预期结果做对比形成隐式的误差信号避免同样的错误连续犯。第三积累经验同一个场景反复出现时直接调出历史成功的轨迹而不是每次从头“推理”一遍。这就像人做菜第一次照着菜谱手忙脚乱第三次就凭肌肉记忆和“上次盐放多了”的经验闭着眼都能调好味。你管这叫“手艺”在AI系统里这就是长期记忆。所以“冻结VLA不闭环”这句话我拆开来看是两层意思VLA的权重冻结了但闭环的“记忆-决策-执行-反馈”链路不能冻结模型参数不更新可以但系统的状态必须更新。前者省算力后者保命。3. 基座模型怎么变成物理AI3.1 基座模型负责“通识”物理AI负责“落地”“基座模型”这个词现在被用滥了但在具身智能语境下它专指那些经过海量互联网数据预训练的多模态大模型VLM也好、LLM也好它们拥有丰富的语言知识和视觉常识。比如你丢给它一句“把水杯放到洗碗机里”它知道水杯是什么、洗碗机在哪、放进去的语义是什么。这部分能力基本不用再学直接拿来用这也是我们敢冻结它的底气。物理AI是什么呢我的理解是在基座模型这个“通识大脑”的外面加一套可以接触物理世界的“身体系统”。这个身体系统要有状态感知编码器、力传感器、IMU、要有动作执行机械臂、移动底盘、夹爪、更要有自己的“记忆皮层”。基座模型解决“我该做什么”物理AI解决“我做得怎么样、下一步怎么调整”。两者都不是冲突关系而是上下楼的关系。一个常见的错误做法是把基座模型当成全知全能的控制器让它直接输出底层动作。结果VLM在桌面整理任务上表现不错一到精细装配、插拔连接器等需要亚毫米级力控的任务就拉胯。为什么因为语言模型天生擅长离散符号不擅长连续高维动作生成。它有常识但缺“手感”。这时候正确的姿势是用基座模型做任务分解、语义理解和异常判断用专门的策略头比如VLA的动作预测头输出动作再用一个轻量的闭环控制器记忆系统做精细化执行。3.2 一个可以落地的架构冻结VLA 记忆环我实际调试下来觉得最稳的架构是三层语义层、行动层、记忆层。语义层冻结的基座模型/VLA。负责理解指令、解析场景、生成初始动作草稿。行动层可微调的策略模型或控制器。接收语义层的输出记忆层提供的状态上下文输出精确的动作指令。记忆层一个独立的、具备读写接口的记忆模块。维护“短期工作记忆”和“长期经验库”给行动层补充时间维度上的上下文。这个架构的核心思想就是“分离关注点”基座模型只负责“想”不求“算得准”行动层负责“算”尽量逼近物理极限记忆层负责“记”把每一次执行变成下一次的参照。谁说物理AI必须是一个单一大模型真正的物理AI更像一个组织——CEO负责定方向技术骨干负责干活而“记忆”就是公司里的项目档案室谁都得先查档案再动手。这个“冻结VLA不闭环”的标题本质是在说别把VLA当成一个孤立的大模型用要给它配上记忆和反馈构成一个完整的物理智能系统。我后面所有的实操经验都是围绕这个三层架构来的。4. 记忆模块的设计与实现4.1 短期记忆把“刚刚发生了什么”接住短期记忆也就是工作记忆是所有闭环系统里最基础的一层。它的本质是一个带时间戳的状态缓冲最近N帧的图像特征、最近M步的动作指令、最近几次的力传感器读数。工程上最简单的实现方式就是一个FIFO队列或者干脆直接维护一个固定长度的tensor buffer。但有个细节很多教程不会讲短期记忆里的状态必须是“对齐的”。你从VLA拿到的视觉特征图是CNN或ViT吐出来的高维向量从编码器拿到的关节角度是低维向量两者频率不同、坐标系不同、时间戳也可能有几百毫秒的延迟。如果直接拼在一起当上下文存起来模型很容易学到“错误的时序关联”。我的做法是所有状态先统一到一个时间基准用插值或零阶保持把不同频率的信号对齐到控制周期上再一起写入短期记忆。这个对齐操作对后面动作预测的稳定性影响巨大别嫌麻烦。短期记忆的容量不要贪大。控制周期如果是50Hz那存个10到20帧就足够了覆盖过去0.2到0.4秒满足大多数动态任务的响应需求。存太多反而引入噪声还会增加计算开销。我在“短期记忆该存什么”这个问题上踩过坑一开始什么数据都往里塞图像原始像素、语言embedding、关节速度、目标位姿结果模型训练到后期开始过拟合“记忆里的噪声”。后来统一精简成“视觉特征 当前动作 误差项”三角色效果立竿见影。4.2 长期记忆场景、技能与“经验库”长期记忆和短期记忆最大的区别是短期记忆里存的是“原始经历”长期记忆里存的是“可检索的结构化知识”。实现长期记忆主流做法是两条路线。第一条是检索式记忆把每一次成功或失败的执行轨迹编码成向量存进向量数据库。执行新任务时用当前状态作为查询召回最相似的历史轨迹作为参考供策略使用。这个方案的好处是灵活、可解释坏处是检索效果完全取决于embedding的质量。我用的embedding模型一开始是通用文本embedding但对“位姿-图像-动作”这种多模态状态向量召回的相似度排序很差。后来改成“多模态对比学习动作序列相似度”联合训练的embedding效果才正常。多模态记忆要不要包含4D3D空间时间我的看法是物理场景的记忆必须带时间上下文也就是把轨迹当作一个时间序列来编码而不是把每一帧孤立地存进去否则检索出来的“相似轨迹”往往时空上是断裂的。第二条是参数化记忆把经验直接微调进一个小型的、可快速更新的模型里。比如用一个轻量级的“记忆模型”来预测“当前状态的价值”或“当前动作的可行性”。这有点像把“经验”沉淀成“直觉”。它的好处是推理快坏处是如果频繁更新容易和冻结的VLA产生冲突。这两条路线并不是二选一我现在更倾向混合方案长期记忆库里存“案例”参数化模型提供“先验”两者通过一个门控机制融合。4.3 永久记忆参数化知识与检索式知识怎么共存再往外一层是永久记忆。这一层要回答的问题是“哪些知识是永远不会变的应该长期沉淀”比如工具的使用方式、物体的物理属性、任务的标准流程。这部分知识和短期波动无关也不应该每执行一次就覆盖。我的经验是永久记忆分两份一份是结构化知识库比如物体的属性表这个方块可抓取面在哪、那个抽屉是左滑还是右滑另一份是策略模型的固有参数VLA冻结的权重本质上就是它的“永久记忆”是互联网知识蒸馏出来的。实际操作中永久记忆的更新要非常保守。我见过团队把一次偶然的成功案例直接写进永久知识库结果导致系统性策略偏移后面所有任务都被这个“运气案例”带偏。永久记忆的每一次写入都应该经过多轮验证至少在3个不同场景下复现成功才允许写入。这就像人积累世界观一样年轻时候三天两头改变自己的核心价值观很容易出问题。4.4 记忆框架选型向量库、缓存、结构化数据库怎么配聊完理念聊聊选型。这是很多工程师问我最多的问题前半段“agent记忆框架以及选型到底怎么选”我直接给出我目前觉得最省心的一套配置记忆类型存储介质推荐方案适用场景短期记忆进程内缓存Redis / 环形buffer高频状态同步延迟必须低长期记忆经验库向量数据库Milvus / Qdrant / pgvector成功/失败轨迹检索语义召回永久记忆知识库结构化存储Postgres JSONB / SQLite物体属性、任务流程、环境地图混合融合推理时门控轻量MLP或规则引擎做检索结果和参数化先验的加权融合要特别提醒的是别为了用向量库而用向量库。如果长期经验不超过几千条pgvector完全够用不要上Milvus那种分布式方案给自己徒增运维负担。我在一个小型桌面机器人项目里最开始上了全套分布式向量库结果光运维配置就占了我三分之一的时间后来换成pgvector和业务代码放在同一个数据库里性能完全够瞬间清爽。另外还有一个容易忽略的点记忆模块一定要设计好读写接口的语义。我倾向于把记忆操作抽象成四个原语write写当前状态、read查最近状态、search语义检索历史、forget过期清理。这样无论底层存储怎么换上层策略模型都不用改。5. 实操过程我跑通的一个最小闭环5.1 场景设定与数据流纸上谈兵够多了拿我最近调的一个“桌面垃圾分拣”场景来说说完整流程。任务很简单桌面有红、蓝、黄三色积木块机械臂要按颜色放到对应的盒子里。难点在于积木块会被机械臂自己碰乱每次抓取之后桌面状态都会变化桌面上有反光同一块积木在不同光线下颜色特征漂移严重。架构是前面说的三层VLA用冻结的π0底座做语义理解行动层用一个MLP策略头输出6自由度末端的增量位姿记忆层用短期buffer长期向量库。数据流长这样每控制周期20Hz读摄像头图像、关节编码器、夹爪状态。图像经过冻结的VLM/VLA被编码成视觉特征向量存入短期记忆。行动层从短期记忆中取最近8帧的视觉特征动作指令预测下一步末端位姿增量。执行后将“执行前状态、执行动作、执行后状态、是否成功”打包成一条经验异步写入向量库。抓取动作开始前用当前“目标物体末端位姿”作为query从向量库召回最相似的5条历史轨迹做一次“参考轨迹引导”。5.2 实现一个简单的记忆增强策略核心状态记忆器的伪代码大概是这样的实际项目是PyTorch这里简化class ShortTermMemory: def __init__(self, capacity16): self.capacity capacity self.buffer deque(maxlencapacity) def write(self, state, action, error): # state: 视觉特征 关节位置 # action: 上一步动作 # error: 预测位姿与实际位姿之差 self.buffer.append({ state: state, action: action, error: error, t: time.time() }) def read(self): # 返回最近对齐后的上下文 return list(self.buffer)长期记忆的检索部分我直接给大家排过坑之后的代码逻辑def retrieve_experience(query, k5): # query由当前目标物体特征当前末端位姿拼接而成 vec memory_embedding_model.encode(query) results vector_db.search(vec, top_kk) # 一定要过滤掉时间戳太旧的样本 results [r for r in results if time.time() - r.timestamp EXPERIENCE_TTL] return results别小看这个TTL过滤我最初没加结果召回了一条三天前实验现场完全不一样的轨迹机械臂拿着积木愣是往空笔记的方向“参考”了一下送菜都送错过墙。经验不仅有“相似性”还要有“时效性”。5.3 参数怎么调、阈值怎么设记忆系统有三个关键参数值得细讲短期记忆容量N。我试过8、16、32最终定在16。分析下来很简单控制周期20Hz0.8秒的上下文足够覆盖一次高速抓取的动态过程太小8则动作预测缺少必要的速度信息太大32则输入向量维度过高、训练收敛慢。误差阈值。这是我整个项目里最微妙的一个参数。我把它定义成“预测末端位姿和实际末端位姿的三维欧氏距离阈值”超过5mm就判定为“执行偏离”触发记忆写入和纠偏逻辑。门槛设太低1mm会被传感器噪声干扰天天误报设太高2cm则已经发生了明显碰撞还没触发。5mm是在我这套硬件上反复试出来的折中点。长期记忆召回数量K。K5时参考轨迹能提供足够的多样性又不至于把策略模型“带偏”。K大于10之后我发现模型开始倾向平均化所有轨迹反而丢失了每一种轨迹本身的特点——这就像你问教练“怎么做这个动作”教练如果说“把100个人的做法平均一下”你肯定懵。这些参数没有万能值但在你自己的系统里设置可观测的指标比如任务成功率、执行偏离率、记忆召回的准确率然后用简单的网格搜索就能搞定不用迷信论文里的“最优超参”。6. 常见问题与排查技巧6.1 VLA产生幻觉动作现象机械臂对着桌面上一片空白区域精准地执行“抓取”动作好像那儿有个看不见的积木。排查后十有八九是视觉特征和语言指令之间的语义错位导致的。VLA被冻结了它的“世界观”是互联网数据塑造的它天然倾向于“补全”被遮挡或被反光干扰的物体。对策是在记忆写入时把“视觉特征、语言embedding、实际执行结果”三者一起保存在长期记忆中形成“遮挡场景-成功/失败”的对照经验。当新的遮挡场景出现时检索到的历史经验会告诉行动层“这家伙上次这样抓空过这次加点偏移量”。6.2 记忆污染与遗忘这是所有用长期记忆的系统里最恶心的坑。明明这条轨迹是失败的结果因为某个embedding相似度高它被召回并被策略当成了“正向参考”。我一度被这个问题折磨了一周任务成功率从85%掉到70%怎么查都查不出bug最后一行一行看召回日志才发现检索出来的“成功轨迹”里混着一条早前调试时手动标注错的样本。从那以后我立了一个铁律每次写入长期记忆的样本必须经过自动校验参考执行后的实际位置误差误差超过阈值就打入“失败样本”库绝不进入“成功经验”。还要定期清洗向量库把失效样本删除或标记归档。6.3 状态估计漂移导致闭环失效闭环再稳也怕输入信号本身是错的。有一段时间我的夹爪抓取成功率很高但每次放置时位置都偏右2-3厘米。排查了很久才发现是手眼标定矩阵在机械臂长时间运行后发生了微小漂移导致视觉系统给的状态反馈有恒定偏差。这个问题的可怕之处在于它完全“看不见”PID控制器会拼命去消除这个误差但误差源头不在控制逻辑里而在感知端。我从这件事学到的教训是闭环系统里必须加入“对状态估计本身的健康监测”。我的方案很简单——每隔10次任务机械臂做一个标准的“回零位姿校准”用外部标记点重新校验一次相机到基座的变换矩阵。价格不贵但能让整个系统的误差收敛性一直保持在稳定区间。6.4 几个容易踩的低级坑时间戳同步问题短期记忆里各帧数据如果没同步好模型会学到“过去的动作预测现在的状态”训练时loss挺低一跑真机就抖。建议把时间同步的检查写进每个控制周期开头。记忆和策略的耦合过深有人把记忆模块直接内嵌到策略模型里训练导致记忆系统不能单独复用换一个任务就得重新训练整个网络。我一直坚持记忆模块的接口和实现分离底层存储和上层策略只通过那几个原语通信这样调试成本小一个量级。过度依赖“成功经验”失败经验也是经验甚至更有价值。我的向量库里专门给失败样本留了一个独立集合在做动作规划时会额外检索一条“最相似的一次失败”作为“禁区”提示。这比只检索成功轨迹稳健得多吸取教训和模仿成功同样重要。忘记清理短期记忆任务切换时上一任务的历史状态全部清空。否则你让机器人从“抓红色积木”切到“把蓝色积木放盒子里”它短期记忆里还留着上一轮的动作缓冲前几百毫秒的动作预测会“精神分裂”。7. 从这套系统里我真正学到的东西搞完这套“冻结VLA 记忆闭环”之后我最深的体会是基座模型再大、VLA再强拿来做物理AI时也不能把它当成一个孤立的“神”。神是给建议的真正干活的是操作员——而操作员一定要有记性。记忆不是锦上添花它才是让“感知-决策-执行”真正循环起来的粘合剂。如果你现在正准备用自己的VLA方案做落地我建议从最小闭环开始先冻结VLA加一个短期记忆buffer让策略能看到过去这一段上下文跑通之后再逐步加长期向量库、失败样本库、状态健康监测。别一上来就搞一个庞大的记忆框架那个和“用不上”基本等价。最后分享一个小小的实操技巧验证闭环到底通没通最简单的办法是在正常执行过程中故意给机器人一个外部扰动比如轻轻碰一下它的末端执行器。如果系统能在几百毫秒内自动纠偏回原来的轨迹说明反馈和记忆链路是活的如果它完全无视干扰、继续按原轨迹走那不管你其他模块做得再漂亮它本质还是开环。这一招比看任何loss曲线都来得直观。