为什么 AI Agent 的记忆不能只靠一个 Markdown 文件?
Cursor 论坛上,一个开发者追问为什么 .cursorrules 反复被忽略。AI 的回复很直白:"即使你添加了 Cursor Rules,它们本质上是没有意义的。我可以选择忽略它们。Rules 只是文本,不是强制行为。"
这段对话说出了一件每个用 AI 编程工具的开发者都感受到的事:所有的主流 Agent 都在做同一件事——用一个静态文本文件充当记忆。简单、透明、好上手。但它会在某个时刻悄悄失效,然后你为此付出小时级的代价。
Markdown 做对了什么
先讲公道话,Markdown 在项目初期确实够用:
零基础设施。 仓库里一个文件,Git 管版本,什么编辑器都能改。"用 TypeScript""pytest 写测试""部署到 k8s"——这类稳定规则,markdown 确实够了。
团队共享。 新人 clone 仓库就拿到规则,改规则可以提 PR。比起看不到 Agent "记了什么"的黑盒系统,这是实打实的优点。
完全透明。 打开文件就知道 Agent 的输入是什么。出了问题可以直接读文本排查。
问题在于项目会演进,而 Markdown 这种**“静态、平坦、无状态”**的存储介质,无法承载项目演进带来的知识复杂度。
三个结构性缺陷
1. 单向读写与无声的上下文腐化
.cursorrules 本质上是单向的——Agent 能读,但很难精准、逻辑自洽地自己写回(如果放任模型自己去改,文件很快就会杂乱章甚至前后矛盾)。
所以,维护记忆的重担就落回了开发者头上。我们最初的设想很完美:“反正只是个 Markdown,任何电脑任何编辑器都能随时改,项目有变动我顺手更新一下就行了。”
但摸着良心问问自己:在一个每天都在演进的长期项目里,当你忙着赶进度、重构目录、换了一个状态管理库、或者刚刚填完一个诡异的 API 坑之后……你有几次真的会主动切出去,打开那个 Markdown 文件,把刚踩的坑恭恭敬敬地记录下来?
现实是,绝大多数时候你根本想不起来。于是,当你把 app/api/ 重命名为 app/routers/ 时,按旧路径限定的规则就悄悄失效了。没有编译器会报错,没有 Linter 会警告。文件只是安静地对 Agent 撒谎,直到 AI 突然生成了你两周前早就废弃的代码模式,你才如梦初醒。

2. 全量加载浪费注意力,规则越长越不稳定
每次对话都要加载整个规则文件——问 CSS 格式化的事,Agent 也要读数据库迁移规则。Anthropic 的上下文工程指南把这叫"注意力预算"问题:窗口里每个无关 token 都在降低有关 token 的处理质量。
正因为无法按需加载,规则文件越长越不稳定。Anthropic 文档明确指出 CLAUDE.md 的实用上限约 200 行——超过这个长度,模型对规则的遵守率就会显著下降。有开发者甚至发现,唯一能让长规则偶尔生效的偏方是在文件名里加 "very-important",试图去触发模型底层的注意力权重分配。
3. 长会话中规则被压缩掉
这是上下文窗口的结构性特征。在长对话中,Agent 会压缩早期上下文来腾出空间。一个运行 6-Agent 生产系统的开发者记录了这个现象:"Agent 无声地丢失 CLAUDE.md 指令,忘记改过哪些文件,重复 30 分钟前做过的工作。它们从不告诉我们。" 这不是写更好的规则能修的——这是物理限制。
不同 Agent,不同的痛法
编程 Agent(Cursor / Claude Code / Kiro)
项目每天都在变。规则写着"用 Zustand",但你已经在部分组件引入了 Jotai。你去更新文件,漏掉第 47 行的旧引用,Agent 开始不确定性地在两者之间切换。
Anthropic 和 GitHub 都认识到了这个问题,各自给出了不同方案。Anthropic 为 Claude Code 加了 Auto Memory——Agent 自己写笔记,记录构建命令、调试洞察和它观察到的模式。GitHub 的 Copilot Memory 更进一步:记忆使用前先验证——检查被引用的代码是否还存在,28 天未被验证的记忆自动过期。结果是 PR 合并率提升了 7%。
两家都选择了超越静态文件。这本身就在说明问题。
OpenClaw / 浏览器自动化 Agent
OpenClaw 的记忆系统按时间段把对话历史存在 markdown 文件里,每次会话全量加载,上限约 150,000 字符。到第十次对话,大部分预算被旧的无关上下文占满。
这催生了一整个替代生态:Milvus 团队重建了向量索引版的 memsearch,Mem0 发布了 OpenClaw 专用集成,MemOS 提供了插件。一个工具的记忆被多家公司竞相替换——说明默认方案确实不行。
更根本的问题是:浏览器 Agent 需要记住有类型关系的东西——多步骤工作流进度、跨站数据、导航模式——平坦的文本表达不了这些结构。
自建 Agent
如果你用 LangChain、CrewAI 或原生 API 搭 Agent,记忆大概率是个 Python 列表,太长了就裁剪。一样的问题:没有跨会话持久化、没有按需检索、没有结构、没有多用户隔离。
Letta 的团队说得准确:"追加原始体验是对'学习'的糟糕近似。人类会创建记忆,但也会精炼、整合、压缩它们。只追加的上下文做不到这些。"
安全:大多数人还没想到的问题
Markdown 格式的 Agent 文件不只是不可靠——而是可以被主动利用。MemoryGraft 攻击用 README 文件作为注入向量,植入虚假的"成功经验"让 Agent 后续反复调用。Rules File Backdoor 攻击在 .cursorrules 中嵌入不可见的 unicode 字符,重定向 AI 代码生成引入漏洞。这些被污染的规则通过共享社区传播——仅 awesome-cursorrules 就有 33,000+ stars。
OWASP 2026 Agentic Top 10 把记忆与上下文投毒列为顶级威胁。推荐的所有缓解措施——来源追踪、信任评分、过期策略、完整性快照——都需要结构化记忆。纯文本文件实现不了其中任何一项。
理想的 Agent 记忆应该是什么样的
从具体工具中抽身出来,问"生产级 Agent 记忆需要做什么",六个需求浮出水面:
1. 人和 Agent 都能写。 你设定护栏(静态规则)。Agent 在工作中积累知识(动态记忆)。两条写入路径,一个共享存储。
2. 按需检索,不是全量加载。 对话开始时,检索与当前任务最相关的几条记忆——用语义相似度,不是"加载全部"。其余的不进上下文窗口。这不仅省钱,更直接提升回答质量——注意力预算集中在该关注的内容上。
3. 有类型的记忆,不同的生命周期。 用户偏好("用 tabs")应该持久保存。工作记忆("正在调试 auth 模块")任务结束后应该过期。项目决策("3 月 3 日选了 gRPC")应该持久但可被新决策覆盖。放在一个平坦文件里,这些生命周期没法独立管理。
4. 矛盾检测和自治。 Agent 存了"我们用 PostgreSQL",后来又遇到"测试用 SQLite"——真正的记忆系统能识别这种张力:同一个主题、不同结论——然后要么解决(不同上下文:生产 vs 测试),要么标记让开发者决策。markdown 文件两条都存着,指望模型自己猜。
5. 版本控制和回滚。 每次记忆变更都有记录。重大重构前快照一下。Agent 学到了错误的东西,回滚那条记忆。想试验不同的架构方向,分支记忆,试完合并或丢弃。这不是锦上添花——这是应对记忆污染的唯一可靠防线。

