导读 随着大语言模型的流行,模型推理能力成为大模型交互的重点。本文将介绍大语言模型增强交互式智能体在动态环境中的推理能力,突破纯文本环境的限制,更好地实现与现实世界的交互。
今天的介绍会围绕下面四点展开:1. 文本环境
2. 实践案例
3. 总结与回顾
4. Q&A
分享嘉宾|林禹臣博士 Allen Institute for AI (AI2) 青年研究员
编辑整理|竹子
内容校对|李瑶
出品社区|DataFun
1. 文本环境——Textual Environment
不管是 Chat-GPT 还是 GPT-4 这种大语言模型,往往只在纯文本环境中使用,例如文章撰写或者问题回答等。这些使用场景下也会存在交互,但是这种交互更多的还是局限在文本层面。
而本文所讲述的交互,则偏向于大语言模型理解现实物理世界的交互,例如,让大语言模型理解厨房的物体,作为机器人的“大脑”,在特定环境下参与交互式任务。例如上图所示的,让机器人把茶壶拿到书架上。
类似的模型在之前也有研究,不过在近期大语言模型呈现大规模应用之后,再次掀起了一波热潮。如何测试这种交互式的智能体呢?受限于机器人的发展,目前业内的普遍做法是借助文本的形式来模拟真实物理世界的物体位置及其相互关系,使用类似文本游戏的方式。
如上图所示,语言模型或智能体每输出一个动作,环境会给出相应的反馈。
这是 AFL world 在两年前提出的测试环境,该环境处理的是比较简单、直接的任务,相对不是很有挑战性。目前大语言模型在这类任务上已经达到了很高的标准。大语言模型的亮点在于对于复杂的交互式任务的处理,例如到很多的房间执行不同的任务。2. Science World
上图所示,Science World 是 AI2 在一年前提出的针对复杂交互式任务的 benchmark,该模型包含 30 余种任务,每种任务包含 10 余个房间、25 种 action,模拟 200 余种物体,每种物体又包含多种物理状态(如热量、开关等),并“人为”制造一些异常。
该 benchmark 非常适合模拟现实世界中的复杂任务,由于其主题是科学实验,因此被称作 science world。
不过模型中涉及的动作本身是比较 general 的(例如拿东西、打开水槽等),这些常见的动作都可以被模拟。3. Swift stage
我们最近的一篇工作是 SwiftSage,正是联合 AI2 以及 USC 做的一项工作,主题为 A
Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks,即处理复杂的交互式任务。
题目中的 fast and slow
thinking,是受到《思考快与慢》这本书的启发。该书中提出,当人们在处理较为复杂任务时,存在两套思维系统:对于简单的任务,往往会有一个直觉的反应,并根据基于直觉的推理直接、迅速地做一个 action;然而,这种直觉性思维在复杂环境中往往会面临一些困难,此时会转为第二套思维系统,即详细地分析任务并思考解决方法,也即应该做哪些动作。以上是我们这套算法的初衷。系统通过四个维度进行交互:Observation、Environment、Inventory、Score。任务一般通过自然语言的形式进行描述,即在每一个时间点,该智能体都会给出一个确定的 action。共有约 25 个不同的 template,如 pick up x(x 是可变)等。
一般来说,第一个 action 都是 look around(观察周边环境),这是固定的流程;而智能体的本质,可以理解为 action
predictor 或 action generator。当每个 action 被执行后,被模拟的环境会给出一个 observation,即做了这个动作之后会得到怎样的反馈。
假如指定的 action 是使用温度计测量锅内物体的温度,那么其 observation 就是温度计显示的度数。假如 action 是诸如拿起某样东西这类简单的任务,则对应的 observation 就是确认该动作是否完成,如果要拿的东西不存在,则会提示该物品不存在,不能完成这个任务。以上所述是第一个维度的反馈,叫做 observation。第二个维度是 environment 的变化。假如我现在在厨房里,或者在工作室里,并不是所有物体都能看到的。那么能看到哪些物体,不能看到哪些物体,其背后有物理学的原理作为支撑。模型会返回看到的物体作为 environment 的描述。
举个具体例子,假如在厨房,冰箱的门是关着的,从未打开过,则冰箱内的物体就不会被包含在该 environment 内,这一点是本任务和其他很多任务的不同之处。很多任务需要智能体去不同的房间内完成任务,因此往往需要携带一些模型曾经pick up过的东西,这也是很重要的。
假如当前任务是让智能体去判断某一未知物体“导不导电”,则该任务的输出结果往往不是 0 或 1 这种二分类结果,而是一个较为细粒度的连续 score 值。假如完成任务中的一部分(如一个电路的构造),系统会给出一部分的分数,用来鼓励该智能体继续完成整个任务,这是该系统的一个特点。如上所述,每个 action 执行后均会得到这样四个维度的反馈,该反馈来自物理环境模拟器。
基于上述场景,业内最常见的方法大多基于强化学习来实现,因为这类复杂任务可能需要数十步甚至上百步来完成。因此,可以将这样的长 action sequence 理解为隐马尔科夫模型,而每一步的 action 都是基于当前状态以及之前的 context 进行判断。这样的场景完全符合传统的 reinforce
learning 的应用范围,这类场景,业内的 baseline 是 DRNN。然而其效果在本文所讨论的场景下表现并不理想,因为其 action space 比较大,每一步的搜索可能也非常多。此外,action
history 也非常复杂,难以快速、便捷地获得 state factor 的表征。并且该任务需要长远规划的能力,而 DRNN 这类传统强化学习模型更多关注的是短期的 action prediction,长远规划能力相对欠缺。为了解决这一问题,近期有一些工作实现了知识增强(knowledge augmentation of reinforce learning),其中一种是通过图的方式,构建一个 Dynamic knowledge graph,去记录之前见过哪些物体,并通过 knowledge
graph 描述物体和物体之间的关系。模型中的 graph 是动态变化的,随着动作的变化而变化。这样,使用 Reinforce learning agent 进行推理和判断时,可以帮助 agent 删除无效 action space。这就是一个比较简单的知识增强的方式。此外,早期还有一些工作利用 language
model 帮助智能体在 reinforced learning 的情景下实现 re-ranking;这个 idea 比较简单,但是效果不错。通过额外的 fine tuning 对 training data 进行学习,例如指定 action 的后续 pattern 等(比如,当 pick up 某件物体之后,是不是会经常 activate 该物体)。这样的 pattern 被模型学到,进而通过额外的 language model 帮助智能体实现 re-ranking,最终达到更好的效果。
近期有人尝试使用 transformer 代替 reinforcement learning,如上图左图所示的 Decision
Transformer,其核心思想也是通过 GP 的方式,借助 auto
regressive language model 将所有历史的 actions、state 以及 reward 的表征融合到一起作为 token,进而学习和预测下一个 action。然而本文所述任务比较复杂,很难有个独立 state 的 encoder,所以在 ScienceWorld paper 中,该方法是通过 encoder/decoder 的方式,使用文本将历史的 actions、state 以及 reward 进行融合,进而预测 action。因此其本质是 seq2seq 的任务,输入 sequence 是 action history 及对应的 feedback,以及环境内的物体等。该方法仍然沿用了强化学习的假设,即仅使用前一个时间点和当前时间点的信息来预测下一个时间点。实际上,只需要将问题转换成 seq2seq 的形式,就可以实现多个时间点信息的融合,并将其作为 input。以上两种方法都属于 behavior
cloning,不同于强化学习,该方法首先去寻找 Oracle agent。对于 Oracle agent,不同任务会有不同的假设;有些任务可能通过人的操作记录来完成,而有些任务则可能需要通过遍历搜索的方式找到最短 action trajectory,作为 Oracle action sequence。基于上述 Oracle agent,构建离线 training data,使用类似 supervised learning 的方法通过 seq2seq 模型完成一个小型智能体的学习,进而模拟这个 Oracle agent 的能力。这类方法非常便捷,然而缺点在于,该模型仅能模仿表面行为,不能模仿其思考方式,因此,将该模型迁移到新的任务时,可能会遇到很大的困难。
上文提到的模仿学习的缺点,恰恰是大语言模型的优势所在。假如将房间内的物体构成用一段文字描述清楚,将其输入给模型,并让模型生成一个 plan,这是 ChatGPT、GPT-4 等大语言模型所擅长的任务,只是大模型输出的 plan 不一定完全符合当下的环境。即使模型已知厨房里的物体,但是随着时间的变化,物体的相对位置及关系也会发生变化,假如每时每刻都将这种变化通过语言的方式更新到大语言模型中,确实是能够得到更加细致的 planning,然而效果仍然不够理想。
这种风格下第一个非常重要的工作叫做 SayCan(来自 Google 及其子公司 everyday Robot)。其核心思想是,在每一个时间点产生一个 action,当环境完成该 action 的执行后,基于环境的反馈及变化去预测下一个 action。SayCan 通过大语言模型实现这个任务,第一步是获取完整的、同类型任务的 Oracle action sequence 作为 training data。考虑到大语言模型在获取 action list 方面的局限性以及 fine tuning,因此通过 incontext learning 或 few shot 等方式,以类似任务作为参考,获取完整的 action 以及对应的 oracle pass;然后描述当前要做的任务,并描述当前已经完成的 action 以及每个 action 对应的反馈。例如,前面的 action 是 go to kitchen,然后 look around,将每个 action 及反馈放入 input 里面,进而调用大模型输出当前反馈。此时,SayCan 模型的思路是 K best generations for Action,即生成 K 个 action candidates(一般是 10-15 个)。接下来,首先将明显不能执行的 action 先删掉,然后根据环境与 action 的交互反馈对剩下的 action 进行 re-ranking,将排序最高的 prediction 作为真正的要去执行的 action。
ReAct 的思想和 SayCan 相似,其区别在于,ReAct 模型具备长远的 planning 能力。ReAct 模型不仅仅输出 action prediction,在此基础上还增加了 manually annotated,即对下一步 action 进行的思考。其特点在于,让大语言模型通过思考的方式逐步自行制定下一个子目标,并将这个子目标的预测结果作为输入 context 的一部分,去预测下一个 action。因此,其效果比 SayCan要好一些。
Reflexion 模型的思路和 ReAct 类似,但在后者的基础上,进一步假设执行的任务可以重复被使用。假如前一轮的 action 没有成功,大语言模型自行总结失败原因,即“自我反思”。具体来说,对于失败的任务,将 action history 作为 input 的一部分,最后加一句“该任务失败,请思考失败原因”这类 prompt,这样大语言模型会生成一个 reflexion 来反思“失败”原因。这样,在新一轮开始的时候,将这个“反思”作为 input 的一部分,与大语言模型进行交互,从而对过往 action 进行修正和优化。这就是 Reflexion 模型的实现。该模型的假设是比较强的,然而在实际环境中,没办法让机器人做过多的重复尝试。此外,其他任务往往是一次性的,完成一部分任务得到相应的分数,如果进行多次尝试,对任务进行直接对比会有失公平。
SwiftSage 模型的思路是基于前文提到的快思考与慢思考来实现。首先使用小语言模型来预测 action,这种思路更符合人类的思考方式,而小模型的优势在于模仿学习(offline
imitation learning)的实现;对于 Oracle agent 产生的 training data,在 GPT-4 等大模型上是很难实现 finetuning 的,因此使用大模型难以实现 action 与环境的交互,而这一点恰恰是小模型的优势所在,小模型可以很好地实现与环境的交互。此外,大多数任务前期的 action 往往并不复杂,因此一般没有必要频繁调用大模型。而不管是 SayCan 模型,还是 ReAct 模型或者 Reflexion 模型,每一个 action 都需要使用大模型去生成。那么随着时间的增长,生成的 action
sequence 会越来越长,而每一次调用可能会产生一两千个 token。这样一方面会造成费用的浪费,另一方面,在实际应用中,这种模式也很难 scale 到大规模应用上。实践案例
1. SwiftSage 架构
基于此,SwiftSage 的思想在于,优先使用小模型对 action 进行预测,只有当小模型遇到瓶颈的时候(例如 score 停滞不前等情况),才切换为大模型,将 action sequence 作为 input 的一部分。Prompting 分成两步:第一步,先让模型思考当下需要哪些物体,当下任务需要拆解成哪几个子任务,之前的任务有没有“犯错”,相当于将 SayCan、ReAct、Reflexion 模型进行融合,作为第一步的 planning 能力。相比于 Reflexion,该模型首先完整地将一整轮任务全部走完,如果发现仍然没有完成任务,才会去总结错误。而我们的模型,对于每一步都会去总结经验和不足。具体地,首先使用小模型,当某一步操作发现小模型不满足要求时候,即模型遇到了困难,从而更换成大模型。最后将其输出结果生成 action sequence 而不仅仅是生成 1 个 action,这也是跟前面 3 个模型不一样的地方。实际上,大语言模型可以直接将 subgoal 拆解成多个 action,这也是后期的发展方向。
SwiftSage 框架包含两个 model,即小模型和大模型。小模型称为 Swift,因为它比较快。小模型主要是基于 T5 实现的模仿学习框架,对于其 input,首先会对任务进行描述,例如任务是“冰淇淋融化”,并且当前的时间点是第 14 个 action,已经获得 35 分了。接下来,会输入过往的前十个 action 及其 observation,同时描述当前环境以及机器人的背包里装了哪些物品,机器人去过哪些房间等。之所以会输入这么详细的信息,主要是因为有些 agent 之前犯错的原因就是不断地去往不同的曾经去过的房间,而它不知道自己去过。因此这里特别加入一个 input 信号,告诉他已经去过这些房间了。这种小模型 T5-large 只有 3B 大小,非常容易部署。小模型可以输出一个动作,例如 activate stove(把炉子点燃),在执行这个任务的过程中,模型可能会出现异常,比如炉子坏掉了。Senseboard 可以随机生成一些异常,来测试该智能体是否能够妥善处理,类似于真实世界,即使我们按部就班地去做动作,中途也难免会产生意外,因此需要使用更强的推理能力去解决这些意外。当小模型受阻时,我们会识别到这种情况,例如出现了 cannot 等关键词,或者某个任务无论如何优化分数始终不上升等。此时将会激活大模型,利用大模型实现更好的规划。
如前文所述,首先使用 planning
stage(包含 task 描述、action sequence 以及当前的环境等)作为文本描述;接下来会给大模型提出 5 个问题,其中,前两个问题是关于完成任务需要哪些物体的,第三四个问题是关于需要完成哪些子目标的,最后一个问题是关于有没有犯过错误,以及如何修复。
下一步任务的预测就是前文所述的 plan。在第二轮 prompting 的时候,加入 environment history 以及 action types(即当前环境有哪些能做的 action,例如倒水),同时对每个 action 进行描述,如该 action 能完成哪些目标,对物理环境会产生什么影响等。接下来,大语言模型将上一轮生成的 plan 进一步拆解成多个 next actions(称之为 action buffer),并逐一输入到环境中执行。
当执行完这几个 action 后,继续回到小模型模式去执行后续任务。这是一种比较节省计算资源的方式。
总结一下,首先使用小模型进行 action 预测,当小模型遇到困难时,比如输出的 action 无法在现实环境中执行,或是对于一些关键动作(比如判断某个物体是否导电)的重要决策,则会用到大模型。此外,当遇到一些异常时,也会需要用大模型来处理。以上是常见的、需要从小模型转换到大模型的情况。对于大模型的调用,也是会分成两步,首先去做 planning,接下来根据 planning 的结果进行 grounding,即在真实的环境中执行 action。此外,Sage 部分预测的并不仅仅是 next one action,而是包含了所有可能 action 的列表,这样最大程度地减少了重复调用大模型所需的 token 的数量以及计算时间。大模型完成输出后,流程会自动切换回到小模型。2. SwiftSage 效果
我们选用 ScienceWorld 对模型进行评测,该评测内容丰富,包括 30 余种不同的任务类型和动作数量,涵盖 10 个不同学科,可以支持复杂的任务。根据 Oracle pass 的平均长度进一步分成短、中、长三组。
第一部分的 baseline 包括几种传统的方法,例如 DRNN,该方法平均分只有 15 分(满分是 100 分);如果使用 random 方法的话,分数会更低,可能接近于 0(因为每一步 action space 都很大,因此 random baseline 是很小的)。其他几种 baseline 效果也都是比较差的,以上发现也是 ScienceWorld paper 本身已经提及的。而基于大语言模型的尝试,效果要好很多。大语言模型的主要优势就在于其 planning 能力,尤其是对于复杂的任务。然而大模型的缺点在于其成本高昂,但带来的分数提升却非常有限(30 分左右)。对于比较短的任务,由于 Reflexion 的“试错”步骤,带来了相对高一些的分数(40-70 分)。而 SwiftSage 效果明显好于其他模型,主要原因在于小模型的使用,首先积累了正确的 action 样本,只有前面 action 做得对的情况下,大模型才能够获得较好的效果,可以认为小模型正样本的积累帮助大模型实现了翻倍的效果;同时小模型的引入,也降低了整个流程的 cost。
从 efficiency 的角度看,从每类任务中选择 3 个具体的任务,去比较 SwiftSage、ReAct、Oracle 所占的比例。Oracle 能达到 100 分,但是通过搜索的方式得到的 Oracle agent 常常不是最优的。如上图所示,横轴是时间,纵轴是分数,Oracle(灰色)一般都能在较长的训练之后达到 100 分;SwiftSage(蓝色)能够达到同样高的分数(比如 10-1 L),但是速度会快很多。有一些任务出现了中途失败被停止的现象,存在提升空间。虽然 ReAct 模型在一些小任务上,其 efficiency 效果是不错的,但是我们的模型在整体上,无论分数还是效率,都是远远超过了 ReAct。
上图是将 short、medium、long 三类任务各自合并起来进行的比较,可以看出,对于 short 任务,SwiftSage 与 Oracle 区别不是很大;对于 medium 任务,SwiftSage 逐渐体现出了其效率上的优势,即达到同样的分数花费的时间比较少;对于 long 任务,优势会更加明显(如上图左上角蓝色的区域)。
对于模型的 cost,上表列举了详细的数据,进行了量化的比较。前三种方法,每个 action 平均花费 1000~2000 个token(Reflexion 模型会花销更多,因为流程的轮数越长,反思就越多)。假如将大模型换成 GPT-4,带来的花销就更大了。而使用 SwiftSage 模型,仅需要大约三分之一的 token 数量,而平均每个 action 能拿到 2 分左右,因此经济性上有明显的提升,这也是小模型与大模型结合的优势所在。总结和回顾
本文提出了一种双模态的 agent 框架——SwiftSage。小模型通过 image invitation learning,即通过 offline的training data 进行学习;大模型通过 prompting 的方式,例如 incontext learning example 来学习。为 embodied actions 而设计,其特点是将 prompting 拆成 plan和ground 两个部分,避免了 planning 和 action 及其 transformation 都放到同一个 prompt 里面,实现了更好的效果。- 该方法需要使用 Oracle agent 才能实现小模型的学习,而环境提供的 Oracle agent 中未必能够把所有的 action 覆盖完全。虽然通过搜索的方式也可以找到相对不错的方案,但是搜索得到的 Oracle
pass 的质量不一定能得到保障。如果使用小模型,需要有足够的 data,并且这些 data 最好能够来自实际应用场景中的真实用户,比如用户在电脑上的一些鼠标、键盘操作等,包括浏览网页时的一些 action;只要最终被判定为完成任务,那么对应的 pass 就可以作为 training data;然而有些新的任务确实没有对应的 Oracle data,此时我们的框架就不太适用了。
- 框架中的大模型部分目前仍然依赖于 ChatGPT 和 GPT-4 等收费的大模型,因此想要转换成开源大模型还有一定的难度。目前开源的 Alpaca 等大模型的 planning 还不能满足我们的要求,而且其 context window 比较小,不适合长距离的规划。在开源大模型上获得较好的 planning 效果,也是未来工作的一个可优化的方向。
- 需要和用户进行交互式反馈。在模拟器中较容易获得用户的 feedback。把机器人放到真实环境中完成任务,往往很难获得丰富的 feedback。实际应用中可能会基于一些视觉信号获取一部分的 feedback 进而将其转换成文字,然而类似 score 这样 feedback 就很难获取了,这也是这种方法的局限性。
- 将应用场景扩展到更复杂的任务中,包括更多和日常生活更接近的任务,甚至 API 的使用。
- 使用开源大模型通过 knowledge distillation 获得 planning 能力。
- 真实的机器人进行更紧密的连接,利用机器人的手臂、机械臂等方式执行一些 low level action,并借助计算机视觉实现完整的 pipeline。
Q&A
Q1:Fast 部分,即小模型部分,能否使用 RL 的模型来做?A1:从这个框架上来说是没问题的,但是在实际尝试中发现,使用 DRNN 实现 RL,听令的过程较难实现,在学习过程中需要经常调整超参,因此很难得到满意的、完整的效果。包括最后 report 和对应的 DRNN,CSS
word 原作者中最后的结果,实际上在自己复现的时候,很难复现到相同的水平。但是如果使用 sequence to
sequence,包括前文所述的 behavior cloning 等方式,都能够稳定的达到相似甚至更优的效果。因为 DRNN 模型做了很多的前提假设,因此如果想要支持更丰富的环境和任务,还是使用 seq2seq 方式更容易实现;此外,因为都是文本,因此还可以基于文本进行 pre-processing,将格式进行规范化处理,进而再去做预测。假如小模型的输入中,我们认为 current environment 比较重要,或者物体分割比较重要,可以基于此自行定义 formatting 方式。对于 visit room,我们额外添加了部分 feature,这类 feature engineering 任务在 seq2seq 的形式下更容易完成。此外,seq2seq 模型的学习过程相对比较稳定,因此 seq2seq learning 也是常见的方案,对于 T5 large 这类 Pretrain model 也是表现比较好的。但是对于 DRNN 模型,需要从零学起,需要通过 Reinforce train 学会物体之间以及环境之间的对应关系,这些难以实现,这也是我们经过多种尝试最终选择 T5 模型的原因。实际上,经过改良后的 T5 模型已经可以达到和 ReAct 模型差不多的效果。Q2:本文所述的这个实现,和 Google 实现的 25 个 agent 那个案例,有哪些区别,本文所述框架有哪些优势?A2:Google 的 25 个 agent 是 staff 的工作,在一个小镇里有 25 个不同的 social,他们的目标是模拟社交行为,即根据不同人的不同性格和特征对不同任务进行匹配。而我们的任务不太关注这个方面,而是任务导向的,即完成某个任务需要使用哪些物体,使用哪些行为等,这就是 physical 和 social 之间的差别。不过,在物理环境中,多个 agent 交互完成某些特定任务,以及多个 agent 之间进行竞争或合作,这些思路会给我们未来的工作带来启发。
分享嘉宾
INTRODUCTION
林禹臣博士
Allen Institute for AI (AI2)
青年研究员
林禹臣是 Allen Institute for AI(AI2)博士后青年研究员,师从 Yejin Choi 教授。他于 2022 年获得南加州大学博士学位,导师是 Xiang Ren 教授。他的研究专注于常识知识推理(Commonsense Reasoning)与大语言模型(Large Language Models)旨在构建具有人类思考和交流模式的智能系统。此外,他还对持续学习和联邦学习主题感兴趣。他曾于上海交通大学IEEE试点班获得学士学位,曾在 Google AI,FAIR 担任实习研究生。他一直担任 ACL、EMNLP、ICML、NeurIPS、ICLR、AAAI 会议审稿人。他曾多次组织了研讨会(Workshop),并在 ACL 2022 和 2023 参与讲习(Tutorial),曾任 ACL 2023 的区域主席(Area Chair)。