现在的 AI 角色扮演,玩完就没了

你和一个 AI 角色聊了三个小时,她记得你救过她,记得你们在第四节车厢的那次争执,记得你撒过的那个谎。然后你关掉窗口。

第二天你回来,她还在,但她不再是「那个她」了。上下文被截断、记忆被压缩、角色被重置。你那三个小时不是一段可以回到的历史,它只是一段蒸发掉的对话。

这是今天几乎所有 AI 角色扮演产品的共同问题:游玩状态是对话的副产品,不是一等公民。 你没法存档到某一刻、没法回到岔路口重选、没法把「我这盘 Elena 已经走到黑暗结局」分享给朋友让他从这里接着玩。

我们的答案:把世界和灵魂都做成可版本控制的东西

WorldLines 借用了软件工程里一个很成熟的想法 —— commit-tree(提交树)。

写代码的人都知道 git:每一次有意义的改动是一个 commit,commit 串成一棵可以分叉的树,任何一个节点都能精确复现、可以从那里长出新分支、可以推给别人。

我们把同样的东西用在叙事上。在 WorldLines 里有三种「东西」是带版本的:

  • 世界(World) —— 一个可玩的故事舞台。作者发布 dark-train@2.0,这是它的「创作者版本」。

  • 灵魂(Soul) —— 一个有人格内核的角色。她有自己的记忆、价值观、底线,可以是你的化身,也可以是世界里的 NPC。

  • 游玩本身 —— 这是关键。你玩的每一个有意义的回合,都会生成一个 commit:那一刻的世界状态 + 每个角色灵魂的状态 + 每个 agent 的完整对话上下文,被算成一个不可篡改的哈希。

哈希不是事后贴的标签 —— 哈希就是这个状态的身份本身。同样的内容,在任何一台机器上算出来都是同一个哈希。这意味着:

  • 存档到任意一刻 —— 不是「最后一次自动保存」,是每一回合都有据可查。

  • 回到岔路口 —— 从任何一个 commit 分叉出一条新支线,原来的历史完整保留。

  • 真正的可移植 —— 把一个 commit 拿到另一台机器(甚至浏览器里),从那一刻继续,结果和在原机器上一模一样。

  • 可分享 —— 「我这盘走到这了,你从这接着玩」变成一句 commit hash。

灵魂不会因为你关掉窗口就失忆

Soul 不只是一张角色卡。她的记忆分短期和长期、会因为情绪和重要性被巩固或遗忘、会因为亲近而靠近也会因为价值冲突而疏远 —— 而这些状态,每一回合都进她自己独立的 commit 链。

她不知道自己在哪个世界里(她的 commit 不写世界的信息),所以同一个「已经经历过黑暗列车结局的 Elena」,可以被带进另一个完全不同的故事。灵魂是可以独立流通的资产。

具体发生了什么 —— 以 Elena 为例,一个文件一个文件地看

你导入一张角色卡。WorldLines 把它解开成一个 soul 文件夹。Elena 是谁 —— 核心性格、价值观、背景故事 —— 落在 persona/ 和 background/ 里,这两个是冻结的:创建之后没有任何东西能覆盖它们。这部分其实今天的角色卡就已经给你了;我们只是让它不再腐烂。

然后你开始玩,每一个动作都会落到一个具体的文件上,而且只有一个特定的 agent 有权写它:

  • 你买了一把剑。 soul-action 写 character/inventory.json 和 character/wallet.json。钱少了,剑进包了 —— 在磁盘上,不是在上下文窗口里。

  • 你跟她说话。 soul-dialogue 和 soul-memory 写 short-term-memo/(conversation_cache.json、recent_events.json)—— 这是这一盘的工作记忆。

  • 某件事在情感上击中了她 —— 她开始信任你,或者你伤了她。soul-memory 把它向上巩固进 long-term-memo/:important_events.md,以及你真正在问的那个 —— Elena 跟你有多近,存在 long-term-memo/emotional_memories.json 里,随着关系变化被重写。persona/relationships.json 那个基线永远不变;感受到的距离是长期记忆,不是 persona。

每一回合,这一整个 soul 状态被哈希成 Elena 自己链上的一个 commit —— 这条链从不记录她在哪个世界里。

跨世界版本迭代

世界作者发布 dark-train@2.0。你把同一个 Elena 带进去。因为她的 commit 链是她自己的,不带任何世界数据:

  • persona/ / background/ —— 完全一样。她还是同一个人。

  • long-term-memo/ —— 跟着她走。她还记得黑暗列车的结局,还带着她对你的那份感觉。

  • short-term-memo/ —— 一个新实例干净开始;这一盘的草稿不会渗进另一盘。

  • character/ —— fork 时你说了算:让她的装备从头开始,还是带过去。它只是一组你选择要不要包含的文件。

短期是每一盘的草稿;长期和 persona 是她;世界是另一条她从不反指的链。

这对平常的 AI 对话意味着什么

在 Character.AI 或一盘 SillyTavern(酒馆)里,上面这一切是同一个东西:上下文窗口里的 token。你的物品栏、她对你有多近、三个小时前发生了什么 —— 它只存在到窗口塞满或你关掉标签页为止。没有 inventory.json。没有 commit。「从我们上次的地方继续」是尽力而为的重新总结。

WorldLines 把这每一样都做成一个你拥有的文件、一个你能存档到任意回合、能分叉、能递给朋友、能在另一台机器上一模一样复现的哈希 commit。一样是从角色卡开始 —— 区别是第一句话之后的一切,不再蒸发。

终局:一个被玩过的世界,会变成一个社区

这套体系真正的野心在更远处。

当一个世界的某个 commit 可以被分发出去,它就不再是「一个静态的故事模组」。它是一个活的节点:别人可以 fork 它、从你停下的地方继续、把他们的续写打卡回来、在它下面形成讨论。世界观本身可以被定期维护、扩写、续写 —— 由一群人,而不是一个作者。

这就是 WorldLines 的 hub 体系最终要长成的样子:不是一个故事商店,而是一棵所有人都能往上嫁接的叙事树。git 让全世界的程序员可以协作在同一份代码上;我们想让全世界的玩家和创作者,可以协作在同一个不断生长的故事世界上。

现在在哪一步

世界 hub 与灵魂 hub 的分发管线、三轴版本模型(创作者版 / 实例 / commit)、跨机器可复现的 commit 快照 —— 地基已经设计锁定,正在实装。多 agent 运行时(一个世界 agent 协调 N 个有独立心智、各自跑自己模型的角色 agent)是接下来的核心工程。

你那三个小时,不该蒸发。它该是一个可以回去的节点,一棵可以长下去的树。

—— Ludic Dynamics

Ludic Dynamics
Ludic Dynamics 从东京打造 AI 驱动的世界。