编程智能体记得之前的对话吗?
简短的回答:不记得。但那些对话都还在你的磁盘上
Claude Code、Codex CLI、Cursor、Gemini CLI 在这件事上是一样的:同一个会话里它记得你说过的每一句话;开一个新会话,它对上一个一无所知——昨天一起修好的 bug、试过又放弃的方案、最后真正跑通的那条命令,全都不在。
这不是 bug,也不是你漏开了什么开关。智能体在会话中的记忆就是上下文窗口,会话结束,窗口就被丢掉了。
三样东西都叫「记忆」
| 机制 | 跨会话保留 | 里面有什么 |
|---|---|---|
| 上下文窗口 | 否 | 当前会话的全部内容,直到装不下为止 |
规则文件(CLAUDE.md、AGENTS.md) | 是 | 只有你亲手写进去的那些 |
| 磁盘上的会话记录 | 是,但没有人去读 | 每一轮对话、每条命令、每个报错,原样保存 |
所以老实的回答是:你的智能体把发生过的一切都写下来了,然后再也没打开过那个文件。而且 Claude Code 默认在 30 天后把这个文件删掉(cleanupPeriodDays)——想保留,就在 ~/.claude/settings.json 里把这个数调大。
各家的情况
下面每一个都会把会话写到磁盘上。「能恢复会话」指这个工具可以重新打开过去的某一个会话并接着做,但没有一个会主动去检索你更早的会话。
| 工具 | 跨会话记忆 | 能恢复单个会话 | 记录位置 |
|---|---|---|---|
| Claude Code | 否 | 是(--resume) | ~/.claude/projects/**/*.jsonl |
| Codex CLI | 否 | 是 | ~/.codex/sessions/**/rollout-*.jsonl |
| Cursor | 否 | 是 | state.vscdb(SQLite)与 ~/.cursor |
| Gemini CLI | 否 | 是 | ~/.gemini/tmp/*/chats/ |
| Copilot CLI | 否 | 是 | ~/.copilot/session-state/*/events.jsonl |
| DeepSeek Harness(dsh) | 否 | 否 | ~/.dsh/sessions/*/session-*/session.jsonl.zstd |
| Kimi Code | 否 | 是 | ~/.kimi-code/sessions/*/*/agents/main/wire.jsonl |
| Qwen Code | 否 | 是 | ~/.qwen/projects/*/chats/*.jsonl |
格式登记表里有全部二十一个工具:各自的路径通配符,以及一条记录长什么样。
「它不是给会话做了总结吗?」
压缩(compaction)是会话变长、窗口装不下时发生的事:早先的轮次被一段摘要替换掉,剩下的才放得进去。这段摘要只活在那个会话里,而且它是散文。
在一台机器上对 43 次真实压缩做的测量(方法和语料见评测):
- 决策保留了 77%。
- 实际跑过的命令保留了 0.2%。
这和使用时的感受是一致的:它还记得你们选了 Postgres,但完全不知道当时的迁移命令是什么。
怎么让它记住
1. 自己写下来
规则文件每次会话开始都会被读一遍,写进去的东西就永远记得。它适合放约定、构建命令、不要碰的地方;不适合放历史——你得提前预判什么以后会用到,而没有人会去记录一个还没踩到第二次的坑。
2. 记忆服务
这类平台从你装上它的那一刻开始往后记录,通常还要靠一个抽取模型。它们从空的开始——你之前几个月的工作不在里面——并且给本来不需要联网的流程加进了一次网络调用。
3. 直接读已经存在的会话记录
不需要提前记录,因为记录早就发生了。在这些文件上建一个索引,就能回答「这个我是不是遇到过」——包括你装任何工具之前的每一个会话。deja 做的就是这件事:
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh deja install --auto
$ deja "connection pool exhausted" [claude] api · Jul 8 · 8f31c0a9 — 2 matches login started failing after refresh token rotation; jwt kid mismatch in tests fixed by reloading jwks cache after rotateKey and adding a clock-skew test [codex] web · Jul 1 · b77d91e2 — 1 match refresh token cookie needed SameSite=Lax in local callback flow
接上自动召回之后,这次查询是智能体自己发起的:会话开始时、提问命中过去的工作时、动手改文件或执行命令之前、命令失败之后。全部在本地:不需要账号,不上传,也不调用模型。