跳转到内容

Memory:让 agent 记住你

📍 Agent 通用知识

一个机器人有透明的头部,里面分层抽屉展示三种记忆容器(短期-工作-长期)

你跟 Claude 聊了3 个小时,告诉它:

  • 你的项目叫啥
  • 你用什么技术栈
  • 你的代码风格偏好
  • 你团队的命名约定
  • 你常踩的坑

第二天新开一个窗口问它:「上次咱们说的那个项目,继续写第 5 个功能」

如果你是直接调 API,或者用的是关掉了记忆的应用、无痕对话、第三方客户端,它多半会回:「抱歉,我没有上下文,能告诉我项目是什么吗?」

怎么回事?

LLM 本身没有记忆。每个 API 调用都是一次性的 —— 你发什么进去,它就基于什么回答,调用完信息全丢。

现在的 Claude、ChatGPT 等应用都自带记忆功能。拿 Claude 应用来说:跨对话记忆 2026-03-02 起免费用户也能用,Free、Pro、Max、Ultra 默认开启(Team、Enterprise 由管理员开启),在设置的 Memory(记忆)里可以查看和关闭;新开的普通对话会自动带上它整理出的项目进展和你的偏好——记住的是要点,“第 5 个功能”这种细节不一定都在(见官方说明)。Claude Code 也有默认开启的 auto memory(自动记忆),后面会拆解。

这些功能背后,就是本篇要讲的 Memory 系统:

  • 跨会话记住用户的信息
  • 跨会话记住项目的上下文
  • 避免重复解释

Memory = 给 agent 加一个「跨会话信息箱」。

让它「听过的事」能在下次还记得,不用每次从头解释。


三张并排卡片(短期),中工作桌带文件(工作记忆),右档案柜(长期)

类型范围实现比喻
短期记忆(Short-term)单次会话内上下文窗口跟人当面聊,记得当前对话
工作记忆(Working)单次任务内scratchpad / 中间结果解数学题时草稿纸上的算式
长期记忆(Long-term)跨会话跨天持久化存储(文件 / 数据库)笔记本里记下的关键事

LLM 每次调用都把整个会话历史塞进 prompt。比如 Claude 5 的 1M token 上下文,够装一本小说。

优点:LLM 直接看,不用额外检索。 缺点:会话结束就没了。窗口越大 = 越费 token。

详细看 上下文窗口怎么算:会忘事吗 那一篇。

agent 跑 ReAct 循环 时,每一步的「思考 → 行动 → 观察」结果临时存着。完成任务后通常丢掉。

例子:Claude Code 写一个 feature,中间它读了 10 个文件 —— 这些读到的内容是工作记忆,但它们会一直占着本次会话的上下文,直到你 /clear、它自动压缩或会话结束,并不会因为这个任务做完就自己清掉。所以换任务前记得 /clear(详见上下文窗口那篇)。

长期记忆 = 跨会话保留的关键事

Section titled “长期记忆 = 跨会话保留的关键事”

今天要讲的重点。这是真正让 agent「记住你」的部分。

例如:

  • 「用户偏好深色主题 + 简洁回复」
  • 「项目 niuxue.org 用 Astro Starlight」
  • 「洁柔是产品经理,不写代码,用产品语言沟通」

这些信息写一次,以后所有会话都能用。


三个并排图标(文件式),中点云成球(向量数据库),右节点连线(图数据库)

最简单。把记忆写到 Markdown / JSON 文件里。每次会话开始,全文加载进上下文。

代表:Claude Code 的 CLAUDE.md / MEMORY.md(咱家小牛 niu 就用这套)。

优点:

  • 简单透明,人能直接读和改
  • 不需要数据库,git 可以管理
  • 适合规模小(几十到几百条)

缺点:

  • 全量加载费 token —— 记忆变多后撑爆上下文
  • 没有相似度检索

适合:个人助手 / 项目级记忆(几十到几百条)。

把每条记忆变成向量(用 embedding 模型),存到向量数据库。要用时,按当前 query 检索最相关的几条。

代表:Chroma / Pinecone / Weaviate / Qdrant。

优点:

  • 容量大(百万条无压力)
  • 按需检索,只加载相关的几条(省 token)

缺点:

  • 需要 embedding 模型(额外 API 调用)
  • 检索可能不准(向量相似 ≠ 语义匹配)
  • 设置复杂

适合:用户量大的产品 / 大量历史对话。

把记忆建模成「实体 + 关系」。比如:

  • 实体:洁柔 / niuxue.org / Mold / V Bridge
  • 关系:洁柔 拥有 niuxue.org;niuxue.org 在 Astro 上;Mold 是 V Bridge 旗下产品

代表:Graphiti(Zep 开源的时序知识图谱,能记住事情发生的先后)、Cognee(知识图谱加向量);底层常用 Neo4j 这类图数据库。Mem0 的开源版已不再对接图数据库,放到下面的「检索式混合」里讲。

