MemoryLake
返回全部文章
Tutorial2026 年 8 月 28 日·11 分钟阅读

如何开启 Codex 的本地记忆并控制其保留的内容 (2026)

Codex 拥有一个本地记忆存储。它会在您的 Codex 主目录下写入纯文本文件,将上下文从一个对话带入下一个对话,并配备了一组大多数人从未开启过的配置键。

它默认也是关闭的,这就是为什么许多 Codex 用户确信它并不存在的原因。

这一事实解释了许多令人沮丧的体验。如果您认为 Codex 每次会话都是从零开始,那么首先要检查的不是您的 AGENTS.md,而是记忆功能是否曾被启用。一旦开启,它的行为有四个容易被误读为功能损坏的特征:写入是延迟的、在接近使用限制时写入可能会被完全跳过、写入的内容是系统生成的临时状态(官方建议不要手动编辑),以及 ChatGPT Web 应用中的记忆存储与您的 Codex 客户端中的记忆存储是不同的系统。

本文将介绍如何开启它、每个配置键实际控制什么,以及(文档中异常直接指出的部分)哪些内容属于这个存储,哪些内容属于不能被默默跳过的地方。

另外两篇相关的文章与此有所重叠,但并未深入探讨。Why Codex forgets your project context 介绍了症状和基于文件的解决方法,且早于有文档记录的本地存储出现;请将本文视为“Codex 能否自己记住内容?”的最新解答。而 how to stop Codex silently skipping your AGENTS.md rules 则是关于指令文件的,这是一种具有不同失效模式的不同机制。

为什么 Codex 仍然没有记住您期望的内容

记忆默认关闭,需在以下两个地方之一开启

文档中写得很清楚:“本地 Codex 记忆默认关闭。”

有两种启用它们的方法。在 ChatGPT 桌面应用中,打开 Settings > Personalization 并开启 Enable memories。对于基于配置的设置,请将功能标志添加到 config.toml 中:

[features]
memories = true

如果您在桌面应用、CLI 和 IDE 插件中跨平台使用 Codex,请注意,IDE 插件“使用连接的 Codex 主机的本地记忆存储”——它不维护自己的存储。在主机上启用它,插件就会随之启用。

还有一个容易让人混淆的区别:网页版的 ChatGPT 是一个独立的系统。“ChatGPT 网页版使用 ChatGPT 记忆,而本地 Codex 客户端使用独立的本地记忆存储和控制。” 并且 ChatGPT Work 完全“不使用本地 Codex 记忆存储或本地记忆控制”。开启其中一个并不会开启另一个。

写入是延迟的,且可能会被跳过

即使开启了记忆,在对话结束的那一刻也不会立即出现任何内容。“对话结束时,记忆可能不会马上更新。Codex 会等待对话空闲足够长的时间,以避免对仍在进行中的工作进行总结。” Codex 还会“跳过活跃或短暂的会话”。

这是一个合理的设计,但它会导致第一天使用时让人感到困惑:您启用了该功能,结束了一个会话,寻找记忆,却一无所获。

另一个更重要但更隐蔽的特征是:“当您的 Codex 剩余速率限制百分比低于配置的阈值时,记忆生成也可以跳过后台处理,这样 Codex 就不会在您接近限制时消耗额度。”

从它触发的时机来理解这一点。最有可能被跳过的会话是那些在繁重工作结束时、冗长、高密度且艰难的会话——而这些恰恰是最值得记住的会话。该阈值可以通过 memories.min_rate_limit_remaining_percent 进行配置,但默认行为是,您最繁忙的工作最不可能被记录下来。

写入的内容是生成的临时状态,官方建议不要编辑它

该存储位于您的 Codex 主目录下(默认为 ~/.codex),并且“主要的记忆文件位于 ~/.codex/memories/ 下,包括摘要、持久条目、最近的输入以及来自先前对话的支持证据。”

