记忆系统,从命名的角度来理解,“记忆”就是如何“记”下,如何回”忆”,以及如何遗忘。
以下是我对Codex以及DeepSeek harness记忆系统的一些理解,若有不对,望指正。
Codex 的思路更像“记忆编译器”:把历史 Session 自动提炼成可复用知识,再分层检索。
DeepSeek Harness 的思路更像“记忆基础设施/操作系统”:先把 Session、持久化、压缩、检索、指令注入都做成独立插件能力,至于“什么值得记住、如何长期整理”交给插件。
而且这里有个非常重要的时间点:截至 2026 年 9 月,Codex 已经有原生的跨 Session Memories Pipeline;DeepSeek Harness 官方本体还没有同等级的自动长期记忆整理器。DeepSeek 社区这几天已经出现dsh-memory等插件补这一层。
一、先把“记忆”这个词拆开
很多 Agent 项目一说 Memory,就直接:
历史聊天 ↓ Embedding ↓ Vector DB ↓ TopK ↓ 塞 Prompt其实这是把至少4 种完全不同的东西混到了一起。
可以分为:
① Working Memory 当前上下文窗口 ↓ ② Episodic Memory 过去某次 Session 发生过什么 ↓ ③ Semantic / Procedural Memory 从很多 Session 中总结出来的规律、经验、工作流 ↓ ④ Instruction / Policy Memory 用户明确规定“以后必须怎么做”举例:
用户:这个项目 Python 环境是 .conda如果只是今天这次会话知道:
→ Working Memory
如果历史 Session 里曾经讨论过:
→ Episodic Memory
如果系统总结成:
这个仓库默认使用
.conda,执行测试前先确认环境。
→ Semantic/Procedural Memory
如果用户明确写:
AGENTS.md: 任何修改前必须运行 pytest。→ Instruction / Policy
Codex 和 DeepSeek Harness 最值得学习的地方,就是都没有简单把这些东西混成一个“memory vector database”。
二、Codex:核心思想是“把历史经验编译成知识”
现在 Codex GitHub 里已经有一个非常完整的:
codex-rs/memories/架构明确分为:
read/ write/也就是:
Memory Write Path 和 Memory Read Path 分离。
(GitHub)
整个流程可以理解成:
历史 Rollout / Session │ ▼ ┌─────────────────────┐ │ Phase 1 │ │ Session Extraction │ │ 每个会话单独提炼 │ └─────────┬───────────┘ │ ▼ raw_memory rollout_summary rollout_slug │ ▼ SQLite │ ▼ ┌─────────────────────┐ │ Phase 2 │ │ Global Consolidation│ │ 跨 Session 整理 │ └─────────┬───────────┘ │ ▼ ~/.codex/memories/ │ ├── memory_summary.md ├── MEMORY.md ├── skills/ └── rollout_summaries/这其实非常漂亮。
三、Codex Phase 1:不是“总结聊天”,而是“提取未来有价值的信息”
Codex 的第一阶段会扫描近期符合条件的 rollout,然后单独交给模型分析。
输出结构明确包括:
{ "raw_memory": "...", "rollout_summary": "...", "rollout_slug": "..." }同时会:
限制每次启动处理多少 Session;
多 Session 并发提取;
DB lease 防止多个 worker 重复工作;
失败有 backoff;
对生成的记忆做 secret redaction。(GitHub)
最值得注意的是它对“什么值得记”的定义。
Codex 的 Memory Writer 明确强调:
高价值记忆不是“有用的信息都存下来”,而是应该改变未来 Agent 默认行为的信息。
典型包括:
稳定的用户偏好;
反复被用户纠正的地方;
高价值的排障经验;
能显著减少未来探索成本的路径/命令;
某项目真实信息存在哪里;
什么信号出现时应该切换策略。
而且它提出一个很有意思的目标:
Optimize for future user time saved, not just future agent time saved.
也就是说,不是:
“Agent 下次能少调用两个工具就存。”
而是:
“这条信息以后能不能让用户少解释一次、少纠正一次、少重新排查一次?”
(GitHub)
这个设计我认为非常值得做 Agent 的人学习。
四、Codex Phase 2:Memory 不是追加日志,而是“持续重构的知识库”
这是 Codex Memory 最值得学习的地方。
很多人的长期记忆是:
memory.md - 用户喜欢 Python - 用户喜欢 pytest - 用户项目是 xxx - 今天发现 xxx - 明天发现 xxx - 后天发现 xxx ...最终一定会变成垃圾场。
Codex 不这样做。
它有第二阶段:
Global Consolidation把第一阶段提取出来的大量原始记忆再次整理。
并且不是简单 append,而是:
ADD UPDATE MERGE DELETE它甚至把:
~/.codex/memories/本身做成一个Git-backed workspace。
每次 consolidation 前产生:
phase2_workspace_diff.md让整理 Agent 看:
+ 新出现的信息 - 已经消失的信息 ~ 被修改的信息然后增量维护:
MEMORY.md memory_summary.md skills/(GitHub)
所以它本质上不是:
Chat → Summary
而是:
Chat → Evidence → Candidate Memory → Consolidated Knowledge
这和数据库思想非常像。
五、Codex 的“遗忘”设计也很重要
Memory 最大的问题从来都不是:
怎么记住?
而是:
怎么不记错?怎么删掉过期信息?
例如:
以前:
Python 3.11后来项目升级:
Python 3.12最差的 Memory 系统会变成:
Python 3.11 Python 3.12以后模型随机信一个。
Codex Phase 2 会根据新的 evidence 和 workspace diff 对旧 Memory:
删除 重写 合并 降级它选取 Phase-1 Memory 时还会考虑:
usage_count last_usage generated_at max_unused_days也就是:
高频 + 最近被使用 ↓ 优先参与 Consolidation 长期没人使用 ↓ 逐渐退出 active memory(GitHub)
这已经很像“记忆代谢”了。
六、Codex Read Path:最聪明的是“渐进式披露”
如果积累半年 Memory:
100 KB 500 KB 10 MB难道每次全部塞 Prompt?
显然不行。
所以 Codex 做的是:
小、密集 memory_summary.md │ ▼ MEMORY.md │ ┌───────┴────────┐ ▼ ▼ skills/ rollout_summaries/ │ ▼ 原始证据这是一个general → specific的结构。(GitHub)
其中:
L0:memory_summary.md
非常短。
作用:
路由。
不是把所有细节告诉 Agent,而是:
这个项目以前做过什么? 有哪些主题? 去哪里找?它会被放进请求上下文。
L1:MEMORY.md
相当于:
长期记忆 handbook / searchable registry
Agent 根据关键词去搜索。
L2:skills/
如果某个历史经验已经形成稳定流程:
如何执行 release 如何排查某类 bug 如何跑特定测试就可以提升成:
SKILL.md scripts/ examples/ templates/这一步特别有意思:
记忆可以从“事实”晋升为“能力”。
L3:rollout_summaries
如果 Agent 需要:
当时到底发生了什么? 具体错误是什么? 为什么做那个决定?才继续进入历史 Session summary。
所以一次普通任务不是:
读取所有记忆而是:
memory_summary ↓ 发现相关主题 ↓ grep MEMORY.md ↓ 必要才打开 1~2 个详细文件Codex 甚至明确建议:
memory quick pass 最好控制在大约 4–6 次搜索操作内。
(GitHub)
这就是典型的:
Progressive Disclosure
和 RAG 非常像。
七、所以 Codex Memory 本质上很像一个“分层 Cache + RAG”
可以把你以前学的 RAG 串起来。
传统 RAG
Query ↓ Embedding ↓ Vector DB ↓ TopK chunks ↓ LLMCodex Memory 更像:
Query ↓ Memory Summary 判断有没有相关历史 ↓ Keyword / 文件导航 ↓ MEMORY.md ↓ 需要的话继续进入 Rollout / Skill ↓ LLM你会发现:
它没有把“向量数据库”当成长期 Memory 的核心。
因为对于 coding agent 来说:
文件名 项目路径 函数名 错误码 命令 模块名本身就是非常好的 discriminator。
因此:
Markdown + filesystem + grep/search + structured index已经能解决大量 Memory Retrieval。
这也是一个很好的反面思考:
Memory ≠ 一定需要 Vector DB。
八、还有一个非常关键的设计:AGENTS.md ≠ Memory
这个经常容易混淆。
Codex 同时存在:
AGENTS.md以及:
MEMORY.md两者地位完全不同。
AGENTS.md
属于:
authoritative instruction即:
用户/项目明确规定应该怎么做。
Codex 会从 repo root → cwd 逐层读取 AGENTS.md,越具体的目录规则作用范围越具体。(GitHub)
例如:
AGENTS.md - 所有 API 必须有 pytest - 不允许修改 migrations/ - Python 必须使用 3.12这是:
Policy。
MEMORY.md
则是:
learned knowledge例如:
上次发现运行 integration test 需要先启动 Redis。 某个 timeout 问题最终根因是连接池耗尽。这是:
Experience。
所以正确关系是:
System / Developer ↓ User Task ↓ AGENTS.md authoritative rules ↓ Memory historical experience ↓ raw historyMemory 不应该偷偷提升成 Policy。
这是一个很成熟的设计思想。
九、DeepSeek Harness 则走了另一条路
DeepSeek Harness 的核心 slogan 就是:
Everything is a Plugin.
官方 architecture 明确说:
模型 adapter、tool registry、session log、agent loop 本身都是插件。
没有一个“神圣不可替换的核心模块”。
(GitHub)
所以它处理 Memory 的思维不是:
“我给你做一个完整 Memory 产品。”
而是先建立这些 primitive:
Session Persistence Compaction Session Query Session Reference Agent Instructions Storage然后让 Memory 成为这些能力的组合。
十、DeepSeek Harness 第一块:Event-Sourced Session
这是我觉得 DSH 最漂亮的设计之一。
它规定:
Session = append-only SessionEvent logSession 是整个历史唯一 Source of Truth。
不是维护:
messages[] session_history[] summaries[]几份互相可能不一致的数据。
而是:
SessionEvent Log │ ├── user/message ├── assistant/message ├── tool/call ├── tool/result ├── turn/start ├── turn/end ... ↓ deriveMessages() ↓ 真正给模型看的 history官方文档明确:
LLM message history 是从事件日志派生出来的,而不是单独保存一份。
(GitHub)
这个思想叫:
Event Sourcing
十一、这可以直接和数据库 WAL 串起来
假设:
发生一次 Tool Call传统实现:
messages.push(...) database.update(...) summary.update(...)三个地方都有状态。
一旦 crash:
messages 更新了 DB 没更新 summary 更新了一半麻烦了。
Event Sourcing 则:
append: ToolCallEvent ToolResultEvent其他东西全部:
Event Log ↓ Projection重新计算。
就像数据库:
WAL ↓ Table State ↓ Index所以 DSH 的 Session 很适合做长期 Memory 的原始证据层。
十二、DeepSeek 第二块:Persistence 与 Session 分离
Session 本身负责:
“发生了什么”Persistence 负责:
“怎么把它保存下来”官方提供:
session-persistence session-persistence-jsonl session-persistence-sqlite(GitHub)
因此:
Session semantics │ ▼ Persistence seam ┌──┴───┐ ▼ ▼ JSONL SQLite这和你设计 Tool abstraction / LLM provider abstraction 一模一样:
业务语义与存储介质解耦。
十三、DeepSeek 第三块:Compaction 不是 Memory,而是 Context Management
DSH 还专门把:
compaction拆成独立 capability。
它的行为:
旧 Conversation History │ ▼ Summary + 最近几轮原文但是有个非常关键的细节:
Compaction 结果本身也写回 Session log。
这样:
Replay Session仍然能够知道:
什么时候 compact compact 了哪些 events 产生了什么 summary而不是偷偷修改历史。
(GitHub)
这又体现 Event Sourcing 思想:
原始事实不可偷偷消失,压缩只是新的事件/Projection。
十四、DeepSeek 第四块:Session Query = 给历史建立检索层
有了很多 Session 后,不能:
每次扫描全部 JSONL。因此 Harness 有:
session-query session-query-sqlite tool-session-query提供:
Session 列表;
exact read;
filters;
relationship tracing;
SQLite Full-Text Search;
模型可调用的 Session Query Tool。
(GitHub)
于是形成:
Session Log │ ┌───────────┴───────────┐ ▼ ▼ Persistence Session Query JSONL/SQLite │ ▼ Agent Search你会发现:
这已经把一个 Memory 系统需要的“原始历史 + 持久化 + 检索”全部准备好了。
只是还没有决定:
哪些历史应该自动升格成长期知识。
十五、DeepSeek 的 AGENTS 体系也比一般项目更强调“Scope”
DeepSeek Harness 官方有:
agent-instructions支持:
$DSH_HOME/AGENTS.md repo/ ├── AGENTS.md ├── src/ │ └── AGENTS.md └── ...甚至兼容:
CLAUDE.md AGENTS.local.md CLAUDE.local.md(GitHub)
而且这里有个挺高级的细节。
DSH 把这些 workspace instructions:
作为 durable user-role context 写进 Session history。
所以它们:
persist replay compact都会跟着 Session。
(GitHub)
这和单纯每次:
system_prompt += AGENTS完全不一样。
因为后者你事后无法确定:
当时那个 Agent 到底看到了哪个版本的 AGENTS.md?
而 DSH durable history 可以复盘。
对于生产 Agent,这一点很重要。
十六、那 DeepSeek Harness 为什么目前没有直接做 Codex 那样的 Memory?
从它整体架构其实很好理解:
DeepSeek Harness 更强调:
mechanism ≠ policyHarness 提供 mechanism:
Session Storage Query Compaction Instruction injection Plugin system但是:
什么值得记? 什么时候整理? 如何忘记? 用 Markdown? SQLite? Vector DB? Graph? Global 还是 Workspace?这些属于:
Memory Policy
不应该强绑定进 Agent Loop。
截至 9 月初,官方 Discussions 里甚至有人专门提出:
DSH 当前并不会原生自动加载
memory//MEMORY.md。
现在原生会自动处理的是 instruction chain 和 Skills,而跨 Session Memory 仍主要由插件实现。(GitHub)
十七、这几天出现的 dsh-memory 正好验证了这个架构
9 月 4 日 DeepSeek Harness Discussions 里有社区项目:
dsh-memory明确标注:
unofficial community project。
设计目标是:
Claude Code + Codex它借鉴:
Claude Code
Markdown memory + progressive disclosureCodex
session consolidation最后形成:
Global MEMORY + Workspace MEMORY + 详细 Markdown并且不要求单独的 Vector DB。(GitHub)
这其实说明 DeepSeek Harness 的路线:
官方 Harness 提供 Memory 的“乐高积木”,社区负责组装不同 Memory 产品。
十八、把 Codex 和 DeepSeek Harness 放一起,就非常清楚了
| 维度 | Codex | DeepSeek Harness |
|---|---|---|
| 核心思想 | 自动把历史经验提炼成长期知识 | 提供可组合 Memory primitives |
| Session | Rollout/history | Event-sourced Session |
| 长期 Memory | 官方原生支持 | 当前主要靠插件 |
| Memory extraction | Phase 1 自动提取 | Memory 插件自行决定 |
| Consolidation | Phase 2 自动整理 | Memory 插件自行决定 |
| 原始证据 | rollout | append-only Session events |
| 检索 | MEMORY + summary + rollout | session-query / FTS / plugins |
| Context 压缩 | 有 compaction | 独立 compaction seam |
| Instructions | AGENTS.md | AGENTS/CLAUDE/local overlays |
| Memory storage | DB + Markdown + Git workspace | 可插拔 JSONL/SQLite/storage/plugin |
| 遗忘 | usage/recency + diff cleanup | 由 Memory plugin 决定 |
| Progressive disclosure | 原生 Memory Read Path | Harness 提供实现它的能力 |
| 哲学 | opinionated Memory product | unopinionated Memory platform |
十九、用一个特别容易记住的比喻
如果把人的大脑类比成电脑:
Codex
更像已经帮你装好了:
记忆管理软件它会:
昨天发生了什么 ↓ 提取经验 ↓ 整理笔记 ↓ 合并重复 ↓ 删除过期 ↓ 建立索引 ↓ 今天需要的时候按需找所以:
Codex = Memory Compiler。
DeepSeek Harness
更像给你提供:
硬盘 文件系统 数据库 搜索引擎 日志系统 缓存 Plugin API但是没有强迫你使用一种“记忆软件”。
所以:
DeepSeek Harness = Memory Operating System / Memory Infrastructure。
二十、这两套设计里,我认为最值得吸收到 Agent 项目里的 7 条原则
如果以后自己设计 Production Agent Memory,我不建议:
所有聊天 → embedding → Milvus而更建议:
┌──────────────┐ │ Explicit Rule│ │ AGENTS/Policy│ └──────┬───────┘ │ User ↔ Agent │ │ │ ▼ ▼ ┌────────────────────────────────┐ │ Append-only Session │ │ User / Assistant / Tool/Evidence│ └───────────────┬────────────────┘ │ ┌───────┴─────────┐ ▼ ▼ Compaction Async Memory Extractor │ ▼ Candidate Memories │ ▼ Consolidator │ ┌────────────┼────────────┐ ▼ ▼ ▼ Summary MEMORY Skills │ │ │ └──── Progressive Recall ─┘核心原则只有 7 条:
Session History 和 Long-term Memory 分开。历史是 evidence,Memory 是 interpretation。
Instructions 和 Learned Memory 分开。用户明确规定的规则,不能和模型自己总结的经验拥有同等 authority。
Write Path 和 Read Path 分开。怎么产生记忆和怎么找记忆,是两个独立问题。
不要同步整理全部 Memory。Codex 把提取/整理放后台,就是为了不阻塞主 Agent。
Progressive Disclosure,而不是全塞上下文。Summary → index → detail → raw evidence。
Memory 必须有 provenance 和 forgetting。没有来源、时间、作用域、更新机制的 Memory,时间长了迟早污染 Agent。
Raw Evidence 最好 immutable。这一点尤其值得从 DeepSeek Harness 的 Event Sourcing 学。
最后再把这件事和熟悉的 RAG 串起来
你可以这样建立知识体系:
RAG 解决的是: “外部知识很多,当前 Query 应该取哪部分?” Memory 解决的是: “历史交互很多,哪些应该影响未来?” Event Sourcing 解决的是: “过去真实发生过什么?” Compaction 解决的是: “当前 Session 太长,怎么压缩上下文?” AGENTS / Policy 解决的是: “不管历史如何,Agent 必须遵守什么?” Skills 解决的是: “已经验证成功的经验,能否升级成可复用能力?”所以一个成熟 Agent 最终其实不是只有一个 Memory 模块,而是:
Evidence ↓ Session ↓ Memory ↓ Knowledge ↓ SkillCodex 最有价值的是“经验如何逐层蒸馏成能力”;DeepSeek Harness 最有价值的是“原始事实、派生状态、存储、检索、压缩之间如何彻底解耦”。
源码入口可以直接看这几个:
Codex Memories Pipelinehttps://github.com/openai/codex/tree/main/codex-rs/memories?utm_source=chatgpt.com
Codex Memory Consolidation Prompthttps://github.com/openai/codex/blob/main/codex-rs/memories/write/templates/memories/consolidation.md?utm_source=chatgpt.com
DeepSeek Harnesshttps://github.com/deepseek-ai/deepseek-harness?utm_source=chatgpt.com
DeepSeek Harness Session Architecturehttps://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/session.md?utm_source=chatgpt.com
DeepSeek Harness Agent Instructionshttps://github.com/deepseek-ai/deepseek-harness/tree/master/packages/context/agent-instructions?utm_source=chatgpt.com