生活番:Generative Agents
- Generative Agents: Interactive Simulacra of Human Behavior
- https://github.com/joonspk-research/generative_agents
斯坦福小镇算是这几个月来看到的最有意思的大模型应用了,作者设计了虚拟的小镇环境,并在其中设计众多不同性格的虚拟智能体,完全基于LLM的生成能力,让众多AI们在小镇中开始了生活,思考和互动。
生活环境和经历塑造了每一个个体,AI也不例外,所以后面的介绍我们会围绕以下三个核心组件相关代码来展开
- 沙盒环境: 描述AI们的生存环境,并让AI感知当前所处环境,并随AI行动更新环境状态
- 智能体框架
- 行为规划:智能体每一步行为的生成
- 记忆流: 智能体历史记忆的存储
在以上组件的加持下,小镇中的智能体们会发生以下基础行为
- 智能体行为:智能体根据当前状态和历史经历,决定下一步是吃饭睡觉还是打豆豆
- 智能体互动:智能体间的互动通过交流或指令进行,当智能体处于同一环境中时可能会触发交流对话
- 智能体和环境交互:智能体行为会改变环境状态,例如智能体睡觉时,环境中床的状态就会变成“Occupied”。当然我们也可以直接修改环境状态
- 智能体规划:想要触发以上1和2的行为和互动,智能体肯定不能在小镇里随机游走。论文的实现是让智能每天都生成一天的Todo List,根据计划行动,并在行动中不断更新当日计划。
- 智能体自我思考:通过对历史经历的不断总结和反思得到更高级层次的自我思考,从而影响日常智能体的行为
- 其他衍生能力:信息在智能体之间传播,多智能体合作,etc
沙盒环境
这里我们把沙盒环境放到第一个部分,因为个人感觉如何定义环境,决定了
- Perceive:智能体能接收到哪些环境信息
- Action:智能体可以做出哪些行为,包括在当前位置行为,和位置移动
- Influence: 行为可以对环境产生哪些影响
- 地图(maze.py)
环境本身被抽象成一个二维矩阵,这类二维游戏地图也叫瓦片地图(Tiled Map)。地图上每一个瓦片,都是一个字典存储了该瓦片内的所有信息,以下信息中的events字段都是智能体可以感知,并影响的环境信息。
self.tiles[9][58] = {
'world': 'double studio',
'sector': 'double studio', 'arena': 'bedroom 2',
'game_object': 'bed',
'spawning_location': 'bedroom-2-a',
'collision': False,
'events': {
('double studio:double studio:bedroom 2:bed', None, None)}}
同时Maze还存储了一份倒排索引,也就是给定当前智能体当前的地址,需要返回在地图中对应的二维坐标,这样就可以规划智能体从当前位置到某个地点的行动路径。
self.address_tiles['<spawn_loc>bedroom-2-a'] == {
(58, 9)}
- 环境感知(perceive.py)
有了环境,再说下智能体如何感知环境。给定智能体当前在地图中的位置,智能体可以感知周围设定范围内所有瓦片中最新的事件。如果周围发生的事件太多,会先按照和智能体之间的距离排序,选择最近的N个。同时对于智能体之前未感知的事件,会加入到智能体的记忆流中。
记忆流
记忆流的设计算是论文的一大核心,分成以下两个部分
- 记忆提取:其一是传统的RAG,也就是智能体的每一步行为都需要依赖智能体的历史记忆,如何抽取相关记忆是核心
- 记忆存储:其二是智能体的记忆除了感知的环境,还包含哪些信息?