《Generative Agents: Interactive Simulacra of Human Behavior》论文阅读——文明也要涌现了?

论文链接:

Generative Agents: Interactive Simulacra of Human Behavior​arxiv.org/abs/2304.03442

Abstract

可信的人类行为代理(Proxies)可以赋能交互式应用,比如沉浸式环境、用于人际交流的排练空间、制作原型工具等。本文介绍了一种能够模拟可信人类行为的生成式智能体(Generative Agents),它们于清晨醒来、享受早饭然后进行工作——画师着墨、作家执笔;它们独立思考、相互观察、彼此交流;它们善于反思,前日之事作为后日之师。智能体的完整经历会以自然语言的形式进行记录,并且存储在一个大型语言模型中。随着时间的推移,这些记忆将会形成更高级的反思,并指导智能体规划它们的行为。受到「模拟人生」的启发,本文创造了一个交互式沙盒环境,用户可以在其中与包含 25 个智能体的小镇进行交互。在评估中,这些生成式智能体不仅有可信的个人行为,还涌现出一定的社会行为:比如,最开始用户只是为其中一个智能体指定了举办情人节派对的概念,但是它在接下来两天内自动发出了派对邀请、结识新朋友、相互邀约并协商在合适的时机一起出现在派对上。一个智能体由 observation、planning 和 reflection 组成,消融实验证明了其中每个部分都对智能体的可信行为有至关重要的作用。本工作通过将大型语言模型和计算交互式智能体融合,引入了对人类行为进行可信模拟的架构和交互模式。

1. Introduction

如何设计一个表现出可信人类行为的、交互式的人造社会?从类似「模拟人生」的沙盒游戏,到像认知模型(Cognitive Models)和虚拟环境(Virtual Environments)这样的应用,过去四十年的研究人员和从业者不断展望着计算智能体充当可信人类行为的代理。在这些愿景中,计算驱动的智能体根据它们过去的经验行事,并根据环境作出可信的反应。这种对人类行为的模拟有望将真实的社会现象引入虚拟的空间或社区中,这有助于锻炼人们处理罕见但困难的人际关系的能力、测试社会科学理论、为原理和可用性测试设计人类处理器模型(Model Human Processors)、赋能普适计算(Ubiquitous Computing)以及让开放世界游戏中 NPC(Non-Playable Characters)驾驭复杂的人际关系。

然而,人类的行为空间巨大且复杂。目前 LLM 取得了极大进步,已经能够在单一时刻(短暂地)模拟可信的人类行为。但是更复杂的情况是:随着时间的推移,新的互动、冲突和事件不断出现和消退,需要管理不断增长的记忆,并同时处理多个智能体之间展开的级联社会动态(Social Dynamics)。应对这样情况的方法需要:在很长的一段时间内检索(Retrieve)相关的事件和互动;反思(Reflect)这些记忆并概括得到更高层次的推理;应用这些推论以作出对当下和长期都有意义的规划和反应(Plans and Reactions)。

本文介绍了生成式智能体——利用生成模型模拟可信的人类行为,并证明了它们能同时对个人和群体行为进行可信的模拟。生成式智能体会对它们自己、其它智能体以及所处环境进行各种推理;它们制定并执行反应它们个性和经验的每日计划,并在适当的时候调整计划;当终端用户改变它们的环境或者用自然语言给它们下令时,它们会针对性地做出反应。比如,生成式智能体会在看到早饭着火的时候关掉炉子、当浴室被占用时在外等候、遇到另一个更想要交流的智能体时停止正在进行的闲聊。一个充满生成式智能体的社会的特点是涌现出社会动态——新的人际关系的形成、信息的扩散、智能体之间的协作。

为了实现这样的生成式智能体,本文描述了一种使用 LLM 进行存储、合成和使用相关记忆以产生可信行为的智能体架构。这个架构包含三个主要部分。第一个部分是记忆流(Memory Stream),这是一个用自然语言存储智能体完整经历的长时记忆模块。检索模型结合相关性、时近性(Recency)和重要性来挖掘指导智能体即时行为所需要的记忆记录。第二个部分是反思(Reflection),即随着时间推移将记忆合成更高层次的推理。这让智能体能够审视自己和它人,从而更好地指导自己的行为。第三个部分是规划(Planning),这一步将反思得到的推论和当前的环境转化成高级的行动规划,然后不断转化成具体的行动和反应。这些反思和规划会再被反馈到记忆流中,从而影响智能体未来的行为。

