记忆的交互设计:没人看见的那次写入,才是会伤人的那次。
记忆是唯一一项最坏结果不是"答错"而是"隐私事故"的智能体功能,而它走到那一步,靠的是几乎人人都会顺手作出的一个设计选择:静默写入。用户无法纠正、无法同意,也无法要求遗忘一条自己从未看见被存下的事实——于是他们会在最糟糕的时刻发现你的记忆系统:当它当着别人的面说出关于他们的某件事。让写入可见,在回忆真正改变答案的地方把它亮出来,并把删除当作一项真实能力而不是一个设置开关。
记忆改变了产品的性质,而用户比你更早察觉。
无状态的助手是一件工具。会跨会话累积关于你的事实的东西,则是一个留着记录的对方,而人们会拿一套完全不同的标准去衡量它——一套他们并没有在你的引导流程里同意过的标准,因为在那个时点,产品还只是一件工具。
- 失败模式变的是类别,不是程度。无状态智能体答错了,产出的是一个你丢掉的糟糕回答。会记忆的智能体记错了,产出的是一个会长期存在、跨会话反复自我确认、并被套用到用户根本没和原始对话联想到一起的决定上的糟糕回答。
- 被存下来的"推断"才是读起来像监控的那部分。一位用户说"我吃素",他预期这会被记住。而一位用户因为几段消息就让系统记下"可能正在离婚",他并没有同意一次推断,而每一场记忆丑闻都住在这两种情况之间的缝隙里。用户说出口的事实与你推导出来的事实是两个不同类别,界面应当区别对待它们。
- 回忆失败与回忆成功都是信任事件。忘掉一件用户明确要求记住的事,读起来是马虎。记住一件他十八个月前顺口提过的事,读起来令人不安。两者之间的带宽比看上去更窄,而它的宽度由"用户是否知道那次写入发生过"决定。
- 工程文献讲的是写入路径;这一页讲的是披露路径。什么被抽取、去重、存储,见记忆写入路径架构。这里的一切都关于用户被展示了什么,而这两件事通常由两拨从不碰面的人设计。
让写入可见——就在当下,代价要低。
记忆交互设计里回报最高的一处改动,是一张回执:一个小而不打扰、出现在对话里的确认,说明某件事被存下来了。它听起来微不足道,却把整项功能从"对用户做的事"变成了"和用户一起做的事"。
- 把它放在对话所在的地方,不要放进通知中心。一行小标签——"已记住:你偏好公制单位"——挂在引发它的那一轮上。用户本来就在看那里,手上有判断所需的上下文,而且一个动作就能把它撤掉。
- 让撤销就在回执上,立刻可用。写入五分钟后要更正一条记忆,不该需要去找设置页。撤销的代价必须低于忍受的代价,否则人们就会忍受——然后在之后怨恨它。
- 把"说出口的"与"推断出来的"在视觉上区分开。"你告诉过我"和"我注意到"是两种不同的主张,值得两种不同的呈现。推断出来的记忆应当更克制地呈现、更朴素地说明它是从什么推出来的,并在被应用时默认更低的权重。
- 不要把回执打包成摘要。一份"本周学到的一切"的周报,是在这些事实已经塑造了十几个回答之后才到达,而且几乎没人会读。及时性就是整个机制。
- 把不会被记住的东西,一次性、可信地说出来。一条清楚的边界——"无痕对话里的任何内容我都不留""我不存支付信息"——比一句笼统的安心话更有价值,因为它具体到可以被核验,而可核验的主张正是为信任而设计所讲的那种经过校准的信任的来源。
对任何一次记忆写入都该做的检验:如果用户看见了这次保存,他会反对吗?会,就别存。如果你答不上来,因为你从来没给用户看过一次写入,那这就是本季度该做的实验——而"说出口的"与"推断出来的"两类记忆各自的反对率,会是你团队今年看到的最有信息量的数字。
在记忆改变答案的地方把它亮出来,而不是在设置页里。
每一个带记忆的产品最终都会做一个列出"我知道什么"的管理页面。那个页面是必要的,但不充分,因为几乎没有人会打开它。真正能抓住一条错误记忆的地方,是它被使用的那一刻。
- 把影响就地归因。"根据你说过你从希思罗出发",把一个莫名其妙的回答变成了一个可核验的回答,而它只花一个从句。没有它,一位遇到奇怪推荐的用户无从追溯,只会得出结论:这个智能体就是不可靠。
- 只在它确实改变了什么的时候展示。给每一轮都标注上整套记忆是噪声,而噪声会被整体忽略——包括那条真正重要的标注。归因应当挂在它所塑造的那个具体论断上,这与渐进披露是同一套规矩。
- 让归因成为一个控件,而不是一个标签。如果用户能在被引用的那条记忆上点一下"这条过时了",并立刻得到一个不同的答案,你就把纠正回路建在了用户既有动机、又有证据去使用它的地方。
- 绝不让记忆无声地压过当前这一轮里的明确指令。如果存下的偏好与当下的请求冲突,请求胜出,并且把冲突说出来。让一条旧事实无声地推翻一条实时指令,是最让人恼火的记忆 bug,而且它很常见。
- 那个管理页面仍然该有真正的职责。它是用户在出事之后会去的地方,而它需要的是搜索、来源(何时、由什么而来)与批量删除——不是一份好看的列表。
纠正与遗忘必须是真的,而"遗忘"有三种不同含义。
"忘掉那件事"是一句话,覆盖着三种不同的操作,而一个只实现了其中之一的产品,在另外两种情况下都会显得坏掉了。
- 忘掉这条事实。对单个条目的定向移除,并且能用用户会用的词找到它。这要求记忆是可单条寻址的,而不是被揉进一团摘要里——这是一个远早于交互设计讨论就已作出的架构决定。
- 忘掉这次对话。由某一次会话派生出的一切,包括从中抽取、如今住在别处的那些事实。这一条是多数系统做错的:会话被删了,派生记忆还在,于是用户眼睁睁看着智能体继续引用一段自己刚刚抹掉的对话。
- 忘掉关于我的一切。一次用户能自己找到并完成、无需联系客服的彻底重置。它应当既显眼、又罕用,而且完成后要告诉用户它做了什么。
- 删除必须够到副本,否则就别叫它删除。派生摘要、向量索引里的嵌入、用真实对话搭起来的评测集,以及厂商侧对产生这条记忆的那些消息的留存,都是彼此独立的存储。清单问题与留存与法务保全里的完全一样,而在这里,它决定了一句面向用户的承诺是真是假。
- 纠正必须比原来的写入更牢固。一位纠正了某条事实、却在下周看见旧版本重新冒出来的用户,学到的是"纠正没用",而且不会再试第二次。如果你的抽取流水线能从同一段历史里重新推出那条错误事实,那么一次纠正就必须是对那段历史的持久否决,而不是对某一行的一次编辑。
- 错误的记忆黏在模型里,不只是黏在存储里。一旦一条错误事实进了上下文,无论它是怎么进来的,它都会影响这一轮。这就是记忆投毒面向用户的那一面——不管坏事实是攻击带来的还是听岔了带来的,机制完全相同。
记忆会跨越用户刻意维持的那些边界。
人们维护着一些对单用户记忆存储完全不可见的边界:工作与家庭、这个客户与那个客户、以及在同事面前呈现的那个版本的自己。一个只有一个作用域的记忆系统,迟早会把一条事实带过它主人在意的某条边界。
- 默认把记忆限定在它被学到的那个上下文里。在工作项目里说出的偏好,不该无缘无故出现在私人项目里。全局记忆是一个决定,而对于超出"持久且无争议的偏好"之外的任何东西,它都该是一个需要主动选择开启的决定。
- 共享智能体需要一个可见的受众。当几个人对着同一个智能体说话时,用户需要在开口之前知道自己说的话会不会变成共享知识——而不是在同事听见它被复述之后。机制见共享与多用户智能体;交互设计上的义务是一个持续、明确的"还有谁能看到这里"的指示。
- 共享屏幕与移交,是记忆让人难堪的那一刻。一个在演示、客服会话或共享屏幕里主动抖出个人上下文的智能体,破坏的是用户以为存在的一条边界。一个能抑制个人记忆的模式是一项很小的功能,却能预防一整类事故。
- 有些东西应当被彻底排除在抽取之外。健康、财务、亲密关系、移民身份——以及任何用户之所以在谈论正是因为它艰难的东西。一个悄悄留着这些的记忆系统,距离一次真实伤害只差一次糟糕的回忆。在抽取处按类别刻意排除,比在回忆处小心行事更便宜,也更站得住脚。
- 提供一个关掉的开关,并对它的代价保持诚实。"关闭记忆——我会没那么好用,也不会留下任何东西"是一笔正当的交易,而用户尊重被给到这个选择。一个没有关闭开关的记忆系统,读起来像是为产品而非为用户设计的——它确实是。
能告诉你它是否奏效的四个数字。
记忆质量指标通常是检索指标,量的是存储有没有返回正确的那一行。下面这四个量的是用户有没有被服务好,而且它们会在信任问题变得可见之前先动。
- 被展示记忆的纠正率。在写入或使用时展示出来的记忆里,有多少被用户否决?上升意味着抽取过于积极;接近零则可能意味着根本没人看见它们,所以要和展示率一起读。
- 删除事件,以及它们之前发生了什么。用户删记忆,是在给你关于边界在哪里的最清晰信号。每一次都去看删除前的那段对话——按生产反馈信号的意义,这是这项功能释放出的最稠密的定性反馈。
- 记忆改变了答案的轮次占比。如果很低,这项功能是装饰性的,而你在白白扛着它的风险。如果很高,微小的抽取错误正在被放大到智能体说的每一句话上。
- 归因于记忆的投诉,以及关闭开关的使用率。钝器。用过记忆之后又把它关掉的用户,在告诉你一件满意度分数不会告诉你的事,而原因几乎总是一次他们叫得出名字的具体回忆。
有一项定性检查抵得上这四个数字:读十位真实用户被存下的记忆集,问问自己愿不愿意把它拿给他们看。如果诚实的答案是"我们想先解释其中几条",那几条就是该停止写入的。
在做别的之前,先上线一张带一键撤销的可见写入回执——它是个小改动,却把记忆从"发生在用户身上的事"变成"用户参与其中的事"。然后在回忆真正改变答案的地方做归因,把三种遗忘(含派生副本)都真正实现,并把记忆限定在它被学到的那个上下文里。用户会原谅一个健忘的智能体;他们不会原谅一个记住了他们从不知道它听见过的事情的智能体。
相关:智能体记忆讲记忆系统是什么,记忆写入路径架构讲本页所约束的那个抽取步骤,透明度与可解释性讲更宽的披露问题,智能体的数据治理讲删除按钮背后的义务。