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