这个架构有望应用于从角色扮演和社交原型设计(Social Prototyping)到虚拟世界和游戏的多个领域。在社交角色扮演场景下(如面试准备),用户可以随心演练困难和冲突性的对话。在设计社交平台原型时,设计师可以超越临时角色,转而直接打造随着时间展开的动态的、复杂的交互过程。受到如「模拟人生」这样的游戏的启发,本文的目的在于创造一个规模不大但可交互的智能体社会。通过将本文的架构与 ChatGPT 相连,可以在游戏环境中创造一个拥有 25 个智能体的小型社会。终端用户可以观察并与这些智能体交互。举个例子,用户或开发者想在小镇上举办一个游戏中的情人节派对,传统的游戏环境需要为数十个角色编写行为脚本。如果使用本文的生成式智能体,那么你只需要告诉其中一个智能体它想要举办一个派对就可以了。尽管这中间存在许多可能会导致失败的地方——派对的组织者必须把这个派对的消息告诉其它人;需要出席派对的人必须始终记得有这么一个邀请;即使能够记住这些也必须在派对上露面才行——但是本文的智能体依然成功了。它们相互传播关于派对的消息并且最终现身于此,甚至出现了一个智能体邀请另一个共赴佳约的情况。这一切都源于用户生成的一个种子建议。

作者对生成式智能体进行了两项评估。第一项是受控评估,用来测试智能体是否能独立产生可信的个体行为;另一项是端到端评估,这项评估通过让生成式智能体在两天的时间内进行开放式地相互交互,来了解它们的稳定性和涌现出的社会行为。在技术评估中,作者通过自然语言「采访」智能体的知识和行为来探测它们准确保持个性、记忆、规划、反应和反思的能力。作者观察到这里面每个部分都对智能体拥有出色的面试表现至关重要。在技术性评估和端到端评估中,错误往往出现在以下情况中:智能体未能检索到相关记忆、对智能体的记忆进行了捏造或者从语言模型中继承了太过正式的言语和行为。

本文的贡献如下:

  • 生成式智能体:能够根据不断变化的自身经验和外部环境进行对人类行为的可信模拟。
  • 提出了一种新颖的架构,使得生成式智能体获得记忆检索反思、相互交流以及根据动态变化着的环境进行规划的能力。这个架构利用了 LLM 强大的 prompting 能力,并且补充了额外的能力以支持更长时间的智能体一致性、管理动态进化的记忆以及不断进行更多迭代。
  • 提出两种评估方法(受控评估和端到端评估):用于确立架构中各组件重要性的因果关系以及辨别故障发生的原因(如错误的记忆检索)。
  • 讨论了交互系统中的生成式智能体带来的机遇伦理与社会风险。作者认为应该:(1)对智能体进行调整,以降低用户形成准社会关系的风险;(2)对智能体进行记录,以降低由 deepfakes 和为说服某个人而量身定制方法所带来的风险;(3)在设计时想着让智能体以辅助人类的方式应用,而不是直接取代人类。

2. Related Work

pass

3. Generative Agent Behavior And Interaction

为了使生成式智能体拥有各种具体的能力,作者在一个简单的沙盒世界(让人联想到「模拟世界」)将它们实例化成一个个角色。

3.1. Agent Avatar and Communication

按照设计,一个由 25 个独立智能体组成的社区坐落在一个名为 Smallville 的小镇上。作者用自然语言为每个智能体都编写了一段包括其职业和与其它智能体关系的身份信息,作为种子记忆。比如,John Lin 有如下的描述:

John Lin 是 The Willow Market and Pharmacy 的一名药房店主,并且非常乐于助人。他一直在想法设法让客户更容易获得药品;John Lin 的妻子 Mei Lin 是一名大学教授,他们有一个学习音乐理论的儿子 Eddy Lin,这一家三口目前住在一起;John Lin 非常爱他的家人;John Lin 与隔壁的老夫妇 Sam Moore 和 Jennifer Moore 相识多年;John Lin 觉得 Sam Moore 是一个心地善良的好人;John Lin 知道有叫 Yuriko Yamamoto 和 Carmen Ortiz 的邻居,但以前从未见过他们;John Lin 和 Tom Moreno 是在 The Willows Market and Pharmacy 工作的同事;John Lin 和 Tom Moreno 是朋友,他们喜欢一起谈论当地的政治;John Lin 对 Moreno 一家有些了解——丈夫是 Tom Moreno 妻子是 Jane Moreno。

每个以分号分割的短语都将在模拟开始时输入到智能体的初始记忆中。

3.1.1. Inter-Agent Communication. 智能体通过它们的行动与世界交互,并通过自然语言和其它智能体交流。在沙盒引擎的每个时间步,智能体会输出一段自然语言陈述来描述它们现在的行动,比如「Isabella Rodriguez 正在撰写杂志文章」、「Isabella Rodriguez 正在查看她的邮箱」、「Isabella Rodriguez 正在和她的家人通话」或者「Isabella Rodriguez 正准备上床睡觉」。这种陈述会被转换成影响沙盒世界的具体动作,而动作在沙盒界面中显示为一组表情符号。例如,「Isabella Rodriguez 正在撰写杂志文章」会显示成「 :pencil2:」;「Isabella Rodriguez 正在查看它的邮箱」会显示成「 :email:」。系统使用了一个语言模型来实现这种动作到表情的转换,转换后的表情会显示在每个角色上方的聊天框中。

