开篇
你有没有遇到过这种情况——
你用 Claude Code 花了一个下午 debug,终于在 DataSourceConfig.java 里找到连接池的 maxLifetime 设得太短,HikariCP 把空闲连接全回收了。改完 commit,完事。
三周后,同样的报错又来了。你打开 Codex(你换了工具),告诉 AI:「连接池耗尽的 bug 又出现了。」
然后你看着它——从头开始读日志、翻配置文件、试了三四个无效方案,烧了 20 分钟,最后终于找到同一个 maxLifetime。
你心里在咆哮:「这个问题我TM已经解决过了!就在三周前!就在你同事 Claude Code 的会话里!」
这就是今天 AI 编程助手的集体尴尬:每个会话都是孤岛。昨天的结论、上周的架构决策、上个月调的配置bug——在新会话开始的一瞬间,全部蒸发。
好消息是,这些 Agent 其实一直在「写日记」。Claude Code 把每次对话存成 JSONL 文件在 ~/.claude/projects/。Codex 存在 ~/.codex/sessions/。opencode 放在 SQLite 数据库里。Cursor 存在 state.vscdb 里……几个月下来,这些文件轻松堆到几 GB,里面全是解决过的问题、做过决策的原因、排查过的死胡同。
问题在于:没人翻得动这些日记——包括 Agent 自己。
一、deja-vu 干了什么:从过去往回挖,而不是从现在开始记
就在本周,GitHub 上一个叫 deja-vu 的项目登上了 Hacker News 首页。它是一个 Go 写的单文件二进制工具,零依赖,MIT 协议开源,目前已有几百颗星但增速极快。
它的 slogan 一句话就说清楚了:「Your agents already solved this. deja finds it.」(你的 Agent 早解决过了,deja 帮你找出来。)
但真正让我觉得它聪明的地方,不是「给 Agent 加个记忆」这个功能本身——坦白讲,Cognee、Mem0、Letta、MemPalace 这些前几个月我们都讲过的项目,都已经在干这件事了。
deja-vu 做了一件这些产品全部没做的事:它不用你「从今天开始养成记录习惯」。
市面上所有记忆方案的基本逻辑都是这条路径:
安装 → 捕获钩子 → 从现在开始记录 → 向量数据库存储 → 未来可以召回。
这意味着什么?这意味着你装它的那一天才是「记忆元年」。在那之前,你过去三个月的所有会话历史——那些真正包含了你最宝贵的调试经验和架构决策的数据——对 Agent 来说依然是空白。而等到你的「记录数据库」足够丰富,可能又是几个月后的事了。
deja-vu 把这条路径彻底翻了过来:
安装 → 直接索引硬盘上已有的所有历史会话文件 → 立即可搜索 → 同时继续增量索引新会话。
它不需要你改变任何工作习惯。你装上它的那一刻,它就能回溯你过去半年在 Claude Code、Codex、Cursor 等十几个 Agent 中的所有对话,给它们建好索引。然后你直接搜索:「deja "connection pool exhausted"」——12 毫秒后,系统告诉你:「2026年7月2日下午3点,你在 user-service 项目中跟 Claude Code 一起修过这个问题,根因是 HikariCP 的 maxLifetime 配置太短。」
这个设计判断看似简单,但其实很反直觉。大多数人想到「给 Agent 加记忆」,脑子里浮现的是「以后怎么办」。deja-vu 的开发者 Vladislav Shulcz 问了一个更关键的问题:「以前的怎么办?」
二、一查就中:12ms 搜 3.3GB,纯词法匹配的「反 AI」哲学
deja-vu 的技术架构出奇的「克制」。
它的搜索不是语义 embedding,不是向量数据库,没有大模型推理。就是最传统的本地倒排索引 + 纯词法匹配。流程是这样的:
会话日志(JSONL/SQLite/Markdown)
↓ 解析提取
脱敏层(AWS keys/JWT/私钥 → [redacted])
↓ 分词
倒排索引(records.bin + token buckets)
↓ 写 manifest.gob
增量更新(仅读取变更的文件)
官方在真实语料上做了基准测试:1,250 多个会话,约 3.3GB,跨越 Claude Code、Codex、opencode 三个 Agent。结果:
| 指标 | 数据 |
|---|---|
| 热搜索延迟(典型) | 12 ms |
| 热搜索延迟(最坏) | ~25 ms |
| 冷索引构建(一次性) | ~10 秒 |
| 索引体积占比 | 原始语料的 ~2.4% |
更值得关注的是它做了一个上下文实验(deja bench context):把 deja-recall 和几种常见方案对比,看谁能用最少的 Token 达到相同的覆盖率。
| 方案 | 中位 Token 消耗 | 覆盖率 | 备注 |
|---|---|---|---|
| deja-recall | 278 | 100% | 仅返回匹配片段 |
| 完整历史回放 | 16,919 | 100% | 把整个会话吐回去 |
| naive-grep | 57,489 | 100% | 原始 grep 输出 |
| 冷上下文(无记忆) | 0 | 0% | Agent 从零开始 |
deja-recall 比回放完整历史少用约 60 倍的 Token,比原始 grep 输出少约 200 倍。
但真正有意思的,不是这些数字本身,而是它做的一个选择:只用词法匹配,不做语义搜索。
这不是因为开发者做不了语义搜索——deja-vu 实际上支持可选的语义 embedding(对接本地 Ollama/LM Studio),但作者把它放在了弱势位置,没有把它作为默认方案推。
原因是务实的。
语义搜索虽然能找「意思相近」的内容,但它引入了一个巨大的不确定性:你永远不知道embedding 模型会把「连接池耗尽」映射到哪些「相似概念」上去——可能是「数据库连接满」、可能是「资源泄漏」、甚至是「性能问题」……但对于一个要改生产代码的 Agent 来说,错的回忆比没有回忆更危险。
有社区讨论说得很好:「先用词法搜精确匹配,搜不到再降级为语义搜——这才是审慎的工程实践。」 deja-vu 的置信度分层(exact → close → semantic)也正是这个思路。
三、把所有 Agent 的「日记」翻译成同一种语言
deja-vu 的第二个关键设计是跨 Agent 兼容。
如果你同时在用 Claude Code 和 Codex(相信我,很多人是这样的——用 Claude Code 写复杂逻辑,用 Codex 做快速重构),你可能会遇到这样一种荒唐的情况:
Claude Code 在某次会话中解决了一个 JWT refresh token 轮换的 bug,结论是 JWKS 缓存没有在
rotateKey()之后刷新。但当你切换到 Codex 新开一个会话,Codex 完全不知道这件事——因为它只能读自己的会话历史。
deja-vu 用了一个简单的策略解决了这个问题:它不要求 Agent 之间有任何「通信」,它只需要能读取每个 Agent 留在自己地盘上的会话文件。
目前支持的 Agent 列表已经长达 12 个:
| Agent | 存储格式 | MCP 召回 | 自动召回 |
|---|---|---|---|
| Claude Code | JSONL | ✅ | ✅ |
| Codex CLI | JSONL | ✅ | ✅ |
| opencode | SQLite | ✅ | ✅ |
| Cursor | state.vscdb | ✅ | — |
| Gemini CLI | JSON | ✅ | — |
| Grok Build | JSONL | ✅ | — |
| Qwen Code | JSONL | ✅ | — |
| Kimi Code | JSONL | ✅ | — |
| pi | JSONL | ✅ | — |
| Copilot CLI | JSONL | ✅ | — |
| Antigravity | JSONL | ✅ | — |
| aider | Markdown | — | — |
每个 Agent 的会话格式不同、存储位置不同、数据库引擎也可能不同(有些用 JSONL,有些用 SQLite,有些用 Markdown,Cursor IDE 甚至放在 state.vscdb 这种 VS Code 内部格式里)。deja-vu 默默地解决了所有这些格式差异,对外只暴露一个统一的 MCP recall 工具。
这就意味着:你在 Codex 里解决了一个问题,切回 Claude Code 之后,可以直接问:「check your memory — did I already fix JWT rotation?」Claude Code 会调 deja-vu 的 MCP recall,查到的结果是你三周前在 Codex 里修的那个 bug。
这不只是在记录知识——这是在打破 Agent 之间的信息孤岛。
四、记忆不只属于你一个人:跨机器同步与团队共享
如果说「跨 Agent 记忆」解决的是同一台机器上的碎片化问题,那 deja-vu 的同步机制解决的是跨设备的碎片化问题。
很多时候你并不是只在一台机器上编程。白天在公司 MacBook 上写后端,晚上回家用家里的台式机写点个人项目。两边的 Agent 各自积累了一套「记忆」,但互相不认识。
deja-vu 的同步设计也非常轻量:
# 通过共享文件夹(Syncthing/iCloud/git)
deja sync export ~/shared/deja-memory
deja sync import ~/shared/deja-memory
# 通过 SSH
deja sync ssh my-desktop
deja sync ssh my-desktop --pull
导出的批次是纯 JSONL(已经过脱敏处理),附带水印,仅追加,幂等。从别的机器同步过来的会话,在搜索结果中会显示为 imported:项目名,来源清楚可追溯。
更实用的是 deja share:你可以把某次调试会话的摘要——已经自动剥离了所有 API key、JWT、私钥——分享给同事。同事拿到的是一个脱敏后的 Markdown 摘要,里面有「当时的问题是什么、试了哪些方案、最终怎么修好的」。
对团队来说,这相当于给所有 Agent 的解决问题经验建立了一个本地知识库,不需要任何云服务,不依赖任何外部存储。
五、为什么 deja-vu 会火:Agent 的下半场,瓶颈不在模型,在上下文
回到那个更大的问题:为什么这样一个「给日志建索引」的简单工具,能引发这么多关注?
因为它切中了一个越来越明显的痛点:AI 编程助手的竞争,已经从「模型能写多好的代码」转向「模型能记住多少上下文」。
你想想看。现在的 AI 编程助手,模型能力差别其实在缩小。Claude Sonnet、GPT-5.x、Gemini——在很多常见编程任务上的表现相差不超过 10%。但真正影响你日常效率的,反而不是模型差的那 10%,而是每次开新会话都要重复说清楚上下文。
"我们这个项目用的是 Spring Boot 3.x + MyBatis。数据库是 MySQL。用户认证走的是 OAuth2,token 存在 Redis 里。之前我们讨论过把 UserService 拆成 UserQueryService 和 UserManageService,还没拆完……"
这些信息,你有,模型没有。每次都要重新灌输。而 deja-vu 做的事情,就是把这些「模型不知道但你我都知道」的信息,变成了一个可自动读取的外部记忆层。
这跟我们之前解读过的 code-review-graph 是同一件事:在模型看到代码之前,先帮它筛选出真正相关的那一小部分。 code-review-graph 解决的是「上下文太大」的问题(82 倍 Token 压缩),deja-vu 解决的是「上下文太老」的问题(三周前的记忆)。这两个项目一横一纵,正在搭建 AI 编程助手的「上下文基础设施」。
而且 deja-vu 的出现,还有一个很有意思的信号:它说明 Agent 生态正在从「单打独斗」进化到「多 Agent 协作」。 12 个主流 Agent,每个都有自己的 Session 格式和存储位置,deja-vu 在它们之上建了一层统一的记忆抽象。这跟 MCP 协议当年干的事很像——「我不取代你们,我给你们提供互通的标准层」。
六、谁该用,谁该等等:诚实的边界
但是,deja-vu 并不是完美无缺的。
首先,纯词法搜索的覆盖面有限。它能搜到「connection pool exhausted」这个精确短语,但搜不到「数据库连接打不开」这种含义相同但措辞不同的表述。虽然它支持可选的语义 embedding 扩展,但那需要你自己搭一个本地 embedding 端点。
其次,12 个 Agent 的支持深度不一样。Claude Code、Codex CLI、opencode 这三个是「一等公民」——支持 MCP 召回、自动召回、会话恢复和上下文切换。其他 Agent 的支持程度参差不齐,像 aider 甚至只有最基本的搜索能力,没有 MCP 集成。
第三,安全模型的双刃剑。deja-vu 默认在索引时剥离 API key、JWT 和私钥——这是好事。但如果你关掉这个功能(DEJA_NO_REDACT=1),你的所有会话日志会变成一份完整的明文密钥档案,存储在本地索引文件里。这意味着你需要注意文件访问权限。虽然它提供了 deja forget(遗忘)、deja doctor(诊断)等工具,但本地文件的物理安全依然是你自己的责任。
最后,它不是 Silver Bullet。deja-vu 能帮你找回「上次是怎么修的」,但不能替代真正的知识管理。真正重要的架构决策、API 设计原则、团队规范——这些还是应该写成 CLAUDE.md / AGENTS.md / 设计文档,而不是依赖 Agent 的聊天记录去「回忆」。
总结
deja-vu 给 AI 编程 Agent 生态补上了一个非常关键的缺失组件:跨 Agent、跨会话、跨设备的外部记忆层。它没有发明什么新的 AI 技术,没有用向量数据库,没有训模型——它只做了一件事:盘活了你硬盘上已经存在的那些「Agent 日记」,让它们从死数据变成了可检索、可召回、可共享的记忆。
它的核心价值不在技术本身,而在一个方向性的判断:Agent 的记忆不应该从「今天开始记录」,而应该从「过去开始回溯」。
如果用一句话来总结 deja-vu 的启示:
AI 编程的下半场,竞争已经从「模型够不够聪明」转向「Agent 记不记得你昨天说了什么」。而那些真正解决痛点的工具,往往不是最复杂的那个,而是最知道「数据其实已经在硬盘上」的那个。
夜雨聆风