为什么你的智能体每次都从零开始
上下文窗口没了;会话记录还在
三月份你解决过一个问题。八月份,同一个智能体、同一个仓库,它提出的正是你当时试过又退掉的方案。没有什么坏掉了——装着答案的那个会话结束了,它的上下文窗口也跟着没了。
会话结束时到底发生了什么
会话期间,智能体的记忆就是上下文窗口;会话结束,窗口被丢弃。留下来的是一份会话记录,由工具自己写:Claude Code 写在 ~/.claude/projects 下的 JSONL,Codex 在 ~/.codex,opencode 用本地数据库,Cursor、Gemini CLI、Zed 等等各有各的格式。格式登记表写清了每一个写在哪里、记录长什么样。
所以工作并没有丢,只是没人去读。默认配置里,没有任何东西会在你今天提问时打开昨天的记录。
压缩不是记忆
长会话会压缩:工具用一段摘要替换掉早先的轮次,好让窗口继续装得下。摘要是散文,而散文不是你需要拿回来的东西。
对一台机器上 43 次真实压缩的测量:
- 决策保留 77%。
- 实际执行过的命令保留 0.2%。
这个落差就是问题本身。推理进了摘要;那条带四个参数才跑通的命令、你贴进去的报错原文、某次编辑替换掉的那一段——恰恰是摘要最先丢掉的,也恰恰是你再次撞墙时最需要的。
人们试过的三条路
规则文件
CLAUDE.md、AGENTS.md 每个会话都会被读,所以它们是放长期约定的好地方——代码风格、构建命令、别动哪里。放历史就不合适:每条事实都得手写,而还没踩到第二次的坑,没有人会去写。
记忆服务
记忆平台从安装那一刻开始往后记录,通常在写入时用模型抽取一遍事实。它们能用,但一开始是空的:安装之前的几个月不在里面,抽取步骤认为「不算事实」的东西也不在。
读你已经有的会话记录
第三条路把日志本身当成记忆。不需要提前记录,因为记录已经发生了——包括工具装上之前的一切。deja 就是这么做的:在本地给这些文件建索引,谁来问就交给谁。
为什么不直接 grep 日志
因为代价。在三十条任务链的评测语料上,靠 grep 原始记录拿到同样的工作上下文,中位数花了 57,489 tokens;重放完整历史花 16,919;召回在同样的事实覆盖率下花 286,而在历史里本来就没有答案的链上一个 token 都不花。这些数字、语料生成器和相关性标注都在仓库里——在相信任何一个数字之前,包括我们的,先去看「相关」是怎么定义的。
它不做什么
它不写记忆,所以编不出记忆。它不往外发东西:索引和检索都在本地,凭据在建索引时就被脱敏。它不会让智能体更聪明;它只是让它不再从空白开始。
快速开始 · 智能体记得之前的对话吗 · 源码