你有没有遇到过这种场景对话进行到第 30 轮Claude 突然把你们二十条消息前说好的所有金额用整数给忘了生成了一段用浮点数处理价格的代码。你气得重新说了一遍它道个歉改了然后在第 35 轮又犯了同一个错误。你骂它记性差。但问题不在它的记性在于它根本没有记性。Claude 没有记忆只有上下文这是很多人用了好几个月才意识到的事情Claude 不记得任何东西。不是记性不好是从设计层面就没有持久化的记忆系统。每次对话结束Claude 对你的项目、你的偏好、你们的约定归零。下次打开新对话它又是一个对你一无所知的陌生人。就连在同一个对话里它能记住的东西也是有限制的——不是靠记忆而是靠上下文窗口。你说的话、它回的话都存在这个窗口里。只要窗口范围内能看到它就记得超出窗口了或者被新内容挤出去了它就忘了。说人话就是Claude 的记忆本质上是视野。它只能看到当前上下文窗口里的内容看得到的它就知道看不到的它真的不知道。三种忘事的真实原因搞清楚为什么忘才能针对性地解决。原因一上下文窗口被撑满早期内容被挤出去Claude Code 的上下文窗口是 200k tokens听起来很大但一次复杂的开发对话很容易用掉大半。当窗口快满的时候会发生一件大多数人不知道的事模型不是平等地遗忘所有内容而是对中间段的内容注意力急剧下降。实验表明LLM 对超长上下文的注意力分布是不均匀的——开头和结尾的内容注意力最高中间的内容容易被忽视。你在对话第 5 轮说的金额用整数随着对话推进这条约定慢慢滑进了上下文的中间地带注意力权重降低Claude 开始视而不见。这不是它故意忘的是它的注意力机制决定的。原因二新 Session 的天然失忆每次开新对话上下文完全清空。这是最彻底的忘事——之前说的一切它真的一条都不知道。很多人以为 CLAUDE.md 配置了就万事大吉。但有一点要清楚CLAUDE.md 解决的是项目规范的记忆问题解决不了决策历史的记忆问题。你在上一个 Session 里决定用 Redis 做 Session 管理而不是 JWT这个决策不在 CLAUDE.md 里新 Session 的 Claude 不知道。它完全可能在新对话里给你生成 JWT 的实现。原因三同一 Session 内的选择性遗忘这是最难察觉的一种。在一个很长的对话里Claude 并不是平等地记住每一条消息。靠近当前位置的内容权重高早期内容权重低。这就是为什么你在第 30 轮重申了某个约定它在第 31 轮会遵守但到了第 45 轮又开始违反。这里有个反常识的细节长对话里你重申某个约定的效果往往比你最初说的效果更好——因为重申发生在上下文的更靠后位置注意力权重更高。所以当你发现 Claude 开始忘事最有效的操作不是骂它而是在当前位置重新声明关键约束。记忆补偿方案四层防御体系既然 Claude 没有真正的记忆就需要我们主动管理信息的传递。我把这套方案叫记忆补偿——用外部机制弥补它内部机制的缺陷。第一层CLAUDE.md——永久性规范记忆这是最基础的一层专门存放不管什么时候都成立的规范。关键原则只写规范不写决策。# 永远成立的规范写进 CLAUDE.md - 金额用整数分为单位 - 时间存储和计算用 UTC - 错误返回格式{ success: false, error: string } - 组件用函数式不用 Class # 不适合写进 CLAUDE.md 的内容决策会变化 - 这个项目决定用 Redis 做 Session - 用户表暂时不加 timezone 字段 - 暂时不做邮件验证功能规范是稳定的决策是动态的。把决策写进 CLAUDE.md几个月后回来看可能已经不适用了还会干扰 Claude 的判断。第二层.claude/decisions/——决策历史归档专门建一个目录存放每个功能模块的决策记录。格式简单关键要可以快速加载进上下文。.claude/ decisions/ auth.md # 认证模块的技术决策 payment.md # 支付模块的技术决策 database.md # 数据库设计决策 architecture.md # 整体架构决策每个文件的格式# 支付模块技术决策 ## 已确认决策 - 使用 Stripe不用 Paddle原因Stripe 对美国市场的覆盖更好 - Webhook 处理必须幂等原因Stripe 会重发 - 订阅取消用 cancel_at_period_end不立即取消原因用户体验 - 退款走 Stripe Dashboard 手动处理不做自动化原因初期流量小不值得开发 ## 待确认问题 - 是否支持年付优惠产品还没决定 ## 更新时间 2025-03-01使用方式每次开新 Session 处理支付相关功能第一步就是Add to Context.claude/decisions/payment.md这样 Claude 就能快速接入之前的所有决策不会给出和已有架构冲突的代码。第三层Session 结束前的摘要接力每个 Session 结束前固定做一件事让 Claude 生成本次对话的决策摘要更新到对应的 decisions 文件。请总结这次对话里所有新确认的技术决策格式和 decisions/payment.md 里的已确认决策一致我需要把它追加进去。这个习惯养成之后decisions 文件会随着项目推进越来越完整相当于一份实时更新的项目记忆库。第四层长对话内的记忆锚点这一层是对抗同一 Session 内选择性遗忘的手段。操作每隔 15-20 轮对话主动发一条关键约束重申提醒一下本次对话的关键约束金额统一用整数分为单位所有异步操作必须有 try-catch错误返回格式{ success: false, error: string } 继续之前的任务。这条消息放在上下文的靠后位置Claude 的注意力权重高会重新把这些约束纳入考量。说人话就是把关键约束定期置顶一遍对抗注意力衰减。烦吗烦。但比事后改错代码不烦。踩坑环节坑一以为 CLAUDE.md 能记住所有事情项目刚开始我把所有能想到的约束都写进了 CLAUDE.md包括暂时不做 OAuth 登录只做邮箱密码登录。两个月后我忘了这条CLAUDE.md 还写着。有一次让 Claude 帮我完善登录系统它看到了这条约束给我生成的代码里把 OAuth 的入口全部注释掉了还专门说根据项目约定暂不支持 OAuth。但那个时候我们已经决定加 OAuth 了只是忘了更新 CLAUDE.md。怎么发现的在 PR 里被同事问为什么 OAuth 相关的代码全是注释怎么解决的把 CLAUDE.md 里的暂时性决策全部清掉移到 decisions 文件里CLAUDE.md 只留永久规范。同时建立了每个月review一次 CLAUDE.md 的习惯。坑二长对话里忘记重申约束积累了大量需要修改的代码有一次做一个比较复杂的功能对话跑了将近 50 轮。中间发现 Claude 开始生成不符合规范的代码但我觉得应该还好先完成主逻辑再说没有及时重申约束。结果功能做完review 代码发现有 8 处金额处理用了浮点数、3 处错误格式不对。一个一个改又花了半小时。怎么解决的现在我的对话里有一条隐形规则一旦发现 Claude 输出不符合约束立即重申不拖到后面。单次重申的成本是 30 秒拖到最后修改的成本可能是 30 分钟。Claude 没有记忆但你可以帮它记住。CLAUDE.md 是它的长期规范decisions 文件是它的项目历史摘要接力是它的阶段交接记忆锚点是它的实时提醒。这四层组合起来才是一个完整的外部记忆系统。你有没有因为 Claude 忘事踩过比较惨的坑具体是什么场景——是跨 Session 的天然失忆还是同一对话里的选择性遗忘你后来是怎么处理的
Claude Code 的记忆机制:为什么它会“忘事“?
你有没有遇到过这种场景对话进行到第 30 轮Claude 突然把你们二十条消息前说好的所有金额用整数给忘了生成了一段用浮点数处理价格的代码。你气得重新说了一遍它道个歉改了然后在第 35 轮又犯了同一个错误。你骂它记性差。但问题不在它的记性在于它根本没有记性。Claude 没有记忆只有上下文这是很多人用了好几个月才意识到的事情Claude 不记得任何东西。不是记性不好是从设计层面就没有持久化的记忆系统。每次对话结束Claude 对你的项目、你的偏好、你们的约定归零。下次打开新对话它又是一个对你一无所知的陌生人。就连在同一个对话里它能记住的东西也是有限制的——不是靠记忆而是靠上下文窗口。你说的话、它回的话都存在这个窗口里。只要窗口范围内能看到它就记得超出窗口了或者被新内容挤出去了它就忘了。说人话就是Claude 的记忆本质上是视野。它只能看到当前上下文窗口里的内容看得到的它就知道看不到的它真的不知道。三种忘事的真实原因搞清楚为什么忘才能针对性地解决。原因一上下文窗口被撑满早期内容被挤出去Claude Code 的上下文窗口是 200k tokens听起来很大但一次复杂的开发对话很容易用掉大半。当窗口快满的时候会发生一件大多数人不知道的事模型不是平等地遗忘所有内容而是对中间段的内容注意力急剧下降。实验表明LLM 对超长上下文的注意力分布是不均匀的——开头和结尾的内容注意力最高中间的内容容易被忽视。你在对话第 5 轮说的金额用整数随着对话推进这条约定慢慢滑进了上下文的中间地带注意力权重降低Claude 开始视而不见。这不是它故意忘的是它的注意力机制决定的。原因二新 Session 的天然失忆每次开新对话上下文完全清空。这是最彻底的忘事——之前说的一切它真的一条都不知道。很多人以为 CLAUDE.md 配置了就万事大吉。但有一点要清楚CLAUDE.md 解决的是项目规范的记忆问题解决不了决策历史的记忆问题。你在上一个 Session 里决定用 Redis 做 Session 管理而不是 JWT这个决策不在 CLAUDE.md 里新 Session 的 Claude 不知道。它完全可能在新对话里给你生成 JWT 的实现。原因三同一 Session 内的选择性遗忘这是最难察觉的一种。在一个很长的对话里Claude 并不是平等地记住每一条消息。靠近当前位置的内容权重高早期内容权重低。这就是为什么你在第 30 轮重申了某个约定它在第 31 轮会遵守但到了第 45 轮又开始违反。这里有个反常识的细节长对话里你重申某个约定的效果往往比你最初说的效果更好——因为重申发生在上下文的更靠后位置注意力权重更高。所以当你发现 Claude 开始忘事最有效的操作不是骂它而是在当前位置重新声明关键约束。记忆补偿方案四层防御体系既然 Claude 没有真正的记忆就需要我们主动管理信息的传递。我把这套方案叫记忆补偿——用外部机制弥补它内部机制的缺陷。第一层CLAUDE.md——永久性规范记忆这是最基础的一层专门存放不管什么时候都成立的规范。关键原则只写规范不写决策。# 永远成立的规范写进 CLAUDE.md - 金额用整数分为单位 - 时间存储和计算用 UTC - 错误返回格式{ success: false, error: string } - 组件用函数式不用 Class # 不适合写进 CLAUDE.md 的内容决策会变化 - 这个项目决定用 Redis 做 Session - 用户表暂时不加 timezone 字段 - 暂时不做邮件验证功能规范是稳定的决策是动态的。把决策写进 CLAUDE.md几个月后回来看可能已经不适用了还会干扰 Claude 的判断。第二层.claude/decisions/——决策历史归档专门建一个目录存放每个功能模块的决策记录。格式简单关键要可以快速加载进上下文。.claude/ decisions/ auth.md # 认证模块的技术决策 payment.md # 支付模块的技术决策 database.md # 数据库设计决策 architecture.md # 整体架构决策每个文件的格式# 支付模块技术决策 ## 已确认决策 - 使用 Stripe不用 Paddle原因Stripe 对美国市场的覆盖更好 - Webhook 处理必须幂等原因Stripe 会重发 - 订阅取消用 cancel_at_period_end不立即取消原因用户体验 - 退款走 Stripe Dashboard 手动处理不做自动化原因初期流量小不值得开发 ## 待确认问题 - 是否支持年付优惠产品还没决定 ## 更新时间 2025-03-01使用方式每次开新 Session 处理支付相关功能第一步就是Add to Context.claude/decisions/payment.md这样 Claude 就能快速接入之前的所有决策不会给出和已有架构冲突的代码。第三层Session 结束前的摘要接力每个 Session 结束前固定做一件事让 Claude 生成本次对话的决策摘要更新到对应的 decisions 文件。请总结这次对话里所有新确认的技术决策格式和 decisions/payment.md 里的已确认决策一致我需要把它追加进去。这个习惯养成之后decisions 文件会随着项目推进越来越完整相当于一份实时更新的项目记忆库。第四层长对话内的记忆锚点这一层是对抗同一 Session 内选择性遗忘的手段。操作每隔 15-20 轮对话主动发一条关键约束重申提醒一下本次对话的关键约束金额统一用整数分为单位所有异步操作必须有 try-catch错误返回格式{ success: false, error: string } 继续之前的任务。这条消息放在上下文的靠后位置Claude 的注意力权重高会重新把这些约束纳入考量。说人话就是把关键约束定期置顶一遍对抗注意力衰减。烦吗烦。但比事后改错代码不烦。踩坑环节坑一以为 CLAUDE.md 能记住所有事情项目刚开始我把所有能想到的约束都写进了 CLAUDE.md包括暂时不做 OAuth 登录只做邮箱密码登录。两个月后我忘了这条CLAUDE.md 还写着。有一次让 Claude 帮我完善登录系统它看到了这条约束给我生成的代码里把 OAuth 的入口全部注释掉了还专门说根据项目约定暂不支持 OAuth。但那个时候我们已经决定加 OAuth 了只是忘了更新 CLAUDE.md。怎么发现的在 PR 里被同事问为什么 OAuth 相关的代码全是注释怎么解决的把 CLAUDE.md 里的暂时性决策全部清掉移到 decisions 文件里CLAUDE.md 只留永久规范。同时建立了每个月review一次 CLAUDE.md 的习惯。坑二长对话里忘记重申约束积累了大量需要修改的代码有一次做一个比较复杂的功能对话跑了将近 50 轮。中间发现 Claude 开始生成不符合规范的代码但我觉得应该还好先完成主逻辑再说没有及时重申约束。结果功能做完review 代码发现有 8 处金额处理用了浮点数、3 处错误格式不对。一个一个改又花了半小时。怎么解决的现在我的对话里有一条隐形规则一旦发现 Claude 输出不符合约束立即重申不拖到后面。单次重申的成本是 30 秒拖到最后修改的成本可能是 30 分钟。Claude 没有记忆但你可以帮它记住。CLAUDE.md 是它的长期规范decisions 文件是它的项目历史摘要接力是它的阶段交接记忆锚点是它的实时提醒。这四层组合起来才是一个完整的外部记忆系统。你有没有因为 Claude 忘事踩过比较惨的坑具体是什么场景——是跨 Session 的天然失忆还是同一对话里的选择性遗忘你后来是怎么处理的