智能体完全通过自然语言的形式相互交流。智能体知道它们所处的局部区域存在着的其它智能体,架构会决定它们是直接路过还是前去搭话。这里是智能体 Isabella Rodriguez 和智能体 Tom Moreno 关于即将进行的选举进行的谈话的中间一段内容:

Isabella: 我还没太想好,但我一直在与 Sam Moore 讨论选举。你对他有啥想法?
Tom: 说实话,我不太喜欢 Sam Moore。我感觉他有点脱离群众,而且也没有把我们的根本利益放在心上。

3.1.2. User Controls. 用户可以通过对话的形式和智能体交流,或者以「心声」的方式直接向它发出指令。

用户以自然语言的形式,通过为智能体指定其角色,来和它进行交流。例如,如果用户指定它们是新闻记者,并针对即将举行的选举进行提问:「谁在竞选公职?」,智能体 John 的回答是:

John: 我和我的朋友 Yuriko 和 Tom 一直在讨论即将进行的选举,并且讨论了候选人 Sam Moore。我们一致同意投票给他,因为他提供的平台深得人心。

用户可以扮演智能体的「心声」——这使得智能体更有可能将陈述视为指令。例如,当用户将「你将在到来的选举中与 Sam Moore 竞争」以「心声」的方式告诉智能体 John 时,它决定参选并把这个消息与妻儿分享。

3.2. Environment Interaction

Figure 2: Smallville 沙盒世界,其中每个区域都被标注好了。如果把整个世界当成根结点,那么子节点描述了不同的功能区(比如房屋、咖啡馆、商店),叶子结点描述了不同的物体(比如桌子和书架)。智能体没有真正的视觉感知能力,它们需要记住反应它们应该看到的周围的世界的子图。

Smallville 是一个典型的小村庄,拥有着咖啡馆、酒吧、公园、学校、宿舍、房屋和商店。它还定义了使这些空间发挥作用的子区域和物体,例如房屋中有厨房、厨房中还有炉灶(如 Figure 2 所示)。

智能体的移动受到生成式智能体架构和沙盒游戏引擎的指导:当模型指示智能体前往某个位置时,我们会在 Smallville 中计算到目的地的步行路线,然后它会开始移动。此外,用户还能以智能体的身份进入沙盒世界。用户代表的那个智能体可以是已经运行的其中的智能体(如 Isabella 和 John),也可以是未曾来过 Smallville 的外部访客。小镇的居民不会区别对待用户控制的智能体,而是会像之前对待彼此那样。它们能意识到用户扮演的智能体的存在,在形成对它的认知之前,则会与之交互并记住其行为。

用户和智能体能够影响这个世界中的对象的状态,就像沙盒游戏「模拟人生」中那样。比如,当智能体在睡觉时,床会被占用;当智能体耗尽了用于做早饭的原料时,冰箱就将空空如也。用户还可以通过用自然语言重写周围物体的状态,来重塑智能体的环境。比如,当 Isabella 正在做早饭时,用户若想将炉灶的状态由「打开」调整为「着火」,可以通过选择对象并说明其新状态来植入指令,如下所示:「<Isabella’s apartment: kitchen: stove> is burning.」。Isabella 会在下一时刻注意到这个情况、前去关闭炉灶,然后重新做早饭。类似地,如果用户在她进入浴室时将淋浴的状态修改为「漏水」,那么她会去客厅拿上工具然后尝试修复这个问题。

3.3. Example “Day in the Life”

从一段描述开始,智能体会规划它们的日子。时间在沙盒世界中流逝,它们彼此交流并与世界互动。随之而来的是,它们的行为逐渐进化、构筑起记忆和相互之间的关系并且在联合活动中相互协作。

Figure 3: 生成式智能体 John Lin 的在一个早晨的经历。John 在大约 6 点醒来,然后依次完成了刷牙、洗澡和吃早饭。在出门开始他一天的工作之前,他与妻子 Mei 和儿子 Eddy 简单打了个招呼。

我们通过追踪一天内 John Lin 的系统输出,来演示生成式智能体的行为(Figure 3)。在 Lin 的家庭中,John 在 6 点时第一个醒来。他会刷牙、洗澡、穿衣、吃早饭并且在客厅的餐桌上看新闻。在 8 点的时候,Eddy 赶紧从床上蹦起来,准备去上课。在他将要出门时,和 John 简单问候了一下:

John: 早安 Eddy。睡的怎么样?
Eddy: 早上好老爸,睡的还不错哟。
John: 好的,今天打算干点啥?
Eddy: 我正在为班级创作一首新的音乐作品。这周就到截止时间了,所以我要尽力搞定它。但是这个过程让我非常享受!
John: 听起来不错!

在 Eddy 出门后不久,Mei 也醒了并且来到 John 身边。Mei 问起了她的儿子,John 回忆起他们刚才的对话:

