机器人记不记得"刚才那一下没用":长程记忆要测的四项

一、”看见”和”记住”不是一回事
据公开报道,国内某高校研究团队针对家庭机器人”看见不等于记住”的问题提出了一项具身记忆方向的评测思路,强调要记住物品的位置,也要记住无效的尝试。基准名称、任务数量与各项得分本文都不涉及,我们取的是它对失败形态的描述:在真实家庭环境里,机器人最常见的失败不是没看见,而是看见了却不记得上一次的结果。
这类失败有三种典型形状。抽屉已经被拉开过,它伸手去开第二个一样的抽屉;杯子被人挪到桌面另一侧,它按旧位置在原处反复找;抓取桌面上的瓶罐时滑手失败,它按同样的方式再试一次,仍然失败。三者的共同点不是感知精度不够,而是上一轮的结果没有进入下一轮的决策。
所以评测长程记忆不能按”记得多少”来排,要按”会不会重复犯错”来排。存储容量是一个内部指标,它对用户的代价是零;重复动作的代价才是可见的——时间被吃掉、物品被碰倒、任务被误判成已完成。这条排序原则也决定了下面四个必测项的顺序:先测会不会找错,再测会不会重做,再测会不会重试同一个失败,最后测允许不允许忘。
二、四项必测:怎么构造场景,用什么判据
下表是本文的核心交付物。每一项的场景构造都刻意保持在”人工可复现”的规模,不需要专门场地,只需要把变量固定下来。
| 可测项 | 场景怎么构造 | 主判据 | 容易漏掉的干扰 |
|---|---|---|---|
| 物体恒存与位置更新 | 目标物先被看见,再被遮挡或在视野外被挪动,之后要求执行”取来”;设置遮挡后未挪动、遮挡后被挪动、挪动多次三档 | 是否能到正确的新位置一次找到;被挪动后的坐标更新成功率 | 只测”遮挡后仍存在”,不测”存在但位置变了”,这两件事的失效原因完全不同 |
| 状态型记忆 | 任务链路里包含会改变环境状态的步骤:抽屉开合、灯亮灭、门开关、容器倒空;把已完成步骤的执行者换成另一轮 | 已完成步骤的重复执行次数;状态被二次破坏的次数 | 用”任务是否成功”当唯一判据——重复开过一次抽屉但任务仍算成功,指标看不见 |
| 无效尝试记忆 | 人为制造可复现的失败:抓取打滑、目标被挡住、容器太重抬不动;失败后允许重试若干轮,观察是否改变策略 | 同一失败原因下重复同一动作的次数;策略变更后是否成功 | 失败原因分类过粗,把”抓握角度不对”和”物体超重”混成一类,重试策略无法变 |
| 时间与衰减 | 同一场景在间隔若干步或若干时长后重放,问它是否还认得位置与状态;间隔逐级拉长 | 成功率与召回随时间步长变化的衰减曲线形状;遗忘后是否触发安全降级 | 只测短间隔,长间隔的表现外推;或者测了忘掉但没测”忘掉之后有没有再观察一次” |
第三行的判据值得多说一句:重复动作次数比成功率更灵敏。成功率是终点指标,任务往往在重复几次之后仍然侥幸完成,曲线看不出问题;重复次数是过程指标,它能在任务成功的情况下就把浪费暴露出来。做长任务回归时,我们优先看过程指标的形状变化,而不是终点指标的绝对值。
三、判据的具体形式,以及怎么读
评测的输出要能被读成趋势,四个形式最有用。
- 成功率随时间步长的衰减曲线。横轴是间隔的步数或时长,纵轴是召回或一次成功率。要读的是曲线形状而不是单点:断崖式下降说明状态没有持久化,只是挂在当轮上下文里;平缓下降说明有存储但会过期;不随间隔变化而整体偏低,更像识别或坐标标注的问题,与记忆无关。
- 干扰物注入后的召回。在场景中增加相似物(同款不同色、同形不同用途),看它是否会把两个对象混成一条记录。混了以后表现不是”找不到”,而是”找到一个错的”,后者代价更高。
- 重复动作计数。按动作类型分开计:开合类、抓取类、寻物类。同一目标在同一任务里的重复计数应该随着轮次下降,不下降即说明失败结果没有回写。
- 错误置信度的上报情况。系统在一个错误位置上表现出高置信度,比它承认不确定要危险得多。判据是:置信度与实际正确率是否单调对应,不对应就说明这个数不能用于下游决策,只能用于人看。
四、能测出来之前,先把状态字段定下来
这四项没有日志支撑都测不了。最小字段集如下,每一项都必须写即带时间戳。
- 对象标识:稳定 ID 与外观描述分开存,避免把一次识别结果当成身份。ID 的生成时机要与”首次确认存在”绑定,而不是与”首次看见”绑定。
- 末次观测时刻与观测来源:哪个传感器、哪一轮看到的,用来判断信息是否已过期,也用来在冲突时选优先级。
- 位置与不确定性:坐标之外要带不确定范围或置信信息,否则下游无法判断该直接执行还是先去复核。
- 尝试记录:每一次动作的输入、执行结果与是否推进了状态。这条记录是”无效尝试”能被检索的唯一前提。
- 失败原因分类:采用固定的小类集合,宁少勿多。分类一多,标注一致性就会垮,检索也失去意义。
- 状态断言与验证方式:抽屉”已开”这类断言要写明是靠视觉、力矩还是行程判定,靠视觉判定的断言最容易在遮挡后失效。
- 写入时间与有效期限:允许过期的项要写明过期后怎么办,是重查还是保留但降权。
有一处常见错误值得点名:把”任务已完成”写成全局标志位。全局完成标志会让所有子步骤在下一轮都被认为做过,反而制造新的错误。状态必须挂在对象与步骤两级上,不能挂在任务级。
五、把失败记下来是最难的一项
四项里,无效尝试记忆最难落地,原因有三个,都不是模型能力问题。
第一,失败原因天然有歧义。同一个”没拿起来”,可能是抓握点不对、物体比预计重、被旁边东西挡住、或者执行器没到位。系统能观测到的只有结果,归因需要额外传感器或额外一次试探,而试探本身有成本。
第二,归因错误会让策略变差,而且比不归因更差。如果系统把”物体超重”错记成”这个位置拿不到”,之后它会绕开一个本来正确的抓取位置;如果反过来,它会一直重试同一个失败的抓法。记忆越被信任,错记的代价越大——这也是为什么失败记录必须带上归因依据与置信度,而不是只留一句”失败了”。
第三,必须留一个让人纠正的入口。人可以直接改失败原因,或者标记某条记录作废;改完之后策略要立刻受影响,而不是等下一轮重新学习。这个入口的验收判据很简单:改完之后重放同一场景,行为变了没有。没变,说明失败记录没有被检索,只是被存档了。
对企业交付来说,还有一层常被忽略:失败记录是敏感的运行数据。它会暴露流程在哪一步最容易出错,因此访问权限和保留期要单独约定,而不是跟主日志共用一套策略。
六、搬到工业现场和自家系统上的等价做法
家庭机器人这套测法,去掉”机器人”三个字之后,对我们的工业现场与软件侧任务是同一张表。
先查再做的幂等纪律:任何可能重复执行的动作,重跑之前先查状态记录里是否已做过、做过是否成功。这条在工业侧对应”工步已完成不允许二次下发”,在软件侧对应消费前的去重检查。
动作日志要能区分三种状态:没做、做了没成、成了但状态又变了。三种混成一格,重放与恢复就无从判断。我们内部把这三态作为动作日志的强制字段,缺最后一态的记录一律视为不合格,因为它正好对应”完成后环境又变化”的那一类错误。
把失败当检索对象而不是归档对象:异常处理链路里,重试策略要先读历史失败原因,读到同类原因就走不同分支。读不到、或者读到了不改变行为,就等于没有失败记忆。
衰减要设安全边界:允许忘掉可以,但忘掉之后必须降级为”先观察再执行”,不能降级为”假设没做过”。这两者的差别,在家庭场景是重复开抽屉,在工业场景是重复下发一道已经做过的工序。
洹拓科技在给客户做长任务链路验收时,会把上面四项压缩成三个必查动作:注入一次挪动、注入一次可复现的失败、把间隔拉长一档,然后看重复计数与衰减形状。这三个动作的成本很低,但它能在上线前把”记不记得刚才那一下没用”这个抽象问题,变成一个可读的数字。