【简析】AI Agent游戏-SmallVille 斯坦福小镇

近期在学习AI Agent的相关知识,一直将注意力放在AI Agent到底能给我们带来什么样的AI 落地新思路,因此,AI Agent实现的游戏斯坦福小镇SmallVille,就没怎么看,大致是知道在游戏中里面的各个角色会自己协同组织一个情人节游戏,感觉商业化价值不大。

在深圳,周末,一个强对流天气里,在房间里听雨声。随即打开了斯坦福小镇的论文,阅读之后,不禁引发了一些感慨,一个N人又开始了畅享,Agent放在游戏里,或许能够产生一些比商业化更有意义的精神层面产物,而且如果真的能够实现,那将会是一个商业化价值巨大的产物,对游戏行业也是一个全新的突破!

作为一名资深的游戏及科幻爱好者,钟爱各类角色扮演、模拟游戏,最爱的游戏模拟人生、荒野大镖客、GTA、文明等,无数次在玩这些游戏的时候,比如模拟人生,我会把自由度开到最高,我什么也不干,就观察我的模拟市民们会自己干什么,他们会自己找到爱人组建家庭吗,他们会自发地去选择自己想做的事情吗,打拼事业?培养兴趣?陪伴家人?还有在荒野大镖客、GTA这类游戏里,我会随机找一些NPC,跟着他们,看他们会怎么样在这个是世界里生活,他们有什么样的喜怒哀乐呢?

实际上是,以往的这些开放世界游戏,即使自由度已经很高,但是这些NPC终归只是NPC,他们只会执行一些设定好的流程。我并不能够真的观察到我想要看见的像西部世界中的自主意志。

但当我看完这篇斯坦福小镇的论文《Generative Agents: Interactive Simulacra of Human Behavior 》 https://arxiv.org/pdf/2304.03442

对AI Agent在游戏中的应用燃起了兴趣,通过Agent,是不是真的能将荒野大镖客变得像西部世界那样呢?我的模拟市民是不是也能有自己真正的自由意志了呢?遂决定写下这篇文章,简单梳理一下了解到的游戏中的AI Agent。
如果有问题的地方欢迎大家提出交流!

25个AI Agent被放入到一个沙盒中,他们有着不同的设定,如不同的职业、人际关系、性格和年龄,允许他们在虚拟世界中工作、生活,他们会发生什么样的故事呢?

Agent行为及交互

Agent图标及设定

共有25个Agents生活在Smallville中,每个agent都有一个自己的像素小人形象,且都会有一个种子记忆(即设定),通过一段自然语言描述来决定每个agent的性格、职业及和其它agent的关系。比如,药剂师John的设定:在这里插入图片描述
Inter-Agent Communication
agent通过行动action来和虚拟世界及其他agent进行沟通交流,每当他们在做一件事时,agent会输出一段自然语言描述当前的行为,也会有对应的图标进行展示他们正在做什么。
一个agent,在其他agent进入到他们的一定范围(原文中表述为local area),他们便可感知到其他agent的存在,可能就会开启一些对话或者交互行为。
User Controls
可以直接通过给agent指令,作为他们的inner voice让他们进行一些行为。

环境交互
在Smallville中,存在着很多场景,比如说咖啡店、酒吧、公园、学校、房子、商店等。Agent会在这些区域中活动

一个agent的早餐可以是这样的:在这里插入图片描述
Emergent Social Behaviors 突发社会行为
通过agent之间的交互,他们会在原先设定之上,产生一些新的社会行为,这些行为是emergent 突发的,而非预先设定的。

  • Inforamtion Disffusion 信息扩散
    在agent注意到其他agent的时候,他们会产生对话,正因为这些行为,信息可以在agent和agent之间传递,比如说A跟B说,我今天要去咖啡馆,B在路上遇到C,又跟C说,A说他今天要去咖啡馆,这样A要求咖啡馆的消息,就从A这里传到了B。
  • Relationship Memory 关联记忆
    在不断的交互及信息传递中,agent会增加新的记忆,包括社交关系及事件。比如,Sam一开始并不认识Latoya,但有一天他在公园散步的时候,遇到了Latoya,并开始了互相介绍,Latoya说她是来这里拍照的。在Sam和Latoya后来的相遇中,Sam的记忆中有关于Latoya的这一个事件点,于是他会问Latoya上次的拍照怎么样了,Latoya也会回复他说,进行的很好!
  • Coordination 协调
    最广为人知的情人节派对举办,就可以体现出这一点。Isabella最开始在擦非关说打算在2月14号的晚上五点到七点举办一个情人节派对,消息通过agent之间的不断传递,最终举办成功了。

