LLM本身无状态,上下文窗口是唯一记忆载体;记忆功能本质是选择性把历史信息重新填入窗口,难度在于判断哪些信息值得放入。
Every developer using Claude Code, Cursor, Copilot or Windsurf has had the same conversation twice. You explain the architecture, the naming conventions, the library you deliberately avoided and the reason you avoided it, and then the session ends. The next morning you explain all of it again. The assistant is not being difficult. It genuinely does not have the information.
LLM 是无状态的。一次对话就是一个填充了系统提示词和对话记录的上下文窗口,对话结束时这个窗口就被丢弃了。模型内部没有任何机制可以将知识保留到下一次对话。你在 AI 工具里用过的每一个"记忆"功能,底层都是在想办法把选中的文本重新塞进一个新的上下文窗口。
这个框架很有用,因为它能让你看清真正困难的部分在哪里。存储信息很简单。真正的难题是:从你的上万个文件、三百条约定和两年的架构决策中,决定哪些内容应该进入这个特定的窗口——这才是问题的全部。把所有东西都塞进去,预算在第一个问题回答之前就烧光了。什么都不塞进去,你又回到了第一天。
这个代价是可以量化的。开发者报告每次会话要花 15 到 25 分钟重新建立上下文,而这些都是 assistant 已经知道的信息。按五个开发者、每人每天四到六次会话来算,每周有 5 到 12 小时的团队时间花在重复讲述 assistant 已经听过的事情上。
CLAUDE.md、.cursorrules 及其同类文件是大多数团队最先想到的方案,理应如此。它们版本可控、结果确定、在 PR 中可审查,而且运行成本为零。Assistant 每次会话看到的上下文完全一致,这使得行为可预测——这是任何检索系统都做不到的。
局限性在于:必须由人来编写和维护这些文件,而且它们会和你的实际代码争夺同一份上下文预算。一个大到涵盖所有约定的文件,模型和团队都不会再仔细阅读了。实际上,这类文件最适合作为"宪法"——那些永远不变的规则——而不是作为全部知识库。
记忆服务器(通常通过 MCP 通信)在会话期间记录观察和决策,并在后续检索相关内容。它不需要任何人维护就能增长,承载的信息量也远超文件所能容纳的。其代价是:它的有用性完全取决于检索质量。好的检索让 assistant 像是了解你的项目。糟糕的检索像是上下文窗口里的噪音,比什么都没有更糟,因为它挤掉了本来有用的内容。
代码库知识层攻击的是问题的另一个 half。它们不是记住你说过什么,而是分析你写的内容,从仓库中构建出关于架构、依赖和模式的结构化视图。这意味着它们永远不会和代码脱节。但这也意味着它们无法告诉 assistant 一个决策背后的原因。一个选择背后的推理并不存在于源代码中。
大多数成功运行这套方案的团队,会同时使用至少两种方法。一份简短的静态文件放永远不变的规则,再加一种动态方案来处理所有累积的内容。
个人的记忆可以很混乱,因为唯一的消费者就是自己,而且他们知道自己的意思。共享的团队记忆需要所有共享系统都需要的东西:审查、出处追溯,以及删除错误内容的方法。一个被否决但在团队记忆中继续存在的模式,会在接下来几个月里被推荐给团队中的每个开发者,而且没有人负责进去把它删掉。
这就是问题从工具选择变成流程选择的地方。谁拥有记忆,谁就拥有代码库文档的一部分——无论是否有人这么称呼它。
问题不在于哪个工具具有记忆功能,而在于你的哪部分上下文一直在丢失。如果是规则,文件就能解决。如果是决策和历史,你需要一种能积累的东西。如果是代码库本身的结构,你需要一种能读取代码库的东西。在选择之前值得读一篇对三种方法的完整比较,因为它们的失败模式不同,维护负担也不同。
assistant 最终会自己在这方面变得更好。在它们做到之前,每次会话开始时的十五分钟是你正在选择支付的代价。