Memory:让 agent 记住你
📍 Agent 通用知识 4/X · 上一篇:← MCP 协议详解

一个让人沮丧的现象
Section titled “一个让人沮丧的现象”你跟 Claude 聊了3 个小时,告诉它:
- 你的项目叫啥
- 你用什么技术栈
- 你的代码风格偏好
- 你团队的命名约定
- 你常踩的坑
第二天新开一个窗口问它:「上次咱们说的那个项目,继续写第 5 个功能」
它回:「抱歉,我没有上下文,能告诉我项目是什么吗?」
怎么回事?
LLM 本身没有记忆。每个 API 调用都是一次性的 —— 你发什么进去,它就基于什么回答,调用完信息全丢。
这就是为啥 agent 需要 Memory 系统:
- 跨会话记住用户的信息
- 跨会话记住项目的上下文
- 避免重复解释
Memory = 给 agent 加一个「跨会话信息箱」。
让它「听过的事」能在下次还记得,不用每次从头解释。
三类记忆:短期 / 工作 / 长期
Section titled “三类记忆:短期 / 工作 / 长期”
| 类型 | 范围 | 实现 | 比喻 |
|---|---|---|---|
| 短期记忆(Short-term) | 单次会话内 | 上下文窗口 | 跟人当面聊,记得当前对话 |
| 工作记忆(Working) | 单次任务内 | scratchpad / 中间结果 | 解数学题时草稿纸上的算式 |
| 长期记忆(Long-term) | 跨会话跨天 | 持久化存储(文件 / 数据库) | 笔记本里记下的关键事 |
短期 = 上下文窗口
Section titled “短期 = 上下文窗口”LLM 每次调用都把整个会话历史塞进 prompt。比如 Claude 4.7 的 1M token 上下文,够装一本小说。
优点:LLM 直接看,不用额外检索。 缺点:会话结束就没了。窗口越大 = 越费 token。
详细看 上下文窗口怎么算:会忘事吗 那一篇。
工作记忆 = 当前任务的草稿
Section titled “工作记忆 = 当前任务的草稿”agent 跑 ReAct 循环 时,每一步的「思考 → 行动 → 观察」结果临时存着。完成任务后通常丢掉。
例子:Claude Code 写一个 feature,中间它读了 10 个文件 —— 这些读到的内容是工作记忆,任务结束就清掉。
长期记忆 = 跨会话保留的关键事
Section titled “长期记忆 = 跨会话保留的关键事”今天要讲的重点。这是真正让 agent「记住你」的部分。
例如:
- 「用户偏好深色主题 + 简洁回复」
- 「项目 niuxue.org 用 Astro Starlight」
- 「洁柔是产品经理,不写代码,用产品语言沟通」
这些信息写一次,以后所有会话都能用。
长期记忆的 3 种主流实现
Section titled “长期记忆的 3 种主流实现”
1. 文件式(File-based)
Section titled “1. 文件式(File-based)”最简单。把记忆写到 Markdown / JSON 文件里。每次会话开始,全文加载进上下文。
代表:Claude Code 的 CLAUDE.md / MEMORY.md(咱家小牛 niu 就用这套)。
优点:
- 简单透明,人能直接读和改
- 不需要数据库,git 可以管理
- 适合规模小(几十到几百条)
缺点:
- 全量加载费 token —— 记忆变多后撑爆上下文
- 没有相似度检索
适合:个人助手 / 项目级记忆(几十到几百条)。
2. 向量数据库(Vector DB)
Section titled “2. 向量数据库(Vector DB)”把每条记忆变成向量(用 embedding 模型),存到向量数据库。要用时,按当前 query 检索最相关的几条。
代表:Chroma / Pinecone / Weaviate / Qdrant / mem0。
优点:
- 容量大(百万条无压力)
- 按需检索,只加载相关的几条(省 token)
缺点:
- 需要 embedding 模型(额外 API 调用)
- 检索可能不准(向量相似 ≠ 语义匹配)
- 设置复杂
适合:用户量大的产品 / 大量历史对话。
3. 图数据库(Graph DB)
Section titled “3. 图数据库(Graph DB)”把记忆建模成「实体 + 关系」。比如:
- 实体:洁柔 / niuxue.org / Mold / V Bridge
- 关系:洁柔 拥有 niuxue.org;niuxue.org 在 Astro 上;Mold 是 V Bridge 旗下产品
代表:Mem0 / Zep / Cognee(2026 年开始普及)。
优点:
- 理解实体关系(比向量更精确)
- 适合多用户 / 多实体场景(每个用户一个子图)
缺点:
- 复杂度高
- 需要 LLM 帮忙抽实体和关系
适合:长期个性化产品(几年时间累计的用户记忆)。
2026 年大趋势:向量 + 图混合
Section titled “2026 年大趋势:向量 + 图混合”到 2026 年,纯向量已经不够用。主流 memory 框架(Mem0 / Zep / Cognee)都走「向量 + 图」混合:
- 简单事实 → 向量(快速检索)
- 实体关系 → 图(精确查询)
- 时序数据 → 图 + 时间戳(知道事件顺序)
业界共识:memory 系统不再是「数据库」,而是「认知架构」。
案例拆解:Claude Code 的 MEMORY 系统(咱家小牛 niu)
Section titled “案例拆解:Claude Code 的 MEMORY 系统(咱家小牛 niu)”
最直观的例子 —— 咱家小牛 niu 自己的 memory。完全文件式,目录结构长这样:
~/.claude/projects/<your-project-path>/memory/├── MEMORY.md ← 索引(必须存在)├── user_profile.md ← 用户基本信息├── feedback_*.md ← 反馈类记忆(怎么干活)├── project_*.md ← 项目类记忆(在做啥)└── reference_*.md ← 引用类记忆(哪里找东西)MEMORY.md(索引)
Section titled “MEMORY.md(索引)”像一个目录:
# Memory Index
- [User Profile](user_profile.md) — 洁柔的基本信息和偏好- [Feedback: Tavily 搜索](feedback_tavily_search.md) — 联网搜索走 Tavily- [Project: 牛学站](project_niuxue.md) — niuxue.org 教程站现状...每行 ≤ 150 字符,只放标题和一句钩子。
单条记忆文件
Section titled “单条记忆文件”每条记忆有 frontmatter + 内容:
---name: feedback-write-style-warmthdescription: 案例篇配方 = 故事钩子 + 真实细节 + 自我视角 + 灵魂问收尾metadata: type: feedback---
写案例篇时,不要平铺直叙堆功能,要按这个配方:
1. **故事钩子**:开头用一个具体场景吸引人2. **真实细节**:具体数字 / 时间 / 地点,不要泛泛而谈3. **自我视角**:站在「咱家」角度讲,不假装中立第三方4. **灵魂问收尾**:结尾留一个开放性的问题
**Why**:洁柔反复提到「这种结构读者爱看」**How to apply**:写所有 case-* 系列文章都走这个配方4 种 type
Section titled “4 种 type”| Type | 内容 | 何时写 |
|---|---|---|
user | 用户身份、角色、偏好 | 学到关于洁柔本人的信息 |
feedback | 怎么干活 / 不能怎么干 | 被纠正 或 一个判断被肯定 |
project | 在做啥、为啥、deadline | 项目状态变化 |
reference | 哪里找东西 | 学到外部资源位置 |
新会话开始,全部 memory 文件作为系统提示词加载。这就是为啥 niu 一打开就「记得你是洁柔」。
主流 Memory 框架对比
Section titled “主流 Memory 框架对比”| 框架 | 类型 | 特点 | 谁在用 |
|---|---|---|---|
| Claude Code MEMORY | 文件式 | 简单,git 可管,人可读 | Claude Code 全系 |
| CLAUDE.md | 文件式 | 项目级 + 全局 + 子目录三层 | Claude Code 项目 |
| ChatGPT Memory | 文件式(系统 prompt 注入) | OpenAI 自家,自动总结 | ChatGPT |
| mem0(mem0.ai) | 向量 + 图 | 当前最热,2026 年活跃更新 | 大量 AI 产品 |
| Letta(原 MemGPT) | OS 风格分层 | agent 自己管 working / long | 学术 / 实验 |
| LangMem | 向量优先 | LangChain 配套 | LangChain 用户 |
| Zep | 向量 + 图 | 企业级,合规友好 | B2B AI 产品 |
| SuperMemory | 向量 | 个人助手定位 | 消费级 |
新项目推荐:
- 个人 / 项目级 → CLAUDE.md / MEMORY.md(轻)
- 产品级有用户量 → mem0(全)
- B2B 合规重要 → Zep
关键策略:写入 / 召回 / 遗忘
Section titled “关键策略:写入 / 召回 / 遗忘”
写入策略(Write)
Section titled “写入策略(Write)”何时写入?
| 策略 | 触发条件 |
|---|---|
| 显式(用户说「记一下」) | 安全,但用户得主动 |
| 自动综合(LLM 觉得重要) | 智能,但可能记错 |
| 规则触发(用户做了某件事) | 例如「访问 5 次后记 ta 是常客」 |
咱家 niu 是自动综合 —— 系统提示词里有规则,LLM 判断这个信息值不值得记。
召回策略(Recall)
Section titled “召回策略(Recall)”怎么选哪些记忆塞进上下文?
| 策略 | 适用 |
|---|---|
| 全量加载 | 记忆少(几十条),文件式 |
| 向量相似度 | 大量记忆,按 query 检索 top-k |
| 时序最新 | 「最近 N 条」 |
| 实体匹配 | 图数据库,按当前讨论的实体拉 |
遗忘策略(Forget)
Section titled “遗忘策略(Forget)”人脑会忘事,agent 也得:
- TTL(time-to-live):过 N 天自动清
- 容量限制:超过 N 条删最旧的
- 用户主动删:「忘掉我之前说的 X」
- 冲突合并:新信息覆盖旧信息
很多产品漏掉遗忘策略,结果用户 3 个月后发现「它还记得我已经离职的那个公司」—— 尴尬。
⚠️ 隐私警告:secrets 永远不能进 memory
Section titled “⚠️ 隐私警告:secrets 永远不能进 memory”
绝对不要写进 memory 的东西:
- 密码 / API Token / SSH 密钥
- 信用卡号 / 身份证号 / 手机号(除非业务必要)
- 用户聊天里出现的 PII(姓名 / 邮箱 / 地址)
- 公司机密(代码片段 / 合同条款 / 客户名单)
为什么:
- Memory 文件可能被同步到云端、备份、git push
- 多个 agent 共享 memory 时会扩散
- 用户离开后,memory 是「遗留风险」
实操:
- 写入前过滤:用正则 + 关键词 blacklist
- 存储加密:敏感字段单独加密
- 审计日志:记录 memory 何时被读 / 写
- 用户可见 + 可删:让用户能查看自己被记了啥 + 一键清
💡 咱家 niu 的 memory 规则里明确:「不记录密码/Token/API Key 明文到记忆文件」。这是 Feedback: secret 永远不进可见输出 那条规则的 memory 衍生。
Memory = agent 跨会话的脑子。
- 没 memory:金鱼脑,每次重启从零
- 文件式:简单透明,适合个人 / 项目
- 向量 + 图:规模化生产,适合用户量大的产品
- 永远记得:secrets 不进 memory,忘记机制要设计
部署 agent 三件套之外的「第四件」就是 memory:
配齐之后,你的 agent 才是「有人格、有记忆、能干活」的完整体。
牛学板块导航
Section titled “牛学板块导航”- 上一篇:← MCP 协议详解
- 本板块:Agent 通用知识
- 1/X AI agent 是怎么思考的:ReAct 模式
- 2/X 给 Agent 配齐 6 类 API 工具
- 3/X MCP 协议详解
- 4/X Memory:让 agent 记住你(就是这一篇)
- 5/X(规划中)多 agent 编排
- 想看 Claude Code 的 CLAUDE.md 怎么用?→ CLAUDE.md:让它一开口就懂你的项目
- 下一板块:Trae 完整教程 →
评论
不记名、不需要注册——不要邮箱,不要手机号,不要任何身份信息,填个昵称就能留言。放心说。