Wink Pings

让 agent 睡一觉花 36 美分,第二天它记的东西你还没看过

Brad Abrams 放出了一个 Claude Cookbook:夜里把 agent 的历史 session 蒸馏成 wiki 式 memory,第二天只读挂载。11 份 transcript 跑了 2.5 分钟、0.36 美元。真正的问题不在钱,在于早上 agent 读到的那份新记忆,默认没人审过。

Brad Abrams 前两天在 X 上发了一条:你的 agent 应该睡一觉。

配套的是一个 Claude Cookbook,叫 Dreaming with a dynamic workflow。做的事很具体:把 agent 跑完的 session 导出成 transcript,夜里批量蒸馏成一套 wiki 式的 memory 文件,第二天 agent 开会话时只读挂载,开局就知道昨天之前发生过什么。

How it works

它跑起来是什么样

流程分三步。导出 session,一个 session 一个纯文本文件。由一个 lead agent 读你的自然语言指令,自己写 workflow,然后启动一次 workflow run:每个 transcript 派一个 analyzer,各自读完、验证、往共享的 memory 目录里加事实;所有 analyzer 结束后,一个 organizer 跑一次,合并重复文件、修链接、补 _index.md。最后你的业务 agent 以 read_only 挂载这个 store。

The workflow

模型分工是 Sonnet 5.5 带 lead,Haiku 5.5 跑 analyzer 和 organizer。analyzer 手里只有 read、write、edit、glob、grep 五个文件工具,没有 shell,没有网络,环境的 allowlist 是空的。这个配置不是随手写的,后面再说。

难的三个地方

Cookbook 用一个虚构的 Python 项目 tidewick 做例子,11 份 transcript、283 KB。里面埋了三类麻烦:

第一,事实会过期。项目早期的 make test 必须先设 TIDEWICK_DATA_DIR 才能过,后来某个版本把这个依赖去掉了。如果 analyzer 只是把“跑测试要设 TIDEWICK_DATA_DIR”抄进 memory,下一个 session 就带着一条错的常识开工。所以规则里要求给事实标日期、标来源、能标注“已被哪个版本取代”的就标。

第二,关键细节埋在 tool output 里。准确的命令行、flag、文件名,散落在几十份 transcript 的返回值中间。蒸馏的质量主要取决于有没有把这些原样挖出来,而不是总结得像不像话。

第三,多个 analyzer 同时在写同一个目录。两个文件可能被两个 agent 在同一秒改写。规则里写了:每次写完要读回来确认自己的内容真的落盘,如果读到的是别人的版本,把两边合并、再写、再验。organizer 最后才做合并和重命名,中途不许改名不许挪目录,因为别人正在写。

这三条决定了“让 agent 睡觉”不是一个总结任务。它更接近一个并发写入的一致性工程,只是写手换成了模型。

成本比想象中低,风险比想象中高

11 份 transcript 跑了 2.5 分钟,0.36 美元,其中 lead 0.17、11 个 analyzer 合计 0.16、organizer 0.03。Cookbook 里另给了一个数:50 多份长 session、约 12 MB 文本,默认设置下一次约 8 美元、十分钟。

这个价格让人放松警惕。真正该看的是下面这条:默认没有 review。nightly 脚本凌晨一点用 cron 跑,dream 完直接写回你 agent 正在读的那个 store。你早上打开电脑,agent 的记忆已经被一份没人看过的转录改过了。

Cookbook 自己承认这一点,也给了缓解措施:每次跑之前把 store 的文件拷一份到 records 目录,每次写入都是一个保留 30 天的 memory version,可以审、可以回滚。但这些都是事后的。

还有一个更微妙的点。analyzer 的 system prompt 里明确写了“永远不要把 secret 抄进 memory”,但这是靠模型听话,不是靠机制。整个流程里唯一真正的防线是:不给 shell,不给网络,写权限只开在 memory 目录。最坏情况是一个被污染的 transcript 改了 store 里的说法,并且花掉你的预算,仅此而已。前提是你不把 store 文本塞进 system prompt。一旦塞了,注入的内容会进入每一个 session。

社区里的几种声音

Ray Amjad 说他自己搭了一套类似的,差别在于每条事实都带一个 source 指针,指回存在 S3 里的原始 session,冲突时回源判定,而不是让 organizer 猜。他另外会“dream”不同团队成员的工作习惯,单独放一个文件夹,偶尔读读 agent 对自己的描述。

Ray Amjad 的截图

Alan Blair 的评论更直接:贵,而且有点乱。他觉得这东西几周到几个月内要么被砍掉,要么被并进 Claude 的核心功能。

还有人翻出了 Letta 团队 2025 年 4 月的论文 Sleep-time Compute(arXiv:2504.13171,作者 Kevin Lin 等)。论文讲的是让模型在收到 query 之前先离线想一遍,预判用户会问什么、预计算一些量,结果是在 Stateful GSM-Symbolic 和 Stateful AIME 上把达到同等准确率所需的 test-time compute 降了约 5 倍,继续加 sleep-time compute 还能再提 13% 和 18% 的准确率;同一段上下文上有一组相关问题的话,摊薄后每个 query 的成本降 2.5 倍。

方向上这两件事不完全一样。论文是 anticipatory,猜你会问什么;Claude 这个 cookbook 是 hindsight,回看已经发生过什么。但底层假设是同一个:推理不一定非得发生在用户等待的那几秒里。

一份判断

“dreaming”这个词容易让人以为它很玄。翻开源码看,它做的事很朴素:批量读文本、抽事实、去重、标日期、维护一个索引文件。真正有含金量的地方不在概念,在组织方式:事实带日期,冲突显式标出来,不猜哪个对,被合并的文件留一个 MOVED TO [[slug]] 的空壳,_index.md 当入口。这些做法跟具体跑在哪个平台无关,抄得走。

Alan 那句“迟早被并进核心功能”大概率是对的。当一个功能的核心资产是几份写得很细的 prompt,它变成平台内置特性只是时间问题。但在那之前,这套 cookbook 更值得读的部分,是怎么处理并发写、怎么给事实标 stale、怎么让 organizer 不发明事实。这些问题是任何自建 agent 记忆的人都会撞上的,跟 Claude 不 Claude 没关系。

最后提醒一句,nightly 那条 cron 装上去之前,先想清楚愿不愿意让一份没人看过的转录,在你睡觉的时候改掉 agent 明天要用的记忆。愿意的话,那 36 美分花得挺值。不愿意的话,Cookbook 里也给了另一条路:先手动跑进一个新的 store,读完再切换。

发布时间: 2026-11-05 21:27