Mei: Eddy 已经去上学了吗?
John: 是的,他刚走。他最近在在为他们班写歌。
Mei: 霍,太强了!跟我讲讲呗。
John:我觉得他应该挺享受的,因为他说他很开心。
Mei: 太棒了,为他骄傲。

在他们结束对话后,Mei 和 John 各自收拾了一下。Mei 前去授课和写论文,而 John 则在 9 点之前打开了 Willow Market and Pharmacy 的柜台。

3.4. Emergent Social Behaviors

通过彼此交流,Smallville 中的生成式智能体相互交流,建立新的关系并且在联合活动中进行合作。这些社会行为是涌现出来的,而不是程序提前设计好的。

3.4.1. Information Diffusion. 当智能体注意互相注意到对方时,他们可能会进行对话——这种做法使得信息在智能体之间传播开来。比如,Sam 和 Tom 在杂货店进行过一次对话,Sam 告诉 Tom 他是地方选举的一个候选人:

Sam: 你好 Tom,最近怎么样?
Tom: 挺好的,谢谢。有事吗?
Sam: 是这样,有件事我要告诉你,实际上我正在竞选市长。
Tom: 真的假的?这是个好消息啊!不过为啥呢?
Sam: 其实我这几年一直在参与地方政治,我真的觉得我可以为我们社区带来一些改变。另外,我想提出一些新的想法和理念。

Sam 离开后,当天的晚些时候,Tom 和 John(John 在另一个地方也听到了这个消息)讨论了 Sam 胜选的可能性:

John: 我听说 Sam Moore 要选市长啊,你觉得他能行吗?
Tom: 我真的他觉得机会很大。他一直在社区中努力工作,而且我觉得有很多人会支持他。你觉得呢?
John: 我觉得他参选很好。我很好奇还有谁也参选了,还有最后结果会如何。

渐渐地,Sam 参选的消息成为了小镇的谈资。有人支持他也有人持保留意见。

3.4.2. Relationship Memory. Smallville 中的智能体会随着时间推移行形成新的人际关系,并且会记住它们彼此之间的交流。比如,Sam 在最开始是不认识 Latoya Williams 的,但是他有一次在 Johnson Park 散步时遇到了 Latoya Willams,然后他们相互介绍了自己。Latoya 提到了她正在参与一个摄影项目:「我来这里为正在参与的一个项目拍些照片」。在他们俩后来的互动中,Sam 能够记住这次交流的内容,因为他问道:「你好,Latoya。你的项目怎么样了?」,然后 Latoya 回答了:「你好,Sam。一切顺利!」

3.4.3. Coordination. 生成式智能体会相互协作。在 Hobbs 咖啡馆的 Isabella Rodriguez 初始化的时候被植入了在 2 月 14 日晚上 5 点到 7 点举办一个情人节派对的意图。基于这个种子意图,当智能体在 Hobbs 或者其它地方看到朋友或者顾客的时候,就会对它们发出邀请。接着,Isabella 在 13 号下午为迎接这个派对而装修了咖啡馆。Maira 是咖啡馆的老顾客,同时也是 Isabella 的闺蜜。在她来到咖啡馆后同意了 Isabella 的帮忙一起进行装修的请求。Maria 的角色设定中提到了她暗恋着 Klaus。当天晚上,Maria 邀请了 Klaus 一起参加这个派对,Klaus 欣然接受了。

Figure 4: 在模拟开始的时候,一个智能体被初始化以组织情人节派对。尽管在串联事件链的时候存在许多可能的失败因素——智能体没有根据种子意图行事、忘记通知它人、不记得要准时出席——但情人节派对确实成功举办了,并且大家欢聚一堂。

在情人节这天,5 个智能体——包括 Klaus 和 Maria——在下午 5 点的时候出现在 Hobbs 咖啡馆欢度佳节(见 Figure 4)。在这个场景下,终端用户只需要将 Isabella 的初始意图设置为举办一个派对和暗恋 Klaus:传播信息、进行装修、相互邀约、出席派对并在派对上开展交际这些社会行为则都是由智能体架构发起的。

4. Generative Agent Architecture

生成式智能体旨在为开放世界中的行为提供框架:和其它智能体产生交互并根据环境变化作出反应。生成式智能体将当前的环境和过去的经验作为输入,然后产生行为作为输出。这种行为的基础是一种新颖的智能体架构,它将 LLM 和用于合成和检索相关信息的机制相结合,从而调节语言模型的输出。如果没有这些机制,LLM 也可以输出行为,但这会导致智能体:无法根据过去的经验作出反应,无法作出关键的推断,也无法在长时间内保持一致性。即使是当下性能最强的 GPT-4,也无法应对长期规划和保持一致性的挑战。为了实现这一点,生成式智能体产生的大量事件流和记忆流必须保存下来,因此我们这个架构的一个核心挑战是确保在需要的时候检索并合成智能体记忆中(和当前情况)最相关的记忆片段。

