LLM 代理实验,结合专门构建的 RPG 和工具调用。(进行中)
免责声明:尝试通过视频捕捉和解释随机响应、随机生成以及独立客户端的行为,比我原先想象的要困难得多。我在这里保留了一些视频片段以打断文本,但它们可能除了我自己之外对任何人都没有太多启示。
引言
大约两年前,我启动了 LlamaTale 项目,它是基于现有 MUD / 互动小说框架的一个分支。其想法是尝试使用 LLM(大型语言模型)创建一个具有程序生成内容(主要开始时是对话)的游戏,但以真实规则集为基础。例如,我尝试过 AIDungeon 和纯粹的讲故事角色扮演,但发现它们缺乏结构。随着时间的推移,项目不断发展,首先是包含完全由用户提示生成的的世界,然后是自主 NPC,它们可以执行一系列动作。前者运行得相当好,但后者则不然。它们会陷入循环,不遵循提示,并尝试以各种可能的方式破坏我的 JSON 解析。这在 LLM 方面也属于“远古时期”,当时 Llama2 微调和 4k 令牌是标准。
快进到最近,我又想再次探索这个概念。但在 LlamaTale 中这样做并不有趣。它从一开始就有些仓促,没有明确的计划。我想从头开始,构建一个从一开始就为代理设计的系统。
我着手构建一个新游戏,或者说是一个框架,目前还没有游戏,代理可以在本地运行并连接到服务器。本质上,它是一个 MMO,或者至少是一个多人 RPG,其中代理可以取代所有玩家。至少,这是理论上的。
框架
我从一开始就做出了一些决定
- 代理将作为客户端运行,而不是在服务器上。
- 我希望超越单纯的对话生成。
- 它们将使用类似于玩家使用的消息系统,但带有一定的限制;没有 WASD 输入,而是具有具体命令,带有要移动到的位置或坐标,要交互的实体。
- 除了 LLM 的决策之外,还将有一个状态机,其中包含确定性状态,这些状态根据 LLM 的命令启用和禁用。
- 代理没有视觉效果。它们将收到其周围环境的文本表示。
- 我将使用工具调用作为动作。不再需要繁琐的 JSON 解析。
关于游戏本身的一些基本信息
- 游戏框架是一个服务器权威的多人系统。
- 我决定采用 Tab 目标战斗系统,因为它对延迟更友好,而且 LLM 的反应速度不佳。
- 服务器是 Java,使用 Zay-ES ECS(实体组件系统),没有场景图。
- 游戏客户端运行 jMonkeyEngine3 (Java)。
- 代理运行 Java。
- 服务器由 SQL 数据库和仓库支持。
- 代理有自己的 SQLite 数据库来存储记忆。
虽然 LLM 服务器可以在本地运行,但我选择使用 Mistral 的 API。它更快,而且由于每个动作主要只有数百个输入和输出令牌(除非您不小心将最大数量设置为端口号,导致 LLM 进入重复模式),所以它非常便宜。我尝试了 Mistral Small,但它无法识别工具调用,所以我最终使用了 Medium。它能很好地处理工具调用,但不是最有创意的模型。
由于我总是担心令牌使用量,目前我将主要决策调用限制为每 15 秒一次。
感知系统
出于带宽和复杂性考虑,我不想发送图像让 LLM 解释。取而代之的是,服务器上有一个系统,收集相关信息,例如附近有什么,前面有什么,位置信息,状态等等,并将所有这些作为组件发送给客户端。这样做的好处是适用于多种基础设施模式。我选择了功能齐全的网络客户端,因为我已将所有东西都设置好了。但这也可以通过 REST 提供服务,例如,效果也一样好。
客户端从感知状态(PerceptionState)获取数据,并用所给的信息替换基本提示模板。这意味着如果本地运行,用户可以控制所使用的具体提示,并根据自己的偏好进行调整。
状态机
为了增加愉悦体验的机会,我不想让 LLM 自己做每一个小决定。有一些“经典”AI 状态可以根据 LLM 想要做的事情开启和关闭。例如,一旦进入战斗,就会有一个战斗系统来帮助攻击和定位。如果它决定跟随某物,一个“跟随者”状态就会接管。一个“旅行”状态将处理较长行程中的事情。
但与此同时,客户端会定期与 LLM 核对,并且还有一些反应性状态会在某些事件发生时提示 LLM。
进展顺利之处
它奏效了!这本身就是一场胜利。LLM 代理根据收到的提示做出相关决策。如果它有一个任务,它更有可能选择一个能推进任务的行动。例如:
消息:“我注意到附近有一片三叶草,这是我收集草药任务的一部分。我将把它捡起来以完成我的目标。”行动:函数[名称=pick_up, 描述=null, 参数原始={"entity": "9"}], 索引=0]]]
具有良好的空间意识。可以根据坐标移动得更近,最终停留在物体的正确一侧等。
它可以同时正确执行多个工具调用。例如,它可以发出移动调用和交互调用。
可改进之处
它会重复自己,并陷入循环。如果某事物显示在“最近记忆”中,它就会一遍又一遍地做同样的事情,没有变化。我在 LlamaTale 中也注意到了这一点,我怀疑它需要一个规划阶段来保持自身的方向。
它也感觉相当枯燥,缺乏个性。这可能是一个提示问题。它需要在提示中加入更深层次的角色描述,并占更大比例(目前只有几行)。
它有陷入“助手模式”的倾向。谈论这或那可能需要“帮助”。这可能是一个微调问题,但也可能与提示有关。
下一步
这个项目仍处于早期阶段。我想在假期结束前完成一些工作,但我会继续,能力各有不同。我很快就会添加规划功能。这将首先能够设置一个在提示中持久存在的目标,然后能够逐步实现该目标。也许可以使用任务框架。
我想探索使用本地模型。欢迎任何关于具有良好工具调用能力的中型模型的建议。