agentsim流程分析

news2025/2/23 7:39:07

agentsim

前言

这里是类斯坦福小镇项目agentsim的一个调研。主要目的是寻找行为树模式的氛围npc不够智能的解决方案。下面会先简单介绍下一些关键的类,然后再讲解流程。该项目有段时间没维护了,没法直接运行,有兴趣的可以修修,主要是openai接口版本的问题。

重点类与作用

这里我们简单阐述几个和llm相关的核心类

Prompts

prompt类作用是获取提示词,提示词目录如下
在这里插入图片描述

Actor

actor类代表每个npc,这里涉及了所有对llm回复的处理。react函数:是一个状态机,根据不同状态选择不同的提示词ask llm。

Agent

agent类是actor的基类,负责填充提示词

Tick

tick类,消息处理的第一环,负责状态转移 。parse_react函数:解析所有的react得到的llm回复,进行状态转移

主流程

主流程其实很简单register tick到来,走初始化逻辑。后续由common tick消息驱动状态转移,每个tick会依次 处理movings,chat, using, initted中uid对应的任务逻辑。
在这里插入图片描述

React system

React system比较复杂,核心函数为为**react **和 parse_react构成。后面,流程图比较难画且不方便理解。下面我们将通过描述过程的方式来帮助理解。主流程中我们可以清楚的看到,处理逻辑的核心是 movings,inited,chatted,using 这几个数组,下面留心下是什么时候添加进来的。

第一个tick

第一个tick往往是register tick,表示一个客户端的连接。这里初始化了一些游戏系统的资源,如npc模型,alan和ph这两个npc。然后将这两个npc的uid添加到inited数组中。
在这里插入图片描述
随后就是持续的common tick,开始驱动后续的状态转移。

第二个tick

上一个tick已经将alan和ph 这两个npc的uid注册到了inited数组中。在该tick中使用solve_init处理alan和ph。这里首先是** _qa_framework**,该函数获取提示词 qa_framework_question ,首先让llm根据用户的目标以及已有知识提出问题,再使用qa_framework_answer解决问题(目的是延迟模型的思考时间,提高模型处理问题的质量),最后获取提示词plan,让llm给出下一个plan作为result的newPlan字段存入,plan 的结构如下:

{
“building”: “…”, 需要我前往的建筑
“purpose” : “…” 目的是什么
}

接着调用parse_react,根据result进行状态转移,因为result中存在newPlan字段,则走newPlan分支。该分支下,如果当前位置和building不一样,这说明需要前往下一个building,所以这里需要通过navigate寻路,调用move将结果发送给客户端。注意无论,curlocation 和targetlocation是否相同都会添加该npc uid到movings队列中。

第三次tick

这里补充下,navigate寻路成功,会将path保存在对应npc model的path中。当send 客户端时,会将path清空。只要调用了move,就会将uid添加到movings数组中。

此时只有movings中有任务需要处理。slove_moving调用move,这时由于path为null,则走move的另外一个分支,即则设置result timetick-finishMoving,进行react,该状态时去llm获取行为act(使用提示词为act),npc能够进行的行为有三个 :(1)use:使用工具 (模拟工具使用)(2)chat:聊天 (3)expierence : 尝试经验中的行为action,下面是result的返回结果:

{
“action”: “use”,
“equipment” : “…”, 使用什么设备,如desk
“operation” : “…” 做什么?
}
{
“action”: “chat”,
“person” : “…”, 和谁聊天
“topic” : “…” 聊天的主题
}
{
“action”:“experience”,
“experienceID”:“…” 使用哪一次的经验
}

由于该tick是第一个行为,没有experience,所以,目前只会出现use 和chat这两种情况。和上一个tick相同

下面是react分支

use

如果是use,则调用use函数使用use提示词,模拟使用物品
{“continue_time” : “…”,
“result” : “…”,使用原因
“bought_thing” : “…”,
“amount” : “…”
}

{“continue_time” : “…”,
“result” : “…”, 使用原因
“earn” : “…”
}

Chat

如果是chat,则调用chat 让llm根据提示词开始一个话题

进行parse_react

use

如果是use,则使用navigate对该equipment进行寻路,如果找到path,则再次进行move,和上个tick一样,send客户端,清空model上的path。并将uid添加到using

chat

如果是chat,则调用_execute_chat对当前两个npc,进行5轮chat (使用提示词为chat),将结果存放在npc的chats上,并将uid添加到chatted

所以这一轮 movings中必定会有值。

第四次tick

这是和之前一样先处理movings中的任务,不同的是这里还要处理chatted/using中任务

上一轮为use

调用finish_using,设置状态为 timetick-finishUse,该状态调用_critic,进行评价(使用critic提示词),这里将根据上一轮中的act判断plan是否完成,llm返回结果如下:

{“result”: “success”/“fail”/“not_finished_yet”}

Success or failed

认为该plan已经有结果了,则调用_store_memory更新对people和building的impression。

{
“people”:{“person_name”:{“impression”:“xxx”,“newEpisodicMemory”:“xxx”}}
“buildings”:{“building_name”:{“impression”:“xxx”,“newEpisodicMemory”:“xxx”}}
}

如果为success,则需要将上一轮的所有act作为experience存储下来,将上一轮的acts和plan作为一个experience存储到 npc的experience map中。并将plan添加到plan_cache中表示以及完成的plans

not_finished_yet

清空所有act,然后调用_plan开始一个新的plan

上一轮为chat

则直接store_memory

Experience

最后我们看下当act 返回结果为experience的情况,如果act选择的是使用experience,我们根据id找到对应的experience中,再从experience中pop出一个act,并且设置flag为使用experience,注意这种情况和use走同一个逻辑,即走parse_react的use分支,不同的在use完毕后不会走critic流程,因为之前以及判断过了,执行完experience的所有act后,会开始一个新的plan

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