优点:

  • 理解实体关系(比向量更精确)
  • 适合多用户 / 多实体场景(每个用户一个子图)

缺点:

  • 复杂度高
  • 需要 LLM 帮忙抽实体和关系

适合:长期个性化产品(几年时间累计的用户记忆)。


到 2026 年,纯向量已经不够用,但“主流框架都走向量 + 图”也不准了。现在大致是两条路线并存(2026-09-26 核对):

路线 1:检索式混合——向量 + 关键词 + 实体或图,适合用户量大的产品:

  • Mem0:开源版 2.0.0(2026-04-16)改成“语义向量 + BM25 关键词 + 实体匹配”一起检索(BM25 是一种按关键词打分的经典检索算法),对接外部图数据库的功能从开源版移除,图记忆只留在它的托管平台上(迁移说明)
  • Zep:社区版 2025-04 起停止维护,现在是托管的 Zep Cloud,加上开源的时序知识图谱 Graphiti
  • Cognee:仍是知识图谱 + 向量

路线 2:文件式——模型自己读写记忆文件,适合个人和项目级 agent:

  • Claude API 的 memory tool(记忆工具):Claude 发出读写文件的请求,由你的程序在自己这边执行,2026-02-17 起不再需要 beta 请求头(官方文档,面向开发者)
  • Claude Code 的 auto memory:默认开启,下面「案例拆解」讲的就是它
  • 文件式并不弱:Letta 在 2025-08-12 的测试里,只把对话历史存成文件、让 GPT-4o mini 自己用文件工具去查,就在 LoCoMo(一个测长对话记忆的公开评测)上拿到 74.0%,高于 Mem0 当时公布的图版本成绩 68.5%(测试原文)

两条路线不是谁取代谁:用户多、记忆量大,检索式更省 token;个人助手、项目记忆,文件式更简单透明。


案例拆解:Claude Code 的 MEMORY 系统(咱家小牛 niu)

Section titled “案例拆解:Claude Code 的 MEMORY 系统(咱家小牛 niu)”

一个文件夹打开里面有多个 .md 文档贴着小图标,机器人拿放大镜在翻

最直观的例子 —— 咱家小牛 niu 自己的 memory。完全文件式,目录结构长这样:

~/.claude/projects/<your-project-path>/memory/
├── MEMORY.md ← 索引(必须存在)
├── user_profile.md ← 用户基本信息
├── feedback_*.md ← 反馈类记忆(怎么干活)
├── project_*.md ← 项目类记忆(在做啥)
└── reference_*.md ← 引用类记忆(哪里找东西)

像一个目录:

# Memory Index
- [User Profile](user_profile.md) — 洁柔的基本信息和偏好
- [Feedback: Tavily 搜索](feedback_tavily_search.md) — 联网搜索走 Tavily
- [Project: 牛学站](project_niuxue.md) — niuxue.org 教程站现状
...

每行 ≤ 150 字符,只放标题和一句钩子。

每条记忆有 frontmatter + 内容:

---
name: feedback-write-style-warmth
description: 案例篇配方 = 故事钩子 + 真实细节 + 自我视角 + 灵魂问收尾
metadata:
type: feedback
---
写案例篇时,不要平铺直叙堆功能,要按这个配方:
1. **故事钩子**:开头用一个具体场景吸引人
2. **真实细节**:具体数字 / 时间 / 地点,不要泛泛而谈
3. **自我视角**:站在「咱家」角度讲,不假装中立第三方
4. **灵魂问收尾**:结尾留一个开放性的问题
**Why**:洁柔反复提到「这种结构读者爱看」
**How to apply**:写所有 case-* 系列文章都走这个配方
Type内容何时写
user用户身份、角色、偏好学到关于洁柔本人的信息
feedback怎么干活 / 不能怎么干被纠正 或 一个判断被肯定
project在做啥、为啥、deadline项目状态变化
reference哪里找东西学到外部资源位置

新会话开始,索引 MEMORY.md 自动加载进上下文——这就是为啥 niu 一打开就「记得你是洁柔」。单条记忆文件不会全量塞进去,模型看索引按需翻阅,这也是索引每行要短的原因。官方规定每次只加载 MEMORY.md 的前 200 行或前 25KB(先到哪个算哪个),超出的部分不会加载。

这套不是咱家自己搭的:auto memory 是 Claude Code 自带、默认开启的功能,装好 Claude Code 你就有同样的一套——~/.claude/projects/<项目>/memory/ 下一份 MEMORY.md 索引加若干主题文件(见官方说明)。

  1. 在一个练习文件夹里启动 Claude Code,对它说:「记住:以后回答我,先给结论再解释。」界面上出现类似 “Saved 1 memory” 的提示,就说明它存了。
  2. 输入 /exit 退出,在同一个文件夹里再启动一个新会话,随便问个问题,看它是不是先给结论。
  3. 输入 /memory,选择打开 auto memory 文件夹,看它写了哪个文件、写了什么;不想要的,直接删掉那一行或那个文件。在 /memory 里也能关掉 auto memory。

