对于机器人来说,任务规划(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提示以供语言模型完成。然后,语言模型将
