首页
看点啥
插画图片
首页 看点啥 拆解 Claude Code Memory:AI Agent 如何真正“记住”项目

拆解 Claude Code Memory:AI Agent 如何真正“记住”项目

2026-07-12 0

为什么 Agent 需要记忆?

人类之所以能在多次对话中保持连贯,靠的是记忆。同样,一个真正可用的 Agent 也不能每次开口都从零开始——它必须记得用户是谁、项目在做什么、过程中又做过哪些关键决策。Agent Memory(智能体记忆),就是为了回答这些问题而生。

关于 Memory,我们到底要解决什么?

要设计一套 Memory 系统,第一步不是动手写代码,而是想清楚:让 Agent 拥有记忆,难点究竟在哪里?

下面这些思考,是我以 Claude Code 为主要参考,结合官方文档和源码梳理出来的几个核心挑战。需要说明的是,不同 Agent 在记忆机制上的实现差异巨大,例如 OpenClaw 与 Claude Code 走的就是两条完全不同的路线。

边界挑战:哪些数据值得被记住?

Claude Code 提供了两套记忆机制:

Auto Memory 并不会在每次会话中都触发保存,而是依据"这条信息在未来对话中是否仍然有用"来决定记什么、不记什么。其核心理念只有一句话:只保存不可推导(Non-Derivable)的信息。

代码模式、架构关系、文件路径、Git 历史这类可以通过 grep 或 git log 实时获取的信息,一律不进入记忆。在这个原则下,Claude Code 把所有值得保留的内容严格收敛为以下四类。

User(用户画像)

记录用户的角色、目标、职责和知识水平,逐步建立起对用户的理解,让 Agent 能针对不同专业背景的用户调整协作方式——和资深工程师对话,与刚入门的新人对话,本就不该是一种语气。

Feedback(反馈指导)

记录用户对 Agent 行为的指导,纠正与确认都要记。如果只保存纠正,Agent 会逐渐变得过于谨慎,反而偏离了那些已经被验证可行的做法。这类记忆,是 Agent 在未来对话中保持行为一致性的基础。

Project(项目状态)

记录项目的非代码状态——决策、截止日期、正在推进的工作。它帮助 Agent 理解用户当前工作背后的更大背景与动机,而不仅仅是"在改某个文件"。

Reference(外部引用)

存储指向外部系统中关键信息的指针。这些信息不在代码仓库里,但对理解项目上下文不可或缺,例如 Sentry 监控、日志系统、内部文档站。

为什么必须收敛到这四类?

如果 Claude Code 不做收敛,允许任意自定义类型,看似更灵活,实际上会带来几个致命缺陷。

存储挑战:记忆数据放在哪里?

Claude Code Auto Memory 所记住的,本质上是项目工程事实:构建命令、架构决策、API 约定、编码规范、用户偏好等。这类内容有几个非常关键的特征:

例如:

项目使用 pnpm
禁止使用 var,要用 const
日志去 dumate.n.baidu-int.com 查看
支付模块不能依赖 React Context

这些信息会更新,但不会像聊天记录一样无止境地累加。

因此,Claude Code 设计了一套基于本地文件系统的存储机制:每个项目在 ~/.claude/projects//memory/ 下拥有独立的记忆目录, 是项目路径的一种抽象表示,例如:

-Users-chenxuejin-Documents-myprojects-baidu-ai-copilot-engine-cloud-front
-Users-chenxuejin-Documents-myprojects-react-rsbuild-project
-Users-chenxuejin-Documents-project-baidu-ai-copilot-engine-cloud-front
-Users-chenxuejin-Documents-project-baidu-qianfan-antd-kit

目录里有一个主入口 MEMORY.md 和若干按主题拆分的文件:

~/.claude/projects//memory/
├── MEMORY.md          # 主索引
├── debugging.md       # 调试规律记录
├── api-conventions.md # API 设计决策
└── ...                # Claude 按需自行创建

MEMORY.md 充当记忆目录的索引,Claude Code 会在会话中按需读写其中的文件。

# Memory Index- [用户背景](user_profile.md) — 十年 Go 经验,首次接触本仓库 React 部分,用 Go 类比解释前端概念
- [禁止使用 var](feedback_no_var.md) — 所有变量声明使用 const/let,禁止 var(全局变量/作用域污染问题)
- [日志系统](reference_log_viewer.md) — 对话页面报错时带 log id 去 dumate.n.baidu-int.com/log-viewer 查看日志

