番外一 · 记忆系统
一个真 正有用的智能体不仅要能完成当前任务,还要能"记住"用户是谁、之前犯过什么错、项目有什么约定。Claude Code 的记忆系统用 文件系统即数据库 的理念,在
~/.claude/下构建了一套分层持久化记忆架构——不需要 Redis,不需要 PostgreSQL,只需要 Markdown 文件和 YAML 前言。
A1.1 四类记忆的设计哲学
只记"不可推导"的知识
记忆系统的第一条设计原则藏在 src/memdir/memoryTypes.ts 的注释里:
src/memdir/memoryTypes.ts
/**
* Memories are constrained to four types capturing context NOT derivable
* from the current project state. Code patterns, architecture, git history,
* and file structure are derivable (via grep/git/CLAUDE.md) and should NOT
* be saved as memories.
*/
export const MEMORY_TYPES = ['user', 'feedback', 'project', 'reference'] as const
这条原则排除了大量"看起来应该记住"的内容——代码风格、架构决策、文件结构——因为这些可以通过读代码、git log、CLAUDE.md 获得。记忆系统只存储从当前项目状态无法推导出的信息。
四种类型
| 类型 | 范围 | 记什么 | 不记什么 |
|---|---|---|---|
| user | 始终私有 | 用户角色、偏好、知识背景 | 代码偏好(那是 feedback) |
| feedback | 默认私有,项目级约定可共享 | 用户纠正("不要这样做")和确认("对,就这样") | 一次性指令 |
| project | 倾向共享 | 正在进行的工作、截止日期、动机 | 可从 git/代码推导的信息 |
| reference | 私有或共享 | 外部系统的位 置指针 | 系统本身的内容 |
最精妙的设计是 feedback 类型——它不仅记录"不要做 X"(纠正),还要求记录"对,就这样做"(确认)。系统提示词中有明确说明:
Record from failure AND success: if you only save corrections, you will
avoid past mistakes but drift away from approaches the user has already
validated, and may grow overly cautious.
这解决了一个真实的 LLM 行为问题:只记录负面反馈会让模型变得过于保守。
feedback 的结构化格式
每条 feedback 记忆要求三个部分:
---
name: 测试不要用 mock
description: 集成测试必须连真实数据库
type: feedback
---
集成测试必须连真实数据库,不用 mock。
**Why:** 上个季度 mock 测试全过但 prod migration 失败了。
**How to apply:** 写测试时如果涉及数据库操作,始终连接测试库。
Why 让模型在边缘情况下能做判断(而不是盲目遵守规则),How to apply 让模型知道在什么场景下应用这条记忆。