Cloud Code 的 Memory 功能很有意思,它历史上其实有过三种形态。而这三种形态代表了在不同阶段,Anthropic 这家公司对记忆的最佳实践。
三个阶段的 Memory 实现
原始的 Memory 在 24 年左右就引入了,那个时候特别简单,就是打一个#号,就可以写一段话,它会自动的插入到你的 memory.md 文件中。
之后不知道发生了什么,他们去掉了这个机制,改成了直接要求用户去编辑 claude.md 文件。
直到到了 2.1.32 那个版本之后,Claude Code 的记忆终于又重新加了回来,而且又改成了自动记忆模式。
| 版本 | 阶段 | 实现方式 |
|---|---|---|
| v0.2.54 ~ v2.0.69 | 手动触发 | 用户以 #开头输入内容,手动保存到记忆文件;/memory 命令编辑记忆 |
| v2.0.70 ~ v2.1.31 | CLAUDE.md 整合 | 移除 # 快捷方式,记忆与 CLAUDE.md 项目配置文件合流,由用户编辑管理 |
| v2.1.32+ | 自动记忆 | Claude 在对话中自主判断触发,自动将有价值的信息写入~/.claude/projects/<path>/memory/ 目录下的独立 Markdown 文件,通过 MEMORY.md索引在每次对话时自动加载 |
最新的自动记忆,在使用的过程中,发现它似乎借鉴了 Skils 的渐进式加载的思路,除了能自动触发之外,对记忆的存储也发生了较大的变化。
1.整体架构
Memory 是一个 基于文件的持久化记忆系统。它不是数据库,不是向量存储,就是纯粹的 Markdown 文件 + 索引文件,存放在固定目录下:
~/.claude/projects/<project-path-encoded>/memory/2.触发机制
Memory 的触发完全是 prompt-driven(提示词驱动),不是代码逻辑。具体来说:
写入触发条件:
- 显式触发:你说"记住这个"、"以后记得"→ 我立即保存
- 隐式触发(我主动判断):
- 你纠正我的做法 → 保存为 feedback 类型
- 你确认了一个非显然的做法 → 也保存为 feedback
- 我了解到你的角色/偏好 → 保存为 user 类型
- 获知项目的截止日期/决策/方向 → 保存为 project 类型
- 获知外部系统的位置 → 保存为 reference 类型
读取触发条件:
- 每次对话开始时,MEMORY.md 的内容会被自动注入到Claude Code的上下文中
- 当Claude Code判断某个记忆文件跟当前任务相关时,会主动 Read 那个文件
- 当用户说"你还记得吗"、"之前说过"→ Claude Code必须触发检查 memory
3.存储结构
存储结构,这里是最有意思的地方。
3.1 索引文件:MEMORY.md
这是唯一一个每次对话都会自动加载的文件。它是一个索引,不存储实际内容,大致的结构类似:
# Linkly AI 项目记忆
## 工作习惯
- [依赖安装由用户执行](feedback_install_deps.md) — 涉及网络的安装命令由用户执行
- [三端同时发行](feedback_cross_platform.md) — macOS/Windows/Linux 三端发行
...会发现其实就是一个索引文档。它的限制是:超过 200 行会被截断,每条索引一行,控制在 ~150 字符内。
3.2 记忆文件:独立 .md 文件
每个具体的记忆,用一个独立文件存放,使用 frontmatter 格式,比如:
---
name: 三端同时发行
description: Linkly AI Desktop 已在三端同时发行,设计必须兼容全平台
type: feedback
---
三端同时发行(macOS + Windows + Linux),所有设计必须考虑跨平台兼容性。
**Why:** 产品已有真实用户在三个平台使用...
**How to apply:** 涉及文件路径的任何设计都必须考虑...
...Frontmatter 有三个字段:
- name:记忆名称
- description:一行描述(用于未来判断是否相关)
- type:分类(user/feedback/project/reference)
发现没有,和 Skills.md 何其相似。Claude Code 内置了四种类型的记忆:
- user: 关于你这个人:角色、偏好、知识背景
- feedback: 你对我工作方式的指导(纠正+确认)
- project: 项目的动态信息(决策、截止日期、方向)
- reference:外部系统的指针
并且 feedback 和 project 类型要求使用特定的正文结构:
规则/事实本身
**Why:** 原因(为什么这么做)
**How to apply:** 如何应用(什么时候触发这条规则)4. 记忆是如何被写入的?
Claude Code 的记忆写入分两步:
Step 1 — 用 Write 工具创建独立的记忆文件:
~.claude/projects/-opt-src-ai-linkly-ai/memory/feedback_xxx.mdStep 2 — 用 Edit 工具在 MEMORY.md 中添加一行索引指针:
```
标题 — 一行简述
## 5. 与其他持久化机制的关系
Claude Code 中除了 memory 以外,还有其他的一些可以持久化存储的机制,比如依然存在的 Claude.md,这类机制一共有四类,它们的生命周期和用途如下:
| 机制 | 生命周期 | 用途 |
|---|---|---|
| Memory | 跨对话持久 | 长期的用户偏好、项目背景 |
| Task | 当前对话 | 当前会话的待办和进度追踪 |
| Plan | 当前对话 | 实现方案的对齐和讨论 |
| CLAUDE.md | 永久(跟随代码库) | 项目级的规则和约定 |
总结
可以看到最新版的自动记忆,本质上其实就是:
一个被自动放入 System Prompt 中的索引指令集,加上磁盘上的一大堆 Markdown 文件。
没有采用特别复杂的像数据库、向量等等技术去存储和检索,完全依靠一种简单的、渐进式加载的两层结构,实现了索引的自动注入和按需读取。而判断完全由模型自己判断。当模型看到 memory.md 中的某一行描述和当前任务相关的时候,就会触发 read 工具去读取独立的记忆文件。