接 DeepSeek 时这个功能也在,但记不记、记什么由模型判断,本站没有实测。


框架类型特点谁在用
Claude Code MEMORY文件式简单,git 可管,人可读Claude Code 全系
CLAUDE.md文件式组织 / 用户 / 项目 / 本地四级,子目录的按需加载,也认别的 AI 编程工具通用的 AGENTS.md(细节见 CLAUDE.md 那篇)Claude Code 项目
Claude memory tool文件式模型自己读写记忆目录,文件操作在你的程序里执行用 Claude API 做 agent 的开发者
Claude 应用记忆服务端托管Free / Pro / Max / Ultra 默认开启,设置里可查看、关闭Claude 应用用户
ChatGPT Memory服务端托管(提示注入)OpenAI 自家,自动总结ChatGPT
Mem0(mem0.ai)开源版:向量 + 关键词 + 实体;图记忆只在托管平台2.0 版(2026-04)换了记忆算法,更新活跃大量 AI 产品
Letta(原 MemGPT)OS 风格分层agent 自己管 working / long生产级 agent 平台(Letta Code、Letta Cloud)
LangMem向量优先LangChain 配套,最后一次发版在 2025-10LangChain 用户
Zep向量 + 图企业级托管(Zep Cloud),社区版已停更,开源的是 GraphitiB2B AI 产品
MemOS(记忆张量)记忆操作系统国产开源(Apache-2.0 许可证,2025-07 开源)国内开发者
SuperMemory向量个人助手定位消费级

新项目推荐:

  • 个人 / 项目级 → CLAUDE.md / MEMORY.md(轻)
  • 产品级有用户量 → mem0(全)
  • B2B 合规重要 → Zep

两个场景连接,左侧机器人往日记本写字,右侧机器人按问号查找特定页面

何时写入?

策略触发条件
显式(用户说「记一下」)安全,但用户得主动
自动综合(LLM 觉得重要)智能,但可能记错
规则触发(用户做了某件事)例如「访问 5 次后记 ta 是常客」

咱家 niu 是自动综合 —— 系统提示词里有规则,LLM 判断这个信息值不值得记。

怎么选哪些记忆塞进上下文?

策略适用
全量加载记忆少(几十条),文件式
向量相似度大量记忆,按 query 检索 top-k
时序最新「最近 N 条」
实体匹配图数据库,按当前讨论的实体拉

人脑会忘事,agent 也得:

  • TTL(time-to-live):过 N 天自动清
  • 容量限制:超过 N 条删最旧的
  • 用户主动删:「忘掉我之前说的 X」
  • 冲突合并:新信息覆盖旧信息

很多产品漏掉遗忘策略,结果用户 3 个月后发现「它还记得我已经离职的那个公司」—— 尴尬。


⚠️ 隐私警告:secrets 永远不能进 memory

Section titled “⚠️ 隐私警告:secrets 永远不能进 memory”

一个机器人在 memory 仓库前举盾牌,挡住代表密码/密钥的图标

绝对不要写进 memory 的东西:

  • 密码 / API Token / SSH 密钥
  • 信用卡号 / 身份证号 / 手机号(除非业务必要)
  • 用户聊天里出现的 PII(姓名 / 邮箱 / 地址)
  • 公司机密(代码片段 / 合同条款 / 客户名单)

为什么:

  • Memory 文件可能被同步到云端、备份、git push
  • 多个 agent 共享 memory 时会扩散
  • 用户离开后,memory 是「遗留风险」

实操:

  1. 写入前过滤:用正则 + 关键词 blacklist
  2. 存储加密:敏感字段单独加密
  3. 审计日志:记录 memory 何时被读 / 写
  4. 用户可见 + 可删:让用户能查看自己被记了啥 + 一键清

💡 咱家 niu 的 memory 规则里明确:「不记录密码/Token/API Key 明文到记忆文件」。配套的还有一条硬规矩——秘密值永远不出现在任何可见输出里(命令、日志、回复都算)。


Memory = agent 跨会话的脑子。

  • 没 memory:金鱼脑,每次重启从零(直接调 API 就是这样;很多应用已经自带记忆)
  • 文件式:简单透明,适合个人 / 项目
  • 检索式(向量 + 关键词 + 实体或图):规模化生产,适合用户量大的产品
  • 永远记得:secrets 不进 memory,忘记机制要设计

部署 agent 三件套之外的「第四件」就是 memory:

  1. 决策框架(ReAct)
  2. 协议(MCP)
  3. 工具集(6 类 API)
  4. Memory(就是这一篇)

配齐之后,你的 agent 才是「有人格、有记忆、能干活」的完整体。