大家好,

我目前正在自行开发一个名为Homeris的定制MUD(基于文本的角色扮演)引擎,使用Java编写,集成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,冻结其utility脑,并在尝试与您交谈时会快速发送一个“brb”。

我非常希望听到您的对这项架构的看法,特别是如果有其他人在使用消息代理与本地GGUF模型进行动态代理模拟!

*P.S. 我在 Patreon 上写了更多关于架构的深入文章,如果您想跟随我的旅程,请关注:https://www.patreon.com/homeris/posts/devlog-4-turing-163048795?utm_medium=clipboard_copy&utm_source=copyLink&utm_campaign=postshare_creator&utm_content=join_link