新闻 · 第 01 篇

一个可自我学习的进化世界

OpenWorld 是一个基于角色扮演的智能化世界,它的全部状态和规则都是基于代码构建的。比较有趣的是,当这个世界在与玩家交互时需要全新的规则或物品,大语言模型就可以自动更新并且共享这个功能。

玩过沙盒游戏的人大概都经历过这样的苦恼:游戏里的交互,都是作者事先写好的。你往篝火上泼水,火灭了,是因为作者写过「泼水灭火」的规则。可如果你突发奇想,把一锅热汤浇到雪人头上,游戏却不响应……程序员管这种情况叫「未定义行为」(undefined behavior,简称 UB),传统游戏的处理,通常就是什么都不发生。

想造点新东西也是一样受限。你也许想在厨房里做出更多花样的菜,酿几种不同风味的酒,或者打一套自己设计的工具和盔甲,可只要作者没定义过这些物品,这些就无法发生。

OpenWorld 想做的,是让这个世界稳定运转的同时,鼓励玩家放开去想、放开去试。如果出现未定义的交互,就让 AI 当场补;如果出现未定义的物品,就让 AI 直接造。而且这些新规则新物品写一次即可,往后同类的情况都能直接用。

这个博客就来讲讲它是怎么做到的,以及我们接下来想做什么。

01我们过去通往开放世界的两条路

我们所说的开放世界,核心是:你可以去做一件无人预先规划的事,而世界会给出自洽合理的反馈。如今通向这个目标有两条路径,各自的优势,恰恰落在对方的短板之上。

一条是靠学习得到的世界模型,比如 Genie、GameNGen、Oasis 以及后续迭代版本:它们依据玩家操作逐帧生成画面,能够接纳任意交互输入,从这点来说具备开放性。但这个世界只寄居在像素与有限上下文窗口之中:GameNGen 的记忆窗口约三秒,Genie 仅保留十六帧,Genie 3 的视觉记忆上限大约一分钟。一旦玩家有长时程交互的需求,周遭可能早已物是人非。它也能凭空画出一件新东西,但过不了多久,这件东西可能就不见了。如果再算上部署模型的推理成本,甚至很难进行商业化的游玩,只能最后形成一些 Demo 和学术工作。

而另一条是传统游戏,也是目前游戏公司一直在发展的。《矮人要塞》、上古卷轴系列、《塞尔达传说:旷野之息》这套基于预先写好的规则的模拟引擎:空间宏大、状态持久、因果严格自洽,运行边际成本极低。但它本质是封闭的,凡是设计者没有写进规则里的交互,就不会发生;凡是没有预先设想的物品,就不会出现。

02我们认为开放是一类稀疏问题

我们的出发点非常简单:开放不是所有内容都要实时生成。玩家能试的东西看着无限,但高频有趣的交互其实是长尾分布。同一个场景只要解决过一次,再出现就该正常跑。同时模型还可以进一步分析总结内容需求,按照用户的交互轨迹进行改进,这让整个过程成为递归式的。

所以只有在某个情境第一次被触及的时候才需要开放。在这之后的一切最好交给代码:精确、持久、可组合、可读,而且重新运行不花任何代价。

模拟一切的依旧是代码,每一帧都是:人们过着各自的日子,火沿着干草蔓延、被雨浇灭,故事按它的轨道推进。

模型只在需要的时候写代码,也就是世界遇到规则留空的情境时。同时,它写下的东西会被保留,放进规则库,往后同类的情况都照它来,每个特殊情境只付一次代价。新物品也是如此:只有世界里真的没有合适的东西时,模型才会新造一类。

工作原理:有规则时规则作答;没有规则时只问一次模型;之后所有人都直接运行这条规则。

对于新物品,我们在游戏中预留了一类 NPC:手艺人,比如铁匠 Garrick。你可以跟他聊天,问问某样新东西能不能做出来,比如「用原木挖一个盛炖菜的木碗」。几秒钟后他就会回话、给出配方,图样随后画好;如果这东西你本来就能做,他会直接告诉你怎么做。

和铁匠 Garrick 一起做一只木碗:说出想法,过检查,做成,再用一用这件新东西。

03我们总结出来规则本质是事件交互的结果

在这个开放世界里,所有变化都源于事件;而事件会产生什么效果,由承受这件事的事物自身规则决定。篝火自带一套规则,定义雨水淋上去会发生什么;史莱姆也有自己的规则,定义火焰碰到它会怎样。规则可以读取世界里任意信息,但只能修改自身所属的这个事物。如果要影响别的东西,它就向外发送一个事件信号,交由对方依照自己的规则去响应。

基础规则库示例:火焰接触物体的交互规则,同一标签以及同一状态的同类事物,只需要重新写入一次。

