尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Claude Code跨会话失忆怎么办?用Markdown记忆库打造AI外置大脑

Claude Code跨会话失忆怎么办?用Markdown记忆库打造AI外置大脑 1. 先说结论AI编程助手最大的坑不是写错代码是“失忆”我用了Claude Code大概半年从最开始的新奇到中间有一段差点弃坑原因不是它写代码不行而是它“翻脸不认账”。举个例子。我有个项目技术栈是Vue 3 TypeScript之前和Claude Code已经明确了组件风格命名用PascalCase、样式走tailwind不用scoped css、API请求统一走封装好的request函数。这些约定在聊天窗口里聊得好好的代码也写得规规矩矩。结果第二天我重新开一个会话继续做它上来就把API直接写在页面里还顺手用了两个scoped style我一个没检查就推上去了测试直接炸了一片。你说这算谁的锅往大了说AI确实没有跨会话记忆往小了说我一个用了多年各种工具的开发者居然忘了给协作工具做“文档化”这件事自己也有责任。后来我认真研究了一下这个问题的本质。Claude Code在每个会话里能记住的上下文是有限的就算模型上下文窗口再大实际工作中也会被代码片段、报错信息、测试日志这些内容占掉一大半。更重要的是每次会话结束这些东西就清空了下一轮对话什么都带不过去。你不能指望一个每次开工都“重置存档”的队友记住你上周二说的每一个决定。所以我在踩了一堆坑之后给自己定了一个规矩所有跟Claude Code协作的中长期项目必须配一套“外置大脑”。这套大脑不依赖AI的记忆能力就靠三个Markdown文件分别承担不同职责。说实话从这之后Claude Code像换了一个助手跨会话的连续工作能力好了太多而且每次对话不用再重复交代背景它自己能去找答案。如果你也遇到过类似情况或者你正准备用Claude Code做复杂项目这篇文章就把这套方案的完整设计、文件内容模板、接入方式、以及我实测中遇到的坑一次说清楚。2. 为什么单靠系统提示词和聊天记录远远不够2.1 失忆的根源是上下文机制不是AI能力问题先说一个容易被误解的点Claude Code“失忆”并不是模型蠢而是会话机制天然就不保留历史。这就像你每天找一个不同的人帮你写代码每个人都是资深工程师但每个人进来时手里只有一张空白的任务单。你再怎么跟他描述昨天的上下文都不如他手里有一份昨天的工序文档来得靠谱。可能在短会话里这个感觉不明显。你启动一个会话给它一两个文件它写得挺好。但项目一复杂跨文件改动一多你就会发现上下文窗口被塞满了它开始忽略之前说过的话或者忘记某些约束条件。你翻聊天记录找到一条“这个接口要用POST”它回答“好的”过了一会儿又用了GET。有人在群里说这是上下文被更早的信息挤掉了有人说是旧技术栈在干扰。我作为一个非算法从业者更关注的是怎么解决。结论是既然它记不住那就让它每次都能找到。让每次新会话启动时它都能查到一个固定的、可持续更新的资料库这才是最靠谱的思路。2.2 散落在聊天记录里的决策是最难追查的隐形债务我经历过一次“至暗时刻”一个功能做了三个礼拜中间改了很多次技术方案。最开始用echarts做图表中间切了一版canvas自绘后来又发现开源库够用换回了echarts但底层是另一套封装。方案来回变的时候每个决策都是在不同天的会话里确定的最后代码也改了注释也写了但注释写的是“为什么这么写”没人写“为什么之前不这么做”。直到某天Claude Code在一个新会话里看到一段遗留代码它判断这是“可优化的旧实现”顺手就给我重构了。我当时没在代码审查里发现异常结果上线后图表渲染崩溃一查才发现它把我特意保留的某个边界处理逻辑删了因为那套逻辑和它在当前会话里看到的“正确方案”是冲突的。这件事让我意识到聊天记录是“易失性存储”代码注释是“碎片化存储”只有结构化的项目文档才是“持久化存储”。而且这份文档还得让AI能主动访问、能增量更新不然就会变成那种写完之后没人看、最后连作者自己都翻不动的僵尸文档。2.3 为什么偏偏选Markdown而不是Notion或数据库有人会说我可以用Notion、用飞书文档、用Confluence记录项目状态啊。没错你自己看当然没问题但你面对的协作对象是Claude Code它读本地文件最方便尤其是Markdown格式几乎不需要任何额外解析成本。Markdown有几个天然优势第一它是纯文本不依赖特定编辑器任何环境都能打开第二结构化的标题、列表、表格让AI很容易提取关键信息第三改动可追踪配合Git能看出谁在什么时候改了什么第四Claude Code本身对Markdown文件的读取非常自然它可以直接打开查看、修改、追加内容不需要额外工具链。我之前也试过在项目里放一堆txt文档但txt格式没有层级结构AI读起来分不清哪里是重点上下文塞进去之后还是靠自己猜。Markdown的标题层级和列表符号很清晰等于给了AI一个“信息导航图”它知道先看哪节、跳过哪节。所以你会发现Claude Code社区里很多人用CLAUDE.md作为项目级指令文件这其实就是一个标准化入口。而我要做的是在这个入口基础上再增加一套可以随项目演进的“记忆文件体系”。3. 三个文件的设计思路与分工3.1 总原则一份“身份档案”一份“工作记录”一份“账本”我最终沉淀下来的方案是三个文件功能边界非常清晰不重叠、不冗余。它们可以放在项目根目录下一个叫memory/的文件夹里也可以直接放根目录看你个人习惯。我是建议独立文件夹因为根目录文件太多之后每次列目录都会分散AI的注意力。第一个文件叫项目档案我自己取名01_ARCHIVE.md或ARCHIVE.md记录的是这个项目“是什么”。只要项目不做重大转向这个文件基本不会频繁改动。它包含项目背景、核心目标、技术栈、目录结构、代码风格、第三方服务清单、环境变量说明等。第二个文件叫状态记录02_STATE.md记录的是“现在进行到哪”、最近完成什么、正在做什么、下一步是什么。这个文件几乎每完成一个功能点就要更新一次是整个体系里更新频率最高的。第三个文件叫决策记录03_DECISIONS.md记录的是这个项目踩过的坑、做过的取舍、以及各种“不要做”的警示。比如上面说的“不要重构某个模块”“不要随意替换某个库”“新接口必须走统一request封装”。这些内容是防止Claude Code在新会话里“自作聪明”的关键。3.2 文件一项目档案解决“它不知道自己在哪”的问题很多失忆问题其实不是“忘记做了什么”而是“搞不清项目背景”。你开个新会话简单说一句“帮我加个导出功能”AI如果不知道这个项目的用户群体是谁、系统架构是什么、性能要求有多高它就很容易给出一个看起来能跑但完全不符合业务语境的方案。我把项目档案的内容分成几个固定模块每次初始化项目时花十分钟填好之后每次会话开始让AI先读这个文件。文档结构大致长这样# 项目档案客户运营后台 ## 一句话定位 给客户成功团队用的日常运营工作台 ## 核心目标按优先级 1. 提供清晰的客户健康度视图 2. 支持批量邮件和站内信触达 3. 所有操作必须有操作日志 ## 技术栈 - 前端Vue 3 TypeScript Vite Tailwind - 后端Node.js Express PostgreSQL - 部署Docker ComposeNginx反代 ## 关键目录结构 - src/views 页面组件 - src/components 业务组件 - src/api 请求封装禁止页面直接fetch - server/routes 路由定义 ## 代码风格约定 - 组件名PascalCase - 变量/函数camelCase - 样式Tailwind类优先禁止写scoped CSS - API函数统一从 src/api 导入 ## 第三方服务 - PostgreSQL连接串通过 .env 注入 - Redis仅用于缓存不存核心业务数据 - 对象存储图片上传走 pre-signed URL ## 重要提醒 - 测试环境数据库可以随便重置不要写定时任务 - 生产环境任何变更必须走审批流程你看有了这份档案AI每次打开新会话等于先做了一次“入职培训”。它不需要你再重新解释一遍技术栈、不用猜目录干嘛的也基本不会写出与项目架构冲突的代码。3.3 文件二状态记录解决“它不知道干到哪了”的问题状态记录文件就相当于一个“工作台便签”。这个文件不仅给AI看给你自己也很有用——有时候你隔了几天没碰项目打开这个文件就能快速漂移回来。# 状态记录 ## 当前迭代目标 完成客户列表页的搜索和筛选功能 ## 进行中包含 - [x] 筛选条件组件开发 - [ ] 搜索防抖逻辑接入 - [ ] 结果表格排序前端排序 - [ ] 空状态、错误状态UI - [ ] 联调后的细节修正 ## 最近完成 - 2025-06-10 客户列表接口封装完成 - 2025-06-11 筛选组件样式完成 - 2025-06-11 修复了日期范围选择的时区问题 ## 当前已知问题 - 搜索关键词包含特殊字符时后端返回500等后端同事修复 - 表格在1000条数据时滚动卡顿需要虚拟滚动方案调研 ## 下一步计划 1. 调研虚拟滚动库 2. 完成防抖逻辑 3. 提交第一版给产品验收这个文件写起来很繁琐但绝对值得。我的习惯是每完成一个阶段就顺手更新一次不一定每次改动都记但至少保证“当前迭代目标”“进行中包含”“已知问题”这三块永远是新的。为什么这个文件重要因为Claude Code在同一个会话里干活它自己知道刚才做了什么但第二天新会话它连昨天改了哪个文件都要猜。如果你让它先读状态记录它就知道昨天进行到哪一步哪些坑还没填完当前最需要处理什么不会一上来就绕进一个你已经否掉的方案里。3.4 文件三决策记录解决“它不知道什么不能做”的问题决策记录是我三个文件里最后补上的也是我觉得实战价值最高的一个。起因是前面提到的“好心上错香”的重构事故。这个文件放的是所有“方向性结论”和“教训”。不需要记流水账只需要记“当AI面临选择时该往左还是往右”的参照。简单来说它是项目的“避坑指南”。# 决策记录 ## 已确认方案 - 客户列表使用虚拟滚动数据量大时不降级 - 图表展示采用ECharts最新版封装不引入其他图表库 - 后端接口一律走REST风格不使用GraphQL ## 被否决方案及原因 - canvas自绘图表开发成本高维护难否决 - 表格分页方案产品要求一次加载否决 ## 高风险区域不要动 - src/utils/export.js 里有特殊BOM处理逻辑重导出Excel会乱码 - server/middleware/auth.js 不要修改涉及多个模块依赖 - 不要用 npx npm-check-updates 一键升级依赖 ## 遇到过的问题 - Node 20 下 bcrypt 编译失败用 bcryptjs 代替 - 线上环境时区是 UTC所有日期都要转北京时间显示 ## 质量红线 - 不写没有错误处理的异步代码 - 不绕过 eslint 的规则如特殊情况需要禁用必须写明理由这个文件越写越有价值。一开始可能只有三五条但随着项目推进每踩一个坑就补一条几个月下来这个文件就是项目的“活字典”。新会话里Claude读一遍这个文件就能避开你之前辛辛苦苦填平的坑不会一脚一脚又踩回去。4. 实操怎么把“外置大脑”接进Claude Code4.1 用CLAUDE.md做总路由强制每次会话先读档案光把三个文件放在项目里是不够的因为Claude Code默认不会主动去看。它每次会话开始时除非你把文件路径显式告诉它否则它不会自己去翻目录。需要在项目根目录配置一个CLAUDE.md文件把它当作“总路由”。我的CLAUDE.md内容其实非常简单就是让AI每次任务开始前先读那三个文件# 项目协作规则 在开始任何任务之前必须先依次阅读以下文件并遵守其中的约定 1. memory/ARCHIVE.md - 项目技术栈、目录结构、代码风格 2. memory/STATE.md - 当前进度、正在进行的任务、已知问题 3. memory/DECISIONS.md - 已确认方案、已否决方案、禁止改动的模块 阅读完成后以一句话说明你掌握的项目背景再开始执行任务。 如果用户要求完成的任务与上述文件中的约定冲突先向用户指出冲突内容不要擅自执行。这里有个小窍门如果项目比较大、文件内容很多你不想让AI每次会话都把这几个文件全读一遍浪费token也可以在CLAUDE.md里简化成“按需读取”比如先读 memory/ARCHIVE.md 如果任务涉及新增功能再读 memory/STATE.md 如果任务涉及重构或修改既有代码先读 memory/DECISIONS.md 确认高风险区域。我试验下来这种“精简入口”模式的token消耗大概能省掉三分之一效率也高。但对于规模不大的项目我依然推荐全量读取因为几次完整读取的成本远低于一次写错代码带来的返工。4.2 让AI帮你更新状态文件别自己苦哈哈地手写很多人听到“每次做完功能都要更新Markdown文件”时第一反应是太麻烦了。但是你有一个24小时随叫随到的AI助手为什么要自己手写更新呢我的做法是在每个阶段任务完成或会话快结束时直接跟Claude Code说一句话请更新 memory/STATE.md把刚才完成的内容移动到“最近完成”如果有新的待办或问题也一并更新。Claude Code有文件编辑能力它会自己打开文件、修改内容、保存。你只需要在关键节点养成提醒它的习惯。实测下来它会按照原有的Markdown结构去更新不会乱改格式也不会把之前的内容删掉。但这里必须注意AI偶尔会把文件改出格。可能多删一行可能把待办状态改错。所以我的经验是让AI更新完之后自己打开文件瞟一眼不用逐字看扫一眼结构有没有坏待办项对不对就行。这个习惯养成了状态记录文件就能长期保持准确。4.3 多个项目并行时这套方案更吃香我手上同时在维护三个项目每个项目的技术栈和开发风格完全不同。在没有这套方案之前每次切换项目我都要花半天时间回忆项目上下文然后重新给Claude Code讲一遍背景讲完之后它还经常搞混。现在我在每个项目根目录下都放了一份memory/文件夹。切换项目的成本降低了很多打开项目启动Claude Code它自动读CLAUDE.md自动加载对应的三个Markdown文件。不需要我在脑子里拼命回忆“那个项目用的是什么数据库”一切都是现成的。尤其是决策记录文件因为不同项目的“不要做清单”完全不一样。A项目里“禁止引入UI组件库”因为产品要求像素级还原设计稿B项目里“必须用Tailwind”因为开发周期短、快速迭代优先。这些项目级差异如果靠对话记忆一定出错放到Markdown文件里AI每次自己读取就不会互相串味。4.4 结合Git管理让记忆文件也能回溯三个Markdown文件放在项目里有一个额外好处它们和代码一起提交到Git仓库天然就有版本记录。我是这么用的每完成一个较大的阶段在提交代码时顺手把memory/里的更新一起提交commit message写清楚“更新状态完成XXX功能”。这样以后想复盘某一天的决策直接看Git历史里memory/DECISIONS.md的变更即可比翻聊天记录靠谱多了。如果你用Git分支管理项目切换分支时这些记忆文件也会跟着切换这意味着你在不同分支上做的技术探索各自的背景和约定也能全部保留下来。我曾经在feature分支上做过一套新架构的实验当时在DECISIONS.md里记录了为什么不用某个方案。后来那个分支被暂时搁置三个月后重新捡起来我完全忘了当时的考虑但文件还在一看记录就全想起来了。这种感觉真的很值。5. 可以直接抄的模板和使用建议5.1 初始化模板复制改改就能用我提供一个稍微完整一点的初始化模板第一次使用这套方案的朋友可以直接复制。三个文件分别按照下面的骨架填写先不用追求完美写清楚80%就已经能发挥作用了。内存档案模板# 项目档案 ## 基本信息 - 项目名称XXX - 一句话定位XXX - 主要用户 / 使用场景XXX ## 技术栈 - 前端XXX - 后端XXX - 数据库 / 缓存XXX - 部署方案XXX ## 目录结构 - src/ xxx - server/ xxx ## 代码风格 - 命名规范XXX - UI规范XXX - API规范XXX ## 外部依赖 - 第三方APIXXX - 密钥管理方式XXX ## 环境要求 - 本地开发命令npm run dev - 测试命令npm test状态记录模板# 状态记录 ## 当前目标 当前这个迭代阶段要完成什么 ## 进行中 - [ ] 任务1 - [ ] 任务2 ## 最近完成 - 日期完成了什么 ## 当前问题 - 问题1状态 - 问题2状态 ## 下一步 1. 优先做 2. 其次做决策记录模板# 决策记录 ## 已确认方案 - xxx ## 否决方案 - xxx原因的简单说明 ## 高风险注意事项 - xxx ## 常见坑 - xxx你不需要把这三个文件写成教科书式的全面只要在项目演进过程中持续往里加内容就行。空文件也比没有强关键是养成“先看文档再干活”的协作习惯。5.2 需要根据项目规模灵活调整如果你的项目非常小只有两三个文件几十行代码那搞这么一套文档体系确实有点杀鸡用牛刀。我自己的经验是当一个项目预计需要跨多个会话、开发周期在一个月以上、或者涉及多个模块协同时这套方案的价值才会充分体现。有一种变形用法是精简成两个文件一个是“项目说明 约定”一个是“进度与决策记录”。对于单体小工具类项目两个文件基本够了。而对于大型项目我甚至会把DECISIONS.md进一步拆分成几个分类文件架构决策、UI风格决策、数据流决策、部署方案决策。不过拆分的前提是内容确实多到影响阅读效率了否则不要主动拆。5.3 定期整理复盘让记忆库沉淀出价值文件会越写越长三个月之后STATE.md里的“最近完成”会积累一大串旧内容DECISIONS.md里可能会有一些已经过时或者被推翻的结论。我一般会做定期整理更直白地说是“归档清理”。状态记录文件里已经完成很久的旧任务我会move到一个单独的历史章“完成历史”或者直接删掉决策记录里如果新方案推翻了旧决策我会在旧条目上标记“已废弃”然后明确写上新的结论。这样能避免AI接下来读到互相矛盾的信息后产生误判。清理的具体做法也很简单项目一个里程碑结束后花十分钟让AI把这几个文件重新过一遍把已闭合的任务归档、把失效的决策标记清楚。做一次彻底的清理比之后每次会话都读一遍冗长文件消耗的token更划算。6. 实战中踩过的坑和解决技巧6.1 踩坑一AI不读文档就直接开工有几次我发现Claude Code在会话里没有读取我的memory文件直接开始写代码。排查后发现原因是我在对话里给的需求非常具体比如“把utils/format.ts里的dateFormat函数改造一下”它觉得不需要全局上下文就直接开工了于是绕过了CLAUDE.md里的规则。后来我在CLAUDE.md里把规则加得更死改成“除非用户明确说明跳过记忆读取否则任何文件修改任务前必须先读取memory/ARCHIVE.md和memory/DECISIONS.md”。这样即使是针对单文件的小改动它也会先扫一眼档案至少不会在一个方向已经否决过的方案上再走一圈。如果你发现你的版本里这个规则偶尔失效还有一个备选方案直接在会话开头手动打一句话“先读memory/ARCHIVE.md和memory/DECISIONS.md再动手”。可能稍微多花几个token但能避免大问题。6.2 踩坑二文件更新不及时信息过期比没有更可怕最危险的状态不是文档缺失而是文档内容过时了但AI和新人都以为它仍然正确。比如说ARCHIVE.md里写“本项目使用axios发请求”但上周你已经全量迁移到fetch封装如果文档没更新AI就会根据旧约定写出已被废弃风格的代码。所以我会专门设一个规矩当项目中任何约定的技术栈或目录结构发生变化时立即更新档案而不是等一个里程碑结束再统一梳理。这个我不建议让AI来做判断因为代码库出现新东西不等于旧文档就该改有时只是新增了一个实验模块。这时候你人工确认后告诉AI更新某一行就行。状态记录文件也是如此最怕“任务推进了但记录没动”。我会刻意在Claude Code执行完一个大功能后多问一句“更新memory”并且检查一下它改了什么。习惯了之后整个流程很顺也就多花十秒钟。6.3 踩坑三单文件过大AI读取反而低效三个文件用久了会越来越大。尤其当项目开始记录很多细碎的日常时单个Markdown文件可能膨胀到几百行。这时候AI每次全量读取会占用大量上下文。一个几千行的记忆文件读完之后上下文窗口就少了一大半真正干活时反而发挥受限。我的做法是控制每个文件在两百到三百行以内。如果超过就把旧的内容往下拆比如把DECISIONS.md的旧记录挪到DECISIONS_ARCHIVE.md或把STATE.md已完成的历史放到STATE_LOG.md。主文件只留当前需要的参照信息。这样既保证核心信息高效命中又不浪费token。6.4 小技巧让决策记录带上日期和原因追责是人之常情给项目做“为什么”记录其实更是为了长远维护。我在记录每条决策时都会带日期和原因格式参考- 2025-06-02 确认列表统一使用服务端分页。 原因前端分页在数据超过2万条时严重卡顿产品无法接受纯前端方案。这段内容即使未来有人翻到也能知道当时的判断依据。如果之后又改回前端分页比如换了虚拟滚动方案这条历史记录也不会被误认为“错误决策”而是作为“当期条件不成立”的备注保留下来。6.5 最终心得这套方法改变了我用AI编码的方式我现在面对Claude Code的“失忆”问题基本不纠结了。它失忆不可怕可怕的是我没有一套能代替记忆的系统。三个Markdown文件做“外置大脑”这件事本质上是把知识管理和AI编码结合了起来。代码仓库不只是存放源代码的地方也是存放“为什么这么写”的地方。按照我个人经验这套方案刚上手时会有点麻烦毕竟你要额外维护三个文档。但坚持下去尤其是让AI帮你更新状态记录和整理决策记录之后麻烦程度骤减而收益会随着项目的时间跨度越来越大。如果你刚接触Claude Code不妨从第2个文件开始用起也就是先把状态记录建好。试一次跨会话继续开发你就会体会到当AI一句“根据记忆上次我们做到筛选条件组件还剩防抖逻辑没接”说出口时那种爽感值得你为它忍受几个月的文档洁癖强迫症。
返回列表