你有没有想过,为什么教机器人叠衣服这么难,但教一个人怎么倒水却只要示范一两次?
这背后藏着一个让机器人研究者头疼了很多年的矛盾。你给机器人一句话指令,比如"把苹果放进碗里",这句话里藏着无数没说出来的细节:怎么抓苹果,用几分力气,先碰哪里,什么时候算放好了。人类听到这句话会自动补全这些细节,因为我们见过太多次抓苹果放碗里是什么样子。但机器人没有这种常识,它必须靠反复试错去摸索这些细节,或者靠人类喂给它成千上万条带标注的训练数据。
这篇来自MIT、2077AI开源基金会等机构的论文叫做ENCORE,它想解决的正是这个矛盾:能不能只用几条示范,就让机器人学会一个新任务,而不需要海量数据训练?
答案是能,但方法有点出乎意料。
**问题到底难在哪**
先说说这个领域现在卡在什么地方。
在ENCORE出现之前,解决这个问题大致有两条路。第一条路是模仿学习,直接拿着几条人类示范去训练一个神经网络。但这条路有个硬伤:五条示范覆盖的场景太少了,网络一旦遇到示范里没出现过的摆放位置,就彻底懵了。研究者们想了很多办法去补这个洞,比如用算法合成更多的训练数据,但这终究是在给一个本质上数据饥渴的模型打补丁。
第二条路是最近几年火起来的"代码即策略"思路,让大语言模型直接写代码来操控机器人,写完就跑,跑错了就改。这条路的代表性工作叫ASPIRE,是目前LIBERO-PRO这个基准测试上最强的智能体系统之一。它的做法是让智能体不断试错,并且在系统里内置了很多人工写好的判断规则,比如夹爪张开多宽才算抓住了东西,张开多宽算是夹了个空气。这套系统报告的成功率在旧模型上是71.7%,在换上更强的opus-5模型重跑后能到89.3%。但这里有个问题:它完全不看示范,纯靠语言理解加反复试验去猜任务的所有隐藏细节。
那自然会问,给它示范会不会提升效果?论文里做了个实验,直接把示范的原始轨迹文件喂给ASPIRE的系统,结果在500次试验里只多蒙对了6次,这个差距在统计误差范围内,基本等于没用。
这个结果有点意外。按常理想,多给点信息总该有点帮助吧?但事实是,原始轨迹文件是一个密集的多模态数据流,里面有几百个时间步、好几个摄像头视角、大量关节状态通道。真正决定任务成败的关键瞬间可能只占这些数据的一小部分,剩下的全是噪音。把整段轨迹原样扔给智能体,它反而被淹没在无关细节里,根本抓不住重点。
这就好像你想教朋友一道菜怎么做,不是把你做这道菜全程的手机录像甩给他让他自己看,而是应该把关键步骤剪出来:下锅那一下、翻炒的手法、出锅前的火候变化。整段录像里信息量不是不够,而是太多了,关键信息被埋没在你擦汗、接电话、找调料的那些无关画面里。如果你真把两小时录像甩给朋友,他大概率看了十分钟就划走了,根本抓不住哪一步是真正决定菜好不好吃的关键。
**蒸馏示范:把示范变成能读的证据**
ENCORE解决这个问题的第一招,叫做示范蒸馏器。
示范蒸馏器*:一个确定性的程序,把一整段人类示范轨迹,提炼成一份结构化的"证据包",而不是直接拿去训练模型。
这个证据包里装了什么?论文给出了五样东西。一是任务的意图描述;二是关键帧集合,也就是示范者自己的夹爪状态发生变化(张开变闭合,或者闭合变张开)、以及手腕转向突然发生急转的那些时刻的多视角画面和完整状态;三是夹爪事件表,记录每一次开合的时间、哪个手臂、张开多宽;四是以固定间隔抽取的完整轨迹路径;五是完整的动作流。
这里有个很巧妙的设计。蒸馏器只根据示范者自己产生的信号去挑选关键帧,比如夹爪开合的瞬间、运动方向突然改变的瞬间,它不告诉智能体这些信号意味着什么。论文里有一句话说得很直白:如果蒸馏器直接标注哪一帧是"松开",那等于蒸馏器自己已经把本该留给智能体做的推理工作做掉了一半。
这个设计思路让我想到一件事。好的老师教学生做实验,不会在实验报告旁边写满"这里出现了沉淀说明反应完成了"这种结论性注释,而是只标出"在第3分钟溶液颜色突然变化"这种客观观察点,让学生自己去想这代表什么。如果老师把结论都写好了,学生学到的只是记住答案,而不是学会怎么从现象推出结论。下次换个实验条件,学生就又不会了。ENCORE的蒸馏器就是这种"只标客观现象,不给结论"的老师。
还有个细节值得注意,证据包里会用一个白名单过滤器,把所有跟任务无关的信息都砍掉,包括模拟器内部状态、物体的精确坐标、文件路径这些。这是为了防止智能体抄近道,直接从底层数据里偷看答案,而不是真的去理解示范。
**感知和动作接口:划清能力的边界**
ENCORE的第二个核心设计,是给智能体一套固定的感知和动作接口,这套接口在模拟环境和真实机器人上是完全一样的。
接口*:智能体用来操控机器人的工具集合,包括感知类的(拍照、测距、读取夹爪状态)、理解类的(物体分割、文字问答)、动作类的(移动到某个坐标、设置夹爪张合)。
这个接口划出了一条清晰的边界:机器人能看、能动,但不知道该抓哪个物体、怎么抓、抓完要放到哪、怎么判断任务完成了。这些具体的任务知识,必须由智能体自己从示范包里读出来,或者在开发阶段自己测出来。
而且每次调用这些接口都有次数限制,智能体不能靠疯狂调用传感器去堆出成功率。
这个边界设计其实很关键。如果接口里直接内置了"抓取规划器"这种高级功能(就像ASPIRE那样提供了抓取规划器和物体包围盒拟合工具),那智能体根本不需要去读示范就能把任务做出来,这样就没法验证示范到底起了多大作用。ENCORE故意把这些高级能力都拿掉,只留最基础的感知和动作原语,逼着智能体必须去读示范才能摸清任务的关窍。
这就像考试的时候,如果给学生一个能直接查答案的计算器,那你永远测不出他是不是真的学会了解题方法。你必须把计算器换成最基础的加减乘除工具,他才会被迫去调用自己的理解去搭建解题过程。而这个被迫调用理解的过程,恰恰是ENCORE想要观察和利用的东西。如果不这么设计,实验结果会完全失真,你根本分不清是示范起了作用,还是接口本身自带的高级功能起了作用。
**开发循环:写代码、跑、看结果、改**
有了证据包和接口,接下来就是智能体真正干活的方式了。
开发循环*:每个任务分配一个全新的智能体,它自己写分析代码去探索证据包,写出一个策略程序,在一批开发阶段的初始状态上反复跑、反复改,最后冻结一个版本提交去做真正的密封评测。
这里有个很严格的规则:评测阶段,智能体永远看不到任务是否成功的信号。它必须自己在程序里写判断逻辑,用机械臂自身的位置感知和摄像头画面去判断"我是不是抓住了""我是不是放对了"。而且系统会静态检查,直接拒绝任何偷看模拟器里"任务终止标志"的程序,逼着每个程序必须自带一套验证机制。
这个设计思路其实很像真实世界里机器人部署的处境。真正在工厂里干活的机械臂,是没有人在旁边随时告诉它"这次做对了"或者"这次做错了"的,它必须靠自己的传感器判断任务进展。如果训练阶段就允许它偷看成功信号,那部署到现实世界的那一刻就会立刻失效,因为现实世界根本不会给它这个信号。
论文里有个很生动的案例,能说明这套开发循环到底在发生什么。有个任务叫打开底部抽屉,但示范里演示的是打开中间抽屉,任务说明文字写的却是要打开底部的那个。没有示范的智能体(论文里叫K=0组)在整整20个版本的尝试里,试了侧面捏取、从下方勾取、压住把手往外拖拽等各种抓取方式,统统失败。它最后得出一个结论,写在自己的笔记里:底部把手这个几何结构根本没法通过这套接口抓住,手比把手下方的空隙还厚,勾手需要的凹槽深度也不够。它冻结了一个只能打开中间和顶部抽屉的程序,在密封测试里得0分。
但拿到三条示范的智能体(K=3组)读到了示范里藏着的关键细节:示范者在拉抽屉的整个过程中,手腕始终保持在水平线以下15到36度的倾斜角度,动作持续地朝外和朝下用力。它把张开的指尖垫在把手上方,模仿这种持续向下向外拖拽的动作,底部抽屉就被拉开了。
这件事挺有意思的。没有示范的智能体并没有偷懒,它确实做了大量系统性的尝试,但它搜索的方向本身就是错的,它一直在尝试"捏住"这个把手,却没想过"拖拽"这个思路。失败的搜索不代表任务不可行,只代表搜索者没找对方向。而示范恰恰提供了那个被搜索遗漏的方向。
这就跟学做一道从没吃过的菜很像。你靠自己瞎试,可能试了二十种火候和刀法都做不出那个味道,然后你断定这道菜用家用灶具根本做不出来。但师傅随手演示一次,你发现关键根本不在火候或刀法,而在于下锅前要先腌制半小时这个你完全没想到的步骤。你的搜索方向错了,不是因为你不努力,而是示范提供了一个你自己永远想不到去尝试的维度。
**结果:示范到底帮了多少**
说完方法,看看数字层面上示范到底值多少钱。
论文在LIBERO-PRO这个基准上做了详尽测试,这个基准会沿着两个方向去扰动原始任务:一个叫POS轴,把物体和承载它们的家具挪到新位置;另一个叫TASK轴,重新编写任务指令,连带着改变了评判成功的标准。两个扰动轴都没有自己专属的示范。
在POS轴(挪位置但不改指令)上,三条示范组写出的第一版程序,就已经在11/30个格子里,在某些开发状态上成功了,平均成功率29%;而没有示范的组第一版程序哪里都没成功。有示范的组第一次成功出现在平均第2个版本,没示范的组要等到第4个版本。但最终冻结后的成功率很接近,分别是1454和1437(满分1500),因为没示范的智能体在15次开发尝试里,基本上也把示范包里暗含的那些信息摸出来了。
在TASK轴(改指令,要求重新组合技能)上,差距拉得更大。三条示范组第一版程序就在18/30个格子里成功,平均成功率53%;没示范组只在1个格子里成功,成功率2%。最终冻结结果,三条示范组赢10个、输2个、平18个,密封测试总成绩1435/1500,对比没示范组的1409/1500。
把这些数字拼起来看,整个60个扰动格子(POS加TASK)里,三条示范组密封测试总成绩是2889/3000,达到96.3%;没示范组是2846/3000,达到94.9%;而重新用opus-5模型跑的ASPIRE系统是89.3%,论文原始发布的成绩是71.7%。
| 方法 | 整体POS成功率 | 整体TASK成功率 |
|---|---|---|
| π0.5 | 25% | 1% |
| CaP-Agent0 | 20% | 16% |
| ASPIRE(opus-4.6) | 77% | 67% |
| ASPIRE(opus-5重跑) | 90% | 89% |
| ENCORE K=0 | 96% | 94% |
| **ENCORE K=3** | **97%** | **96%** |
这里有个特别值得停下来想的失败案例。有个任务叫把盘子放到柜子顶上,三条示范组始终没能找到一个能把盘子稳稳拿起来还能带去柜顶的抓法,试了11个版本之后放弃,密封测试0/50。而没示范组反复搜索了23个版本,自己摸出了一种沿弧线提起盘子的抓法,最终拿到50/50。
这说明示范不是万能钥匙。它能大幅缩短搜索的时间,但不能保证搜索一定会走到对的地方。如果示范本身展示的抓法恰好不适用新场景,有时候反而会把智能体引向错误的方向,让它过早放弃本该继续尝试的路径。
**没说清楚的目标:RoboDojo的考验**
LIBERO-PRO这个基准,任务指令虽然改写了,但好歹还算清楚。ENCORE团队又找了一个更刁钻的测试场,叫RoboDojo。
RoboDojo*:一个双臂机器人的模拟测试平台,很多任务的指令本身就没把目标说清楚,比如"用木块和木板搭个塔",这句话没告诉你塔应该搭成什么形状,全靠系统自带的判定程序去打分。
在这个基准上,没有示范的智能体,一个任务都没成功。论文里挑出10个任务做对比,三条示范组总共拿下450次测试里的95次成功,没示范组是0次。而这95次成功集中在4个任务上,而且论文里引用了一句没示范智能体留下的笔记,写得挺耐人寻味:"操作本身已经解决了,但不知道该搭成什么结构。"
这句话其实点出了问题的本质。机器人的手部动作能力并不缺,缺的是知道该往哪个方向用这个能力。示范包里的关键帧图片恰好补上了这一块,它展示的不是怎么抓怎么放,而是最终应该长成什么样子。
但有个反直觉的发现:光给图片不够。研究者单独做了个对照实验,把三条示范简化成只有关键帧图片,去掉所有的姿态数据、夹爪读数、动作记录,结果在需要精细接触的任务上(比如堆叠积木、互换两个T形块、插管子)成绩大幅下降,有些甚至比完全没示范还差。这说明智能体光看一张抓取动作的照片,没法还原出那个精确的抓取力度和角度,它反而要花掉宝贵的开发预算去反复试探猜测这些数值,结果比什么都没有更糟。
这个结果提醒我们一件事:图片能告诉你"结果长什么样",但告诉不了你"怎么用力才能做到这个结果"。这跟看菜谱配图学做菜很像。照片能让你知道这道菜最后应该是什么颜色什么形状,但那张照片永远教不会你翻锅的手腕力度和下盐的精确克数,这些东西只有看着完整的操作过程才能学会。如果菜谱只给最终成品照,你反而会在猜测具体手法上浪费更多时间,还不如直接没有照片去自由发挥。
**真实机器人上的验证**
论文最后把这套系统搬到了真实的双臂机械臂上,型号是Trossen WidowX AI,配了四个摄像头。研究者录了两类真实示范:一个是双臂传递魔方,另一个是把倒立的杯子翻正放到桌上。每个任务只用了五条人类遥操作示范。
传递魔方的示范里藏着一个任务说明里完全没提到的细节:接收方的夹爪要转一个90度,让两个手指的平面和递交方的手指平面呈十字交叉,而且接收方要先闭合夹爪才能让递交方松开。这正是文章开头那张图里强调的那个重叠环节,是示范专门捕捉下来而指令文字完全没有体现的隐藏技巧。
杯子翻转的示范更复杂,一共涉及四次夹爪开合(而不是简单抓放的两次):先捏住立着杯子的侧壁把它放倒,再在杯子倒下后换个抓法抓住底部附近,然后把手腕立起来让杯口朝下扣在桌上。
两个任务在真实世界的10次密封测试里都拿到了9/10的成绩,由一个没参与开发的人来做最终判定。
**写在后面**
读完这篇论文,有一个点一直在我脑子里打转:示范不是用来教机器人"怎么动胳膊"的,而是用来教它"该往哪个方向思考"的。
这个区分很微妙,但也很关键。传统意义上我们觉得示范就是动作数据,学了动作数据就能复刻动作。但ENCORE让智能体自己去读示范、自己去写代码,这意味着示范真正起作用的方式,是帮智能体缩小假设空间,让它少走弯路地找到那个藏在任务指令背后的"隐藏目标"或者"隐藏策略"。打开抽屉那个案例里,没有示范的智能体耗费20个版本得出"这个任务做不到"的错误结论,而示范只是悄悄告诉它一个它从未想过的用力方向。
还有个细节让我印象很深,就是示范蒸馏器那种克制的设计哲学。它完全可以更贴心一点,直接告诉智能体"这一帧是松手"、"这个动作是在抓取",但它偏偏不这么做,只给出客观的信号(夹爪开合时刻、运动方向突变点),把解读的权力完全留给智能体。这种设计选择背后似乎藏着一种判断:预先告诉答案的系统学不到迁移的能力,只有自己去推理过的东西,才能在新场景里灵活套用。这跟教育里常说的"授人以渔"是同一个道理,只不过放在了机器人系统设计这个很具体的工程语境里。
还有一个被我反复琢磨的问题是,这套系统目前在六个需要极其精细接触的任务上(插充电器、插钥匙、拧螺丝、烤面包、放笔记本电脑、挂马克杯)全部失败,成功率是零。这是不是说明,靠几条示范加语言模型写代码这条路,终究会在某个精细度的门槛前撞墙?那道墙具体在哪里,是靠更好的感知接口能跨过去,还是说有些任务天生就不适合用这种"读示范写代码"的范式去解决,这个问题论文没给出答案,留给了后面的人。
Q&A
Q1:ENCORE是什么?
A:ENCORE是一个让机器人通过阅读少量人类示范来写出操作程序的框架,智能体读完示范材料会自己写代码控制机械臂,并反复试跑和修改,最终冻结一版程序去做正式测试。
Q2:ENCORE和直接用示范数据训练模型有什么区别?
A:直接训练模型得到的是一个黑箱网络,几条示范覆盖的场景太窄,稍微换个摆放位置就容易失败。ENCORE让语言模型把示范读成证据,自己写出可读、可改的程序,能更好地迁移到没见过的新布局。
Q3:没有示范的话机器人能完成任务吗?
A:在换位置但指令不变的任务里,没示范的智能体靠反复试错最终也能达到接近的成功率,但耗时更久。在目标本身没说清楚的任务(比如RoboDojo的部分任务)里,没有示范完全无法成功。