我们的架构的核心是记忆流,这是一个保留智能体完整经历的数据库。架构会从记忆流中检索相关记录,以规划智能体的动作和对环境作出适当反应,同时将记录递归地合成为用于指导行为的更高级别的 observations。在架构中的一切都以自然语言描述的形式进行记录和推理,这让架构可以使用 LLM 来完成这些过程。

我们目前的实验使用了 ChatGPT 的 gpt3.5-turbo 版本。我们希望生成式智能体的结构基础(记忆、规划和反思)随着 LLM 的改进也保持不变。更新的语言模型(如 GPT-4)将进一步提升生成式智能体依赖的 prompts 的表现和性能。

4.1. Memory and Retrieval

挑战:创建可以模拟人类行为的生成式智能体需要对一系列过去的经历进行推理。这些经历的内容远远多于应该在 prompt 中描述的内容,这是因为完整的记忆流可能会让 LLM 找不到重点,甚至这些内容多到根本无法塞进有限的上下文窗口中。现在假设智能体 Isabella 要回答问题「这些天都热衷于干什么?」。先对 Isabella 的所有经历进行总结再填充到语言模型有限的上下文窗口中,得不到什么有意义的响应,因为 Isabella 的经历可能涉及到关于项目合作的讨论以及咖啡馆的保洁和管理。 相反,记忆流不是进行总结,而是直接呈现相关的记忆。这样能得到更有意义和具体的回答(提到了 Isabella 热衷于让人们感到受欢迎和被接纳、策划活动并营造令人愉悦的氛围,比如情人节派对)。

方案:记忆流保存了智能体的完整经历。这是一个记忆对象的列表,其中每个对象包含自然语言的描述,创建的时间戳以及最近访问的时间戳。记忆流最基本的元素是 observation,这是一个智能体直接感知到的事件。常见的 observations 包含智能体自己进行的行为,或者智能体感知到的其它智能体或非智能体对象进行的行为。比如,在咖啡馆工作的 Isabella Rodriguez 可能随着时间流逝积累如下 observations:(1)Isabella Rodriguez 正在布置糕点;(2)Maria Lopez 一边喝咖啡一边在准备化学考试;(3)Isabella Rodriguez 和 Maria Lopez 讨论着在 Hobbs 咖啡馆举办一个情人节派对;(4)冰箱空了。

我们的架构实现了一个检索方法:输入智能体当下的处境,返回一个记忆流的自集,然后往后传给 LLM。检索方法存在多种可能的实现,这取决于智能体认为哪些事情是对作出行动比较重要的。在我们的上下文中,我们聚焦于 3 个主要因素,它们共同作用以产生有效的结果。

时近性(Recency)为最近访问的记忆对象分配一个更高的分,使得刚才或今早发生的事情很可能留在智能体的注意力范围内。在我们的实验中,时近性被设计成一个自上次检索记忆以来根据沙盒游戏内小时数呈指数衰减的函数,衰减因子为 0.99。

重要性(Importance)通过为智能体觉得重要的记忆对象赋予更高的得分,将关键记忆和普通记忆区分来开。比如,像在房间内吃早饭这样一件平凡的事情可能会得到一个较低的重要性得分,但是和另一半分手这件事则会有一个较高的得分。重要性评分也会有多种可能的实现方式;我们发现直接让 LLM 来输出一个整数是有效的。完整的 prompt 如下所示:

在 1 到 10 的范围内,其中 1 是完全普通的(例如刷牙和整理床铺),10 是非常深刻的(例如分手和大学录取),请评估以下记忆片段可能的深刻程度:
记忆:在 The Willows Market and Pharmacy 买杂货
等级:

这个 prompt 对于「打扫房间」会返回整数 2,而对「与你的暗恋对象约会」则返回 8。重要性得分会在记忆对象创建的时候生成。

相关性(Relevance)为与当前情况紧密相关的记忆对象分配一个更高的得分。举个例子,如果 query 是一个学生正在和同学讨论化学考试的内容,那么关于他们早餐的记忆对象应该和这件事有较低的相关性,而关于老师和功课的记忆对象应该具有较高的相关性。在实现中,我们使用语言模型为每个记忆的文本描述生成一个 embedding,然后计算记忆 embedding 和 query embedding 的余弦距离作为相关性。

为了计算最终的检索得分,我们用 min-max scaling 将时近性、重要性和相关性都归一化到 [0, 1] 之间。检索时会将上述三个元素进行加权求和作为每条记忆的最终得分:在我们的实验中,所有的权重都设为 1。排名靠前的记忆会被填入 prompt 中,然后送到语言模型的上下文窗口中。

4.2. Reflection

