当前位置: 首页 > 科技观察

将大象放入冰箱需要多少步?Nvidia发布ProgPrompt,让语言模型为机器人安排计划

时间:2023-03-22 01:24:46 科技观察

对于机器人来说,任务规划(TaskPlanning)是一个无法回避的问题。要完成现实世界的任务,您首先需要知道将大象放入冰箱需要多少步。即使是相对简单的扔苹果任务也包含多个子步骤。机器人首先要观察苹果的位置,如果没有看到苹果,就必须继续寻找,然后靠近苹果,抓住苹果,找到并靠近垃圾桶。如果垃圾桶是关着的,就得先打开,然后把苹果扔进去,再把垃圾桶关上。然而,每个任务的具体实现细节无法由人来设计,如何通过命令生成动作序列成为一个问题。使用命令生成序列?这不是语言模型的工作吗?过去,研究人员使用大型语言模型(LLM)根据输入的任务指令对潜在的下一步动作空间进行评分,然后生成动作序列。指令以自然语言描述,没有额外的域信息。但此类方法要么需要枚举所有可能的下一步动作进行评分,要么以不受限制的形式生成文本,其中可能包含当前环境中特定机器人不可能完成的动作。近日,南加州大学与NVIDIA联合推出了新模型ProgPrompt,同样使用语言模型为输入指令规划任务,其中包含程序提示结构,使得生成的规划可以在不同的环境中使用,机器人与不同的能力,可以在不同的任务中发挥作用。为保证任务的规范化,研究人员采用生成python风格代码的形式,提示语言模型哪些动作可用,环境中有哪些对象,哪些程序可执行。例如,输入“扔苹果”命令可以生成如下程序。ProgPrompt模型在虚拟家务任务上取得了sota性能,研究人员还将该模型部署在物理机械臂上以执行桌面任务。聪明的语言模型完成日常家务既需要对世界的常识性了解,也需要对当前环境的情境了解。为了创建“做晚餐”任务计划,智能体需要知道最起码的常识:物体的功能,例如炉子和微波炉可以用来加热;动作的逻辑顺序,烤箱必须在添加食物之前预热;对象和动作的任务依赖性,例如加热和寻找食材,首先是与“晚餐”相关的动作。但是如果没有状态反馈,就无法进行这种推理。agent需要知道当前环境中哪里有食物,比如冰箱里有没有鱼,或者冰箱里有没有鸡。在大型语料库上训练的自回归大规模语言模型可以生成以输入线索为条件的文本序列,具有出色的多任务泛化能力。比如你输入“makedinner”,语言模型可以生成后续的序列,比如打开冰箱,拿起鸡肉,拿起苏打水,关掉冰箱,打开电灯开关等等。生成的文本序列需要映射到代理的动作空间。例如,如果生成的指令是“伸手拿起一罐泡菜”,对应的可执行动作可能是“拿起罐子”,然后模型会计算一个动作值的概率得分。但是在没有环境反馈的情况下,如果冰箱里没有鸡,却仍然选择“捡鸡”动作,会导致任务失败,因为“做晚饭”不包含任何关于状态的信息世界。ProgPrompt模型巧妙地利用了任务规划中的编程语言结构,因为现有的大规模语言模型通常是在编程教程和代码文档的语料库上进行预训练的。ProgPrompt提供Pythonic程序头作为语言模型的提示,导入可用的动作空间、期望的参数和环境中可用的对象。然后定义make_dinner、throw_away_banana等函数,其主体是对对象进行操作的动作序列,然后通过断言计划的先决条件,比如在尝试打开冰箱之前接近冰箱,使用处理断言失败的恢复操作,以结合环境的状态反馈。最重要的是,ProgPrompt程序还包括用自然语言编写的注释来解释动作的目标,从而提高生成的计划器执行任务的成功率。有了完整的ProgPrompt思路,ProgPrompt的整体工作流程就清晰了,主要包括三个部分,Pythonic函数构建,编程语言提示构建,任务计划生成和执行。1.将机器人计划表达为Pythonic函数。计划功能包括对操作原语的API调用、总结和注释操作以及跟踪执行的断言。每个动作原语都需要一个对象作为参数。例如,“将鲑鱼放入微波炉”的任务包括对find(salmon)的调用,其中find是一个动作原语。使用代码中的注释为后续动作序列提供自然语言摘要,注释有助于将高级任务分解为逻辑子任务,即“抓三文鱼”和“将三文鱼放入微波炉”。注释还可以让语言模型理解当前目标,减少不连贯、不一致或重复输出的可能性,类似于思维链(chainofthought)生成中间结果。Assertions提供了一种环境反馈机制,保证前置条件为真,不为真时实现错误恢复,比如计划在抓取动作前断言agent接近鲑鱼,否则agent需要先执行find动作.2.构建编程语言提示Prompt需要向语言模型提供环境和主要动作的信息,包括观察、动作原语和示例,并生成Pythonic提示以供语言模型完成。然后,语言模型将预测为一个可执行函数,microwave_salmon()在微波三文鱼的任务中,LLM可以生成的合理的第一步是取出三文鱼,但是负责执行计划的agent可能有没有这样的动作原语。为了让语言模型理解代理的动作原语,通过提示中的import语句导入,将输出限制为当前环境可用的函数。要更改代理的行为空间,只需更新导入函数列表即可。变量对象以字符串列表的形式提供环境中的所有可用对象。该提示还包括一些完全可执行的程序计划作为示例,每个示例任务演示了如何使用给定环境中可用的动作和目标来完成给定的任务,例如throw_away_lime3,任务计划生成并执行给定的任务后,计划是由语言模型根据ProgPrompt提示完全推断,然后生成的计划可以在虚拟代理或物理机器人系统上执行,需要解释器针对环境执行每个动作命令。在执行期间,断言检查发生在闭环中,并根据环境的当前状态提供反馈。在实验部分,研究人员在虚拟家庭(VH)模拟平台上评估了该方法。VH的状态包括一组对象和对应的属性,比如微波炉里的鲑鱼(in),或者接近(agent_close_to)等。动作空间包括抓取(grab)、放(putin)、放回(putback)、行走(walk)、寻找(find)、打开(open)、关闭(close)等。最终测试了3个VH环境,每个环境包含115个不同的对象。研究人员创建了一个包含70个高度抽象的家务任务的数据集。这些命令都是“微波鲑鱼”,并且用于创建真实的动作序列。在虚拟家庭上对生成的程序进行评估后,评估指标包括成功率(SR)、目标条件召回(GCR)和可执行性(Exec)。从结果中可以看出,ProgPrompt明显优于baseline和LangPrompt,表格中还展示了每个特性如何提升性能。研究人员还在现实世界中进行了实验,使用具有平行爪的Franka-Emika熊猫机器人,并假设可以获得一种取放策略。该策略将目标对象和目标容器的两个点云作为输入,并执行拾取和放置操作以将对象放置在容器上或容器内。该系统实现引入了一个开放词汇对象检测模型ViLD来识别和分割场景中的对象,并在提示中构建可用对象列表。与虚拟环境不同,这里的对象列表是每个规划函数的局部变量,可以更灵活地适应新的对象。语言模型输出的计划包含grab和putin形式的函数调用。由于现实世界的不确定性,基于断言的闭环选项未在实验设置中实现。可以看出,在分类任务中,机器人可以识别出香蕉和草莓是水果,并生成规划步骤将它们放在盘子里,把瓶子放在盒子里。