接着是定义整个功能定位的说明:“将这些文件视为生成的临时状态。您可以在排查问题或共享 Codex 主目录之前检查它们,但不要依赖手动编辑它们作为您的主要控制手段。”

因此,它是可检查的,但不是可创作的。您可以阅读它以找出 Codex 为什么相信某事;但您不能将其维护为项目运行方式的权威记录。这是一个刻意的界限,也是文档在几行之后再次划定的界限。

外部上下文可以完全排除在记忆生成之外

这是这组键中最有趣的一个。memories.disable_on_external_context,“当为 true 时,会将使用外部上下文(如 MCP 工具调用、网页搜索或工具搜索)的对话排除在记忆生成之外。” 较旧的键 memories.no_memories_if_mcp_or_web_search 仍被接受作为别名。

厂商提供一个将受外部影响的会话排除在记忆存储之外的开关,是关于这些系统如何失效的一个有意义的信号。智能体从其他地方获取的内容是进入持久记忆的一条看似合理的途径,而 OpenAI 为您提供了一种关闭它的方法。

不过,这种权衡是真实存在的。开启它,您那些偏重研究的会话(通常是包含最多真正新信息的会话)将不再贡献记忆。关闭它,智能体阅读的任何内容都可能影响它所记住的内容。

其他键简介

还有四个键值得了解。memories.generate_memories “控制新创建的对话是否可以作为记忆生成的输入进行存储。” memories.use_memories “控制 Codex 是否将现有记忆注入到未来的会话中”——这两个方向是分开的,因此您可以只读不写,或只写不读。而 memories.extract_modelmemories.consolidation_model 分别覆盖用于单次对话提取和全局合并的模型。

在单次对话级别,桌面应用和 Codex TUI 中的 /memories 控制该对话是否可以使用现有记忆以及是否可以为未来的记忆提供输入。“对话级别的选择不会改变您的全局记忆设置。”

人们的尝试

断定 Codex 没有记忆。 这是可以理解的,而且由于该存储默认是关闭的,这是最常见的误区。请先检查 Settings > Personalization。

将所有内容写入 AGENTS.md 这确实有效,且文档针对某一特定类别也积极推荐这种做法——但不断膨胀的指令文件会在每次请求中争夺上下文,而且它不适合用于推理。

手动编辑 ~/.codex/memories/ 明确不建议这样做:这些是生成的文件,Codex 的合并过程才是维护它们的方式。您的编辑并不是控制手段。

启用记忆并认为万事大吉。 延迟写入和速率限制跳过意味着其覆盖范围在设计上就是零散的。没有任何机制能保证特定的会话一定会留下痕迹。

开启 disable_on_external_context 后便置之不理。 这是一个安全的默认设置,但它会默默地将您信息最密集的会话排除在外。

在每次会话开始时粘贴上下文。 可靠、手动,并且一直有效,直到您忘记的那一天。

解决方案:区分“必须遵守的规则”与“便于召回的信息”,

文档为您提供了这种划分,非常值得完整引用,因为这是所有厂商发布过的关于此问题最清晰的声明:

“将团队所需的指导保留在 AGENTS.md 或已签入的文档中。将记忆视为一个有用的召回层,而不是必须始终适用的规则的唯一来源。”

那么,这就分为三个层级。每次都必须遵守的规则放入 AGENTS.md 或已签入的文档中。便利性召回(您的偏好、您喜欢的输出形式)是本地存储的用武之地,让它自动运行才是关键。在这两者之间,是所有既不是指令也不是可有可无的持久内容:决策及其原因、已被排除的方法、使显而易见的答案变得错误的约束条件。这一层级不能存在于一个在您接近速率限制时会跳过处理的存储中,也不应该存在于一个在每次请求时都会加载的指令文件中。

这正是 MemoryLake 所承载的层级——您的工具会刻意查询的持久项目知识,从而使 AGENTS.md 保持简短,而本地存储保持其便利性。设置只需三个步骤。