挑战:生成式智能体在仅使用原始 observation 时,很难作出概括或者进行推理。考虑这样一个场景,用户问 Klaus Mueller:「如果你必须在你认识的人里面挑一个一起度过一个小时,你怎么选?」。如果只能访问这些原始 observation,那么 Klaus 会直接选择和他互动最频繁的那个人:Wolfgang(他的大学室友)。不幸的是,Wolfgang 和 Klaus 只是经常在对方路过的时候会看到对方,但其实没有过深的交情。更理想的响应要求智能体对 Klaus 花费大量精力在研究项目上的记忆进行概括,以得到 Klaus 对研究充满热忱这个更高层次的反思,并且同样认识到 Maria 在她自己的研究中(虽然是不同的领域)也付出了努力,这反应出它们可能有共同的兴趣。在第二种方法下,当 Klaus 被问到希望和谁度过时光时,Klaus 会选择 Maria 而非 Wolfgang。

方法:我们引入了第二种类型的记忆,叫做反思(Reflection)。反思是智能体生成的更高级别、更抽象的思维(Thoughts)。由于反思也是一种记忆,因此检索时也会将其包含在在 observations 中。反思是周期性生成的;在我们的实验中,当智能体感知到的最新事件的重要性分数总和超过某个阈值时,就会形成反思。实际上,智能体每天会反思大约两到三次。

反思的第一步是根据智能体最近的经历确定可以提出的问题,从而确定要反思的内容。我们使用智能体记忆流中的最近 100 条记录(如「Klaus Mueller 正在阅读一本关于中产阶级的书」、「Klaus Mueller 正在与图书馆里员讨论他的研究项目」、「图书馆的办公桌被占用中」等)构造 prompt 来询问 LLM:

仅考虑上述信息,我们可以回答关于陈述中主题的3个最突出的高层次问题是什么?

模型的响应生成了候选问题:例如「Klaus Mueller 热衷于什么话题?」、「Klaus Mueller 和 Maria Lopez 的关系是什么?」。我们使用这些生成的问题作为 query 以进行检索,然后为每个问题收集相关的记忆(也包括其它反思)。接着我们通过 prompt 让语言模型进行感悟(insights)并引用特定的记录,这些记录视作感悟产生的依据。完整的 prompt 如下:

关于 Klaus Mueller 的陈述

  1. Klaus Mueller 正在写科研论文
  2. Klaus Mueller 喜欢看关于中产阶级的书
  3. Klaus Mueller 正在和 Ayesha Khan 讨论锻炼身体 [ … ]
    关于这段陈述你能推断出哪 5 个高层次的感悟?(示例格式:感悟(因为 1, 5, 3))

这个过程会生成像「Klaus Mueller 全身心投入在他对中产阶级的研究上(因为 1, 2, 8, 15)」这样的陈述。我们对它进行解析并以反思的形式存储在记忆流中,包括指向被引用的记忆对象的指针。

智能体不仅在 observations 上进行反思,还会基于其它反思结果进行进一步的反思:比如,上面关于 Klaus Mueller 的第二个陈述是他之前的反思,而不是他在环境中直接观察到的 observation。最终,智能体生成了反思树:叶子结点代表基本的 observations,而非叶子结点代表了思维。随着非叶子结点的高度变高,它所代表的思维也越抽象越高级。

4.3. Planning and Reacting

挑战:虽然 LLM 可以根据情境信息生成看上去合理的行为,但是智能体需要在更长的一段时间轴上进行规划以确保它们的行为序列的一致性和可信程度。如果我们将 Klaus 的背景作为 prompt,描述时间,然后询问语言模型他在给定的时刻应该干什么,那么可能的后果是 Klaus 在中午 12 点的时候吃了一次午饭,但是12.30 的时候再吃一次。优化此刻的可信性牺牲了长时的可信性。为了解决这个问题,规划非常有必要。在规划下,Klaus 不再那么贪吃:他会在 Hobbs 咖啡馆边吃午饭边看书,下午 1 点在学校图书馆写论文,然后下午 3 点在公园散步。

方法:规划描述了智能体未来的行为序列并且帮助保持其行为在时间维度上的一致性。一个规划包含地点,开始时间和持续时间。比如,「全神贯注于研究」的 Klaus Mueller 在「迫在眉睫的最后期限」下,可能选择整天都在办公桌前奋笔编写论文。规划的其中一条内容可以更好地说明,比如,「从 2023 年 2 月12 日上午 9 点开始,在Oak Hill 大学的宿舍:Klaus Mueller 的房间:桌子,为研究论文阅读并记笔记」。类似反思,规划也存储在记忆流中,并且可被检索。这使得智能体在决策如何行动时,可以综合考虑观察、反思和规划。智能体在必要的时候会中途改变它们的规划。

规划一个画家智能体在药房柜台一动不动地坐 4 个小时是不现实的,也非常无聊。一个更理想的规划是让它在家工作的四个小时内花一些必要的时间去收集物料、调颜料、休息以及清洁打扫。为了创建这样的规划,我们的方法自上而下递归地生成更多细节。第一步是粗略地制定一个概述当天行程的计划。为了创建初始计划,我们将智能体的摘要性描述(如姓名、特点和最近经历的概括)以及前一天的摘要作为语言模型的 prompt。一个完整的 prompt 示例如下,最下面的续写部分交给 LM 完成:

