最近在《投票帝国》(前称《民选帝国》)的开发中,我一直在思考一个问题:如何让冷冰冰的政令数值变成有血有肉的世界反馈?
如果只是弹出一句“支持率下降 5%”,玩家很难感受到那种身处权力漩涡的紧迫感。我想要的是那种“推特”式的、充满了情绪化、偏见甚至阴阳怪气的民众声音。于是,我决定在游戏中集成 Ollama,利用本地大模型(Local LLM)为每个回合、每种突发事件生成实时的民众评论。
以下是这次技术集成的核心思路和一些避坑指南。
为什么选择本地 LLM?
很多独立游戏会选择接入 OpenAI API,但对于《投票帝国》这种需要频繁交互的游戏来说,这并不理想:
- 零成本: 玩家不需要支付额外的 API 费用,我也没必要承担高昂的服务器开销。
- 隐私与离线: 玩家的所有决策和评论生成都在本地完成,无需联网。
- 可控的延迟: 我们选择了 Qwen 3.5 0.8B 这种超轻量模型,在现代显卡上几乎是瞬时响应。
技术实现:把 Ollama “塞”进 Electron
我们没有要求玩家自行安装 Ollama,而是直接将其二进制文件和模型文件(GGUF)打包进了游戏的 extraResources 中。
1. 自动化环境审计
AI 虽好,但不能拖垮玩家的电脑。我在代码里加入了一套严苛的硬件检测逻辑:
- 内存门槛: 系统内存必须 6GB$。
- 显存优先: 为了保证生成速度,我通过 nvidia-smi 和注册表查询,确保玩家至少有 2.5GB 的可用显存(VRAM)。如果检测不达标,系统会优雅地回退到传统的静态文案,避免由于硬件过载导致的程序崩溃。
2. 私有端口与进程隔离
为了不干扰玩家电脑上可能已经安装的 Ollama 服务,我们强制指定了私有端口 20120。
此外,针对 Windows 平台常见的一个坑——关闭游戏后推理引擎可能变成“僵尸进程”持续占用显存,我写了一个清理机制:在游戏退出时,通过 taskkill 强制清理整个进程树。
TypeScript
// 针对 Windows 的“僵尸进程”补丁
if (process.platform === 'win32' && ollamaServerProcess.pid) {
exec(`taskkill /pid ${ollamaServerProcess.pid} /t /f`, (err) => {
if (err) console.error('[ollama] 强制清理进程失败:', err);
});
}
赋予 AI “人格”:Prompt 的设计逻辑
为了避免那种一股子“AI味儿”的官话,我们在 ScenarioConfig 中为每种场景(如:战争爆发、通胀、失业潮、选举舞弊传闻)定义了非常具体的系统指令。
我们的核心规则只有几条:
- 拒绝助手感: 严禁出现“好的,这是为您生成的评论”之类的废话。
- 严格字数限制: 模仿社交媒体,必须在 140 字以内。
- 情绪化: 允许并鼓励民众表现出恐惧、愤怒、盲目爱国、愤世嫉俗或冷嘲热讽。
示例(通货膨胀场景):
System Prompt: "你是帝国的一名普通公民。物价涨得比反应速度还快。用愤怒或苦涩的幽默发一条短动态。不要有助手的语气,不要引述,不要标语。"
目前的进展
目前,本地 AI 运行环境已经能够随游戏启动无感初始化。正如日志图里显示的,模型已经成功加载并在后台就绪。
下一阶段,我将进一步优化评论的“记忆力”,让 AI 能根据玩家之前的名望和历史政策,产生更具连续性的抨击或赞美。


暂无关于此日志的评论。