最近一段时间,Agent 的文档里开始出现一些奇怪的词。
OpenClaw 有 Dreaming。Claude 的 Managed Agents 里,也出现了 Dreams。
这些词不像工程词。工程系统通常喜欢更硬的名字:task、queue、memory store、session、permission、scheduler。
Dream 太软了。
但它碰到的问题很具体:记忆。
一个长期存在的 Agent,迟早要处理记忆。单次 session 里的 Agent 可以轻一点。上下文结束,窗口关掉,连续性也就断了。可长期 Agent 不一样。它会把过去带到下一次判断里。
这也是 memory store 危险的地方。
它不是日志。日志只是记录发生过什么。记忆会改变之后怎么看你。
如果一个 Agent 把临时想法当成稳定偏好,把一次失败当成永久规则,把某个误会写成事实,它之后的每一次判断都会带着这层偏差。
保存本身并不难。
难的是,系统要决定哪些东西以后还要继续参与判断。
在 OpenClaw 里,Dreaming 是一个后台 memory pipeline。它会在凌晨三点左右触发一次 sweep,看最近一段时间里反复出现过什么。
Light 阶段把 daily memory、sessions、recall 里的候选信号收进来。REM 阶段看模式:哪些只是偶然出现,哪些在不同上下文里反复回来。Deep 阶段再处理晋升。
系统会看次数、相关性、上下文多样性、最近程度、跨日期的巩固程度,决定一个候选内容有没有资格进入 MEMORY.md。
到这一步,记忆开始变重。
MEMORY.md 保存的是系统之后会带着走的东西:长期偏好、项目约定、反复出现的工作方式,或者以后会影响判断的事实。
所以写入 MEMORY.md 需要谨慎。一次对话、一个临时念头、一段还没稳定下来的情绪,都不该太快变成系统之后默认相信的东西。
于是就需要一个更轻的位置。
一件事发生了,还只是发生了。它可能是噪音,也可能是一个刚露头的信号。直接写进长期记忆太早,马上丢掉又太快。
Dreaming 给了它一个中间状态。
它可以先被看见,先被放在那里。等下一次出现,等系统重新加权,等人 review,再决定最后去哪里。
严格说,机器真正使用的中间状态在 .dreams/*.json 这类文件里。DREAMS.md 更像一层可读的 dream diary,把那些还没定型、还不适合写进长期记忆的信号,用人能读懂的方式放出来。
MEMORY.md 像是:我知道。
DREAMS.md 更像是:这里曾经出现过一个信号。
Claude 的 Managed Agents 也用了类似的处理方式。Dreams 会读取 memory store 和 sessions,生成一份新的 memory store,但不会直接覆盖原始记忆。
它更像一次候选改写。你可以 review,也可以 discard。
这也是 Dreaming 这个词成立的地方。
它并不是说 Agent 有期待。Agent 的 Dreaming 做的是整理、筛选、降噪、晋升。它只是让事实和长期记忆之间,多了一层候选状态。
写到这里,我想说的已经不只是 Agent 了。
人也有类似的中间层。
很多东西最开始都只是一个 dream,还没有事实的形状,也没有记忆的重量。
有些 dream 后来超出了预期。你只是随手试了一下,没准备把它当成什么大事,现实却给了一个更大的返回值。
有些 dream 被反复提起。它在不同时间、不同场景里回来,慢慢有了权重,最后变成你会记住的东西。
也有些 dream 沉到湖底。
它没有失败,也没有完成。只是信号越来越弱,最后不再浮上来。偶尔想起,也不会觉得遗憾,只是知道它曾经在那里。
这同样是一种整理。
像一行没有被 commit 的改动。最后没有进入主分支,但你知道,某个晚上,你确实在那里写过一点东西。也正因为写过,后面的判断变得更准了一点。
无论对人来说,还是对虾来说,it's always nice to have a dream.
我喜欢 Dreaming 这个名字。
它让一个非常工程的系统,保留了一点中间状态。
有些东西还不是记忆,也不只是噪音。
先作为梦存在。