一个聊天机器人看上去记得你,有两种做法。一种是很长的上下文窗口,窗口一往前滑,前面的就忘了。另一种是把事情记下来。
这一个是记下来的那种——而且不常见的地方在于,它让你读它写了什么。
角色为什么会走样
模型在两条消息之间是没有记忆的。它看起来想起来的一切,其实都是在提示词里重新发给它的。当一段对话长到装不下,就必须丢掉或者压缩一些东西,走样就从这里开始:角色先是不记得你妹妹叫什么,接着跟自己上周说的话打架,然后悄悄变成另一个人,只是还在用同样的词。
大多数产品的处理办法是在后台写摘要。这招一直管用,直到摘要写错——而一旦写错就永远错下去,因为你根本看不到它,也没法改。
到底存了些什么
一条条短事实,随着对话进行被提取出来。不是聊天记录,也不是一坨向量——是你读得懂的句子。
它们同时按三个维度分开,正是这种分法让不同的故事不会串味:
- 按角色——一个角色知道的事,另一个角色不知道。
- 按话题——跟同一个角色的不同话题,各记各的。
- 按人——你告诉一个角色的任何事,跟这个角色说话的其他人都看不到。
读它、改它、删它
记忆清单是聊天设置里的一个页面。打开它,你会看到那些事实,按顺序排好。哪一条写错了,就改掉。哪一条本来就不该被写下来,就删掉。要是你一条都不想要,把这段对话的记忆关掉,之后就什么都不再存。
这听起来是件小事,可它把出错的方式整个换掉了。藏起来的摘要里一条错的事实,会毒到后面每一条回复,而你只能猜角色为什么变得奇怪。清单里一条错的事实,是你五秒钟就能改好的一行字。
角色第一次记下什么的时候,我们会告诉你一次。不是每条消息都提醒——就一次,让你知道有这么个机制,以及去哪儿找它。
什么永远不会被写下来
每一条被提取出来的事实都会过一道过滤,把根本不该进记忆库的东西剥掉:邮箱地址、电话号码、卡号、身份证件号。
这是一道过滤,不是对你输入内容的承诺。它清掉的是它认得出的那些格式。对付真的卡号,最稳妥的做法仍然是别发给聊天机器人。
场景分岔时,记忆怎么办
任何一条回复你都可以分岔,两条线都留着。分岔的时候,新的那条会继承父线在那一刻拥有的记忆——所以一条分支是从同一段共同过去开始的,而不是从零开始,然后才各走各的。
分岔的意义正在于此:同一段关系的两个版本,而不是两个陌生人。
记忆能走到哪儿
如果一个角色变成了自己的 Telegram 机器人,记忆在那边的运作和主聊天里完全一样——依然按角色、按话题、按人分开。跟你机器人说话的人,会和这个角色攒出他自己的一份记忆,而那份只属于他。