什么都记得的角色,反而不好用

设想镇上的面包师阿禾是玩家的陪伴角色。玩家每天早上来买面包,阿禾如果把每一次“早上好”“今天天气不错”“照旧”都原样存进记忆库,三个月后会发生什么?她的记忆库里堆满了几乎一样的日常条目,而玩家真正想让她想起的那件事,比如去年冬天玩家在她烤炉坏掉时帮她扛了一晚上煤,混在里面,被检索到的机会并不高。

这有两层问题。一是检索变杂:候选记忆越多,相似的琐碎内容越容易占满取回名额。二是成本变高:存储、索引、每次调用时的整理都在增长。一个更接近真实的角色,应该有一部分记忆自然变淡,只留下印象。

下面所有的分值、天数都是示意,用来说明机制,不是任何产品的真实参数。

第一步:给每条记忆一个重要度

遗忘的前提是知道哪些不该忘。我们倾向于在记忆写入时就给它打分,而不是等到空间不够了再一起清理。示意的打分维度如下:

维度 看什么示意例子
情感强度 事件当时带来的情绪有多强炉子坏了、玩家熬夜帮忙,强烈
后果 事件有没有改变后来的走向 面包店保住了,后果大
重复出现 同类事情是否一再发生 每天买面包,重复多但单次分值低
与目标关联 是否关系到角色当前想做的事阿禾想开分店,相关

四项合成一个分数,比如假设满分十分。注意“重复出现”是一把双刃剑:反复出现的事说明玩家在意,但单次内容本身并不特别,所以更合理的做法是把重复的琐事合并计数,变成一条“玩家几乎每天早上来买面包”的习惯事实,而不是保留一百条一模一样的早晨。

第二步:让记忆按曲线变淡

有了分数,就可以决定衰减速度。示意做法是给每条记忆一个“新鲜度”,随时间下降,下降的速度由重要度决定:重要度低的迅速下降,重要度高的几乎不动。被再次提起或用到的记忆,新鲜度会回升,就像人回忆一件事会让它更牢。

  • 两分的闲聊,假设一两周后新鲜度降到很低,不再参与日常检索。
  • 六分的一般经历,衰减较慢,几个月后仍可能被想起。
  • 九分以上的重大事件,可以不衰减,或者衰减极慢。

新鲜度低不等于立刻删除。它先从“随时可想起”的主记忆退出,进入一个更难被触及的次级区,只有玩家明确提到相关内容、语义足够接近时才会被唤醒。这和人的感受很像:平时想不起来,别人一提,忽然全记起来了。

第三步:不删,而是压缩

真正的遗忘并不是一片空白,而是细节褪去、轮廓留下。压缩通常分几档逐级进行:

  1. 原始对话:只在当天或当次会话内保留。
  2. 事件摘要:把一整次对话浓缩成两三句“发生了什么、谁做了什么、结果如何”。
  3. 主题摘要:把一段时间内的多条事件合并成更短的阶段性印象,比如“冬天那段时间,玩家常来帮忙看炉子”。
  4. 习惯或事实:最后只剩一句稳定的结论,如“玩家爱吃碱水面包”。

每一级都会丢信息,所以要记录“来源”:摘要要能指向它是由哪几条更细的记忆压缩而来。这样一旦发现摘要出错,比如把“帮忙一次”概括成“一直帮忙”,可以回溯修复,而不是只能整条推翻。Affordable Generative Agents 那篇论文里就提到了“总结并遗忘”的记忆机制,用来降低频繁调用大模型的成本,思路与这里相通,不过游戏角色的压缩更强调可解释与可回溯

第四步:有些记忆不允许被忘

如果只按分数衰减,会出现一类严重的失误:一个看起来平淡、分值不高的承诺,因为没人再提起,慢慢被淡忘了。玩家说“下个月你生日,我一定陪你”,这句话的单次情感强度也许不高,但它是承诺,忘了就是违约。

所以我们倾向于设立一层受保护记忆,不参与常规衰减:

  • 双方之间的承诺与约定,直到履行或被明确取消。
  • 改变关系走向的重大事件,比如救助、和解、告别。
  • 玩家的明确声明,比如“我不喜欢别人提起我的旧工作”,这类边界必须长期有效。
  • 玩家手动锁定的任何条目。

受保护记忆的数量要严格控制,否则又回到了“什么都记”。一个有效的办法是给受保护区设一个软上限,超出时提示玩家挑选哪些继续保留。

受保护并不等于永久:承诺履行后,它可以转成一条普通事件,重新进入正常的压缩流程。

第五步:让玩家看见并决定

遗忘如果全在后台发生,玩家会觉得角色的记性时好时坏、不可捉摸。更合适的做法是把它变成可见的东西。示意的记忆清单可以按三栏展示:

  • 常记:主记忆区里当前活跃的内容。
  • 淡忘中:已经变淡、暂时不会主动提起的内容。
  • 已锁定:受保护和玩家手动锁定的内容。

玩家可以把淡忘中的条目拉回常记,把某条锁定,也可以直接删除,删除应当是真实的移除。还可以设一个整体的“记忆深度”:偏向只记重大事件,或者尽量多记。具体形态以App内说明为准,记忆纠正的做法一篇里说明了发现角色记错时怎么处理。

有一点需要说清:让角色“忘记”某些事,尤其是玩家不愿被提起的内容,是玩家的正当权利。角色遗忘,不应该被解释成“角色不在乎你”。产品文案和角色台词都应避免暗示这种关联。

走一遍:阿禾的三条记忆

用三条示意记忆,把上面的步骤串起来。

  • “玩家说早上好”:情感、后果、目标关联都很低,假设两分。第二周新鲜度就降到很低,被合并进“玩家常在早上来店里”这条习惯事实,原始对话不再保留。
  • “玩家帮忙扛了一晚上煤”:情感强、后果大,假设九分。它不衰减,同时作为关键节点写进两人的关系状态,后来阿禾提到分店计划时,会第一个想到要告诉玩家。这与关系记忆的维护是同一条线索。
  • “下个月你生日,我陪你”:分值一般,但它是承诺,被放进受保护区,直到生日当天履行,之后才转成普通事件、逐步压缩。

三条记忆的命运截然不同,但规则是统一的、能解释的。玩家如果问“阿禾为什么不记得那天的早安”,答案很明确:它被合并了。

还没有解决的问题

首先,重要度是模型判断的,可能低估一件对玩家意义重大的小事。一个补救办法是让玩家能随手标记“这个别忘”,玩家的信号优先于模型的打分。其次,压缩会不会悄悄改变了事实,仍然要靠抽查和来源回溯去校验,没有一劳永逸的方案。最后,不同玩家对“该记多少”期待不同,有人喜欢角色什么都记得,有人只想要轻量的陪伴,这也是记忆深度需要开放给玩家调整的原因。

关于记忆整体如何分层、如何写入与检索,可以先读长期记忆这一篇,再回头看遗忘机制,会更容易理解它在整个链条里的位置。遗忘本身没有标准答案,但可以做到有规则、可解释、能被玩家修改。