第十二次会话的开场,主持人描述队伍走进港口酒馆,那位在第七次会话里被玩家亲手杀死的商人,正笑着擦拭柜台。同一个晚上,战士想拔出那把银匕首,才发现背包清单里早就没有它了。没有人恶意欺骗谁,出错的只是一个记不住三个月的叙述者。

讲故事不难,长期管理才难

语言模型写一段场景描写、模仿一个粗鲁水手的口吻,几乎不需要额外工程。长期跑团的崩坏往往从四种小错开始:装备凭空消失,已死的NPC复活,主持人曾经许下的悬赏被彻底遗忘,规则在第二次和第十次会话里给出不同的裁决。单看每一处都能被玩家圆过去,叠在一起,玩家便会意识到自己的选择没有分量:反正世界不会记得。

根源在于上下文窗口不等于记忆。窗口是一张随时会被擦掉的桌面,而记忆是一间需要分类整理的档案室。把三个月的对话原文全部塞进去,既装不下,也检索不到重点;只保留摘要,又会在压缩的过程里丢掉关键细节。所以问题不该问“模型能记多长”,而该问“什么信息该以什么形式被保存”。

摊开的账本与桌面地图上方漂浮背包、关系、伏笔、规则四张记忆卡片,骰子和底部时间轴标示三个月跨度。
长期跑团的难点在于记忆,AI主持人要把背包、关系、伏笔与规则持续记录三个月以上。

五层记忆:各存各的,各用各的

保存内容 形式 谁来更新
事实账本 背包、血量、位置、任务状态结构化记录规则引擎与账本写入器
事件史 每次会话的摘要与关键原文 可检索的文本与标签 会话结束时由摘要模型整理
关系图 NPC与角色的好感、债务、秘密 带方向的图 事件触发时增量更新
伏笔栈 尚未回收的线索与承诺 带过期条件的栈主持人规划器
规则引擎判定、骰子、数值与条件 确定性程序规则文本,人类审定

五层分开,是因为它们对准确度的要求不一样。背包里有几支箭,不允许“大概”;一位NPC对队伍的印象,允许有一点模糊。前者用结构化数据,可以被程序核对;后者交给关系图,用带方向、带原因的边来表达,比如“老韦对灰岩:欠人情,原因见第三次会话”。最关键的是规则引擎:骰子、命中、伤害、豁免检定这些“确定性判定”,无论主持人多会叙述,都必须由程序执行,语言模型只负责把结果讲成故事。第一天没人在意,第九十天它就是玩家信任的基础。

一条账本记录大致长这样,同样是本文的示例格式:

{
  "id": "favor-0003-01",
  "type": "favor",
  "from": "老韦",
  "to": "灰岩",
  "session": 3,
  "status": "open",
  "terms": "老韦替队伍瞒下一批货,日后可请灰岩帮一次不问缘由的忙",
  "tags": ["港口", "税吏", "人情"],
  "expires": null
}

注意两点:其一,每条记录都有来源会话编号,便于回溯;其二,状态是显式的,“open”与“settled”之间的切换,只能由被认可的事件触发,而不是由叙述文本顺手改变。

检索、压缩与遗忘

五层信息不能每次都全部喂给模型。合理的做法是让场景来决定取什么:队伍走进港口,检索器就用“地点、在场NPC、当前任务”三组条件去查事实账本、关系图与伏笔栈,同时从事件史里取出最相关的两三段摘要。示例参数:单次上下文里保留不超过十条账本记录、五段事件史摘要,其余留在库里。

压缩是必要的,但有一条硬规矩:摘要只是索引,账本才是权威。每次会话结束,摘要模型可以把两小时的对话压成三百字,可凡是摘要里出现的“硬事实”,比如谁死了、谁获得了什么,必须先落入事实账本,再允许原文淡出。否则,压缩一次,丢一次。