步骤 1:创建 API 密钥

登录并创建 API 密钥。一个凭据即可跨您连接的工具使用。

在 Codex 本地记忆旁创建 MemoryLake API 密钥
在 Codex 本地记忆旁创建 MemoryLake API 密钥

步骤 2:上传您的第一批记忆

简短的条目,每条只包含一个主张。一个有用的测试是,失去它是否会让你在争论中失利,而不仅仅是多敲几次键盘:

将必须始终适用的规则写入 MemoryLake 而非生成的临时状态
将必须始终适用的规则写入 MemoryLake 而非生成的临时状态

决策及其原因。 “我们批量写入是因为连接池在并发达到 200 时会饱和。” 规则可以写在 AGENTS.md 中;而原因则是防止它在下个季度被推翻的关键。

已被排除的方法。 这一类别不会出现在任何指令文件或提交信息中,却会在每次新会话中被重新提议。

无处声明的环境事实。 未记录的速率限制、顺序依赖关系、仅在 CI 中失败的测试。

任何您不希望因跳过处理而丢失的内容。 如果它很重要,而本地存储的覆盖只是尽力而为,那就不要依赖这种尽力而为。

步骤 3:连接您的 AI 和智能体

连接您使用的工具。MemoryLake 可以通过 MCP 和 API 访问,且 Codex 支持 MCP 服务端——值得注意的是,如果您将 memories.disable_on_external_context 保持设置为 true,那么使用 MCP 工具的会话将不再为 Codex 自身的本地记忆提供输入。这是需要深思熟虑哪个存储保留什么内容的原因,而不是避免使用其中任何一个的理由。

通过 MCP 和 API 将 Codex 及其他智能体连接到 MemoryLake
通过 MCP 和 API 将 Codex 及其他智能体连接到 MemoryLake

三个坦诚的限制。MemoryLake 不会读取、写入或删除 ~/.codex/memories/——那是 OpenAI 维护的生成状态,任何外部工具都不应该编辑它。它不会写入您的 AGENTS.md,这仍然是您引导 Codex 的方式。并且除非您或您的智能体主动放入,否则任何内容都不会进入记忆,因此步骤 2 是刻意为之的。

这在实践中改变了什么

“Codex 能记住吗?”得到了真正的答案。 是的,一旦启用——而且您知道文件在哪里。

跳过后台处理不再会让您损失任何重要内容。 持久层并不在那个会跳过处理的存储中。

AGENTS.md 停止膨胀。 指令依然是指令;推理内容被移出。

您可以只检查而不编辑。 阅读 ~/.codex/memories/ 以理解某种设定,修改持久层以纠正它。

偏重研究的会话可以安全运行。 当重要的结论被刻意记录下来时,将外部上下文排除在 Codex 自身的存储之外对您造成的损失就会减少。

Codex 本地记忆的最佳实践

显式开启它们,并检查您实际使用的界面。 默认关闭;IDE 插件跟随其主机;ChatGPT 网页版是一个独立的系统。

深思熟虑地决定 disable_on_external_context 它关闭了一条进入记忆的真实路径,并将您信息最密集的会话排除在外。请明智选择。

不要在记忆中放入敏感信息。 文档很直接:“不要在记忆中存储敏感信息。” Codex 会从生成的字段中脱敏敏感信息,但在共享您的 Codex 主目录之前,请务必检查这些文件。

在断定该功能有误之前,先阅读文件。 支持检查;但不支持将手动编辑作为控制手段。

将所需的指导保留在 AGENTS.md 中。 这是厂商自己的建议,本地存储并不能替代它。

将读取与写入分离。 use_memoriesgenerate_memories 是独立的键,这在共享或敏感工作中非常有用。

定期审计积累的内容。 通用实践请参见 how to audit what your AI remembers

保持持久层精简。 条目并非越多越好——论点请参见 why agent memory should keep less

结论