规则面向的应该是具体的分类集合,也就是我们所划分的类型、标签和状态,而不是单独某一个客体(一只特殊的史莱姆,或只在某个场景里出现的一张床)。只要一条规则写完,那么同类所有客体全部生效。事件本身来自一个有限并且固定的集合:玩家主动操作、外物冲击、接触、碰撞、时间流逝、数值触达阈值、进入视野、卡住、受损。

所以,一条规则就是一棵条件判断树,最终的结果往往写在树的叶子节点。有些叶子是故意不写一些内容作为留白:这里还没有定义这个事物遇到该条件时的反应。比如火焰史莱姆被火碰到,或者玩家突发奇想斧头拿去撬绞盘,又或者有人尝试拿绳子递给狼,这些留白大大拓宽了开放的边界。

空白叶子示例:规则库写好了油和大部分物体的交互,剩下的情况预留空白。
因此,我们说我们的游戏本身完全不依赖大模型。不接入模型的时候,碰到这些空白叶子就走默认逻辑,大多是什么都不发生。游戏依旧可以正常游玩、通关,和传统游戏没有区别。

04我们可能有着奇异博士看到的 1400 万种未来

一切事物都自带一套本性,所以没有任何一件事是孤立的。闪电劈中枯木便燃起明火,大雨落下就熄掉篝火;有人借着风雨掩护行窃,悬赏告示随之传遍渡口。新造出来的东西也一样:一只刚做好的木碗,第一次被拿去敲铁砧,世界就为它补上一条新规则,它也从此卷进这些连锁反应里。每一件发生的事,都会搅动周遭的人和物,涟漪再向外扩散,牵出一连串新的变化,所以每一次的未来都不会完全一样,这正是开放世界的魅力所在。

渡口的暴风雨,以及它荡开的层层影响:此地的环境、往来的人、各样物件、固有规则与衍生任务。

规则可以无缝接入现有的世界逻辑:一旦摆渡人学会暴雨受困时守在火堆旁,火、雨水,还有她身边所有事物,依旧按原本的步调运转。

05当我们达到了世界的彼岸

当事件落到空白分支时,我们不希望引擎把整个世界都暂停了。于是我们选择只暂停这个被波及的事物,其余一切照旧往前走。

模型会先试着从已经存在的世界本性里找解法:先看事件涉及的类型,再翻一遍现有的物种和物件库。实在找不到适配的,才会新增一类事物,顺带生成它的示意图像。最后产出一条适配这个类型的规则,填回这片空白。

一条习得的规则:倾倒液体的交互逻辑,同类流体只需要定义一次。

模型可以提出新规则、创造新物品,但引擎不会直接采纳,每条改动都要依次通过三道检查。第一道是静态校验,检查格式是否合法、引用的实体是否存在,并确保一条规则不越界影响别处。第二道是经济检查,专门防止「刷资源」。它把世界中所有的资源转换写成一个线性规划,只要存在任何一种组合能凭空产出资源,这条补丁就会在上线前被拒绝。第三道是沙盒审计,检查这条规则是否会造成安全隐患,比如游戏卡死、连锁失控。此外,有一部分基础规则在设计时就已定死,模型写下的任何东西都改不了它们。

目前来说,我们的单次请求大概十秒、成本五美分,而且这个成本不会一直存在。同时,规则库是所有人共用,如果之后别的玩家撞上相同场景,那么就可以直接当成普通代码跑。玩家还能按交互类型,自主调节模型介入的程度,从完全关闭到深度生成。

游戏内 AI 设置面板:按不同交互类型调整模型参与度,档位从关闭到高,各档位等待时长保持一致。
游戏内 AI 设置面板:按不同交互类型调整模型参与度,档位从关闭到高,各档位等待时长保持一致。

06一千张地图,以及接下来

因为不需要每次渲染都由额外的视频模型参与,世界可以做到内容允许的任何大小。

目前,OpenWorld 有 1,024 张地图,从城镇、村庄到每扇门后的房间;780 户人家里的 1,654 个人,各有自己的样子和一天的安排,还有 1,013 种、共 40,562 件物品,种类还会随着玩家和 AI 造出的新东西变多。玩家离开的场景不必一直全速运行:等玩家回来时,再把这段时间里的变化一次补算出来,省钱也省事。

世界的规模:一张地图,然后是一千张;一个人,然后是一群人;一只倒不完的箱子。

我们希望 modder 在未来可以更加自动化:modder 会在世界变大的同时改自己,记住见过的事,给自己写技能,改自己的工作流程,从而实现递归式地自我改进。我们认为,这可能是通向真正开放的世界最直接的一条路。

引用

@misc{openworld2026,
  title        = {OpenWorld: A Large Symbolic World},
  author       = {{OpenWorld Team}},
  year         = {2026},
  howpublished = {\url{https://openworldrpg.ai/}}
}