智能记忆的几种模式:Knowledge Graph、MCP Memory 与 Markdown 文件记忆的分野
最近在看一条关于 opencode 的讨论时,我发现一个很有代表性的话题:今天大家到底该怎么给智能体做“记忆”?
这个问题看上去像是产品细节,实际上已经越来越接近一个基础架构问题。
因为当 agent 从“会聊天”升级到“会持续工作”,记忆就不再只是附属功能。它决定了系统能不能:
- 记住上下文
- 复用过去决策
- 延续长期任务
- 避免反复教学
- 在长周期协作里保持一致性
但与此同时,记忆系统又天然带着一个反身性的风险:
一旦记忆陈旧,它就不再是资产,而会变成污染。
这也是为什么今天关于智能记忆的讨论,正在迅速分化成几条不同路线:
- 让系统自己维护结构化记忆
- 让系统把记忆写成文件
- 让记忆尽量轻量,甚至尽量少做“长期记忆”
- 把“决策记录”和“会话上下文”拆开看待
本文想系统梳理一下,当下智能记忆的几种主要模式,以及它们各自真正解决的是什么问题。
一、先把“记忆”拆开:我们其实在谈几种不同的东西
很多人一说 memory,脑子里只有一个模糊概念:
agent 记住东西。
但工程上,至少有四类东西都可能被叫做“记忆”:
1. 会话上下文记忆
也就是当前对话窗口里的上下文。
它的特点是:
- 短期有效
- 跟着当前 session 走
- 容易被压缩、截断、遗忘
这类记忆解决的是:
- 当前任务别掉线
- 当前推理别断裂
2. 任务级工作记忆
比如:
- 当前 todo
- 当前计划
- 当前调试路径
- 当前这轮的中间结论
它比纯 session 稍微稳定一点,但通常还是短生命周期。
3. 持久化知识记忆
比如:
- 项目规则
- API 约定
- 架构决策
- 环境惯例
- 用户偏好
这类记忆真正解决的是:
- 不要让 agent 每次都从零学起
4. 检索型外部记忆
比如:
- 向量库
- 知识图谱
- MCP memory server
- 文件索引系统
它本质上更像一个外部知识基座,而不是“脑内记忆”。
把这几类拆开后,很多争论就清晰了:
- 有的人其实在讨论 session compaction
- 有的人在讨论长期知识库
- 有的人在讨论跨项目语义检索
- 有的人在讨论决策记录系统
这些问题并不是同一个问题,自然也不会有同一个答案。
二、第一类路线:Knowledge Graph / MCP Memory / codebase-memory 这类结构化记忆
在这类路线里,代表性的思路是:
让系统自己维护一个结构化、可检索、可更新的记忆层。
讨论里有人提到自己在 opencode 里使用 codebase-memory mcp,体验不错。它做的事情大概是:
- 自动索引代码文件
- 建立文件之间的关系
- 维护某种知识图谱
- 随着代码变化增量更新
- 在 agent 工作时提供检索支持
这代表的是一种很典型的设计哲学:
既然系统规模越来越大,就不应该靠手工文档维护全部记忆,而应该让系统自动维护结构化知识。
这条路线的优点
1. 它更适合大规模代码库
当项目足够大时,仅靠人手整理:
- 模块关系
- 数据流关系
- 依赖关系
- 文件之间的语义关联
成本会非常高。
这时候,自动索引 + 图谱化组织的价值就很明显:
- 能做跨文件关联
- 能做依赖追踪
- 能做语义级检索
- 能帮 agent 快速理解大仓库
2. 它更像“可计算的记忆”
文件记忆偏人类可读,知识图谱偏机器可操作。
后者的优势在于:
- 能推导关系
- 能追踪更新
- 能做结构化问答
- 能更容易做跨仓库 / 跨模块的查询
3. 它适合 agent-first 工作流
如果你希望:
- agent 经常自主探索代码库
- agent 频繁做跨模块推理
- agent 不只是读文档,而是自己找结构
那么这类记忆系统确实会比纯 markdown 更强。
这条路线的问题
1. 维护正确性很难
知识图谱的最大问题从来不是“建不建得出来”,而是:
它多久开始偏?
一旦:
- 索引延迟
- 关系抽取错误
- 语义归类失准
- 增量更新漏掉变更
图谱就会逐步变成“看起来很聪明,实际上有误差”的系统。
而这种误差比纯缺失更危险,因为它会带来错误自信。
2. 可纠错性往往不如文件系统
如果 markdown 里有一条错了,你直接改那一行。
但如果知识图谱里错了一条边、一条节点属性、一个抽象关系,纠错往往需要:
- 重新索引
- 重跑抽取
- 改规则
- 改服务
- 改 UI 或 MCP 层
它天然更“系统化”,也天然更重。
3. 它容易引入新的基础设施复杂度
为了“更好的记忆”,你可能要额外维护:
- 图数据库
- 向量库
- 索引服务
- MCP server
- 同步机制
- 更新策略
这在团队场景里可能合理,但对很多单人开发者或小团队而言,会迅速从“帮助系统”变成“被维护系统”。
三、第二类路线:文件型记忆——Markdown / JSONL / ADR / 日志 / repo 化记忆
另一派非常鲜明的观点是:
记忆最终很可能会收敛到 markdown、jsonl 或 repo 结构。
这条判断其实很有洞见。
因为 LLM 天生就擅长处理:
- 文本
- 文件
- 目录结构
- 可 grep 的内容
- 有版本历史的 artefacts
从这个角度看,文件型记忆不是“低级替代品”,反而可能是最符合 LLM 工作方式的记忆载体。
这条路线的典型形态
文件型记忆通常包括这些东西:
AGENTS.md:全局规则 / 项目规则adr/:架构决策记录sessions/:会话简报、wrap-upopen-questions.md:未决问题memory.jsonl:结构化追加日志notes/:项目笔记、约定、排坑记录
它的哲学很清楚:
不把记忆藏进不可见系统,而是把记忆做成 repo 里可读、可改、可 diff、可提交的文件。
这条路线的优点
1. 可读性强
这是文件路线最大的优势。
你不需要专门工具就能知道“系统记住了什么”。
- 你能直接打开看
- 你能 grep
- 你能 diff
- 你能人工修正
- 你能 git blame
对工程系统来说,这种透明度非常重要。
2. 更容易纠偏
文件记忆一旦过时,纠偏成本非常低:
- 删掉
- 改掉
- 重写
- 提交一个 commit
这跟复杂 memory backend 相比,维护心理负担要小得多。
3. 与工程工作流天然兼容
代码仓库本来就有:
- 版本控制
- diff
- review
- merge
- 历史追踪
把记忆也放进 repo,本质上是把“知识管理”并入“工程管理”。
这比额外造一个记忆黑盒更自然。
这条路线的问题
1. 更依赖纪律
文件型记忆的弱点在于:
它不自动维护,它要求你持续维护。
如果没有明确流程,最后很可能出现:
- ADR 没人写
- session note 不更新
- 问题列表没人清
- 记忆文件堆着没人看
2. 结构化查询能力较弱
你当然可以 grep,但 grep 不等于图谱查询。
当你需要:
- 精细关系推导
- 跨多个语义层检索
- 自动构造依赖网络
文件型记忆就没有那么“机器友好”。
3. 它更适合“决策记忆”,不一定适合“全量知识记忆”
文件很适合记录:
- 为什么这样设计
- 当前规范是什么
- 还有哪些问题没解决
但它不一定适合自动覆盖整个 codebase 的动态知识网络。
所以文件型记忆强在治理与记录,不一定强在自动抽象整个系统。
四、第三类路线:反记忆立场——memory 太容易变 stale,宁可少记
这类声音也很真实。
有人直接说:
我讨厌 memory system,因为总会留下不再 relevant 的东西。
这句话其实击中了所有记忆系统最大的共同问题:
记忆最难的不是保存,而是淘汰。
为什么 stale memory 很危险
很多人直觉上觉得:
- 有记忆总比没记忆好
但对 agent 系统来说,未必。
因为 stale memory 会导致:
- 旧规则覆盖新规则
- 过时偏好继续生效
- 已废弃架构还被当真
- 被修复的问题继续被当成现状
- agent 因为“自信地记错”而走偏
这比“我不知道”还糟糕。
“我不知道”通常会触发重新检查; “我记得”则会触发错误执行。
这派的真实主张
他们并不是说完全不要记忆,而是在强调:
- 记忆必须节制
- 记忆必须有生命周期
- 记忆必须容易删
- 记忆不能默认越积越多
这其实是一种memory hygiene first 的路线。
从工程视角看,它是非常成熟的:
记忆不是越多越好,而是越干净越有价值。
五、从工程视角看,真正重要的不是“有没有记忆”,而是“什么应该被记住”
我越来越觉得,今天关于 memory 的很多争论,其实都绕开了一个核心问题:
哪些东西值得进入长期记忆?
不是所有信息都配叫 memory。
值得长期保留的,通常是这些
1. 架构决策
例如:
- 为什么选这套分层
- 为什么不用另一种方案
- 为什么接受这个 tradeoff
这类信息最适合做 ADR 或文件型记录。
2. 项目级稳定规则
例如:
- 路径约定
- 平台默认行为
- 发布流程
- 代码风格例外
- 技术栈边界
这类信息很适合写入 AGENTS.md 或项目规则文件。
3. 用户/团队偏好
例如:
- 默认发到哪个平台
- 哪些操作必须确认
- 哪种发布方式是首选
这类信息适合做精简、稳定的 durable memory。
不适合长期保留的,通常是这些
1. 临时任务状态
今天做到哪一步、哪条日志报错,这些更适合 session 级记录。
2. 易过期事实
比如:
- 当前某个页面结构
- 临时 token
- 一次性的 workaround
这些东西一旦过期,就很容易污染系统。
3. 低价值重复信息
不是所有对话都值得沉淀。
如果什么都记,最后就等于什么都没真正记住。
六、我对这几条路线的判断:未来不会只剩一种,而会形成分层
我不认为未来所有智能记忆都会收敛成某一个统一方案。
更可能的现实是:
不同层级的问题,会对应不同层级的记忆。
第一层:短期上下文
- session context
- compaction
- todo
这一层解决当前任务连续性。
第二层:项目级文件记忆
- markdown
- jsonl
- ADR
- AGENTS.md
- session journals
这一层解决长期解释性、协作性、可维护性。
第三层:外部结构化检索记忆
- knowledge graph
- MCP memory
- codebase-memory
- semantic index
这一层解决大型系统里的跨模块理解与机器可检索性。
换句话说,真正成熟的系统未必会在“图谱”和“文件”之间二选一,而更可能是:
- 文件负责可信与可治理
- 结构化系统负责规模化检索与推理加速
这可能才是现实中的最优分工。
七、为什么我认为“最终会回到文件”这个判断很重要
“记忆最后会回到 markdown / jsonl / repo 结构”这条评论之所以有价值,不是因为它说所有高级系统都没用,而是因为它提醒了一个底层事实:
工程系统最终需要可见、可改、可验证的记忆。
而文件正好满足这几点:
- 可见
- 可改
- 可审查
- 可版本化
- 可人工纠错
这意味着哪怕未来大家会继续用:
- MCP memory
- knowledge graph
- 自动索引
- 向量检索
最后也很可能还是要有一个文件化的地面真相层。
否则系统会越来越聪明,却越来越不可治理。
而不可治理的 memory,早晚会反过来伤害 agent。
八、最后的判断:智能记忆的真正竞争,不是“记得更多”,而是“记得更干净、更可纠偏、更有层次”
如果要我用一句话总结今天智能记忆的竞争,我会这么说:
未来记忆系统的胜负手,不是谁存得更多,而是谁能在“结构化、可检索、可维护、可纠错、可淘汰”之间取得更好的平衡。
Knowledge graph / MCP memory 这一路在解决“系统怎么自己理解复杂世界”; Markdown / JSONL / repo memory 这一路在解决“人和 agent 如何共享一个可治理的记忆地面真相”; 反记忆派则一直提醒我们:
记忆如果不能优雅过期,就会从资产变成污染。
从这个意义上说,当下智能记忆真正值得讨论的,不是“要不要 memory”,而是:
- 记忆分几层
- 哪些东西该记
- 谁来维护
- 怎么淘汰
- 怎么纠偏
这才是比“有没有 memory”更深一层的问题。
而我越来越倾向于相信,未来真正稳定的 agent 系统,都会是分层记忆系统:
- 短期上下文负责连续性
- 文件记忆负责治理与决策
- 结构化记忆负责规模化检索
如果没有这三层的边界,memory 迟早会变成一个越长越重、越聪明越脏的系统。
而这,恐怕才是智能记忆真正的工程难题。