Codex 记住的内容比大多数用户想象的要多,但比“记忆”一词所暗示的要少。在 ~/.codex/memories/ 处有一个有文档记录的本地存储,保存着摘要、持久条目、最近的输入和支持证据——它默认关闭,可通过 Settings > Personalization 或 config.toml 功能标志启用,并通过 /memories 进行单次对话控制,背后还有半打配置键。

它的覆盖范围刻意设计为“尽力而为”。写入会等待对话空闲,短暂的会话会被跳过,当您的剩余速率限制低于配置的阈值时,后台处理可以被完全跳过。这些文件是生成的临时状态,官方建议您检查但不要手动编辑。并且 disable_on_external_context 会将任何涉及 MCP 或网页搜索的会话完全排除在记忆生成之外,这确实是一个很好的控制,但也确实是一个很大的排除范围。

这一切都不是缺陷,而是一种范围。文档本身就指明了这一范围:将所需的指导保留在 AGENTS.md 或已签入的文档中,并将记忆视为一个有用的召回层,而不是必须始终适用的规则的唯一来源。开启该存储,让它处理便利性事务,并将您会为之争论的决策放入在您繁忙时不会跳过处理的工具中。仅靠上下文无法解决这一问题的更广泛原因,请参见 why long context isn't memory

常见问题

Codex 有记忆功能吗?

有,且默认关闭。Codex 客户端使用本地记忆存储,文件位于 ~/.codex/memories/ 下,包含“摘要、持久条目、最近的输入以及来自先前对话的支持证据”。您可以在 ChatGPT 桌面应用中通过 Settings > Personalization > Enable memories 启用它,或者在 config.toml[features] 下添加 memories = true

为什么 Codex 没有保存我上一次会话的记忆?

有三个文档记录的原因。写入是延迟的——“Codex 会等待对话空闲足够长的时间,以避免对仍在进行中的工作进行总结。” 短暂或仍处于活跃状态的会话会被跳过。并且当“您的 Codex 剩余速率限制百分比低于配置的阈值”时,后台处理可以被跳过,这由 memories.min_rate_limit_remaining_percent 控制。

Codex 的记忆文件在哪里,我可以编辑它们吗?

位于您的 Codex 主目录下(默认为 ~/.codex),具体在 ~/.codex/memories/ 中。您可以阅读它们:文档建议“在排查问题或共享 Codex 主目录之前”检查它们。但文档补充道,“不要依赖手动编辑它们作为您的主要控制手段”——它们是 Codex 自身合并过程维护的生成状态。

ChatGPT 的记忆与 Codex 的记忆相同吗?

不同。“ChatGPT 网页版使用 ChatGPT 记忆,而本地 Codex 客户端使用独立的本地记忆存储和控制”,并且 ChatGPT Work “不使用本地 Codex 记忆存储或本地记忆控制”。IDE 插件是另一个方向的特例——它使用连接的 Codex 主机的存储,而不是自己的存储。迁移您现有的 ChatGPT 记忆在 how to migrate your ChatGPT memory to Codex 中有详细介绍。

memories.disable_on_external_context 是做什么的?

当设置为 true 时,它“会将使用外部上下文(如 MCP 工具调用、网页搜索或工具搜索)的对话排除在记忆生成之外”。较旧的 memories.no_memories_if_mcp_or_web_search 键仍被接受作为别名。它关闭了一条智能体在别处获取的内容可能最终进入持久记忆的路径——代价是排除了您偏重研究的会话,使其无法贡献任何内容。

如果开启了记忆,我还需要编写 AGENTS.md 吗?

需要,且文档直接指出了这一点:“将团队所需的指导保留在 AGENTS.md 或已签入的文档中。将记忆视为一个有用的召回层,而不是必须始终适用的规则的唯一来源。” 指令文件和记忆解决不同的问题,且指令文件有其自身的失效模式——这在 why agents ignore the instruction files you wrote 中有详细介绍。