# 三行速读
- 记忆系统的核心是 “筛选”,不是 “囤积”。
- 只保存跨会话仍有价值、且不易从当前仓库重建的信息。
- 记忆治理(合并、裁剪、过期)和记忆写入同样重要。
# 先修知识
- 已理解 s06 的上下文压缩与存储分层。
- 知道会话内状态与跨会话状态不是一回事。
# 读完后你应该能做到(可检验清单)
# 本篇要解决什么
会话结束后,哪些信息应该被保留到下次?s09 回答的是 “长期记忆边界”,不是 “把一切都存起来”。
核心问题:什么值得记,什么不该记。
# 用一个类比先理解
把记忆当 “项目交接手册”:
- 记长期有效规则(风格偏好、团队约定、关键背景);
- 不记短期临时状态(某次命令输出、当前游标位置)。
手册是为了下次接手更快,不是为了复制整个工作台。
# 为什么这一步必须现在做
如果没有记忆系统,跨会话协作会重复沟通;但如果记忆无边界,系统会被过时信息污染。s09 就是在建立 “长期价值筛选器”。
# 关键代码怎么读
# 1) 记忆存储结构
1 | MEMORY_DIR = WORKDIR / ".memory" |
类型化是关键,它为后续检索和治理打基础。
# 2) MemoryManager 的核心职责
1 | class MemoryManager: |
它做三件事:加载、注入、保存。职责清晰,便于扩展。
# 3) frontmatter 化存储
1 | frontmatter = ( |
可读、可查、可审计,比黑盒存储更适合教学与团队维护。
# 4) DreamConsolidator 的治理入口
1 | class DreamConsolidator: |
这部分强调 “慢治理”:记忆不是每轮都重排,而是按策略周期整理。
# 你可以怎么复现
- 先保存 3 条不同类型记忆。
- 重新启动会话,观察是否成功注入。
- 再刻意保存一条无价值临时信息,体会污染效果。
# 常见误区
- 误区 1:把可从仓库重建的信息也写入记忆。
- 误区 2:没有类型,后续召回杂乱。
- 误区 3:不做清理,记忆库越积越脏。
# 一句话总结
s09 不是 “增加存储量”,而是 “增加跨会话方向感”。
# 补充解读:记忆系统的治理层设计
# A. load_all() 为什么不依赖 MEMORY.md 单点
1 | for md_file in sorted(self.memory_dir.glob("*.md")): |
它是 “从原始条目重建索引”,而不是盲信索引文件。这样索引损坏也能恢复。
# B. _rebuild_index() 的上限策略
1 | if len(lines) >= MAX_INDEX_LINES: |
这里在主动控制记忆可读性。上限不仅是性能问题,也是认知负担控制。
# C. save_memory() 的命名清洗
1 | safe_name = re.sub(r"[^a-zA-Z0-9_-]", "_", name.lower()) |
这是非常实用的文件系统兼容处理,能避免奇怪标题导致落盘失败。
# D. Dream 七道门(should_consolidate)
这段 gating 思维很值得学:不是 “想合并就合并”,而是满足条件才执行,避免在高负载 / 低价值时做无用治理。
# 进阶练习
- 给 memory 条目增加
updated_at,做最近使用淘汰。 - 给 Dream 增加 “同义合并” 策略。
- 测试异常 frontmatter 时的健壮性(空字段、乱码、缺失 type)。
# 统一术语口径(本章)
Memory Entry:可跨会话复用的持久知识条目。Memory Index:记忆条目的摘要索引视图。Consolidation:记忆去重、合并、裁剪的治理过程。
# 章节衔接(从易到难)
- 本章解决 “跨会话方向感”。
- 下一章
s10进入 “模型输入面如何管道化组装”。