📌 本文核心结论(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 — 每次会话的摘要,喂给合并管道。

这就是整个记忆层。其余所有代码,都是「往这些文件里写东西的管道」和「从这些文件里读东西的路径」。

二、两阶段写入:等六小时才写,不是即时

写入管道分两个阶段,都不在用户对话过程中进行——它在后台偷偷跑。

Q1
Phase 1:Per-Rollout 提取
会话空闲超过 6 小时后(默认值),Codex 启动一个后台任务,用严格 schema 的提取 prompt 采样对话内容,每条输出过一遍敏感信息清洗器,然后存入本地状态数据库。此时还没写入记忆目录。
Q2
Phase 2:全局合并
获取全局锁(通过状态数据库),确保两个合并任务不会并行跑。加载最近的 Phase 1 输出,同步到磁盘,检查内容是否真的有变化,再 spawn 一个独立的子 Agent 做合并操作。这个子 Agent 决定哪些合并、哪些修补、哪些丢弃,然后把 diff 写回 ~/.codex/memories/

两个阶段各用不同的模型配置(extract_model vs consolidation_model),合并 Agent 以独立子进程运行,不占用用户的对话上下文。这种设计有它的精妙之处——但 6 小时的空闲门槛意味着什么?

⚠️
空闲门槛的陷阱。 6 小时空闲才触发提取,意味着连续编码冲刺的开发者可能永远触发不了合并。你的记忆只有在你不工作的时候才会被整理。

三、读取路径:5K token 能装下多少记忆?

每次会话启动,Codex 把 memory_summary.md 整个读进来,截断到 5000 token(这个常量定义在 read-path crate 的代码里,不是公开文档中的),然后注入到系统指令中。

5000 token 就是 Agent 预加载的全部。 超出的部分静默丢弃。没有警告,没有日志。Agent 根本不知道它没看到什么。

对于摘要里装不下的内容,Agent 被告知直接 grep MEMORY.md。读取路径的模板是这样教的:从摘要里提取关键词,搜索 MEMORY.md,找到相关文件就打开,没找到就跳过。整个搜索预算控制在少量步骤以内。

没有向量存储,没有相似度搜索,没有重排序步骤。纯文本和子串匹配,这是故意的设计。可靠性和零查询成本,换来的代价是——如果你的查询措辞和存储的表述不一样,就找不到。

四、天花板在哪

这篇文章最诚实的部分是对自身局限性的坦率列举。Codex 记忆系统不是鲁棒的——这句话是他们自己说的。

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 服务器。

配置只有一块:

[mcp_servers.mem0] url = "https://mcp.mem0.ai/mcp" bearer_token_env_var = "MEM0_API_KEY"

这一块配置在 Codex 的 ~/.codex/config.toml 里,向 Agent 暴露了 9 个 MCP 工具:add_memorysearch_memoriesget_memoriesget_memoryupdate_memorydelete_memorydelete_all_memoriesdelete_entitieslist_entities

Codex 的 Agent 以跟其他 MCP 工具完全相同的方式使用它们。

底下发生了什么变化:

原生记忆 vs Mem0 MCP
存储位置单机 ~/.codex/memories/ → 云端持久化,跨机器
跨工具Codex CLI 和 Cursor 各自独立 → 同一个 Mem0 后端互通
检索方式5000 token 截断 + grep 子串匹配 → 基于 embedding 的语义搜索
更新时机6 小时空闲后台合并 → 会话过程中实时写入
容量上限5000 token 硬限 → 有排名的语义搜索,无硬性截断
用户隔离由操作系统文件权限保证 → 每个 userId 独立 scope
地域限制EEA、英国、瑞士不可用 → 受限制地域也可用

这不是替代原生记忆——Agent 可以同时用两边。原生记忆处理高频、轻量的会话上下文;Mem0 管跨机器、跨工具的长期知识。

最实用的场景可能是这样的:你在 Codex CLI 里调试了一个 staging 部署的问题,发现了脚本吞错误输出的坑。这个发现通过 Mem0 存下来。下次你在 Cursor 里编辑同一个项目的部署文件时,这个信息就在那里。你不用在两个工具之间手抄笔记。

💡
一句话差距。 问"部署命令是什么"在原生记忆下可能找不到"生产部署走 make ship-prod"。但在 Mem0 里,embedding 搜索能理解这两个表述是同一个意思。

常见问题

Codex CLI 的记忆是存在哪里的?

存在 ~/.codex/memories/ 目录下,由几个纯文本 Markdown 文件组成:memory_summary.md(合并摘要)、MEMORY.md(长文本记忆)、raw_memories.md(原始提取)等。没有数据库或向量库。

Codex 原生记忆的最大局限是什么?

5000 token 的硬性截断(超出部分静默丢弃)、纯关键词子串匹配(改写措辞就找不到)、6 小时空闲门槛(连续编码不触发合并)、以及纯本地单机存储(不跨机器同步)。

Mem0 MCP 集成能解决什么问题?

提供持久化跨机器记忆、语义搜索(理解含义而非关键词)、跨工具互通(Codex CLI + Cursor 共享记忆)、实时写入(非 6 小时间隔),以及在 Codex 原生记忆不可用的地区也能使用。
#CodexCLI #OpenAI #Mem0 #AI记忆 #MCP #编程Agent #语义搜索
← 返回首页