遗忘同样要设计。路人的对白、一次没有后果的闲聊,可以随时间降权;血仇、债务、誓言、玩家亲手做出的不可逆选择,则永远不降权。有趣的是,“永久保留”并不等于“永远在场”,它们静静待在库里,等场景再次召唤。这一点与长期记忆为什么成为NPC与AI主持人的核心能力一文里的趋势判断相通:真正稀缺的,是知道哪些不能忘。

会话事件写入账本触发检索冲突检测生成叙述
本文讨论的主持人记忆流程:会话事件先写入结构化账本,下一场景由检索取回相关条目,经冲突检测后才生成叙述。

冲突检测:让新剧情先过一遍旧账本

再好的检索也挡不住模型偶尔“自由发挥”,所以需要在叙述生成之后、展示给玩家之前,插入一道冲突检测。流程很朴素:先让模型把即将展示的段落抽成“事实断言”,比如“商人在柜台后面说话”,再逐条与账本对照;命中矛盾时,给出三种处理:一是要求模型带着矛盾提示重写;二是若矛盾来自账本错误,转入人工确认;三是若剧情确有必要,比如商人其实是双胞胎兄弟,就走一个显式的“设定变更”,写入事件史并说明理由。

这与推理游戏里的一致性校验是同一种思路:不追求生成时永不出错,而是让错误在到达玩家之前被拦下。目前还没有好办法的,是那些没有显式断言的“暗矛盾”,比如语气、性格的悄悄漂移,这类问题只能靠角色设定卡与抽样评测慢慢压住。

多人并发、公平与透明账本

四个玩家在同一时间说出自己的行动,主持人如果按到达顺序逐条处理,先发言的人会占尽便宜。较稳妥的做法是采用“回合收集、统一结算”:先收集各自行动,规则引擎按先攻或事先约定的顺序排序,再依次写账本。若两人抢同一件战利品,判定交给规则引擎的对抗检定,而不是交给叙述的“谁描写得更漂亮”。私聊与秘密信息也要挂在可见范围上:只有对应的玩家能在自己的视图里看到该条记录,避免主持人在公共叙述里无意说漏。这些流程在AI桌游主持人的工作流与分工里有更详细的讨论,这里只强调一点:并发的公平性最终仍要落回账本。

透明是最便宜、也最有效的一道保险:允许玩家随时打开账本,查看自己的背包、任务、被记录的承诺与关系变化,发现错误可以直接提出修正,修正记录同样进入事件史。这样一来,即使系统偶尔出错,玩家也知道错在哪里、怎样纠正,信任不会随之崩塌。

示例:第十二次会话里的那笔人情

回到那笔债。第三次会话里,税吏老韦替队伍瞒下一批违禁货,作为回报,他保留了一次“不问缘由”的请求。此后九次会话里,这条记录静静躺在关系图与伏笔栈里,状态是“open”。第十二次会话,队伍再次进入港口,检索器按“地点:港口、在场NPC:老韦”查出这条记录,同时事件史里第三次会话的两段摘要被一并取回。

叙述生成之前,规则引擎先确认老韦当前仍然存活、仍在港口任职;冲突检测通过之后,主持人才让老韦在码头拦住灰岩,提出请求:明晚有一艘船需要“没人看见”。玩家在账本页面能看到这一条被点亮的人情,来源标着“第三次会话”。如果队伍这次答应,账本状态改为“settled”,关系图里老韦对灰岩的边被更新;如果拒绝,则写入新的事件,并让好感度下调,也让伏笔栈里的这条线以新的形式继续存在。

这就是PA真人AI桌游主持人在研究框架里追求的效果:三个月前发生的事,在合适的时刻回来,不多不少,而且有据可查。当然,这些仍是设计目标与演示方案,检索阈值、摘要质量与冲突检测的漏报率,都需要更长时间的真实跑团去验证。更多关于游戏大模型的分工,可以回到PA真人AI大模型栏目继续阅读。