姓名: Eddy Lin (age: 19)
性格:善良、外向、好客
Eddy Lin 是一个 Oak Hill 大学攻读音乐理论与作曲的学生。他热衷于探索不同的音乐风格,并且一直想方设法提升知识水平。Eddy Lin 正在为他的大学班级创作。同时,他也积极上课以学习音乐理论。Eddy LIn 对他正在创作的新作品感到非常兴奋,但他也想在接下来几天内花更多时间来完成它。
在 2 月 12 日,Eddy(1)早上 7:00 醒来并完成了例行事务,[ … ](6)在晚上 10 点左右准备入睡
今天是 2 月 13 日周三。这里是 Eddy 今天粗略的规划:(1)

这生成了智能体一天规划的大致构想,可以分为 5 到 8 条:

(1)在早上 8 点起床并完成晨间例事
(2)去 Oak Hill 大学然后从 10 点开始上课
[ … ]
(5)从下午 1 点到 5 点创作他的新音乐作品
(6)在下午 5.30 吃完饭
(7)完成学校的作业然后在晚上 11 点上床睡觉

智能体会将这个规划保存在记忆流中,然后递归地对它进行拆解以生成更精细的行为。首先按小时级进行拆解:「从下午 1 点到 5 点创作他的新音乐作品」的计划变成:

下午 1:00: 从对音乐创作进行头脑风暴开始
[ … ]
下午 4:00: 短暂的休息一下并且在检查和润色他的作品之前恢复一下创造力

我们接着再对上述计划拆解成 5 - 15 分钟的级别,比如:

下午 4:00: 吃点零食,比如水果、燕麦棒或者坚果
下午 4:05: 在工作地附近逛一逛
[ … ]
下午 4:50: 花几分钟时间收拾一下工作区

这个过程是可以调整的,以匹配理想的粒度。

4.3.1. Reacting and Updating Plans. 生成式智能体不断执行着动作。在每个时间步,他们感知周围的世界,并将观察到的结果记录在记忆流中。我们将这些 observations 作为 prompt,让语言模型决定智能体应该继续遵循既定的计划,还是作出反应。比如,站在画架前进行绘画可能引发关于画架的 observation,但这不意味着需要作出特别的反应。但是,如果 Eddy 的父亲 John 看到 Eddy 在自家花园散步,那么情况就不一样了。下面是 prompt 的内容,[Agent‘s Summary Description] 代表动态生成的、长长的一段关于智能体目的和处置的摘要,这在 Appendix A 中进行了描述:

[Agent’s Summary Description]
现在是 2023 年 2 月 13 日下午 4:56。
John Lin 的状态:John 早早下班回家。
Observation: John 看到 Eddy 在他的工作地点附近散步。
John 记忆中相关上下文的摘要:Eddy Lin 是 John 的 Lin 的儿子。Eddy Lin 一直在为他的班级创作音乐。Eddy Lin 喜欢在思考或听音乐时在花园里走来走去。
John 应该对这个 observation 作出反应吗?如果是的话应该作出什么反应?

记忆中相关上下文的摘要是通过如下方法得到的:根据两个模版「[观察者] 和 [被观察实体] 的关系是什么」和「[被观察实体] 正在 [被观察实体的动作状态]」构造 query,在记忆中进行检索,然后总结在一起。针对上面的例子,语言模型的输出为「John 会考虑向 Eddy 询问关于他的音乐创作项目的事情」。接着我们从这个反应发生的时间开始,重新生成智能体现在的规划。最终,如果动作预示着智能体之间的交互行为,我们会生成他们的对话。

4.3.2. Dialogue. 智能体在交互时会进行对话。我们根据他们对彼此的记忆来调节他们说的话,以实现智能体间的对话。例如,当 John 开始与 Eddy 对话时,我们通过使用他对 Eddy 的记忆摘要以及当他决定向 Eddy 询问他的作曲项目时的预期反应来生成 John 的第一句话:

[智能体的简要描述]
现在是 2023 年 2 月 13 日下午 4:56。
John Lin 的状态:John 早早下班回家。
Observation: John 看到 Eddy 在他的工作地附近散步。
John 记忆中相关的上下文摘要:Eddy Lin 是 John Lin 的儿子。Eddy Lin 一直在为他的班级创作音乐。Eddy LIn 在思考和听音乐的时候喜欢逛花园。
John 正在询问 Eddy 他的音乐项目的情况。他可能会对 Eddy 说什么呢?

返回的结果是:

嗨,Eddy。你们班的音乐创作项目进展如何了?

对于 Eddy 来说,John 向他发起对话这件事可能是需要回应的。因此,正如 John 所做的那样,Eddy 回忆了他和 John 的关系以及他们的上一次对话。如果他决定作出回应,我们会对他的记忆和当前的对话历史进行总结:

