大家好,

我目前独自开发Homeris,一个基于Java的自定义MUD(基于文本的角色扮演游戏)引擎,使用PostgreSQL矢量数据库。整个游戏世界、房间描述和NPC背景都是动态生成和在飞行中增强的,使用本地Meta-Llama-3.1-8B-Instruct-GGUF (Q5_K_M)在本地小型PC上运行。

直到上周,游戏引擎需要本地LLM重新写房间描述,基于王国的经济状态的变化时,它依赖于标准的异步线程(CompletableFuture)。

它工作了,但这是一个等待发生的灾难。将本地8B模型用几十个并发请求喷射,完全融化了我的RAM,导致频繁的API超时,如果服务器在生成过程中崩溃,那些世界构建任务就被丢弃在了迷宫中。

RabbitMQ出现了。

我完全重新设计了AI管道,采用了严格的生产者-消费者模式,使用RabbitMQ。

  • 容错性:游戏引擎现在安全地将世界生成和角色丰富的任务发送到一个持久的队列。如果我需要重启服务器或如果某些东西崩溃,队列不在乎——任务就安全地保存在RabbitMQ中,重启后就继续执行。
  • 速率限制:消费者通过严格的速率限制(basicQos(1))从队列中获取任务,逐一将它们发送到本地RAG模块。没有更多的资源挨饿。

每月世界变化:我将整个消息管道直接连接到我的EconomyManager。每个游戏月,引擎检查每个模拟王国的健康和财富。如果一个地区陷入贫困,它的房间就会被悄悄地添加到队列中。RabbitMQ将它们发送到LLM,LLM动态重写描述,添加视觉提示,如剥落的壁纸、朽烂的木头和熄灭的火炬。如果王国恢复,文字就会恢复到奢侈状态。

人性化代理:为了使基于文本的环境感觉更真实,我还建造了几个功能来使NPC模仿实际人类玩家在聊天:

  1. NpcTypoGenerator:NPC现在偶尔会因为状态而犯错误(例如,输入“helli”而不是“hello”),并且会在下一行立即发送一个纠正(*hello*)。
  2. SimulateAfkAction:如果NPC感到疲劳或缺乏刺激,它会标记自己为AFK,冻结其工具脑,并且如果你尝试与它交谈,它会快速发送一个“brb”。

非常希望听到您的想法,这个架构,尤其是如果有人在本地GGUF模型和动态代理模拟中使用消息代理器。