智能记忆的几种模式:Knowledge Graph、MCP Memory 与 Markdown 文件记忆的分野

3 阅读12分钟

智能记忆的几种模式: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-up
  • open-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 迟早会变成一个越长越重、越聪明越脏的系统。

而这,恐怕才是智能记忆真正的工程难题。