跳转到内容

记忆衰退

不妨把人格的长期记忆想象成书桌上的便签。她在每次回复前都会重读桌上的每张便签,因此堆满便签的书桌会让每次回复变得更长、更昂贵。记忆衰退会把一段时间内无人需要的便签移进抽屉里。它们并没有被丢弃:当对话触及抽屉里的某张便签时,她会重新把它拿出来。在本文档中,书桌上的便签被称为生效中,而抽屉里的便签被称为休眠中。

记忆衰退需要嵌入模型;请参阅提供方与模型。若没有嵌入模型,每条记忆都会保持生效状态。

  1. 每条记忆都有一个未使用天数计数器。计数器初始值为 0。
  2. 每次回复时,TomoriBot 都会执行一次搜索。她将最新消息转换为嵌入向量(表示其语义的一组数字;请参阅搜索机制),并将其与该对话中可能用到的每条记忆进行比对。
  3. 在服务器记忆和个人记忆中,只要匹配度达到合理阈值,最接近的最多 3 条匹配项就会计为已使用。它们的计数器归零。
  4. 该次搜索中的所有其他记忆的计数器增加一天。无论发送了多少条消息,这在每天(UTC)最多发生一次。
  5. 当计数达到 7 天时,记忆进入休眠状态。它不再随每次回复一同发送,但依然保持保存状态并可被搜索。
  6. 当后续消息与休眠记忆匹配时,她会将其加入该次回复中,其计数器随之重置,从而重新生效。

处于生效状态并不等同于被使用。记忆之所以能保持生效,仅在于它持续成为某些消息的最佳匹配项之一。

只有搜索成功的日子才会计入。没有任何对话的一天,或者搜索失败的回复,不会产生任何改变,因此记忆不会仅仅因为时间流逝而休眠。

以一条服务器记忆为例:「Juno 的猫叫 Mochi」:

聊天天数发生了什么计数器状态
保存当天已保存0生效中
接下来的 6 个聊天日聊游戏;从未提到 Mochi6生效中
安静的一周没有人说话6生效中,暂停
下一个聊天日另一次未提到 Mochi 的聊天7休眠中
后续的某个聊天日Juno 问「Mochi 最近怎么样?」0为该次回复召回,随后生效

服务器记忆在该人格于该服务器发言的日子里老化。个人记忆仅在其所有者参与对话时才会被搜索,因此仅在这些日子里老化。Bau 每月来访一次,所以 Bau 的记忆需要经历 7 次从未提及的来访才会休眠,常客活跃的日子并不会消耗这些天数。

因隐私设置、黑名单、频道限制或标签而隐藏的记忆绝不会被搜索,因此它们既不会老化,也不会被唤回。

默认情况下,每个人格可容纳 100 条服务器记忆和 100 条个人记忆。当 TomoriBot 将新记忆保存到已满的列表中时,她会遗忘一条休眠记忆以腾出空间。从未匹配过的记忆最先被遗忘,然后是最近匹配时间最久远的记忆。确认提示会根据服务器的记忆提示可见性设置,显示保存了什么以及遗忘了什么。

她绝不会遗忘:

  • 全局个人记忆
  • 某人通过 /memories 或 /personal memories 添加或编辑过的记忆

导入的记忆不受保护。若要保护某条记忆,请使用 /memories 或 /personal memories 对其进行一次编辑并保存。受保护的记忆依然可以休眠并通过搜索恢复;保护机制仅防止其被遗忘。

如果没有符合条件的记忆,或者该次回复无法使用搜索,则会拒绝保存。

像「始终用西班牙语回复 Juno」这样的记忆很少会与人们的发言内容匹配,因此它可能会休眠并停止生效。请将应该始终适用的指令放入人格属性、人格提示词,或常开(Always On)世界书条目中。

搜索在每次回复中是一次嵌入请求,与文档搜索共享。召回的记忆位于提示词靠近末尾的位置,紧邻文档,因此提示词的开头部分在各次回复之间保持一致。提供方通常会对重复的提示词开头给予折扣优惠,因此记忆召回能够保留该折扣。只有在记忆在生效中与休眠中之间发生转移后的首次回复中,开头部分才会发生改变。

自部署者可以设置 MEMORY_DECAY_ENABLED=false 为整个实例关闭记忆衰退。此时每条记忆都将保持生效状态,不会遗忘任何记忆以腾出空间,且列表已满时会拒绝新的保存。文档搜索依然正常工作。记忆衰退还需要 pgvector 数据库扩展;请参阅手动部署。