Generative agent architecture

生成智能体结构,每个Agent的背后机制
该机制决定了一个智能体是否要与在他能感知到的范围内的其他智能体进行互动。
在这里插入图片描述
Memory and Retrieval
主要涉及到一个Memory Stream和Retrival的公式。
记忆流包含:自然语言描述、创建时间戳、最近访问时间戳
每个agent都有一个memory stream,遇上新的事情时,会与当前,memory steam进行对比,没有就会加入到记忆中。记忆会被转换为embedding向量,便于检索。
Retrieval=reccency + importance + relevance
在这里插入图片描述

  • Reccency
    根据在记忆流中的时间新旧来判断,越新的值为越高
  • Importance
    重要性通过为agent的记忆打分来区分普通记忆和和核心记忆,主要是通过一个Prompt实现:
    在这里插入图片描述
  • Relevance
    相关性,若是与当前的情景相关性越高则分值越高。这里将相关性设在query memory,比如说,查询的是,学生正在讨论化学考试要学什么,则在他们的记忆中早餐要吃什么就该具有较低的相关性,关于老师和学生的记忆就该具有更高的相关性。因此就会使用记忆的embedding向量和query记忆的embeddings向量进行余弦相似度,作为相关性计算。

Reflection
当只具具备原始记忆时,agent很难概括或者做出推理。这里论文中举了个例子,问Kalus Mueller,如果要你选择一个人跟他待一个小时,你会选择谁?展现了Kalus的Reflection tree
这里引入了Reflection。反思也是一种记忆,当遇到新的对话,开始检索记忆时,将会结合其他的结果一起思考,当agent感知到最新时间的重要性得分超过某个阈值时,反思将会形成。
reflection的第一步是,确认要reflec什么,这里是通过使用agent最近的100条记忆流中的记录,根据这些记忆内容生成新的问题,比如说根据一些描述(kalus正在阅读一本关于中产阶级话的书,kalus正在与图书管理员谈论他的项目,图书馆的桌子目前无人使用),通过大语言模型,提出了新的问题:klaus热衷于什么话题?和Maria之间的关系?
并且为每个问题收集相关的记忆及思考,再使用Prompt来进行提取一些insights,并用insight作为见解证据的特定记忆。
这些记忆将会被作为反思存储在memory stream中。
在这里插入图片描述
Planning and Reacting
Planning描述了agent的未来行动,计划包括地点、开始时间和持续时间。与Reflection一样,planning将会被存储在记忆流中,在检索的过程中,agent在决定如何行动时综合考虑Plan、Retrieve、Reflect。

  • Reacting and Updating Plans
    Agent在一个动作循环中,他们会感知周围的世界,这些感知到的观察结果会存储在memory stream中。将会通过这些观察结果来决定agent的下一步行动,该继续当前计划,还是做出其他反应。
  • Dialogue
    agent会进行相互交谈,通过根据agent对彼此的记忆来调节他们的话语,从而形成新的对话。

总结

写的不够精简明了,但这篇论文的想法给我带来了很大的启发,很期待自己也能够参与到类似的项目中去。期待AI给这个世界带来更多的改变。

附上一个B站一位UP主的思维导图总结及视频链接,讲得挺清晰明了的。思维导图主要就是Generative Agent Architecture的总结归纳。
在这里插入图片描述
视频链接:https://www.bilibili.com/video/BV1ixZmYyEAc?spm_id_from=333.788.videopod.episodes&vd_source=0f960425ede0a95570259b1bea878afc

