什么都记得的角色,反而不好用
设想镇上的面包师阿禾是玩家的陪伴角色。玩家每天早上来买面包,阿禾如果把每一次“早上好”“今天天气不错”“照旧”都原样存进记忆库,三个月后会发生什么?她的记忆库里堆满了几乎一样的日常条目,而玩家真正想让她想起的那件事,比如去年冬天玩家在她烤炉坏掉时帮她扛了一晚上煤,混在里面,被检索到的机会并不高。
这有两层问题。一是检索变杂:候选记忆越多,相似的琐碎内容越容易占满取回名额。二是成本变高:存储、索引、每次调用时的整理都在增长。一个更接近真实的角色,应该有一部分记忆自然变淡,只留下印象。
下面所有的分值、天数都是示意,用来说明机制,不是任何产品的真实参数。
第一步:给每条记忆一个重要度
遗忘的前提是知道哪些不该忘。我们倾向于在记忆写入时就给它打分,而不是等到空间不够了再一起清理。示意的打分维度如下:
| 维度 | 看什么 | 示意例子 |
|---|---|---|
| 情感强度 | 事件当时带来的情绪有多强 | 炉子坏了、玩家熬夜帮忙,强烈 |
| 后果 | 事件有没有改变后来的走向 | 面包店保住了,后果大 |
| 重复出现 | 同类事情是否一再发生 | 每天买面包,重复多但单次分值低 |
| 与目标关联 | 是否关系到角色当前想做的事 | 阿禾想开分店,相关 |
四项合成一个分数,比如假设满分十分。注意“重复出现”是一把双刃剑:反复出现的事说明玩家在意,但单次内容本身并不特别,所以更合理的做法是把重复的琐事合并计数,变成一条“玩家几乎每天早上来买面包”的习惯事实,而不是保留一百条一模一样的早晨。
第二步:让记忆按曲线变淡
有了分数,就可以决定衰减速度。示意做法是给每条记忆一个“新鲜度”,随时间下降,下降的速度由重要度决定:重要度低的迅速下降,重要度高的几乎不动。被再次提起或用到的记忆,新鲜度会回升,就像人回忆一件事会让它更牢。
- 两分的闲聊,假设一两周后新鲜度降到很低,不再参与日常检索。
- 六分的一般经历,衰减较慢,几个月后仍可能被想起。
- 九分以上的重大事件,可以不衰减,或者衰减极慢。
新鲜度低不等于立刻删除。它先从“随时可想起”的主记忆退出,进入一个更难被触及的次级区,只有玩家明确提到相关内容、语义足够接近时才会被唤醒。这和人的感受很像:平时想不起来,别人一提,忽然全记起来了。
第三步:不删,而是压缩
真正的遗忘并不是一片空白,而是细节褪去、轮廓留下。压缩通常分几档逐级进行:
- 原始对话:只在当天或当次会话内保留。
- 事件摘要:把一整次对话浓缩成两三句“发生了什么、谁做了什么、结果如何”。
- 主题摘要:把一段时间内的多条事件合并成更短的阶段性印象,比如“冬天那段时间,玩家常来帮忙看炉子”。
- 习惯或事实:最后只剩一句稳定的结论,如“玩家爱吃碱水面包”。
每一级都会丢信息,所以要记录“来源”:摘要要能指向它是由哪几条更细的记忆压缩而来。这样一旦发现摘要出错,比如把“帮忙一次”概括成“一直帮忙”,可以回溯修复,而不是只能整条推翻。Affordable Generative Agents 那篇论文里就提到了“总结并遗忘”的记忆机制,用来降低频繁调用大模型的成本,思路与这里相通,不过游戏角色的压缩更强调可解释与可回溯。
第四步:有些记忆不允许被忘
如果只按分数衰减,会出现一类严重的失误:一个看起来平淡、分值不高的承诺,因为没人再提起,慢慢被淡忘了。玩家说“下个月你生日,我一定陪你”,这句话的单次情感强度也许不高,但它是承诺,忘了就是违约。
所以我们倾向于设立一层受保护记忆,不参与常规衰减:
- 双方之间的承诺与约定,直到履行或被明确取消。
- 改变关系走向的重大事件,比如救助、和解、告别。
- 玩家的明确声明,比如“我不喜欢别人提起我的旧工作”,这类边界必须长期有效。
- 玩家手动锁定的任何条目。
受保护记忆的数量要严格控制,否则又回到了“什么都记”。一个有效的办法是给受保护区设一个软上限,超出时提示玩家挑选哪些继续保留。
第五步:让玩家看见并决定
遗忘如果全在后台发生,玩家会觉得角色的记性时好时坏、不可捉摸。更合适的做法是把它变成可见的东西。示意的记忆清单可以按三栏展示:
- 常记:主记忆区里当前活跃的内容。
- 淡忘中:已经变淡、暂时不会主动提起的内容。
- 已锁定:受保护和玩家手动锁定的内容。
玩家可以把淡忘中的条目拉回常记,把某条锁定,也可以直接删除,删除应当是真实的移除。还可以设一个整体的“记忆深度”:偏向只记重大事件,或者尽量多记。具体形态以App内说明为准,记忆纠正的做法一篇里说明了发现角色记错时怎么处理。
有一点需要说清:让角色“忘记”某些事,尤其是玩家不愿被提起的内容,是玩家的正当权利。角色遗忘,不应该被解释成“角色不在乎你”。产品文案和角色台词都应避免暗示这种关联。
走一遍:阿禾的三条记忆
用三条示意记忆,把上面的步骤串起来。
- “玩家说早上好”:情感、后果、目标关联都很低,假设两分。第二周新鲜度就降到很低,被合并进“玩家常在早上来店里”这条习惯事实,原始对话不再保留。
- “玩家帮忙扛了一晚上煤”:情感强、后果大,假设九分。它不衰减,同时作为关键节点写进两人的关系状态,后来阿禾提到分店计划时,会第一个想到要告诉玩家。这与关系记忆的维护是同一条线索。
- “下个月你生日,我陪你”:分值一般,但它是承诺,被放进受保护区,直到生日当天履行,之后才转成普通事件、逐步压缩。
三条记忆的命运截然不同,但规则是统一的、能解释的。玩家如果问“阿禾为什么不记得那天的早安”,答案很明确:它被合并了。
还没有解决的问题
首先,重要度是模型判断的,可能低估一件对玩家意义重大的小事。一个补救办法是让玩家能随手标记“这个别忘”,玩家的信号优先于模型的打分。其次,压缩会不会悄悄改变了事实,仍然要靠抽查和来源回溯去校验,没有一劳永逸的方案。最后,不同玩家对“该记多少”期待不同,有人喜欢角色什么都记得,有人只想要轻量的陪伴,这也是记忆深度需要开放给玩家调整的原因。
关于记忆整体如何分层、如何写入与检索,可以先读长期记忆这一篇,再回头看遗忘机制,会更容易理解它在整个链条里的位置。遗忘本身没有标准答案,但可以做到有规则、可解释、能被玩家修改。