乘法与位运算

目录 描述 输入描述: 输出描述: 参考代码 描述 题目描述: 进行一个运算单元的电路设计,A[7:0]*11111011,尽量用最少的资源实现,写出对应的 RTL 代码。 信号示意: A信号输入 B 信号…

MySQL 的故事:一场 SQL 语句的戏剧演绎

本文由 ChatMoney团队出品 第一幕:解析与优化 - “翻译官与谋士” SQL 解析器是第一个上场的角色,任务就是把 SQL 请求翻译成 MySQL 能听懂的语言。就像你点餐时,服务员得听懂你到底要什么菜。不然你说“我要一盘炒青菜”,结果服…

gitlab2024最新版安装

系统:redhat9.0 gitlab版本:gitlab-ce-16.10.7-ce.0.el9.x86_64.rpm 安装组件&包依赖:https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-16.10.7-ce.0.el9.x86_64.rpm 参考: 前提: 下载gitl…

【车载开发系列】CAN通信总线再理解(上篇)

【车载开发系列】CAN通信总线再理解(上篇) 【车载开发系列】CAN通信总线再理解上篇 【车载开发系列】CAN通信总线再理解(上篇)一. CAN的概念1)硬件组成2)编码与负载3)收发数据4)半双…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言: 仔细一想,小编已经把指针的大部分内容都说了一遍了,小编目前有点灵感枯竭了,今天决定就结束指针这一大山,可能很多小编并没有提到过,如果有些没说的小编会在后续博客进行补充道,不多废话了…

电脑桌面图标大小怎么调整?多种方法图文教程【全】

随着数字化生活的深入,电脑桌面图标的大小调整成为了我们日常使用中经常需要面对的问题。无论是为了更清晰地查看文件内容,还是为了美化桌面布局,掌握调整图标大小的方法都显得尤为重要。电脑桌面图标大小怎么调整?本文将为您提供…

LVGL开发教程-按钮Button

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 1. 普通Button 2.可选中Button 3.按钮事件处理 总结 前言 在图形用户界面(GUI)开发中,按钮(Button)是用户与程序交互的重要组件之一…

面向龙芯LoongArch平台的AMD GPU补丁解决了一个“巨大平台错误“

本周一Linux内核社区发布了一组补丁,旨在让老旧的 AMD Radeon GFX7/GFX8 时代图形处理器在龙芯LoongArch平台上运行。这些在Loongson平台上处理老旧Radeon Hawaii~Polaris GPU的补丁指出了这些中国计算系统的一个"巨大的平台错误"。 AMDGPU 和 Radeon 内核…

揭秘与应对:一打开移动硬盘就提示格式化的深度解析

在日常的数据存储与交换中,移动硬盘因其便携性和大容量而备受青睐。然而,有时我们可能会遇到一种令人困扰的现象:当试图打开移动硬盘时,系统会弹出一个警告窗口,提示“磁盘未被格式化,是否现在格式化&#…

跨境电商打造高效运营:自养号测评系统的五大优势

在当前的跨境电商行业,测评作为提升产品排名和促进销售的关键策略,其重要性日益凸显。为了在竞争激烈的市场中获得优势,卖家需要运用自养号测评系统等工具,以实现更高效的运营和更佳的业绩。 自养号测评系统具备多方面的优势&…

Python酷库之旅-比翼双飞情侣库(15)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

hugging face:大模型时代的github介绍

1. Hugging Face是什么: Hugging Face大模型时代的“github”,很多人有个这样的认知,但是我觉得不完全准确,他们相似的地方在于资源丰富,github有各种各样的软件代码和示例,但是它不是系统的,没…

数据库 |试卷1试卷2

1.数据库语言四大语句 4.四大类(DDL、DML、DQL、DCL)_中度ddl-CSDN博客 数据定义(data defination language) 查询、创建、删除、使用 #查询所有数据库 show databases;#查询当前数据库 select database();#创建数据库 create …

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要:随着APISIX作为IT应用系统入口的普及,其故障定位能力的不足导致了在业务故障诊断中,APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入,还可能使诊断方向“背道而驰”,从而导致业务故障“…

【CT】LeetCode手撕—46. 全排列

目录 题目1- 思路2- 实现⭐46. 全排列——题解思路 3- ACM实现 题目 原题连接:46. 全排列 1- 思路 模式识别 模式1:不含重复数字的数组 nums ——> 任意顺序 可能的全排列 ——> 回溯模式2:全排列 ——> 排列问题,不同…

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议,它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议,被广泛应用于各种设备之间的通信,如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…

可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件)

之前发了《把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)》。有人说都淘态了,有什么好内嵌的。。。所以再发个 SpringBoot3 FolkMQ 是一个 “纯血国产” 的消息中间件。支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版&am…

SysTools MailXaminer: 电子邮件取证调查中的链接分析和时间线分析

天津鸿萌科贸发展有限公司是 SysTools 系列软件的授权代理商。 SysTools MailXaminer 电子邮件取证软件提供全面强大的解决方案,通过简化的操作,从电子邮件客户端、网络邮箱服务器、磁盘镜像、Skype 通讯工具中解密并搜索证据。软件对调查工作的每一阶段…

volatile原理

volatile内存语义 volatile是java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。一方面volatile不会造成上下文切换的开销,另一方面它又不能像synchronized那样保证所有场景下线程安全,因此必须在合适的场…

滑动窗口练习1-长度最小的子数组

1.题目链接:209.长度最小的子数组 2.题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条…