阅读: 2023/5/22 15:03:36
以下文章来源于深圳大学可视计算研究中心 ,作者苏泽嘉
导读
本文是VCC苏泽嘉同学对论文 PROGPROMPT: Generating Situated Robot Task Plans using Large Language Models 的解读,该工作来自南加州大学和英伟达,已被发表在机器人与自动化国际会议ICRA 2023上。
项目主页:
https://progprompt.github.io/
该工作提出了一种程序化的Prompt结构,使得大语言模型可以在不同环境条件下,为具有不同技能的机器人生成不同任务的动作序列。该方法可以广泛应用于新的场景、智能体和任务上,包括真实机器人部署。
I
引言
利用智能体完成一项日常的家庭任务既需要具有对世界的常识性理解,也需要有关当前环境的场景知识。比如,为了创建一个在家里 "做晚饭" 的任务规划,智能体需要具有一定的常识,比如做晚饭通常需要加热食物,加热食物通常需要用烤箱或者微波炉等。除了常识外,智能体还需要获取一定环境信息,如冰箱里有哪种食物,食物的种类是什么等。
近年来,在大型语料库上训练的大型语言模型(LLMs)在多种任务上展现出强大的的泛化能力,例如ChatGPT可以以对话的形式回答不同领域的问题。这种泛化能力最近也被用于机器人任务中,以规划合理的动作序列。现有的利用LLMs规划动作序列的方法包括基于评分和基于生成的两种方法。基于评分的方法通过利用LLMs对动作集合中的每个动作逐个打分进行动作的选择,例如给定“做晚饭”的目标,且第一步动作是“打开冰箱”,在生成第二步动作时,LLMs首先会对所有的动作进行评分,如“拿起鸡肉”:5分,“拿起汽水”:2分,“关闭冰箱”:1分,然后选择评分最高的动作作为决策结果。基于生成的方法利首先通过LLMs续写一段文本,然后再将通过映射的方式将该文本转化为动作集合中的某个动作。例如给定“做完饭”的任务,若LLM续写了一段文本:“伸手拿起一罐泡菜”,则需要将该文本转化为一个动作,如“拿起罐子”。上述两类基于LLM规划动作序列的方法并未考虑环境信息,规划产生的动作可能不可执行,进而无法完成相应任务。比如在“做完饭“的任务中,若LLMs规划出“拿起鸡肉”的动作,但当前环境中可能不含有鸡肉,则该动作可能不可执行。
本次导读论文介绍了一种新的基于LLMs规划动作序列的方法ProgPrompt[1],该方法在规划中引入了有关场景的信息,提高了动作序列的任务成功率。具体来说,该方法基于LLMs的代码理解和生成能力,以python代码的形式构建提示样例输入到LLMs中,LLMs将参考提示样例为新的任务生成的一段包含动作序列的代码。其中,提示样例首先通过“import”语句声明了智能体可执行的动作类型及相应的参数,并通过一个“list”指明场景中所包含的所有物体类型,然后通过函数定义的方式来表示样例任务的动作序列。该函数使用断言命令“assert”来纳入环境的信息作为条件,使得动作序列的规划可以受环境的条件所影响。比如在执行“开启微波炉”的动作前,若环境中的微波炉还未插上电源,则需要先执行“插上微波炉的电源”动作。此外,该函数还以注释形式在每条动作前插入一个短期的目标语句,以改善动作序列的任务成功率。
II
技术贡献
本工作主要贡献如下:
提出了一种新的基于LLM进行机器人任务规划的方法;
该方法可以广泛地应用于新的场景、智能体和任务上,包括真实的机器人部署。
III
方法介绍
ProgPrompt方法的关键设计在于两个一部分:第一部分是如何将一个机器人任务的动作序列表示为python的代码。第二部分是如何构建一个代码风格的提示输入以启发LLMs进行新任务的动作序列生成。
将机器人任务的动作序列表示成代码
ProgPrompt利用Python风格的函数来表示一个机器人任务的动作序列。其核心设计包括利用API的形式表示一个原子动作,利用注释表示一个短期的目标,以及利用断言命令“assert”来纳入环境的信息作为条件。
如图1所示。其中,每个原子动作的API以将物体作为参数,比如任务“put salmon in microwave”包含find(salmon)的API,其中find为原子动作,物体salmon为参数。此外,ProgPrompt还利用利用注释来为将高层次的任务分解为多步的子任务,每段注释可以看作后续动作序列的一个短期目标。如图1所示,“put salmon in microwave”任务的完整动作序列被两段注释“grab salmon”和”put salmon in microwave”分解为了两个子任务的动作序列。这种引入短期目标的好处是可以减少LLMs在推理任务中生成不连贯,不一致或者重复的输出。先前的工作”Chain-of-thought”[2]也表明,引入短期的目标有助于提升LLMs在算术、常识和符号推理任务中的表现。最后,ProgPrompt利用断言命令“assert”来纳入环境的信息作为条件,以确保每个动作执行的前提条件是成立的,并在不满足条件时执行其他动作。如图1所示,在智能体执行grab(salmon)的动作前,会通过断言assert('close' to 'salmon')检查智能体是否靠近salmon,如果不是,则智能体会先执行find(salmon)的动作。
图1 以Python表现的任务“put salmon in microwave”的动作序列
构建代码风格的提示输入
ProgPrompt通过构建提示输入的方式为LLMs提供有关智能体的原子动作和环境有关的信息。此外,与常见的小样本LLM提示相同,ProgPrompt的提示中还包括几个样例任务及相应的动作序列。如图2所示,ProgPrompt构建了一个Python代码风格的提示(包括原子动作类型,环境信息,以及样例),通过将该提示输入给LLMs,LLMs将为新的任务生成一段以代码形式呈现的动作序列。为了约束LLMs只利用智能体的技能进行动作序列的生成,ProgPrompt在提示的开端利用python风格的引入命令”import”来声明智能体的所有原子动作,其中每个原子动作的参数数量也相应地声明。由于动作序列可能涉及到场景中不存在的物体,为了约束LLMs只利用场景中的物体进行动作序列的生成,ProgPrompt利用python风格的列表”list”来声明场景中存在的物体类型。基于上述两个设计,LLM即可针对当前的智能体技能和场景条件进行动作序列的生成。此外,ProgPrompt的提示中还包含几个样例任务和相应的动作序列。每个样例展现了如何利用智能体的技能和环境中的物体为某个特定的任务生成动作序列。这些样例进一步加强了任务,智能体技能以及场景中的物体与动作序列之间的联系,有利于辅助LLM为新任务进行动作序列的生成。
图2 代码风格的提示输入
动作序列的生成与执行
利用上述的提示输入,LLMs将为新的任务生成动作序列。该动作序列可以在虚拟智能体或者真实的机器人系统上运行,其中每个符号化的动作需要通过一个解释器转化为智能体或者机器人的实际行动。其中,动作序列中的断言“assert”则通过提供给LLMs环境信息的形式进行检查。如图3所示,给定样例的环境条件与断言判断的结果,LLMs会根据当前环境对当前断言进行判断,输出True或者False。
图3 利用LLM进行断言判断的输入
IV
部分结果展示
接下来我们将展示利用ProgPrompt在虚拟的VirtualHome环境和真实的机器人上规划的动作序列。
图4展示了在虚拟场景中为活动“关灯”的任务,智能体很好地在虚拟场景中完成了该任务。
图4 ProgPrompt为虚拟环境中的智能体规划的动作序列
图5展示了一个在真实的机器人规划的动作序列。场景中具有“草莓”,“香蕉”,“箱子”,“盘子”,“瓶子”和“电钻“。给定“将水果放进盘子,将瓶子放进盒子”的任务,LLMs理解了场景中的“香蕉”和“草莓”属于水果,并相应地生成动作序列,将它们放在“盘子“里,并将“瓶子“放在“盒子“里,并忽略了场景中无关的物体“电钻”。
图5 ProgPrompt为真实的机器人任务规划的动作序列
V
总结与展望
本文提出了一种用基于LLM进行机器人任务规划的方法ProgPrompt,它汇集了LLM的两个优势:常识推理和代码理解。ProgPrompt构建了包括对世界和机器人能力的理解在内的提示输入,使LLM能够直接生成可执行的动作序列。可以广泛用于新的场景、智能体和任务上,包括真实的机器人部署。
在后续的工作中,可以进一步地研究如何更广泛地使用编程语言的特点进行机器人任务的规划,包括用实值的数字表示场景的度量信息,用嵌套字典表示场景图,以及引入更复杂的控制流等。
VI
思考与讨论
Q: ProgPrompt利用LLMs进行断言的检查,是否能保证检查结果一定正确?
A: 不一定,因为LLMs进行推理的结果很大程度上受给定样例的影响,因此如果新的断言的检查与样例差异较大,则不能保证检查结果完全正确。
以下是开放性问题,欢迎读者朋友留言讨论:
Q: ProgPrompt在提示中只输入了场景中的物体类型,并通过在线执行的方式获取局部的场景信息。能否一次性输入完整的场景信息,让LLMs能基于全局的场景进行动作序列的生成?
转自:“arXiv每日学术速递”微信公众号
如有侵权,请联系本站删除!