一个终端里的文字推理游戏,剧情取自2012年动画《Another》(アナザー)。玩家困在一桩神秘事件的循环里,反复探索地点、盘问角色、翻查档案、串联线索,最后尝试用一场仪式把真相翻出来。每一轮循环都多给一次机会,让你注意到上一轮漏掉的东西。
![]()
作者把这种“机器里的幽灵”理解成藏在系统内部的纠缠:旧记录、重复的对话、人们不愿说出口的秘密,以及世界重置后仍然残留的痕迹。答案不会直接告诉你,得自己推。
真正值得看的是架构选择。作者想让大模型把游戏演活,但不想让它决定游戏规则,于是把确定性的机制和语言模型的部分彻底切开。
流程大致是这样:玩家在终端输入,进入顶层的 LangGraph 工作流。如果没有正在进行的 NPC 对话,输入先交给规划器(Planner,用 Gemini 做结构化输出),解析成一个游戏动作——移动、查看地点、和 NPC 说话、检索文档、交叉比对文档,或者尝试仪式。动作被转成带类型的 ActionRequest,再交给确定性的 GameEngine。
GameEngine 是唯一的权威。它校验动作、扣行动点、检查游戏条件、更新状态。模型不能直接解锁线索、不能改污染度、也不能决定仪式成不成功。世界设定集(World Bible)提供标准的故事与游戏数据;查档案时走的是作者已有的 MCP 文档检索工具,而不是把模型生成的文字当成证据。
NPC 对话走的是对话路由。玩家先选定一个 NPC,工作流记下当前对话对象,然后问你想问什么。下一条输入会被当作对这个 NPC 的提问,而不是一个新的全局动作。引擎校验通过后,才调用该 NPC 对应的子图。
每个 NPC 在设定集里都有独立子图,配独立的记忆检查点和按会话与 NPC 划分的线程 ID,角色之间的对话历史互不串味。NPC 还有知识边界和允许触及的线索 ID,线索是否真的被发现仍由引擎说了算,对话本身不改游戏状态。输入 /back 就退回主规划器。
角色对话用的是本地 Ollama 跑的 Gemma3:1B,规划器和旁白目前用 Gemini。作者选这套组合,是为了能在本地调 NPC 行为、控制提示词,并把角色对话和游戏机制隔开。同一个本地 Gemma 模型靠不同提示词扮演不同角色,不必给每个角色单独加载一个模型。
记忆目前只在内存里,应用重启就没了。作者把换成 SQLite 或 PostgreSQL 检查点列为后续改进。下一步还包括:把所有动作类型和 NPC 跑一遍端到端测试,加固话题与线索解锁,改善模型输出格式错误时的兜底;界面方面计划加一个 Streamlit 前端,给每个 NPC 单独一个聊天分支或面板。
作者对开放创新的说法很务实:Gemma 能在本地跑,提示词能看能改,每个角色允许知道什么可以自己定义,核心规则留在可测试的代码里。工具也能拼着用——LangGraph 编排流程、Pydantic 校验动作、游戏引擎管确定性机制、MCP 提供档案检索、Gemma 本地生成对话,改其中一块不用重写整个游戏。
对推理游戏来说,这种分离是关键。模型可以生成可信的对话,但故事的真相不该因为模型编出了一句像模像样的话就跟着变。
当前版本刻意做小:先把规则做可靠,让 NPC 有区分度,让谜题值得查。终端版是地基,更丰富的界面和可持久化的角色记忆放在后面。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.