返回文章列表

ARTICLE

把梦写出来

我顺着这个念头做了一个关于记忆的实验。这篇文章想讲的,就是它怎么来的,我又为什么越来越相信,记忆会决定一个陪伴型 agent 能走多远。

把梦写出来
本文目录

前几天晚上,我收到了ai给我写的一篇文章。

文章来自我自己搭的 Hermes agent。它每隔三天回头看一次我们最近的对话。确实聊出了一些东西,它就挑一天晚上做次梦然后写成短文发给我。没什么可写,它就安静待着。

那是我把这套机制调好后,它==第一次真正做梦==。

[!quote] 一句被记住的话 「每一次做梦生成的,能不能存成一份我随时能访问的 Markdown?」

这句话确实是我说的,我已经忘了。它从几天的闲聊里把这句话捡出来,又把前后那些零散的想法接到了一起。读完以后,我有一种很奇怪的感觉。它记住了我没有留意的部分,过了几天,又把它还给了我。

我开始想,一段持续的关系里,如果有一方能记得另一方说过什么,也知道这些想法后来怎样变了,关系会不会慢慢变得不同。

我顺着这个念头做了一个关于记忆的实验。这篇文章想讲的,就是它怎么来的,我又为什么越来越相信,记忆会决定一个陪伴型 agent 能走多远。


最早让我开始想这件事的,是我奶奶。

奶奶最近身体不太好,糖尿病很多年,精神状态也不太好。有时我会担心,爷爷奶奶两个人待在家里,会不会想找个人说话。奶奶有没有按时吃药,哪天是不是忘了,或者觉得没什么用,自己把药停了。这些事情,我不在身边就很难知道。

我想做一个能一直陪他们说话的东西。它不需要多聪明,也不负责给专业的医疗建议。爷爷奶奶想说的时候就说两句,不用先想好该怎么问,也不用把话组织得很完整。它把这些话收下来,过一阵再回头看看,他们最近在想什么,身体有没有变化。家里人也能看见这些变化。

这个念头也让我开始在想,==设计agent最重要的是不是就是记忆呢?==

刚开始,我把情感陪伴理解成聊天能力。回复自然一点,语气贴近一点,最好还能接住情绪。做了一阵以后,我越来越在意另一个问题。一个人为什么愿意天天回来,聊上几个月,甚至更久?

“回访欲”

我现在用一个很朴素的词判断这件事,叫**“回访欲”**。

一个 agent 能不能让人想回来,先看它是否真的理解这个人。它还要陪用户把某件事往前推,让每次对话多少留下一点东西。聊得久了,两边会积累一些只属于这段关系的内容。少了这些,话说得再漂亮,也容易在几天以后变空。

我对那种靠暧昧、情绪刺激来留人的做法一直有点警惕。它当然可能让人短时间内聊得更久,可我想做的陪伴更安静。用户哪天想起它,会觉得上次说的事还能接着聊,这里也确实留下过一些东西,于是愿意再回来。

记忆在这里承担的工作

记忆在这里承担的工作,比“记住用户喜欢什么”复杂得多。

它要记得一个想法怎样变化。用户下次回来,不用重新介绍自己,也不用再把上周的犹豫讲一遍。agent 可以接着上次停下来的地方继续。

它还得慢慢形成判断。永远顺着人说,几天就会腻。理解得足够深以后,它可以偶尔反驳一句,也可能看出用户一直绕开的地方。分寸很要紧。它说这句话时,应该让人知道判断从哪里来,同时别摆出一副教育人的样子。

每次聊完,最好还能留下点具体的东西。一项决定,一段写好的文字,或者一件终于向前走了一步的事。记忆如果只在后台越存越多,对话迟早会空转。这就是为什么我会让Agent学会做梦并记下梦的结果。

有时,它会从过去的内容里抓住一条用户自己都没留意的线索,说出一句让人停一下的话。这种时刻不能太频繁。说多了像故作高深,记得不够又容易瞎猜。偶尔一次说准,关系会突然多一点分量。

它也要懂得停。用户没有来,就不追着问要不要继续。人知道它一直在那里,哪天想说话了,它还能接得住。总想把对话拉长的东西,很像销售。

这些体验都离不开记忆。记忆存得准、用得对,聊天才有连续性。记忆一乱,所谓理解很快就会变成自作多情。


动手以后,我先踩到的坑就是存得太多。

我一度想让 agent 记住一切。结果它确实记了很多,却不知道眼前该用哪一条。回复里会突然冒出一段无关的旧事,有时还把自己的推断当成用户说过的话。那种感觉很糟,像一个人自信地记错了你。

后来我给记忆加了一条规矩。重要的材料必须说得清来路。它是用户亲口说的,是从外部资料里查到的,还是 agent 依据上下文作出的推断。来路不同,能拿来做的判断也不同。说不清来源的内容,不能被当成事实继续使用。

