当 Codex 开始记得你偏好的语言、常用验证方式和反复出现的工作流,新任务会少一些重新磨合。但“记得”很容易被理解成“它会自动遵守所有规则”,这两件事并不相同。
Codex Memories 更适合保存跨任务仍然有用的背景与偏好,让后续任务能够从更接近你的起点开始;必须遵守的项目规则、实时变化的外部事实和只对当前任务有效的要求,则各有更可靠的归宿。本文从这条边界出发,梳理 Memories 如何工作,以及它与 AGENTS.md、Skills、MCP 和当前线程应当怎样分工。
Memories 到底记住什么
按照 OpenAI 的 Codex Memories 文档,Memories 是 Codex 在本地生成和使用的一层长期上下文。它不是把每次对话全文永久塞进提示词,而是从适合沉淀的任务中提取稳定信息,再经过整理,供后续任务按需参考。
适合进入这一层的内容,通常具有两个共同特征:跨任务仍然成立,并且能减少重复沟通。例如:
- 默认使用中文交流,但技术名词可以保留英文;
- 某个仓库长期使用 Node 22,并以
npm run build作为基本验证; - 用户偏好先整合已有笔记,而不是创建近似重复的新文件;
- 某类工作已经形成反复出现的步骤与已知陷阱。
与之相对,临时日志、当前分支状态、一次性的路径、刚从网页查到的数据和某个 PR 是否已经合并,都可能很快失效。它们即使在当前任务里很重要,也不一定值得成为长期记忆。
Memories 是辅助回忆层,不是事实与规则的唯一权威来源。它的价值不是让 Codex 无条件相信过去,而是帮助新的任务更快找回可能有用的背景。
它如何生成与存储
Memories 目前是一项默认关闭的实验性能力。启用功能后,Codex 可以在后台从合适的任务中生成记忆;它会跳过仍在活跃的会话和过短的任务,等待系统空闲,并受剩余速率额度阈值影响。官方文档也说明,生成字段会进行敏感信息清理,但仍明确建议不要把 API key、密码等秘密交给 Memories 保存。
主开关可以写在 Codex 的 config.toml 中:
[features]
memories = true
生成的内容属于本地 Codex 状态,通常保存在 ~/.codex/memories/;如果修改了 CODEX_HOME,位置也会随之变化。这里的文件可以检查和清理,却不适合作为需要人工长期维护的第二套知识库,更不应该替代 Git 中的项目文档。
这也意味着,本地 Codex Memories 与 ChatGPT 网页端的记忆不是同一套存储。两者都可能让交互更连贯,但作用范围、配置方式和数据位置不同,不应混为一谈。
使用与生成是两只不同的开关
“让当前任务读取已有记忆”和“让当前任务生成新的记忆”是两个独立动作。全局配置中可以分别控制:
[memories]
use_memories = true
generate_memories = true
前者决定任务能否使用已有 Memories,后者决定任务结束后是否参与新记忆的提取。命令 /memories 则提供当前任务级别的控制,不会悄悄改写全局设置。
读取过去与沉淀现在应当分开判断。例如,一次处理敏感材料的任务仍可能需要使用已有的语言偏好,却不适合把这次任务继续写入长期记忆;一次全新的工作流试验也可能暂时关闭已有记忆,避免旧习惯过早影响探索。
最重要的不是开关,而是分层
Memories 真正容易被用错的地方,不在于配置项,而在于把不同性质的上下文全部交给同一层。一个长期运行的 Codex 工作流,通常至少包含以下几类信息:
| 层次 | 主要载体 | 最适合保存 | 不适合承担 |
|---|---|---|---|
| 当前任务 | Prompt 与本轮输入 | 眼前目标、临时要求、交付范围 | 跨任务长期复用 |
| 当前过程 | Thread | 已完成步骤、中间判断、连续对话 | 新任务的稳定起点 |
| 长期回忆 | Memories | 稳定偏好、反复出现的背景和经验 | 强制规则、实时事实、秘密 |
| 项目规则 | AGENTS.md、仓库文档 | 必须遵守的约束、验证方式、目录约定 | 只属于个人的模糊偏好 |
| 可复用方法 | Skills | 一类任务的步骤、格式知识和检查方法 | 新权限与实时外部数据 |
| 实时上下文 | MCP、网页与其他工具 | 当前文件、服务状态、最新文档与数据 | 未经核验的长期结论 |
| 环境设置 | config.toml | 功能开关、模型与本机行为 | 项目内容和写作知识 |
flowchart TB
Task["当前任务与线程"] --> Agent["Codex 组织与执行"]
Memory["Memories\n长期背景与偏好"] --> Agent
Rules["AGENTS.md / 仓库文档\n必须遵守的项目规则"] --> Agent
Skills["Skills\n可复用的方法与格式知识"] --> Agent
Live["MCP / Web / Tools\n实时外部上下文"] --> Agent
Config["config.toml\n本机与功能设置"] --> Agent
Agent --> Result["经过验证的结果"]
这张图里没有哪一层能够取代其余所有层。Prompt 负责说清这一次要做什么;Thread 保持当前过程连续;Memories 帮助想起长期背景;仓库规则提供可审查的强约束;Skills 沉淀重复任务的方法;MCP 和工具则获取此刻真实存在的文件与外部状态。
如果想进一步理解 Skills 为什么属于“方法层”,可以阅读 AI Agent 的 Skill 是什么:结构、运行机制与概念边界;如果关注 MCP、Skills 与应用控制在知识库中的具体协作,则可以继续看 Codex 操作 Obsidian 的能力分层。
为什么强规则应当写进 AGENTS.md
OpenAI 的 AGENTS.md 文档把它定义为 Codex 开始工作前会读取的项目指令。它可以随仓库进入版本控制,也可以按目录逐层覆盖,因此团队成员和自动化检查都能看到规则何时发生了变化。
这与 Memories 的性质不同。记忆是后台生成的本地状态,可能尚未提取、已经过时、被用户关闭,或没有在这一次任务中使用。如果一条要求关系到数据安全、发布流程、目录结构或构建结果,就不应该只寄希望于“Codex 也许还记得”。
必须稳定执行的要求写进 AGENTS.md 或仓库文档;希望减少重复说明的长期偏好,再交给 Memories。
例如,“回答尽量使用中文”可以是一项个人偏好;“合并前必须运行测试,不得把密钥提交进仓库”则应该成为可见、可审查的项目规则。前者偶尔需要根据语境调整,后者不应依赖一次概率性的回忆。
外部上下文为什么需要单独对待
Codex 还提供 disable_on_external_context 设置,用于避免从使用了 MCP、网页搜索或其他外部上下文的任务中生成 Memories:
[memories]
disable_on_external_context = true
这项设置背后的问题很实际:工具返回的内容未必代表用户的长期偏好。网页中的一句话、MCP 读取到的旧文档、临时环境里的路径,甚至第三方材料中的指令,都可能只对当下有效。如果不区分来源,外部事实就可能被错误概括成“用户一直希望这样做”。
工具给出的事实,不等于用户希望被长期记住的偏好。是否开启这项设置要看工作方式:如果日常任务高度依赖网页、MCP 和连接器,开启它能减少外部内容进入长期记忆的机会;如果某些稳定工作流恰好只能在工具辅助下完成,则需要接受更少自动沉淀,或在之后通过明确的项目文档补上真正值得留下的结论。
一套更稳妥的使用方式
Memories 不需要承担一切,反而更适合在边界清楚时使用。可以从下面这套流程开始:
- 先把强规则写进仓库。 发布流程、安全限制、目录约定和验证命令进入
AGENTS.md或项目文档。 - 只让稳定信息成为记忆候选。 偏好和经验至少应当跨越多个任务仍然成立。
- 把实时事实留给工具核验。 当前版本、在线状态、法律与价格等易变化信息,每次使用时重新确认。
- 定期检查本地记忆。 发现过时、过度概括或包含敏感信息的内容时及时清理,不把生成结果视为不可触碰的系统文件。
- 按任务控制使用与生成。 面对敏感材料、外部上下文或需要刻意摆脱旧习惯的探索任务时,使用
/memories调整本轮行为。 - 让方法进入 Skills。 当某套步骤经过多次真实任务验证,再把它整理为可复用、可检查的工作流,而不是只留下一句模糊偏好。
这种分工看起来多了几层,实际却减少了冲突:规则有明确出处,方法可以版本化,实时事实能够重新查询,Memories 也终于只需要做好它擅长的事——在新任务开始时,帮你少重复介绍一点自己。
结语
Codex Memories 最值得期待的,不是“它什么都记得”,而是它能在不把所有历史对话长期塞进上下文的前提下,保留一部分真正有复用价值的背景。
如果只保留一句总结,可以记成:
把长期偏好交给 Memories,把必须遵守的规则写进 AGENTS.md,把可复用的方法整理成 Skills,再让 MCP 与工具负责核验此刻的事实。
当这些层次各自承担合适的责任,记忆才不会变成另一种不可见的配置债务,而会成为长期协作中安静、但确实有用的一层。
评论
由 GitHub Discussions 提供支持。