好的,您的问题是如何用 SQL Server 实现创建数据库和相关操作。 首先,我们可以使用以下语句创建一个数据库: ```sql CREATE DATABASE MyDatabase; ``` 接下来,我们可以使用以下语句创建五个表并插入至少十条数据: ```sql CREATE TABLE Employees ( EmployeeID int PRIMARY KEY, FirstName varchar(50), LastName varchar(50), DepartmentID int, CONSTRAINT FK_Employees_Department FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) ); CREATE TABLE Departments ( DepartmentID int PRIMARY KEY, DepartmentName varchar(50) ); CREATE TABLE Tasks ( TaskID int PRIMARY KEY, TaskName varchar(50), EmployeeID int, CONSTRAINT FK_Tasks_Employees FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID) ); CREATE TABLE Customers ( CustomerID int PRIMARY KEY, CustomerName varchar(50), Address varchar(50), City varchar(50), State varchar(2), ZipCode varchar(10) ); CREATE TABLE Orders ( OrderID int PRIMARY KEY, OrderDate date, CustomerID int, CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ); INSERT INTO Employees VALUES (1, 'John', 'Doe', 1); INSERT INTO Employees VALUES (2, 'Jane', 'Doe', 1); INSERT INTO Employees VALUES (3, 'Bob', 'Smith', 2); INSERT INTO Employees VALUES (4, 'Alice', 'Johnson', 2); INSERT INTO Departments VALUES (1, 'Sales'); INSERT INTO Departments VALUES (2, 'Marketing'); INSERT INTO Tasks VALUES (1, 'Task 1', 1); INSERT INTO Tasks VALUES (2, 'Task 2', 1); INSERT INTO Tasks VALUES (3, 'Task 3', 2); INSERT INTO Tasks VALUES (4, 'Task 4', 2); INSERT INTO Customers VALUES (1, 'Acme Inc.', '123 Main St', 'Anytown', 'CA', '12345'); INSERT INTO Customers VALUES (2, 'Widgets R Us', '456 Oak St', 'Smallville', 'NY', '67890'); INSERT INTO Orders VALUES (1, '2021-01-01', 1); INSERT INTO Orders VALUES (2, '2021-02-01', 2); INSERT INTO Orders VALUES (3, '2021-03-01', 2); ``` 接下来,我们可以使用以下语句添加外键约束: ```sql ALTER TABLE Employees ADD CONSTRAINT FK_Employees_Department FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID); ALTER TABLE Tasks ADD CONSTRAINT FK_Tasks_Employees FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID); ALTER TABLE Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID); ``` 接下来,我们可以使用以下语句创建一些视图: ```sql CREATE VIEW EmployeeTasks AS SELECT e.FirstName, e.LastName, t.TaskName FROM Employees e JOIN Tasks t ON e.EmployeeID = t.EmployeeID; CREATE VIEW OrderDetails AS SELECT o.OrderID, o.OrderDate, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID; ``` 然后,我们可以使用以下语句创建一些索引: ```sql CREATE INDEX IX_Employees_DepartmentID ON Employees (DepartmentID); CREATE INDEX IX_Tasks_EmployeeID ON Tasks (EmployeeID); CREATE INDEX IX_Orders_CustomerID ON Orders (CustomerID); ``` 接下来,我们可以使用以下语句创建一些约束: ```sql ALTER TABLE Employees ADD CONSTRAINT CK_Employees_DepartmentID CHECK (DepartmentID IN (1, 2)); ALTER TABLE Customers ADD CONSTRAINT DF_Customers_State DEFAULT 'CA' FOR State; ALTER TABLE Employees ADD CONSTRAINT UQ_Employees_Email UNIQUE (Email); ALTER TABLE Orders ADD CONSTRAINT CK_Orders_OrderDate CHECK (OrderDate > '2020-01-01'); ``` 然后,我们可以使用以下语句创建一个存储过程: ```sql CREATE PROCEDURE GetEmployeeTasks @EmployeeID int AS BEGIN SELECT e.FirstName, e.LastName, t.TaskName FROM Employees e JOIN Tasks t ON e.EmployeeID = t.EmployeeID WHERE e.EmployeeID = @EmployeeID; END; ``` 最后,我们可以使用以下语句创建一个触发器,以在更新或插入时更新 EmployeeTasks 视图: ```sql CREATE TRIGGER EmployeeTasks_Update ON Employees AFTER INSERT, UPDATE AS BEGIN UPDATE t SET t.FirstName = i.FirstName, t.LastName = i.LastName FROM EmployeeTasks t JOIN inserted i ON t.EmployeeID = i.EmployeeID; END; ``` 以上是一个简单的示例,您可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值