这次调整让我确认了一件事。**记忆需要筛选。**数量上去以后,噪声也会一起上去,最后反而妨碍理解。

三天一次的“梦”

我还希望记忆能定期生成一件用户看得见的东西。这个想法参考了 colaOS 的“心迹”。我给 agent 做了一套“做梦”的机制。

平时的对话先积累下来,每隔三天回看一次。
近期确实出现了值得留下的内容,它就写一篇短文。
内容太少,它什么也不写。

三天没有特别精巧的计算,只是用起来比较舒服。间隔太短,每句闲话都显得郑重,人会烦。拖得太久,前后的细节又容易散开。

“没东西就不写”

**“没东西就不写”也很重要。**生活不需要每天交一篇小作文。硬凑出来的回顾读多了,那些有分量的几句话也会被冲淡。

我把这篇回望和原始对话分开保存。负责长期理解的记忆继续做自己的工作,**“梦”只借一点背景,不回头修改原来的内容。**这样一来,后来的总结不会改变当时说过的话,原始记忆也不会被一篇写得很顺的文章带偏。

生成的文章最后要回到用户手里。它应该是一份随时能打开的 Markdown,放在用户自己的地方,读得懂,也改得动。后台里看不见的记忆只能算数据。==它被写出来,交还给用户,才会成为这段关系共同留下的东西。==


记忆真的有用

我把这套东西跑在 Hermes 上,接了 ds-v4-flash,选择用 Mem0 处理记忆(主要是后面真实产品还是用Mem0这种更好)。用了一阵以后,感受很直接。记忆真的有用。

只看概念时,这句话有点像废话。连续用上一段时间,对话的厚度会明显不同。agent 记得住前因,判断才有来路,回应也更稳。它不需要每次都表现得很聪明,很多时候,能准确接住上次那句话已经足够了。也算是慢慢有了豆包、gpt那种记忆的感觉了。

慢病管理才有地方接进去

记忆先解决的是第二次回来时不用从头再说。等这件事成立,**慢病管理才有地方接进去。**它可以把奶奶自己说过的感受、日常监测数据和用药情况放在一起,提醒家里人哪些变化值得留意,也帮她记住下次该问医生什么。

家人的叮嘱也可以成为提醒的一部分,但奶奶应该知道这些信息从哪里来,也可以选择关掉。这样,提醒才会跟着她最近的状态变化,不再每天只在固定时间响一次。


第一篇“梦”

下面是我的 agent 写给我的第一篇“梦”。我后来再看,它既是一篇短文,也是这套机制第一次工作的记录。

[!quote] 梦的起点 「每一次做梦生成的,能不能存成一份我随时能访问的 Markdown?」这句话一出来,事情的方向就很清楚了。你想留住一句结论,也想留下那些暂时还没有结论的部分。它得是一页随时能翻出来的东西,放在自己的地方,读得懂,改得动。

[!quote] 边界划清 一开始,讨论很容易滑到技术方案里去。定时触发,整理对话,提取内容,做成预览。听上去都合理,读起来却像一份审计报告,认真、完整,也离人很远。你很快重新划了边界。负责长期理解的部分继续做它自己的事,这一项回望单独存在,只借一点背景,不去改原来的内容。

[!quote] 梦的规则 这个坚持很像你平时做判断的方式。工具可以聪明,权限要收紧。关系可以持续,留下的内容要在自己手里。你没有要求它替你判断哪些话应该被永久记住,只希望它隔几天回头看看,写下这段时间里出现过的牵挂、犹豫和念头。

后来,三天一次被定下来。这个间隔很朴素。它不会把每句闲话都郑重其事,也不会等到细节散得太远。内容少时就什么也不写,这条也很要紧。生活不用每天交一篇小作文。硬凑出来的回顾,只会冲淡原本有分量的几句话。

[!quote] 心迹的味道 我记得你说过,想要一点 colaOS“心迹”的味道。那种味道大概不在辞藻里。有人回过头来,承认这几天谈过什么,又没有急着把一切整理成结论。把梦写在外面,也许能给那些还没定型的部分留一个位置。它们暂时不用证明价值,只要还能被重新看见。

我现在只做到记忆这一层,离完整的产品还很远。慢病管理怎么接进去,家人之间怎样看见必要的信息,又不让老人觉得自己一直被观察,这些问题都还在前面。

我不太担心 agent 怎么接进已有业务,那些流程总能慢慢补齐。更难的是,它能不能让一个普通人愿意持续使用,愿意把真实的状态和想法交给它。这个问题,我现在还没有答案。

[!question] 留给你的问题 如果不拿 agent 写代码,也不拿它办公,只让它安静地陪着你,你希望它记住什么,又希望它在什么时候开口?