记忆衰退
不妨把人格的长期记忆想象成书桌上的便签。她在每次回复前都会重读桌上的每张便签,因此堆满便签的书桌会让每次回复变得更长、更昂贵。记忆衰退会把一段时间内无人需要的便签移进抽屉里。它们并没有被丢弃:当对话触及抽屉里的某张便签时,她会重新把它拿出来。在本文档中,书桌上的便签被称为生效中,而抽屉里的便签被称为休眠中。
记忆衰退需要嵌入模型;请参阅提供方与模型。若没有嵌入模型,每条记忆都会保持生效状态。
记忆如何休眠与恢复
Section titled “记忆如何休眠与恢复”- 每条记忆都有一个未使用天数计数器。计数器初始值为 0。
- 每次回复时,TomoriBot 都会执行一次搜索。她将最新消息转换为嵌入向量(表示其语义的一组数字;请参阅搜索机制),并将其与该对话中可能用到的每条记忆进行比对。
- 在服务器记忆和个人记忆中,只要匹配度达到合理阈值,最接近的最多 3 条匹配项就会计为已使用。它们的计数器归零。
- 该次搜索中的所有其他记忆的计数器增加一天。无论发送了多少条消息,这在每天(UTC)最多发生一次。
- 当计数达到 7 天时,记忆进入休眠状态。它不再随每次回复一同发送,但依然保持保存状态并可被搜索。
- 当后续消息与休眠记忆匹配时,她会将其加入该次回复中,其计数器随之重置,从而重新生效。
处于生效状态并不等同于被使用。记忆之所以能保持生效,仅在于它持续成为某些消息的最佳匹配项之一。
只有搜索成功的日子才会计入。没有任何对话的一天,或者搜索失败的回复,不会产生任何改变,因此记忆不会仅仅因为时间流逝而休眠。
以一条服务器记忆为例:「Juno 的猫叫 Mochi」:
| 聊天天数 | 发生了什么 | 计数器 | 状态 |
|---|---|---|---|
| 保存当天 | 已保存 | 0 | 生效中 |
| 接下来的 6 个聊天日 | 聊游戏;从未提到 Mochi | 6 | 生效中 |
| 安静的一周 | 没有人说话 | 6 | 生效中,暂停 |
| 下一个聊天日 | 另一次未提到 Mochi 的聊天 | 7 | 休眠中 |
| 后续的某个聊天日 | Juno 问「Mochi 最近怎么样?」 | 0 | 为该次回复召回,随后生效 |
哪些人的对话计入
Section titled “哪些人的对话计入”服务器记忆在该人格于该服务器发言的日子里老化。个人记忆仅在其所有者参与对话时才会被搜索,因此仅在这些日子里老化。Bau 每月来访一次,所以 Bau 的记忆需要经历 7 次从未提及的来访才会休眠,常客活跃的日子并不会消耗这些天数。
因隐私设置、黑名单、频道限制或标签而隐藏的记忆绝不会被搜索,因此它们既不会老化,也不会被唤回。
默认情况下,每个人格可容纳 100 条服务器记忆和 100 条个人记忆。当 TomoriBot 将新记忆保存到已满的列表中时,她会遗忘一条休眠记忆以腾出空间。从未匹配过的记忆最先被遗忘,然后是最近匹配时间最久远的记忆。确认提示会根据服务器的记忆提示可见性设置,显示保存了什么以及遗忘了什么。
她绝不会遗忘:
- 全局个人记忆
- 某人通过
/memories或/personal memories添加或编辑过的记忆
导入的记忆不受保护。若要保护某条记忆,请使用 /memories 或 /personal memories 对其进行一次编辑并保存。受保护的记忆依然可以休眠并通过搜索恢复;保护机制仅防止其被遗忘。
如果没有符合条件的记忆,或者该次回复无法使用搜索,则会拒绝保存。
指令应放在别处
Section titled “指令应放在别处”像「始终用西班牙语回复 Juno」这样的记忆很少会与人们的发言内容匹配,因此它可能会休眠并停止生效。请将应该始终适用的指令放入人格属性、人格提示词,或常开(Always On)世界书条目中。
成本与提示词缓存
Section titled “成本与提示词缓存”搜索在每次回复中是一次嵌入请求,与文档搜索共享。召回的记忆位于提示词靠近末尾的位置,紧邻文档,因此提示词的开头部分在各次回复之间保持一致。提供方通常会对重复的提示词开头给予折扣优惠,因此记忆召回能够保留该折扣。只有在记忆在生效中与休眠中之间发生转移后的首次回复中,开头部分才会发生改变。
自部署者可以设置 MEMORY_DECAY_ENABLED=false 为整个实例关闭记忆衰退。此时每条记忆都将保持生效状态,不会遗忘任何记忆以腾出空间,且列表已满时会拒绝新的保存。文档搜索依然正常工作。记忆衰退还需要 pgvector 数据库扩展;请参阅手动部署。