在 Roblox 中探索自主 Agent
文章目录
前言
详细的中央规划是不可能的,甚至都不要去尝试。 – 《栖息地: 来自一个在线社区的报告》
近期, 我们(DynaLab)在 Roblox 中探索自主 Agent。
我们想把自主 Agent 引入像 Habitat(栖息地) 这样的虚拟世界, 让自主 Agent 与人类玩家一同生活,彼此影响。
LLM 提供了一个构建自主 Agent 有前途的方向。
以 LLM(大型语言模型)为核心控制器构建 Agent 是一个很酷的概念。AutoGPT、GPT-Engineer 和 BabyAGI 等概念验证演示,都是鼓舞人心的例子。LLM 的潜力不仅限于生成流畅的文本、故事、论文和程序;它也可以被视为一个强大的通用问题解决器。 –LLM 驱动的自主 Agent
Agent 是什么
在计算机科学领域,“Agent”(代理、智能体)通常指一种具有自主行为和决策能力的实体,能够感知环境并采取行动来实现其预定的目标。 – ChatGPT: Agent in Computer Science
在人工智能(AI)中,智能 Agent(IA) 是以智能方式行事的 Agent;它感知环境,自主采取行动以实现目标,并可以通过学习或获取知识来提高其能力。 –wikipedia: Intelligent agent
AI 社区对 Agent 有着长期兴趣(Intelligent agent)。
我们对马文·明斯基(Marvin Minsky)在《心智社会(Society of Mind)》一书中提到的架构尤为感兴趣: 智能从这些彼此独立,相互协作的 Agent 构成的 “心智社会” 中涌现出来。
Agent 是思维中的任一组件或程序,它自身非常简单,容易理解, – 马文·明斯基 《心智社会》
斯坦福小镇(Generative Agents) 与 批处理风格
在我们开始的时候, 斯坦福小镇(Generative Agents)论文 刚发布不久, 它立刻引起了 AI 社区和大众媒体的广泛讨论。
25 个生成式 Agents 共同生活在一个小镇上。 它们清晨醒来、享受早餐然后进行工作: 画家画画、作家写作…它们独立思考、相互观察、彼此交流, 它们善于反思…
这些生成式 Agent 不仅有可信的个人行为,还涌现出一定的社会行为:比如,最开始用户只是为其中一个智能体指定了举办情人节派对的概念,但是它在接下来两天内自动发出了派对邀请、结识新朋友、相互邀约并协商在合适的时机一起出现在派对上。
这篇论文发布时,源代码并未立即公开(目前已经开源)。当时社区里不少人试图复现它,如Generative Agents in LangChain。
起初, 我们也想复现它, 经过几次讨论,我们发现论文中的场景,实质上是一种“批处理风格”(我们也称其为"录制"风格): 完成"初始设置"之后, 游戏就一帧一帧生成,最后输出一部可供观赏的电影。
这样做的好处是明显的: LLM(大语言模型)实时性不好,且有访问速率限制。批处理风格可以做到逐帧生成游戏画面,不论每一帧实际花费了多少时间。即使中间发生意外,也可以修复后再发布。假设同一帧里有 10 个人,他们按顺序调用 LLM ,一共花了 1 分钟。采用批处理风格,可以把这 1 分钟里发生的 LLM 调用,收集起来,放到游戏的同一帧里。批处理的过程用户看不到,用户看到的是最终的漂亮作品。
我们不想要这种"批处理风格",而想要"实时行动和交互式的 Agent"。 类似于恩格尔巴特发明的"交互式图形界面"那样的东西。
于是我们放弃了复现 “斯坦福小镇”, 但这篇文章依然给了我们深刻的印象(观察、规划和反思)。
冒险之旅
你期待结束旅程的你,不再是出发时的自己
游戏环境
“斯坦福小镇” 论文 中游戏环境使用 phaser 构建。 这是一个 2D 游戏框架,运行在浏览器里。
由于我们之前在 Croquet 上工作,我们渴望在 3D 环境里构建虚拟世界。
Minecraft 和 Roblox 成为两个备选项。为了获得更高的自由度,我们决定采用 Roblox。
智能的幻觉
我们实际上必须认为思维所做的所有事都是无意识的。 – 马文·明斯基《心智社会》
Alan Kay 在 计算机软件 中提到, “图形用户界面(GUI)” 是一种幻觉。 对于用户而言,呈现在他们感官上的东西就是他们的计算机。这种幻觉可以帮助用户理解和猜测系统的行动和接下来应该做什么。
我们想在 Roblox 中构建自主 Agent 的幻觉: 它以游戏角色的形象出现在 Roblox 游戏场景中,拥有记忆、感知和决策能力。以一个整体的形象出现在用户面前: 一个拥有自主行动能力的游戏角色。
Roblox 是我们临时的计算环境,长期来看,我们想要将自主 Agnet 集成到个人计算环境中,这便是我们构建智能幻觉的原因: 我们希望将它用作一种交互界面,用于增强用户的心智力量。
让简单的事情保持简单,让困难的事情变得可能 – Alan Kay
狼来了
“自主 Agent +游戏” 这个方向有不少探索者:
- Inworld: Bring games to life with AI NPCs
- NVIDIA ACE for Games
- Central Casting AI: Cast your next game with Central Casting AI
- Unity AI
- Lumari
- MineDojo: building Open-Ended Embodied Agents with Internet-Scale Knowledge
- …
我们最初不知如何切入这个方向, “在 Roblox 中探索自主 Agent”, 听起来是一个定义相当模糊的目标。
由于缺少在游戏领域的工作经验,我们打算以一个简单的场景开始: 狼来了
《狼来了》是《伊索寓言》中的一则故事:
故事发生在一个小镇,一天,父亲让小男孩去放羊。他感到无聊,便以撒谎取乐。经常喊叫“狼来了”,引起村民们的注意。看着村民们因虚假的警报奔跑而来,他自己则在笑声中躲藏起来。
由于他频繁撒谎,村民们不再相信他的话。有一天,狼真的来了,袭击羊群。男孩大呼 “狼来了”,但这一次,没人相信他…
我们希望 AI 驱动的角色们,能够协同表演这个故事场景。
可是我们发现故事性和自主性似乎会导致冲突,当我们渴望角色按照剧本演戏的时候,它的自主性就不强。当我们希望它自主性强的时候,它就不一定会遵从剧本。
我们没有解决这个问题,而是消除了这个问题: 我们意识到,故事主要作为一种脚手架,帮助我们起步,给予我们可供讨论的角色,告诉我们游戏场景大致如何… 有了这些基本设定,就可以开展工作了。 一旦起步之后,故事就不再重要。 我们希望,随着事情的进行,会出现一些意料之外的行为(但要可信),而不是束缚于原本的剧情。
和"斯坦福小镇"一样,狼来了的故事也发生在一个小镇。
小镇
我找来老家小镇的的地形图:
@David 据此构建了最初的游戏世界:
不久他又往里添加了游戏角色、屋舍、动物、昼夜生长的农作物、随风飘舞的花草…
Roblox 开箱可用性非常棒. 不到一周时间,我们就有一个体面可用 3D 游戏环境了!团队成员可以通过化身(Avatar)一同进入这个虚拟世界,在田间山头展开讨论,规划门要如何摆放,树要种在哪里,河的上游有座桥坏了得修一下…
从 NPC 到 AIC 和 NAIC
在这个项目的场景下,我们想要实现由 AI 操控的角色,于是我们对角色的种类进行了更加细致的区分。
- NPC - Non-player character,是游戏设计里常用的术语,用于形容非人类玩家操控的角色
- AIC - Artificial Intelligence Character,人工智能角色,比如故事里面的村民
- NAIC - Non-Artificial Intelligence Character,非人工智能角色,比如故事里面的狼和羊
AIC 和 NAIC 都无法被人类玩家直接控制, 所以都属于 NPC 的一种。
AIC 的能力
从技术方面我们想要探索自主 Agent 的可能性,而通过自主 Agent 方面的工作我们想要实现具有高度拟人性的非人类玩家角色。
这意味着 Agent 需要具备玩家角色具备的行为以及能力。
这方面的工作的实施主要有两个部分:
- 在表现层 - Roblox 环境内实现 AIC 角色的能力以及动画
- 将 Roblox 环境里面实现的能力以及环境内的信息反馈与 LLM 对接,从而使 LLM 可以通过这些能力操控 Roblox 里面对应的 AIC 以及理解 Roblox 内部发生的事情
这个部分会主要讲解在 Roblox 环境内 AIC 角色能力的类别以及实现。关于 Roblox 环境与 LLM 的对接会在后文讲解(DynaTalk)。
对话功能
对话功能是我们在 Roblox 中最初实现的功能之一,它很简单,Roblox 游戏引擎中包含了主要功能。
在 Roblox 游戏引擎内,所有的角色都属于 Humanoid
,可以直接使用 Roblox 自带的文字对话功能 - game:GetService("Chat")
。
该功能会将玩家或者 LLM 输入的文本以文字冒泡的形式显示在对应角色的头顶上:
角色的基本控制
在一般 3D 游戏场景下,玩家控制的角色还具备移动、跳跃等基本控制能力。
为了能使 AIC 的行为更加接近真实玩家所操控的角色,我们也将 Roblox 内原本带有的角色控制的功能进行了封装和适配。
Roblox内的 Humanoid
可以使用 MoveTo(x, y, z)
来将角色移动到指定的坐标;其他还包括 Jump
来进行跳跃、LoadAnimation(animation)
来控制角色的动作。
同时还具有自动寻路的模块 game:GetService("PathfindingService")
。环境内还具有对不同路面材质的判断功能,比如草、泥地、平地等等,假如我们希望 AIC 尽量不走泥地,我们可以在寻路模块内进行对应的调整:
感官能力
为了让 LLM 知道 Roblox 内部发生的事情, 从而能对事件进行反应,AIC 还要具备感官能力,比如视觉和听觉。
在这个方面,Roblox 本身并没有带有完整的感官信息模拟的模块。
在听觉方面我们利用了Roblox内部的 Event
的功能来实施。比如,当一只羊被狼吃掉的时候游戏引擎的后端会将这个事件广播给处在这个事件坐标附近的 AIC,然后接受到这个事件的 AIC 会再将这个事件转发给LLM从而实现对听觉感官的模拟。
在视觉方面我们使用了 GetPartsBoundsInBox(box, size, ...)
的功能。这个功能可以获取在3D环境内定义的一个三维空间内的所有模型(比如环境内的房子,工具,其他AIC也属于模型)。我们将该三维空间设计成类似人类视觉范围的锥形并将其坐标设为跟随 AIC 角色头部朝的方向,这样一来AIC可以获取视觉范围内所有的模型同时将这些模型反馈给 LLM。
交互能力
这个能力包括 AIC 对 Roblox 环境内其他模型的操作。比如,将门打开或者关闭、拿起或者放下工具等等。
由于 Roblox 本身并不是为了自主 Agent 而设计的,这方面的功能 Roblox 官方并没有进行太多的实现。于是我们借鉴了“模拟人生”(sims)内部的机制给 Roblox 内 AIC 可以操控的模型和工具附加了属性和状态并给予 AIC 改变这些属性从而改变模型状态的能力。最终实现了 AIC 的交互能力。
bootstrapping 研究方式
这种走到游戏中去规划游戏世界的体验,我们非常熟悉,它很像个人计算环境(Scratch、MicroBlocks、Squeak、Etoys、Lively…)。我们想到个人计算社区偏好的 bootstrapping 研究方式: 生活在自己构建的系统里,持续改进它。Smalltalk 背后的设计原则对此有更好的表述:
- 在当前系统内构建一个应用程序(进行观察)
- 根据经验,重新设计语言(形成一种理论)
- 基于新设计构建新系统(做出可测试的预测)
这是恩格尔巴特发明交互式图形界面的方式; Alan Kay 团队在施乐实验室,构建 Smalltalk 的方式; 也是 Bret Victor 在 Dynamicland 里构建 Realtalk 的方式。bootstrapping 研究方式在计算机历史上产生了许多有趣成果。
我们之前在 CodeLab 也学习这种工作方式: 生活在自己构造的系统里。通过这种方式,我们构建了 CodeLab Adapter 和 Neverland。
由于过去在个人计算领域的工作经验,我们渴望在一个高度灵活可塑的计算环境里工作。我们打算先建造一些基础设施来支持我们更好的做事。
基础设施
我们需要先造出一个合适的筏子,这样我们就可以一边学习航海,一边设计一艘船。我们将设计出正确的船,因为它是我们将要居住的船 … 创造工具,以便于创造更好的工具 – David Smith AR/VR 为何将获胜?它将如何获胜为何重要?
很快我们的愿望清单上就出现了两个基础设施:
- DynaBrain
- DynaTalk
起初我们打算以 DynaBrain(“大脑”) 为中心,大脑以 LLM(大型语言模型)为核心控制器。Roblox 中的角色像是一个木偶,每个角色都有对应的大脑在幕后提着线操控它。架构上,我们把 Roblox 看作视觉表现层。为这个木偶赋予灵魂的则是 DynaBrain。
起初的架构图是这样的:
更精细的版本:
“起初的架构图” 和 ReAct 论文 展示的架构很相似。
很自然地,我们打算采用 LangChain 作为 DynaBrain 的核心。 LangChain 作者好像提过, LangChain 项目最初是为了复现 ReAct 论文的想法。
在思考 DynaBrain 如何设计的同时,我们也在考虑架构的其他部分。我们需要回答的一个关键问题是: 系统的不同部分如何协同工作?
构建优秀且可扩展的系统的关键更多的是设计模块之间如何通信,而不仅仅是设计其内部属性和行为。 – Alan Kay
如何让 LLM 驱动的 “大脑” 与 Roblox 环境中的角色 “身体” 协调起来? 我们最初想在身体里安装一个通信组件,临时叫做 dynabrain adapter
。 这个名字反映了我们以大脑为中心的想法。
我们不想在 Roblox 中构建大脑(理论上行得通),而把 Roblox 当作临时计算环境,未必是最终的计算环境。我们希望从探索中得到一些通用的架构组件,未来可以在各种地方使用它(我们最终得到了!)。
即便我们弱化了 Roblox 计算环境的职责,它依然有一些不令我们满意的地方,其中最重要的一点是: Roblox 不容易与其他系统进行双向通信,Roblox 社区里没有令我们满意的解决方案。我们最终动手打造了自己的方案。这个话题,会在另一篇文章里单独讨论,我们相信它对 Roblox 社区有独特的价值。
有一天,@hidaris 在工作小组提议说:
我比较期待 dynabrain adapter 能够被设计成一个基于消息的行为协调组件,它本身不关心两边是 Roblox,还是 Langchain。
它能够像 realtalk 那样, 即使后面技术或者产品形态有一些调整,也可以持续作为项目的基石? 或者说我们有没有必要在这里设计一个 dynatalk 这样的东西?
DynaTalk
- 一切都是对象
- 对象通过消息进行沟通
- 对象解释它所理解的消息
我们对 Agent 协同工作的"心智社会"感兴趣。希望 Agent 之间的耦合足够低,Agent 们能够自由加入和退出系统,它们能够发现彼此并协同工作,这个系统要足够灵活和健壮,而且是动态生长的,最好像互联网一样…
这些愿望把我们带向了消息传递(Message passing)架构。
我们关心的是在对象之间发送消息(通信行为而非表现)的协议 – 《栖息地: 来自一个在线社区的报告》
差不多就在这时,我们在 Github 上发现了 agency, 它刚起步,足够小巧,以至于可以将它捏造成任何我们想要的形状; 它又足够完整,具备了大多数我们想要的特性。
我们喜欢这个采用 Actor 模型 的 Agent 框架。打算基于它来构建 DynaTalk。很快我们就开始在开源社区为它贡献代码,成为这个项目的主要贡献者之一,并与作者围绕消息结构等关键问题展开讨论。
Actor 模型
Agent 的概念可以追溯到 Hewitt 的 Actor 模型(Hewitt,1977)—— “一个独立的、交互式的、并发执行的对象,拥有内部状态和通信能力”。 –Software agent
引自维基百科的这段话,很好说明了为何我们想要基于 Actor 模型的 Agent。
我们希望 Agent 拥有这些特性:
- 能够接收外部信息(事件)
- 能够与其他 Agent 通信
- 拥有独立的生命进程
这样的系统不可能是集中式的,得是分布式的。Actor 模型正是我们需要的。 一个 Actor 可以:
- 响应收到的消息
- 发送消息
- 创建更多 Actor
如此简单、干净、正交 !
OOP(面向对象) 对我来说仅意味着消息传递、局部保留、状态过程的保护和隐藏,以及所有事物的极端晚绑定(late-binding) – Alan Kay
Actor 模型 与 Alan Kay 对 OOP(面向对象)的看法非常相似。 他对 Actor 模型的最著名实现–Erlang 语言表示赞赏,Alan Kay 曾与 Erlang 作者 Joe Armstrong 有过一段对话 Joe Armstrong & Alan Kay。
马文·明斯基构想 Agent 组成的"心智社会", Alan Kay 构想对象构成的可生长系统,Joe Armstrong 构想能够对抗失败的编程语言… 他们有许多共同的上下文,以至于 Agent、Object、Actor 看起来像同一个东西的不同侧面。
我们认为 Actor 模型是构建 Agent 的正确计算模型。
于是,我们得到 Actor 风格的架构设计:
消息传递架构的回报
基于消息传递的新架构,很快让我们尝到了甜头.
有了新的架构,我们开始对整个系统进行重构,之前想不明白的许多问题,现在变得容易了,这得益于消息传递机制的灵活性。基于 Actor 的 Agent, 和 Alan Kay 的对象一样, 它是"递归的计算机",局部拥有整体的所有能力。许多问题,我们不再需要一开始想明白,可以推迟机制方面的决策(晚绑定), 这让我们得以在不确定中前进。
我们之前难以解决的问题有两个,其一是 DynaBrain 的"生命周期问题"; 其二是与 Roblox(Studio) 的双向通信问题。在新的架构下,它们都变得没那么困难。
有一个周末,为了实现第二个里程碑,@hidaris 基于 DynaTalk 的消息架构重构 DynaBrain。我当时想要一些基础设施来提高开发效率。于是花了半个上午的时间,完成了 Roblox 模拟器、Roblox 双向消息转发器。 模拟器和双向消息转发器让我们看到消息传递的强大能力: 我们可以在集成调试中,随时停下来查看消息,拦截它,再播放它,这仿佛我们可以操控系统逻辑时间(进程在逻辑时间中演进)。我们可以在系统层面上打断点,所需的一切工作都只是摆弄消息!
之后 @hidaris 与我讨论 DynaBrain 基于消息传递的设计时,我提到模拟器和转发器,他说这正是他想让我做的,结果我已经做出来了!
基于消息传递的架构,也让我们很快得到期待很久的另一个基础设施: 事件观测器。
对于一个复杂系统来说,可理解性和可观测性是很重要的,否则,随着系统成长和变得复杂,很快我们就无法理解系统里边发生了什么。
我们几乎不费力就得到了 “事件观测器”, 可以随时往系统里插入探针,实时看到任何 Agent 之间的"交谈"。这对于理解和调试系统非常有帮助。随着系统变得复杂,它会更加重要。
困难不在于如何构建它,而是如何理解它 – Bret Victor
DynaTalk 与 Roblox 环境的对接
为了实现自主 Agent 的拟人性我们在 Roblox 环境内部实现了许多用于 LLM 操控 AIC 角色的功能,并且将这些功能与 DynaTalk 对接让 LLM 可以调用这些功能。
上文提到的对 AIC 赋予的各种功能以可以被 LLM 调用的编程方法(Function Call)的形式集成进了 DynaTalk 通信架构里面。
这使 LLM 可以通过 DynaTalk 调用这些能力从而实现对于 AIC 角色的操作。
这些能力包括,移动角色到某一个坐标、让角色说话、让角色操控物品等等。
DynaTalk 的特性
并发运行
多个 Agent 是并发运行的,它们可以分布在不同机器上。
异步消息
Agent 发出消息(诸如请求)后,不需要等待接收方立即响应,而是可以继续执行其他任务。接收方在适当的时候处理消息或请求,并在处理完成后进行响应。
异步消息通信模式在许多场景下非常有用,特别是在处理复杂或耗时的操作时。它也非常适合用于构建事件驱动的系统。
在异步消息之上,要构建经典同步机制(类似 LangChain 的大多数案例)是很容易的: 建立在异步消息之上的同步指令, 我们已经在异步消息的基础上,构建了拥有同步语义的 Agent。
以下是一个探索 Agent 视觉能力的原型实验,我们希望 AI 能够观察环境里的东西, “观察环境” 是一个"语义同步"的行为。
可理解性与可观测性
前头提到:
可以随时往系统里插入探针,看到任何 Agent 之间的"交谈"。
这为我们提供了 Agent 之间的协作视图。有了这个视图,我们就能够在"社会"层面弄清楚 Agent 之间是如何协作的。出了问题时,我们也能够弄清楚,是消息传递的哪个环节出了问题,是因为某个 Agent 没收到预期的消息,还是因为它收到了某个消息,却没有完成后续的工作,导致了智能链条在它这一环断开了 …
多处运行
前头提到,Roblox 只是我们临时的计算环境,我们希望架构是通用的。
我们可以在各种计算环境中构建 Agent, 这些不同计算环境的 Agent 可以协同工作。
- Python
- Roblox(Lua)
- MicroPython
- Snap!
- JavaScript (正在构建中…)
- …
目前,我们主要在 Python 和 Roblox 中构建 Agent。我们也在探索在 JavaScript 环境中构建 Agent(MQTT over websocket),以下是我们在 Snap!(Javascript) 中构建的 Agent:
DynaTalk 主要支持两种消息协议: AMQP 和 MQTT。对可靠性和安全性有很高要求的 Agent,建议使用 AMQP。而对于具身智能(Embodied AI)的研究, 尤其是有硬件身体的 Agent, 推荐 MQTT,因为大量 硬件系统/Iot 都支持 MQTT 协议。
通过 MQTT over websocket,支持在 JavaScript 环境中构建 Agent,浏览器是新的操作系统,以及最强大的软件分发平台,@David 提议探索这个方向,将 AI Agent 与浏览器中的个人计算环境结合。希望帮助终端用户按需构建软件。关于这方面,我们受到软件 2.0(Andrej Karpathy) 和 大语言模型时代的可塑软件(Geoffrey Litt) 的影响。
我们甚至可以基于消息传递机制,将图形化编程环境用作 Roblox 游戏的控制器(或解释器),这让我们很容易实现 teamlab 的这个场景
人机共生
人类用户、计算环境、智能 Agent 能够协同工作。在系统层面,他们都只是对外收发消息。这里边有很大的设计空间,我们对此还不怎么理解,目前处于早期探索阶段。
我们倾向于对系统中不同的角色(无论是人类还是 AI)持不可知论,以此来提高系统的一致性,AI、人类、计算环境,可以以任何方式在系统中交互,甚至彼此欺骗(安全性可以通过一个独立的层添加进去, Capability-based security可能是个好想法)。这种不可知论的另一个益处是增加系统的动态性,以便于环境和 Agent 都可以动态生长。我们希望保持消息网络的愚蠢,采用端到端原则, 互联网的成功很大程度受益于端到端原则。
端到端原则(End-to-End Principle)是一种设计思想,强调在网络中,核心部分应该保持简单,而复杂性应该移动到网络的边缘,即端点(endpoints)。该原则强调网络的核心部分不应该过于依赖于具体应用程序,而应该专注于提供基本的传输功能,而将更高级的功能留给端点进行处理。 –ChatGPT
我们希望通过 DynaTalk(以及 DynaBrain),终端用户可以轻松与 AI 以及计算环境协同工作。
性能
Dynatalk 在很多方面和 CodeLab Adapter 相似,但更加健壮和工业化。我们相信,它可以服务于许多企业级场景。
在普通笔记本电脑上,Dynatalk 每秒处理数以万计的消息,如有需要,很容易进行横向扩展。
困惑与未来
大多数想法来自过去的旧想法。 – Alan Kay 《The Early History Of Smalltalk》
Agent 之间如何对话的问题,进一步说是如何协作的问题,给我们造成困扰。 @David 对这个问题进行了梳理: 沟通、互动和协作问题。 @hidaris 与 ChatGPT 围绕互动性规划有一段精彩的讨论 。 团队目前在工作上大量使用 ChatGPT 和 Claude,这或许也可以视为 bootstrapping 研究方式的一种体现: 借助 AI 来探索 AI。
我们近期视图弄清楚 Agent 之间如何交流,需要建立哪些规范。打算最终将这些想法实现在消息结构和消息解释器(实现在 Agent 的结构中)里。关于 Agent 的协作方面,@neolay 为团队找到了许多有价值的方向。我们目前对 FIPA 很感兴趣。
FIPA 成立于 1996 年,是一家瑞士非营利组织,其雄心勃勃的目标是为 Agent 可以执行的实施系统(Agent 平台)定义一整套标准,并指定 Agent 本身应如何在标准中进行通信和互操作方式 –Foundation for Intelligent Physical Agents
LLM(大语言模型)像是 Agent 的大脑皮质(功能上最为高阶的一部分), 它功能强大,但是反应慢。 我们想要赋予 Agent 像本能一样的原始机制(基本的生理需求,安全需求…)。这些机制简单而迅速。
最生动的思维也比不上最迟钝的感觉。 – 大卫·休谟
@David 向团队介绍了 BDI(Belief–desire–intention software model) ,它可能可以为 Agent 提供类似本能的内在内驱力。并分享了一个相当有趣的视频 展示了类似 BDI 的简单机制如何赋予模拟人生的游戏角色强大生命力。Dynatalk 的架构设计,似乎非常适合实现视频里提到的游戏机制: “可交互对象在环境中主动广播”。
如果想要系统能够发展,那么随着时间的推移添加新的对象类型的能力至关重要。 –《栖息地:来自一个在线社区的报告》
@neolay 进一步整理了 BDI 相关的资料
我们在最近的里程碑-2 中也视图弄清 Agent 如何与环境中的物体进行互动,@neolay 也为此找到了一些看起来有前途的方向:
这方面还处于探索阶段。
DynaBrain
记忆器(memorizer)是一个智能体,它可以重置一个智能组,让它回到某种以前的有用状态。– 《心智社会》
LLM 驱动的自主 Agent 提到:
在一个由 LLM 驱动的自主 Agent 系统中,LLM 充当 Agent 的大脑,辅以几个关键组件:
- 计划
- 记忆
- 工具使用
在我们几次讨论 Agent"生命周期问题"(计算模型)之后,我们意识到最初以大脑为中心的设计不令人满意。
将 LLM 驱动的大脑作为中央调度器,会出现很多问题,尽管它也可以制作许多有趣的用例,但我们很难获得"真正交互式/可生长的 Agent"。
随后,我们发现 Actor 计算模型是正确的方向。这极大影响了 DynaBrain 的设计。
我们最初也采用上图中集中式的设计。后来,我们放弃了这个方向,正在以消息传递为核心重构大脑。并不存在一个"中央大脑", “大脑"的能力,分散在不同的 Agent 之中,这些分散而简单的 Agent,共同构成"心智社会”,整个"心智社会"共同承担"大脑"的功能。
以下是我们(@hidaris)对 DynaBrain 设计和期待:
我们关注机器智能与人类智能的交叉研究,最早可以追溯到 20 世纪 40 年代的控制论之父维纳。他将控制和反馈回路的理念应用于生物系统的神经肌肉反馈,并引领沃伦·麦卡洛克和沃尔特·皮茨加入麻省理工学院,开展了世界上第一个人工神经网络的研究。我们深受马文·闵斯基关于心智社会的启示,他主张心智是由无意识的简单“智能体”相互作用而成。David Eagleman 对人类大脑功能的解读也给我们带来了很多灵感。当看到斯坦福的 generative agents 和像 babyagi 这样的项目出现时,我们意识到,构建类人智能的时刻已经来临。
过去在个人计算领域的研究使我们团队达成一项共识:应该构建一个由简单多 agent 组成的类人智能的心智社会,而其基础应该是基于消息的系统架构。我们意识到,在现有的 LLM 上构建类人智能,首先需要为其构建观察机制,使其能观察世界的物体和事件。我们采用了 David Eagleman 的感官替代理论(在多模态之前,LLM 相当于盲人)。构建观察机制后,还需引入基于时间衰退因子的长期记忆模块来储存记忆,使类人智能在新观察到达时能根据长期记忆中的相关信息做出反应。反应产生后,类人智能需判断是否需进行短期规划,若是,则进入反馈循环(采纳维纳的观点,即世界应通过信息来理解,复杂系统由相互关联的反馈回路组成,导致复杂而稳定的行为)。
在反馈循环中,类人智能会根据环境的反馈调整短期规划,逐步实现最终目标。同时,类人智能还需能做长期规划,这些规划在整个生命周期中由新的观察、互动和反思更新。除了个体的感知-行动,我们还在探索多个类人智能的协同问题。狭义上,我们研究他们如何协作完成任务、对齐目标、分享经验;广义上,我们试图探究他们能否完成创造性任务,能否进行新颖性探索,为其他类人智能的长期目标创造足够多的“踏脚石”。
最终,我们期望这个类人智能的机制足够通用,以便当底层模型进一步发展时,它能够与艾伦·凯所说的指数增长的力量同步增强。
接下来,我们将探讨大型语言模型为何无法像人类那样独立行动。首先,大型语言模型,是一个自回归的文本生成模型,这意味着它主要是用于生成连续的文本。它并不具备主动观察和解读环境的能力。虽然其上下文窗口可以视为短期记忆,有助于生成连贯的回复,但这个窗口是有限的。因此,LLM 无法在长时间跨度上维持或建立一个稳定的“自我”意识。
此外,LLM并不处于一个持续的行动循环中。这意味着,除非有人类用户为它提供指引或提示,否则它是被动的,不能主动采取任何行动。
最后,GPT这样的大型语言模型是在大量的互联网数据上进行训练的。它所展现出的信息和回答其实是基于人类互联网数据的平均或集合,而不是任何独立的思考或意识。但是当通过提示工程对它提出要求,如何表现,会帮助 GPT 在一个不同的轨迹上行动。
DynaBrain
我们构建了一个名为“DynaBrain”的 Agent 系统,该系统基于 LLM 作为其思维中心。它的设计目的是为了更好地实现功能和与 Roblox 环境进行交互。
核心组件与架构:
-
思维核心:
- 使用GPT-3.5,为了更好地处理和生成有意义的输出。
- 采用RAG设计,解决了上下文窗口的大小问题和长期一致性的挑战。
-
模块化设计:
- 包括观察、反应、规划和行动等模块。
- 模块间存在循环与反馈机制,确保流畅的操作。
-
记忆流机制:
- 动态记录来自 Roblox 环境的所有感知信息,如视觉、听觉等。
- 记忆流是一个向量数据库,它详细记录了 Agent 的经历。
记忆检索与其度量标准:
记忆流在被检索时,会基于以下三个主要标准进行评估:
- 新近度:使用小时级的指数衰减函数,使近期的记忆得分更高。
- 重要性:基于GPT的判断,对关键记忆给予更高的权重。
- 相关性:记忆的向量与当前查询文本向量间的余弦相似度。
Agent的策略与规划:
-
反思:
- Agent 每天进行 2-3 次的自我反思。
- 每次反思的主题都是基于 Agent 的近期经历选择的。
- 在反思过程中,Agent 会检索“记忆流”以找到相关的过去经历。
-
长期计划与路线图:
- Agent 首先设定一个长期目标。
- 然后为这些步骤制定一个详细的日程。
- 最终将其日程细化到小时,甚至分钟级别。
-
短期响应与决策:
- 当 Agent 感知到新事件时,会迅速评估其意义。
- 基于评估,Agent 会设定短期目标。
- 为实现目标,Agent 制定详细的短期行动计划。
-
互动与环境反馈:
- Agent 的响应分为非互动和互动两种。
- 非互动行为仅与环境交互,而互动行为涉及其他 Agent 的交互。
- 为了优化互动,Agent考 虑与其他 Agent 的协作,以达成共同目标。这需要 Agent 理解并预测其他 Agent 的行为和意图,从而形成有效的合作策略。
- 协作行为包括共同解决问题、分工协作或交换资源等。
里程碑
团队采用远程工作的方式,我们鼓励在确定共识的情况下,最大化大家的探索自由。
为了在自由探索和推进目标之间取得平衡。我们会定期制定里程碑。以此作为我们短期的共同目标,大家各自寻找有效推进这些里程碑的机制。
里程碑由团队会议上共同制定出。
里程碑-1
我们希望在里程碑-1 中实现以下场景:
- 在 Roblox 中构建"狼来了"故事中的小镇。具备合适的地形、人物、动物、房屋…
- 本杰明在山上放羊。狼来了,吃了羊,本杰明听到羊叫声(听觉事件)。他从记忆中想起遇到这种事情的应对方案,本杰明做出决策,跑到村口的店里求助。
我们已经实现了里程碑-1。
里程碑-2
详情参考: 里程碑-2
里程碑-2 聚焦的目标是:
- 多个 AI 之间的对话
- Agent 使用道具,以及与环境交互
具体而言,我们希望实现以下场景
- 本杰明到达村口求助,与店老板展开 2 人对话
- 对话在村子里传播
- 期待传递到更远范围(如抵达正在田里劳作的本杰明的爸妈)
- 涌现出社会行为
- 有一个人拿起锄头 ⛏️(Agent 使用道具)
- 村民们在村口集合,一起上山驱逐狼 🐺
- 到达山顶 ⛰️,把狼赶跑。发生讨论
我们正在推动里程碑-2。
后记
LLM & AI
LLM 的影响是巨大的,这是我们开始当前工作的原因之一。
我们团队在工作中,大量使用 LLM(ChatGPT、Cloude) 帮助我们编写代码、概述/总结论文、整理会议纪要、讨论设计决策、一起头脑风暴…
我们认为 AI 在不久会被广泛地使用,影响整个社会。
价值危机
人本身就是目的,而不是工具 – 康德
有天深夜,@hidaris 和 @David 在工作小组里讨论 AI 的进步可能造成的社会问题,一直聊到半夜 2 点。之后这个话题成为第二天团队会议的主要议题。
我们一开始认为这个问题主要是关于经济和伦理的,但后来大家都认同在当前语境下,它很大程度上与政治有关。
这次长时间的讨论,共识是,这一波的 AI 浪潮,可能不是"狼来了"的故事,炒作的成分虽然依旧很大,但实际的冲击力也是巨大的。泡沫是有,但它正在创造实际的价值,同时正在造成实际的破坏。如果我们参与其中,应该是负责任的,而不是草率的。
我们希望是恩格尔巴特、Alan Kay 、Bret Victor 的后继者,让计算机/AI成为增强人类心智的力量。而不是用自动化来替代人。
我们希望我们的工作(尽管它可能微不足道),能够促进技术民主化与数字赋权,而不是与数字极权有关。
参考
- Wikipedia Habitat
- 《心智社会(Society of Mind)》
- Generative Agents: Interactive Simulacra of Human Behavior
- 《栖息地:来自一个在线社区的报告》(收录在真名实姓一书中)
- gist BDI model
- gist FIPA
- 里程碑 2
- LLM Powered Autonomous Agents
- FIPA Communicative Act Library Specification
- Belief–desire–intention software model
- Actor model
- wikipedia Message passing
- Software agent
- Actor model
- Intelligent agent
- Neohabitat
- Inworld: Bring games to life with AI NPCs
- Central Casting AI: Cast your next game with Central Casting AI
- The Genius AI Behind The Sims
- Bootstrapping Research & Dynamicland – Bret Victor
- ReAct: Synergizing Reasoning and Acting in Language Models
- Voyager: An Open-Ended Embodied Agent with Large Language Models
- NVIDIA ACE for Games
- LangChain
- Late binding
- Joe Armstrong & Alan Kay
- VirtualHome: A Multi-Agent Household Simulator
- ai2thor iTHOR
- 计算机软件
- Smalltalk 背后的设计原则
- 建立在异步消息之上的同步指令
- Software 2.0
- Malleable software in the age of LLMs
- End to end principle
- The Sims
- Auto-GPT: An Autonomous GPT-4 Experiment
- BabyAGI
- agency
- Generative Agents in LangChain
文章作者 种瓜
上次更新 2023-08-12