解码 Claude Code(三)— 记忆与上下文:让 AI 不再健忘

当 AI 遇上金鱼脑

你有没有经历过:跟 Claude Code 讨论复杂功能,聊了半小时,上下文越来越长,突然它开始忘记之前的约定,重复已做过的修改,甚至"反悔"之前的共识。

这不是 bug,这是大语言模型的天性。

记忆与碎片

TypeScript 社区知名开发者 Matt Pocock 做过精妙的比喻:LLM 就像电影《记忆碎片》的主角——每隔几分钟失去短期记忆,只能靠纹身和照片维持对世界的理解。每次上下文窗口被清除,AI 就回到初始状态。

理解了这一点,你就明白了 Claude Code 上下文管理的设计哲学:不是消灭遗忘,而是对抗遗忘

Smart Zone 与 Dumb Zone:上下文窗口的隐形红线

当上下文 token 数量低于 10 万时,模型处于 "Smart Zone"——反应敏捷、逻辑清晰。一旦越过这条线,模型跌入 "Dumb Zone":遗漏指令、重复自身、矛盾判断。

这不是渐进式的衰退,而是断崖式的。就像一个人从清醒到醉酒,中间没有"微醺"的过渡。

标准会话经历四个阶段:系统提示 → 探索 → 实现 → 测试。每个阶段都在往上下文塞信息,不管理就会从 Smart Zone 滑向 Dumb Zone。

记忆与上下文管理系统,正是维持 AI 代理长期有效性的基础设施。

CLAUDE.md:项目的灵魂文件

代码与文档

如果说提示词是给 AI 的指令,那么 CLAUDE.md 就是给 AI 的"世界观"。它定义了项目的编码规范、架构偏好、技术决策背景——所有那些让一个新成员快速融入团队的"潜规则"。

CLAUDE.md 的加载分两条路径:

  • 祖先加载(Ancestor Loading):Claude Code 启动时,从项目根目录开始向上遍历目录树,依次加载每一层的 CLAUDE.md。这意味着项目根目录的全局规则会在第一时间注入上下文。
  • 后代加载(Descendant Loading):当你在操作某个子目录时,Claude Code 会向下遍历并懒加载该子目录的 CLAUDE.md。这保证了子模块的特定规则只在需要时才被激活。

三层配置形成了一个优雅的层级:全局(~/.claude/CLAUDE.md)→ 项目根 → 子目录。全局配置管通用偏好(比如"用中文注释"),项目配置管架构约定(比如"使用 Repository 模式"),子目录配置管局部细节(比如"这个模块用 Rust 编写")。

更贴心的是 CLAUDE.local.md。个人偏好写在这里——喜欢的调试方式、本地环境配置——加入 .gitignore 即可避免团队冲突。兄弟目录的 CLAUDE.md 互不加载,避免无关上下文污染。

Rewind:与其修补,不如重来

很多开发者的习惯:AI 犯错了,立刻在当前上下文中纠正它。

回退与重置

这是一个陷阱。

每一次修补都在上下文留下错误痕迹。之前的错误推理链依然占据空间,随着修补次数增加,上下文越来越脏——恶性循环。

Claude Code 提供了更好的方案:/rewind 命令。它允许你回退到之前的任意一个正确状态,就像 Git 的 revert 一样,彻底抹去错误操作的影响。按两次 Esc 键可以撤销上一步操作,简单粗暴但极其有效。

回退到正确状态,永远比从错误状态修补更高效。这不是偷懒,这是工程智慧。

Compact 还是 Fresh?上下文的两个出口

面对一个膨胀的上下文窗口,Claude Code 提供了两条出路:

  • Compact(紧凑化):将当前上下文压缩为摘要,保留关键信息,丢弃冗余细节。适合正在进行中的任务,你不想丢失整体进展,但需要腾出空间。
  • Fresh Session(全新会话):彻底重开一个干净的上下文。适合切换到新的子任务,或者当前会话已经被严重污染。

