共享世界的实现

数据和运行链路

flowchart LR
  U[世界设定] --> I[本地模型初始化]
  I --> V[结构与引用校验]
  V --> S[SQLite 世界快照]
  S --> P[同一快照上的全部人物规划]
  Q[用户行动队列] --> R[统一规则判定]
  P --> R
  R --> J[必要时模型裁决]
  J --> C[冲突仲裁与不变量检查]
  C --> T[快照和事件原子提交]
  T --> S
  S --> UI[浏览器地图与时间线]

World 保存原始设定、地点、存在、规则、轮次及版本。存在分人物和物品;物品只有一个 owner,位置必须和主人一致。地点连接显式存在。人物的目标、描述、体力、健康与状态共同构成下一轮输入。

规则分客观事实、代码约束、自然语言裁决。代码约束支持行动禁令、人物标签条件、体力消耗。引擎自身强制位置、所有权、唯一消耗和单轮单行动等条件。任何模型生成内容均须经 Pydantic 校验;模型输出没有执行 Python、Shell 或任意补丁的入口。

并行演化的含义

这里的并行指世界语义:全部人物在同一个起始快照和时间边界上提出意图,随后统一提交。为了在一块 3090 上高效运行,自动人物的意图被合并为一次结构化模型请求;这不是多个 GPU 进程同时写世界,也不是按人物轮流更改现实后让后面的人偷看结果。

冲突优先级基于排序后的人物 ID,并按轮次轮换,避免固定顺序长期偏袒某个人。对人物位置和物品资源加本轮逻辑占用标记,交换与移动互斥,所有权修改始终满足位置约束。失败事件记录原因,不发生部分写入。

人物等待不等于世界暂停。没有用户输入时,自动人物仍继续规划;控制人物无意图时等待。看向哪个地点不影响调度。

客观历史和长期运行

SQLite 使用 WAL、BEGIN IMMEDIATE 事务和预期版本校验。每次提交包含完整快照与事件,哈希串联前一版本。重启读取最新提交,历史快照可查、可导出、可分支;导入先校验整条链再写入独立世界。哈希用于发现意外损坏,不是外部签名或不可伪造证明。

模型记忆使用「原始设定 + 当前结构化世界状态 + 最近事件」,上下文有界。更早的完整事件保存在数据库,默认不全部送入模型。描述状态承载已经落实的持续变化;复杂长线心理、秘密知识图谱、自动历史语义检索尚未实现。因此这是可运行的共享世界基础版本,不能声称无上限地记住每句聊天或准确模拟任意物理过程。

当前每次提交保留完整快照,适合个人小世界;长期运行的数据库会增长,需定期备份。重启不会自动恢复运行循环或内存中的待执行行动,防止无意继续推理。

自定义互动的边界

模型可裁决行动是否符合自然语言前提,只能改变执行者及同地点目标的描述状态;代码独占位置、所有权、时间、体力及消耗标记。自定义互动不能借修改描述重复使用已消耗物品。固定设施建模为 tags=[fixed] 的物品,可以描述修复结果,不能拾取。

健康字段保留,当前没有战斗数值系统。生产、物品销毁/生成、经济、远程通信等需要显式扩展动作和不变量。世界作者新增存在是有记录的管理操作,不是人物凭空造物。

语音和任务调度

AudioWorklet 采集单声道音频并重采样成 16 kHz PCM WAV。连续对话由浏览器能量阈值和停顿检测切句,SenseVoice INT8 在 CPU 识别。llama.cpp 在 GPU 逐 token 生成,MeloTTS 在 CPU 分句合成,浏览器提前请求后续句子、顺序播放。

每次前台对话抢占尚未完成的后台模型请求,被取消的整轮不提交,之后从原快照重试。ASR 和 TTS 各自有独立并发门限,不阻塞 FastAPI 事件循环。最多 240 token 的对话回复和短句输出控制等待时间。连续模式在回应期间暂停采集,手动重新录音可打断播放,不承诺全双工回声消除。

角色对话只发送角色和同地点实体,不发送全局实时状态;公共规则与概要仍会发送。此机制不是严格的角色知识推理系统。纯对话不修改世界,行动必须走命令解析、排队、规则裁决和提交路径。

部署和数据边界

本地绑定 loopback,拒绝不受信任 Host 和跨源请求,不启用任意跨域访问。公网只放明确列入发布清单的静态文件和源码 ZIP。下载包不含 base/、模型、数据库、虚拟环境、私钥或服务器凭据。部署脚本读取外部 SSH 私钥路径,维护 eventer 独立站点并校验其他站点配置未改变。