[智能体的概述]
现在是 2023 年 2 月 13 日下午 4:56。
Eddy Lin 的状态:Eddy 正在他工作地附近散步。
Observation: John 发起了和 Eddy 的对话。
Eddy 记忆中相关情境的汇总:John Lin 是 Eddy Lin 的父亲。John Lin 关心 Eddy Lin 的学业并且想多了解一些。John Lin 知道 Eddy Lin 正在进行音乐创作。
这是对话历史:
John: 嗨,Eddy。你们班的音乐创作项目进展如何了?
Eddy 可能如何回答 John?

这样可以生成 Eddy 的回答:

嗨,老爸。一切顺利。我在这个花园走走,放松下头脑顺便找找灵感。

后续的对话都会使用相同的机制来生成,直到两人中的一方决定结束对话。

5. Sandbox Environment Implementation

Smallville 沙盒游戏的环境使用 Phaser 网页游戏开发框架搭建。包括我们创作的精灵(Sprites,游戏编程中的一个概念)、智能体形象、环境地图以及碰撞地图(Collision Map)都被导入到 Phaser 中。

我们辅以沙盒开发框架一个服务器,使生成式智能体能够获取信息、移动和影响沙盒环境。服务器维护一个 JSON 数据结构,其中包含了沙盒世界中每个智能体的信息(它们当前的位置、当前行为的描述以及正在与哪个对象交互)。在每个沙盒时间步,服务器会解析 JSON 来获取生成式智能体的任何变化、将它们移动到新的位置和更新正在与智能体进行交互的对象的状态(例如,如果智能体的动作是「为顾客制作意式浓缩咖啡 @ Hobbs 咖啡店: 柜台: 咖啡机」,则将咖啡机的状态从空闲调整为正在煮咖啡)。沙盒服务器还负责将每个智能体视线范围内的其它智能体和对象存入这个他的记忆中,使这个智能体能做出合适的行为。智能体的输出动作接着会更新 JSON,并且整个过程会在下一时刻重复。

终端用户通过一段简短的自然语言描述初始化一个新的智能体,正如 3.1 节介绍的那样。在我们的实验中,我们将这个以分号分隔的人物特征切成一系列记忆作为决定智能体行为的初始记忆。这些初始记忆只是最初的起点:随着智能体在沙盒世界中获得获得更多经历、记忆流接受着更多记录,智能体的概述和行为也将随之演变。

5.1. From Structured World Environments to Natural Language, And Back Again

生成式智能体架构运行于自然语言之上。因此,我们需要一种机制将智能体的推理置入沙盒之中。为了实现这一点,我们将沙盒环境——区域和对象——表示为树结构,树中的边表示包含关系。我们将这棵树转换成自然语言的形式然后传给生成式代理。例如,「炉灶」是「厨房」的子项,可以表达成「厨房中有一个炉灶」。

智能体在探索世界的时候会基于周围环境构建一棵独立的树——完整沙盒环境树的子图。我们使用环境树初始化每个智能体,该树包含了智能体应该注意的空间和对象:它们的住处、工作场所、经常光顾的商店和商店中的货架与商品。当智能体探索沙盒世界的时候,它们会更新这棵树以体现新感知到的区域。智能体没有上帝视角:它们的环境树可能会在它们离开某个区域后过时,直到再次进入才会更新。

为了确定每个动作的合适位置,我们遍历智能体存储的环境树并将其中的一部分展开为自然语言以作为语言模型的 prompt。从智能体环境树的根部开始递归,我们通过 prompt 让模型找到最适合的区域。比如,如果 Eddy 表示它应该在工作地附近散步:

[智能体的概述]
Eddy Lin 目前正在 Lin 家的房子: Eddy Lin 的卧室: 书桌),家中有Mei 和 John Lin 的 卧室,Eddy Lin 的卧室,公共休息室、厨房、浴室和花园
Eddy Lin 知道以下区域:Lin 家的房子、Johnson Park、Harvey Oak Supply Store、The Willows Market and Pharmacy、Hobbs Cafe、The Rose and Crown Pub

  • 如果活动可以在此处进行,则偏向于留在当前区域
    Eddy LIn 正打算在工作的地方附近转转。他应该去哪个区域?

语言模型的输出结果是:「Lin 家的房子」。然后我们用相同方法递归地决定所选区域内适合的子区域,直到我们到达智能体环境树的叶子结点。在上面的例子中,最终的结果是 Lin 家的房子: 花园: 宅院。可以使用传统的游戏路径算法将智能体移动到叶子结点所表示的那个地方去。

当智能体对某个对象执行动作时,我们用 prompt 询问语言模型对象的状态发生了什么。比如,如果 Isabella 输出「为顾客制作浓缩咖啡」的动作,语言模型的回答是表明咖啡机的状态应该从「关闭」变成「正在煮咖啡」。

from:《Generative Agents: Interactive Simulacra of Human Behavior》论文阅读——文明也要涌现了? - 知乎