一个常见的误区是认为"长上下文 = 更好的理解"。事实恰恰相反。在上下文窗口中,信息的密度比总量更重要。一个被紧凑化后的摘要,往往比包含所有对话历史的原始上下文更能引导模型做出正确判断。

不要咬下比你能咀嚼的更大的东西。—— Matt Pocock

这条建议对人类和 AI 都适用。把复杂任务拆分成可以在单个会话中完成的子任务,每个子任务结束后 compact 或开新会话,远比试图在一次超长会话中搞定一切要高效得多。

子代理的真正价值:隔离,而非并行

很多人理解子代理(Subagent)时,第一反应是"并行执行、提升速度"。但 Claude Code 团队的设计意图远比这深刻:子代理的核心价值是隔离

系统架构与隔离

想象一下:你需要在一个大型代码库中搜索所有使用了废弃 API 的地方。如果把搜索结果全部堆在主会话的上下文里,会急剧消耗 token 预算,把主会话推向 Dumb Zone。但如果用一个专门的 Explore 子代理来做这件事——它使用更轻量的模型,只配备只读工具,完成后只把精炼的结果返回给主会话——主会话的上下文始终保持干净。

更强大的是 isolation: worktree 模式。子代理在一个临时的 Git 工作树中运行,可以自由修改代码而不影响主工作区。任务完成后,如果结果令人满意,就合并回来;如果不满意,直接丢弃——临时工作树会被自动清理。这种"沙箱"式的隔离,让 AI 代理可以大胆尝试而不怕搞砸。

RPI 方法论中的上下文哲学

RPI(Research-Plan-Implement)是使用 AI 编程代理的最佳实践框架。在上下文管理方面,它有一个常被忽视的原则:Research 阶段应该"压缩真相"

什么是"压缩真相"?就是在研究阶段只收集客观信息——代码结构、API 签名、数据流向——而不掺杂任何关于"应该怎么构建"的主观判断。常见错误是在研究阶段就告诉模型"我们要用 Redux 重构状态管理",这会导致模型在后续阶段带着预设观点去工作,产出的是 opinions 而非 facts。

不要外包思考。—— Dexter Horthy

这句话的核心意思是:研究阶段的工作应该由你来主导方向,AI 负责收集信息和执行。把"思考"外包给 AI,往往得到的是听起来合理但脱离实际的方案。只有当你自己对问题有清晰的理解,才能有效地引导 AI 产出真正有价值的代码。

三级记忆:让 AI 具备跨会话经验

最后,让我们把视角从单次会话拉到长期项目的维度。Claude Code 的记忆系统分为三级:

  • User 级别:个人偏好和通用习惯,跨项目生效。比如"我偏好函数式编程风格"。
  • Project 级别:项目特定的知识和约定,同一项目的所有会话共享。比如"认证模块使用 JWT + Refresh Token 方案"。
  • Local 级别:本地环境特有信息,不入版本控制。比如"本地数据库端口是 5433"。

项目级记忆是其中最有价值的。它让 AI 代理具备了跨会话记忆能力——昨天讨论的架构决策、上周发现的技术债、上个月踩过的坑,都可以被持久化存储并在新的会话中被激活。对于长期维护的项目来说,这几乎是必需品。

一个新人加入项目需要数周才能建立起的"项目常识",AI 代理通过项目级记忆几秒内就能加载完毕。

写在最后

理解 Claude Code 的记忆与上下文管理,本质上是在理解一件事:AI 的智能是有限的,但通过好的工程实践,我们可以让有限的智能发挥出最大的效用

CLAUDE.md 是灵魂,/rewind 是兜底,compact 是效率保障,子代理是隔离利器,三级记忆是经验传承。它们共同让 AI 代理从"每次重新开始"进化为"持续积累"。

下一期,我们将深入 Claude Code 的安全模型——当 AI 拥有文件系统读写权限时,如何确保它不失控。敬请期待。

Views: 1