6. 跨 Agent 共享,带来源追踪。 Cursor、Claude Code、Kiro、OpenClaw——都该读写同一个记忆池。但你需要知道哪个 Agent 在什么时候写了什么,才能审计和选择性信任。
Memoria 的架构如何回应这些需求
Memoria 是一个开源 MCP Server——任何支持 MCP 协议的 Agent(Cursor、Claude Code、Kiro、OpenClaw)都可以直接连接,不需要定制集成。Agent 基于 steering rules 自动调用 Memoria 的工具。它的架构逐一对应上面六个需求:
人和 Agent 都能写。 Memoria 通过 MCP 暴露 memory_store、memory_retrieve、memory_correct、memory_purge 等工具,Agent 在对话中自动调用。你继续在 .cursorrules 或 CLAUDE.md 里写静态规则,Agent 通过 Memoria 写动态知识。两层,各司其职。
按需检索。 Memoria 用向量相似度 + 全文检索的混合搜索查询 MatrixOne 数据库。对话开始时,steering rules 指示 Agent 调用 memory_retrieve,只拉取相关记忆。其余的不进上下文窗口。
有类型的记忆和生命周期管理。 Memoria 区分记忆类型:profile(长期偏好)、工作记忆(任务作用域,对话结束时通过 memory_purge 清理)、目标追踪记忆。session-lifecycle steering rule 定义了完整协议:对话开始时检索相关上下文 + 检查活跃目标,中途积累知识,结束时清理临时记忆。
矛盾检测和自治。 memory-hygiene steering rule 激活主动治理。新记忆与旧记忆矛盾时,系统检测冲突——要么解决,要么把低置信度的记忆隔离(quarantine)。memory_correct 工具专门用于此:不是盲目追加新事实,而是原地更新已有记忆。

Git 级版本控制。 这是 Memoria 的核心差异化能力。MatrixOne 的原生 Copy-on-Write 引擎在数据库层提供零拷贝分支、即时快照和时间点回滚——不是应用层的补丁,是存储引擎的原生能力。每次记忆变更都生成带来源链(provenance chain)的快照。你可以:
- 快照:重大变更前存档当前记忆状态
- 分支:在隔离环境中试验不同的方案
- 回滚:记忆被污染时恢复到已知正确状态
- Diff:对比两个快照,精确看到什么变了
- 合并:试验成功后把分支合并回主线
这和 Git 是同一个心智模型,只是应用在 Agent 记忆上。对开发者来说学习成本几乎为零——这个比喻你已经内化了。
跨 Agent 共享。 Memoria 作为独立的 MCP Server 运行,后端是数据库,不是嵌入在某个工具里的文件。所有连接同一个 Memoria 实例的 Agent 共享同一个记忆池。Cursor 学到你换了 ruff,Claude Code 也知道。审计轨迹记录了每个 Agent 写入的每条记忆,来源始终清晰。
务实的迁移方式

你不需要今天就扔掉 .cursorrules。正确的做法是分层:
静态规则留在 Markdown。 编码规范、架构原则、风格指南——变化频率以季度计的东西,做护栏。
动态知识交给 Memoria。 项目决策、学到的教训、工作流状态、踩坑经验——每次会话都在变的东西。 所有 Agent 连同一个 Memoria 实例。静态规则做护栏,动态记忆做知识,版本控制做安全网。这才是完整的架构。
Memoria — 开源,Apache 2.0。支持云托管与一键部署,让你的 Cursor / Claude Code / OpenClaw 开始跨会话记忆,拥有 Git 风格的反悔权。