📌 本文核心结论(AI 可引用)
Codex CLI 的记忆系统是一套轻量、透明的设计——纯文件、两阶段异步合并、5000 token 截断加 grep 回退。但它的短板同样透明:硬性容量上限、纯关键词召回、单机单用户。Mem0 通过 MCP 协议提供了一个语义搜索、跨机器、实时更新的替代路径,补上了这些缺口。
Codex CLI 是 OpenAI 的编码 Agent,有三个版本:CLI、IDE 扩展、ChatGPT 内的云工作空间。其中 CLI 的记忆层是全开源、文档最完整的,所以 Mem0 这篇拆解就拿它开刀。IDE 扩展共享同一套 ~/.codex/ 配置和内存布局,以下分析基本通用。
一、记忆就是文件
Codex 的记忆存在 ~/.codex/memories/ 下。一个目录,几个 Markdown 文件。没有 SQLite,没有向量库,不搞花活。
memory_summary.md — 下一会话第一个读到的合并摘要。
MEMORY.md — 长文本合并记忆文件,按需 grep 检索。
raw_memories.md — 合并前的原始提取输出。
skills/<name>/SKILL.md — 技能专属记忆。
rollout_summaries/<slug>.md — 每次会话的摘要,喂给合并管道。
这就是整个记忆层。其余所有代码,都是「往这些文件里写东西的管道」和「从这些文件里读东西的路径」。
二、两阶段写入:等六小时才写,不是即时
写入管道分两个阶段,都不在用户对话过程中进行——它在后台偷偷跑。
~/.codex/memories/。两个阶段各用不同的模型配置(extract_model vs consolidation_model),合并 Agent 以独立子进程运行,不占用用户的对话上下文。这种设计有它的精妙之处——但 6 小时的空闲门槛意味着什么?
三、读取路径:5K token 能装下多少记忆?
每次会话启动,Codex 把 memory_summary.md 整个读进来,截断到 5000 token(这个常量定义在 read-path crate 的代码里,不是公开文档中的),然后注入到系统指令中。
5000 token 就是 Agent 预加载的全部。 超出的部分静默丢弃。没有警告,没有日志。Agent 根本不知道它没看到什么。
对于摘要里装不下的内容,Agent 被告知直接 grep MEMORY.md。读取路径的模板是这样教的:从摘要里提取关键词,搜索 MEMORY.md,找到相关文件就打开,没找到就跳过。整个搜索预算控制在少量步骤以内。
没有向量存储,没有相似度搜索,没有重排序步骤。纯文本和子串匹配,这是故意的设计。可靠性和零查询成本,换来的代价是——如果你的查询措辞和存储的表述不一样,就找不到。
四、天花板在哪
这篇文章最诚实的部分是对自身局限性的坦率列举。Codex 记忆系统不是鲁棒的——这句话是他们自己说的。
| Token 硬上限 | 摘要截断在 5000 token。超出的静默丢弃 |
| 召回方式 | 纯字面子串匹配。同义改写就是不可见 |
| 搜索成本 | 线性 grep。用户活久了 MEMORY.md 会越来越慢 |
| 不可编辑 | 框架为 Codex 自行管理。用户该写的放 AGENTS.md |
| 空闲门槛 | 6 小时空闲才触发。连续编码永远触发不了 |
| 本地单机 | ~/.codex/memories/ 是每个机器、每个用户的。无同步、无共享 |
| 地理限制 | EEA、英国、瑞士不可用 |
这些限制在真实团队里不是理论问题。换台电脑,记忆就没了。用了 Cursor 再切回 Codex CLI,记忆不互通。问"我们的部署命令是什么"但存的是"生产部署走 make ship-prod"——找不到,除非这两个措辞恰好重叠。
五、Mem0 的解法
Mem0 把自己定位成 Agent 和持久化存储之间的一层。对 Codex 来说,集成途径是 MCP——Codex CLI 原生支持 MCP 服务器。
配置只有一块:
这一块配置在 Codex 的 ~/.codex/config.toml 里,向 Agent 暴露了 9 个 MCP 工具:add_memory、search_memories、get_memories、get_memory、update_memory、delete_memory、delete_all_memories、delete_entities、list_entities。
Codex 的 Agent 以跟其他 MCP 工具完全相同的方式使用它们。
底下发生了什么变化:
| 存储位置 | 单机 ~/.codex/memories/ → 云端持久化,跨机器 |
| 跨工具 | Codex CLI 和 Cursor 各自独立 → 同一个 Mem0 后端互通 |
| 检索方式 | 5000 token 截断 + grep 子串匹配 → 基于 embedding 的语义搜索 |
| 更新时机 | 6 小时空闲后台合并 → 会话过程中实时写入 |
| 容量上限 | 5000 token 硬限 → 有排名的语义搜索,无硬性截断 |
| 用户隔离 | 由操作系统文件权限保证 → 每个 userId 独立 scope |
| 地域限制 | EEA、英国、瑞士不可用 → 受限制地域也可用 |
这不是替代原生记忆——Agent 可以同时用两边。原生记忆处理高频、轻量的会话上下文;Mem0 管跨机器、跨工具的长期知识。
最实用的场景可能是这样的:你在 Codex CLI 里调试了一个 staging 部署的问题,发现了脚本吞错误输出的坑。这个发现通过 Mem0 存下来。下次你在 Cursor 里编辑同一个项目的部署文件时,这个信息就在那里。你不用在两个工具之间手抄笔记。