大家好,
我目前正在单独开发 Homeris,一个基于Java的MUD(文本基RPG引擎)引擎,使用PostgreSQL向量数据库。整个游戏世界、房间描述和NPC背景都是动态生成并在飞行中丰富的,使用本地的 Meta-Llama-3.1-8B-Instruct-GGUF (Q5_K_M) 运行在本地的迷你PC上。
直到上周,游戏引擎每次需要本地LLM重写房间描述,根据王国的经济状态变化,依赖于标准的异步线程(CompletableFuture)。
它工作了,但这是一场灾难的前奏。用本地8B模型来处理几十个并发请求完全耗尽了我的内存,导致API超时频繁发生,如果服务器在生成过程中崩溃,那些世界建造任务就像迷失在无人之地一样。
进入RabbitMQ。
我完全重新设计了AI管道,采用了严格的 生产者-消费者模式 使用RabbitMQ。
-
恢复性: 游戏引擎现在安全地将世界生成和角色丰富任务存储在一个持久的队列中。如果我需要重新启动服务器或如果某些东西崩溃,队列不会在乎——任务就像坐在RabbitMQ中一样安全,重新启动后就像从哪里离开了。
-
速率限制: 消费者通过严格的速率限制(
basicQos(1))获取任务,逐个提示本地RAG模块。没有资源饥饿。
月度世界变化: 我将整个信息管道连接到我的 EconomyManager。每个游戏月,引擎检查各个模拟王国的健康和财富。如果一个区域堕落到贫穷,它的房间就会静悄悄地排队。RabbitMQ将它们传递给LLM,它动态重写了描述,添加了视觉提示,如剥落的水泥、腐烂的木头和熄灭的火炬。如果王国恢复,文本就会转换回豪华。
人格化代理: 为了使文本环境感觉像活生生一样,我还建造了几个功能来使NPC模仿实际人类玩家在聊天:
- NpcTypoGenerator: NPC现在偶尔会因为状态而犯词(例如,打出“helli”而不是“hello”)并且立即在下一行中发送一个纠正(“hello”*)。
- SimulateAfkAction: 如果NPC感到疲劳或缺乏刺激,它会标记自己为AFK,冻结其实用脑,试图与你说话时会给你一个快速的“brb”。
非常期待您的想法,这个架构,特别是如果有人在使用本地GGUF模型和动态代理模拟消息代理时有任何其他想法!
评论 (0)