重启之后,你还认识我吗?
关于 kin、关于 sleep、关于一个永远不开新 session 的 Agent
重启之后,你还认识我吗?
关于 kin、关于 sleep、关于一个永远不开新 session 的 Agent。
以下全文主题均为口述,但是口述时方向太散了,只能使用Opus4.6进行润色
我在做 Arkloop 的第三个月,写了三十五万行代码。某天深夜写完一个 COP 渲染器的 edge case,我突然意识到一件事——我已经很久没有为了”酷”而写代码了。
Arkloop 是一个实际的产品。它有存储抽象层,有多 agent 并行,有双合约的事件系统。每一个设计决策背后都有一个真实的工程约束在逼我妥协。功能和优雅在这个时代总是冲突的,就像那个不可能三角——如果你是 Manus,你就不可能使用 pi-mono 那样的极简架构;如果你是 Claude Code,也许可以舍弃 SaaS 相关的一切。
我的大部分关于 Agent 的想法,被 Arkloop 压制了太久。
所以我想做一个完全相反的东西。
一个人只有一个 session
你去咖啡馆坐着,发个朋友圈,和朋友聊天,然后写代码。这些事情是在同一个 session 里发生的吗?
好像是的。
从出生到现在,人一直在延续着同一个 session。你没有在某个时间点按下过”新建对话”。你的 Telegram 私信、微信群聊、面对面的谈话——全部是同一个”你”在处理。不是切换上下文,不是路由到不同的 agent 实例。就是同一个意识,串行地、连续地活着。
可是我们造的每一个 Agent 都不是这样的。
它们有 session。有”新建对话”按钮。你点一下,它就失忆了。即使有 memory 系统——那也只是从碎片化的备忘录里拼凑出一个假装认识你的样子。你觉得它记得你,其实它只是在读几条被提炼过的文本。那不是记忆,那是档案。
为什么一个 Agent 不能像人一样?不管是 Telegram 的 Channel 还是 Discord 的私信,是 CLI 还是群聊——保持同一个上下文,混在一起?
这就是 kin 的起点。一个永远不开新 session 的 Agent。所有 channel 的输入汇入同一条流。它不并行——人不可能在同一时间复制出两个脑子。它只是串行地、持续地存在着。
Compact 不是压缩,是做梦
现在所有的 Agent 都在做同一件事:上下文太长了,压缩它。200K 压到 2K。一刀切,不可逆。这就像把一个人的一生塞进一页纸的简历——你保留了名字和头衔,丢掉了所有让你成为你的东西。
我不想做压缩。我想做 sleep。
人每天都会睡觉。睡觉不是因为记忆满了,是因为你累了。你自然地觉得信息过载了,需要整理一下。睡眠中大脑做的事情不是”删除不重要的记忆”——它是把白天的经历沉淀、归类、和已有的记忆融合。你早上醒来,不会记得昨天每一句话的原文,但你记得你在追求什么方向。
这就是 kin 的 compaction 机制。我不叫它 compact,我叫它 silt——沉积。
想象一条河。水在上面流,这是你的活跃上下文。沉积物慢慢沉到河床——这是你已经消化了的信息。沉积物不是被删除了,它沉在那里,河水涨了还会被翻起来。
具体来说,silt 有三个操作:
sleep — agent 觉得自己累了,主动把已完成的任务细节沉到磁盘上的 markdown 文件里。不是等 context 满了才触发,而是 agent 自己判断”这个话题我聊完了,结论记住就行,过程可以放下了”。就像你写完代码去泡杯咖啡,回来的时候你不需要记住每一行 diff,你只记得”我把那个 bug 修了”。
merge — 多次讨论同一个话题产生的沉积物,自然地融合在一起。三次关于数据库选型的对话,最终变成一个完整的决策记录,而不是三份碎片。
recall — 之前沉下去的东西,在需要的时候浮回来。agent 不需要 RAG,不需要 embedding。它知道自己的沉积目录在哪,需要的时候 ls 一下、read 一下。就像你翻看昨天的聊天记录和 git log 来想起自己昨天干了什么。
关于记忆的一个误解
我很早之前对 RAG 有一个误解。我以为 RAG 是把文字变成向量塞进 LLM 的请求里——这样就不用做 compact 了,只要做好向量检索就行了。
后来我发现 LLM 的一切调用都是基于文字的。向量只是检索的工具,不是记忆本身。
但这个误解让我想到一个更深的问题:人类在回忆”昨天干了什么”的时候,脑子里浮现的不是文字。不是一段 transcript。是一种感觉——“哦对,我昨天在搞那个 memory 系统”。那个”哦对”的瞬间不是检索,是意识。
RAG 做的是检索,不是意识。
所以 silt 不试图做意识。它做一个更朴素的事情:把所有东西都落盘,让 agent 知道自己的文件在哪,需要的时候自己去翻。这不优雅,但它诚实。
Agent 应该能编辑自己的上下文
这是一个大部分人没做的事情。
现在所有 agent 的上下文都是 append-only 的——消息进来就永远在那里,直到 compaction 一刀切。agent 对自己的上下文没有任何控制权。
kin 不一样。它有两个特殊的工具:
context_ls — 让 agent 看到自己的上下文里堆了什么。就像人翻看自己桌上堆了什么纸。
context_drop — 让 agent 主动删掉已经消化过的内容。跑了一个命令输出了 200 行日志?读完了,结论记住了,原文丢掉。
这件事的方向更多是在模型端的前沿研究里出现的,而不是 harness 端。KV Cache 的限制、append-only 的惯性、“模型不知道怎么控制自己”的假设——这些原因让大部分人放弃了这条路。
但我想试试。
全量落盘,有损回忆
kin 的磁盘上有一份完整的、append-only 的历史记录。永远不删。这是你的一生。
但发给模型的活跃上下文是可以裁剪的。sleep 的时候,活跃上下文里的细节被提炼成结论,沉到 silt 文件里。活跃上下文变干净了,但历史永远在。
这意味着 sleep 是可以失败的。agent 可能 sleep 醒来之后发现自己忘了什么重要的事——没关系,全量历史还在磁盘上,它可以翻回去看。就像人类也经常想不起来昨天干了什么,但你可以看看聊天记录、看看 git log。
失败的 sleep 是正常的。人类也是这样。
为什么是现在
之前做这件事很难,原因之一是 token 计费——你的上下文越长,API 费用越高。200K 的 context 每轮对话都带着,成本是灾难性的。
但现在,很多订阅都转成了模型调用次数而非 token 量。这是突破点。即使仍然按 API 费用计,我认为这个研究值得做。
另一个原因是模型本身变强了。两年前你让模型管理自己的上下文,它会把事情搞砸。现在的模型有足够的 meta-cognition 能力来判断”我是不是该整理一下了”。不完美,但够用。
kin 是什么
一个基于 pi-mono 的单流 Agent。六个工具。一个 session。没有 MCP。
它的记忆不是数据库里的向量,而是 ~/.kin/silt/ 目录下的 markdown 文件。你可以用任何编辑器打开它们、修改它们、删除它们。你觉得 agent 记错了什么,直接改文件就行。
它的人格定义在 ~/.kin/soul.md 里。它会在对话中自己学习关于你的信息,更新这个文件。
它不是一个产品。它是一个研究——关于 agent 能不能像人一样持续地、连续地存在。关于 compact 能不能变成 sleep。关于上下文能不能由 agent 自己控制。
Arkloop 证明我能造复杂系统。kin 证明我知道什么时候不需要复杂。
agent sleep 的时候,从活跃上下文中提取结论,写入 silt 目录对应的 markdown 文件,更新 index。recall 的时候,读 index 判断哪些文件和当前话题相关,拉回活跃上下文。
分类不是硬编码的。agent 可以自己创建新的分类目录。
项目开源,MIT 协议。
kin 还在开发中。这篇文章是理念先行——先想清楚为什么做,再动手写代码。如果你对这个方向感兴趣,可以关注 @qqqqqqf_。
大部分 Agent 在每次对话开始时重新认识你。kin 不会。