而 OpenClaw 这类面向个人生活的 Agent,处境完全不同。它面对的不是项目,而是用户的整条长期生活流,例如:

这些记忆有几个本质特征:

因此,OpenClaw 选择把记忆存进专门的数据库(SQLite),并配合向量搜索与关键词搜索完成信息检索。

检索挑战:怎么找到需要的记忆?

Claude Code 的记忆检索分为两个环节:启动时全量注入和运行时按需加载。

启动时全量注入

每次 Claude Code 会话开始时,CLAUDE.md 与 Auto Memory 会同时启动加载,分两条线并行进行。

运行时按需加载

预注入解决了"常用知识总是在场"的问题,但并不是所有记忆都值得每次会话都占用上下文 token。Claude Code 为此设计了两个按需加载的触发点。

OpenClaw 采用的是混合检索模式:向量搜索擅长语义理解,关键词搜索擅长精准匹配。最终向量搜索的内容权重为 70%,关键词搜索为 30%。

时效性挑战:怎么让记忆不腐烂?

Claude Code 的自动记忆是一项突破——Agent 第一次能够自动沉淀项目信息。但在大约 20 多次使用之后,这些记录的质量会明显下滑,这是一个共性问题。

本应帮助 Claude 思考的笔记本,反而变成了干扰它判断的噪音。为了解决这个问题,Claude Code 提出了 Auto Dream 方案,目前作为一个尚未正式公布的功能被推送到 Claude Code 中。

什么是 Auto Dream?

Auto Dream 这个名字,灵感来自人脑的 REM(快速眼动睡眠)机制。白天,大脑吸收原始信息,将其暂存为短期记忆;在 REM 睡眠中,大脑再对这些记忆进行二次加工——强化重要内容、丢弃无关内容、把一切系统地归档进长期记忆。

类比之下,Auto Memory 就是白天工作的大脑,在工作中持续记笔记;而 Auto Dream 则是 REM 睡眠周期,在休息时间复盘所有积累的内容,去除过时信息,重新整理成干净、有条理的文件。

Auto Dream 的工作机制

Auto Dream 遵循一个结构化的四阶段流程,每个阶段都有明确目的。它们共同把零散的会话记录,转化为系统化的项目知识。

OpenClaw 采用的是时间衰减机制,通过指数衰减模型实现"近期记忆优先"。

记忆管理的常见误区

误区一:记忆越多越好

这是最常见的误区。一些用户会让 Agent 记下所有对话细节,导致 MEMORY.md 索引膨胀,记忆目录中堆满低价值文件。过多的记忆不仅会加重每次对话的上下文负担,还会让 Agent 被噪音干扰,反而忽略真正重要的内容。

误区二:开了 Auto Dream 就高枕无忧

像把 Webpack 全面迁到 Vite、把 Redux 换成 Zustand 这种重大重构场景,用户往往以为 Auto Dream 会自动处理一切,结果旧的记忆条目仍然滞留,给 Agent 带来更多混乱——因为 Auto Dream 的触发条件是双重的(24 小时 + 5 个会话),整合根本没跑起来。

所以,凡是涉及架构级别的迁移,都应该立即手动触发:在会话里直接说 "consolidate my memory files",不要等系统自动触发。

误区三:忽视相对日期问题

用户说"昨天决定放弃 CSS Modules 改用 Tailwind"、"这周二我们把路由从 React Router 换成了 TanStack Router"——这些表述在写下当天看起来很清晰,但未来 Claude 再读时已完全失去参考价值。

因此,所有涉及时间的记忆都必须使用绝对日期,例如:"2026 年 3 月 2 日决定放弃 CSS Modules,改用 Tailwind。"

参考资料

喜欢(0)

上一篇

读不懂10万行代码?用GitNexus一键生成知识图谱:AI编程再也不瞎改

读不懂10万行代码?用GitNexus一键生成知识图谱:AI编程再也不瞎改

下一篇

Claude Code 桌面版 和 CLI 自动模式及跳过所有授权!

Claude Code 桌面版 和 CLI 自动模式及跳过所有授权!
猜你喜欢