用PARA框架知识图谱和原子化事实打造OpenClaw三层记忆系统

本文介绍三层记忆架构让AI助理拥有持久结构化记忆,基于PARA框架组织知识图谱,配合每日笔记和隐性知识,实现记忆衰减与自动提取,用QMD搜索高效检索,全程只用纯文本文件避免平台锁定。

如何让AI助理真正拥有像人一样的长期记忆?不是那种聊完天就忘的傻白甜,而是能记住你讨厌什么、喜欢什么、正在忙什么、过去发生过什么的真记忆。

这套方法用了三个层级来存东西:
第一层是知识图谱,按照PARA方法把人和事分类存好,
第二层是每日笔记,记录每天聊了什么,
第三层是隐性知识,记住你的习惯和偏好。

最重要的是这套系统会自己判断哪些记忆重要该留着,哪些可以暂时放一边,还会自动从聊天记录里提取有用的信息存起来,配合一个叫QMD的搜索工具,让AI找东西又快又准。整套系统只用简单的markdown和JSON文件,不怕被任何平台绑架,换AI助理也能带走全部记忆。



为啥现在的AI助理都是金鱼脑

你有没有遇到过这种情况,跟一个AI聊得火热,它好像特别懂你,知道你最近在忙一个大项目,知道你老板叫啥名字,知道你喜欢用哪个软件写代码。结果第二天重新打开,它一脸懵逼问你"今天有什么可以帮您的",你当场就想摔键盘。这就是现在大多数AI助理的真实写照,记忆跟金鱼一样,只有七秒,甚至更惨,每次对话都是全新的开始,之前聊的啥全忘光光。

这种体验简直让人抓狂。你得一遍又一遍地重复自我介绍,我是干啥的,我在做啥项目,我喜欢什么风格,我讨厌什么语气。有些平台号称有"记忆"功能,但你去看看那玩意儿,就是一堆乱七八糟的事实列表, flat得跟煎饼似的,没有结构,没有重点,没有时间概念,更没有那种"这事儿很重要我得记住,那事儿过去很久了可以淡忘"的智能。

如果你真的想搞一个私人AI助理,不是那种只会陪你聊天的玩具,而是真正能当你的参谋长、帮你打理生活的那种,你就必须给它设计一套真正的记忆架构。不是简单的 bullet list 清单,而是一个完整的系统,有分类、有层级、有更新机制、有遗忘策略。这篇文章介绍的就是这么一套三层的记忆系统,基于一个叫PARA的框架,加上了原子化事实、记忆衰减和自动提取的功能,听起来很学术,其实特别接地气。



三层记忆架构是个啥玩意儿

这套系统把记忆分成三个完全不同的层级,每一层都有自己的任务,就像你脑子里不同类型的记忆一样。

第一层叫知识图谱,存的是关于这个世界的事实性知识,用PARA的目录结构组织,每个实体都有JSON文件存细节,这层是持续更新的,新信息来了就往里面塞。

第二层叫每日笔记,就是按日期排列的原始时间线,每天一个markdown文件,记录当天发生了啥聊了些啥,这层是每次对话都要写的。

第三层叫隐性知识,存在单个markdown文件里,记录的是你的行为模式和偏好,这层更新很慢,只有发现新模式的时候才改动。

你可以把这想象成人的记忆系统:

知识图谱就像你的陈述性长期记忆,是你知道的事实,比如"巴黎是法国首都"或者"我老板叫张三"。
每日笔记就像你的情景Context记忆,是你记得什么时候发生了什么事,比如"上周三我跟客户吵了一架"。
隐性知识就像你的程序性记忆,是你不用想就能做的事,比如"我习惯早上先喝咖啡再工作"或者"我做决定前喜欢先列出所有选项"。

这三层合起来,AI助理才能真正了解你,不是只知道一些零散的事实,而是知道这些事实之间的关系,知道事情发生的时间顺序,知道你的行为规律。



第一层:知识图谱用PARA方法组织

整个系统的核心是一个目录树,用一种叫PARA的方法来组织。PARA是四个单词的首字母,Projects(项目)、Areas(领域)、Resources(资源)、Archives(归档)。你的生活里所有东西都能塞进这四个桶里,而且这些东西会随着时间自然流动,从一个桶跳到另一个桶。

你的目录结构大概长这样:
life文件夹下面有projects、areas、resources、archives四个子文件夹,每个实体文件夹里面有summary.md和items.json两个文件,根目录还有index.md和README.md做总览:

life/
├── projects/          # Active work with clear goals/deadlines
│   └── <name>/
│       ├──summary.md
│       └── items.json
├── areas/             # Ongoing responsibilities (no end date)
│   ├── people/<name>/
│   └── companies/<name>/
├── resources/         # Topics of interest, reference material
│   └── <topic>/
├── archives/          # Inactive items from the other three
├──index.md
└──README.md


Projects 是那些有明确目标和截止日期的活跃工作,比如你要发布一个新产品、要写一本书、要装修房子。这些东西有始有终,做完了就移到Archives里。

Areas 是那些没有结束日期的持续责任,比如你认识的人、你合作的公司、你担任的角色,这些东西会一直存在,不会"完成"。

Resources 是你感兴趣的话题和参考资料,你现在不主动做,但以后可能用得上,比如"机器学习入门"或者"日本旅游攻略"。

Archives 是前面三个桶里不再活跃的东西,项目做完了、某个话题不关注了,就扔到这里,但注意,不是删除,只是搬家,你随时能找回来。

PARA的美妙之处在于,你生活里的每个实体都恰好只属于其中一个桶,而且实体自然会在桶之间流动。

一个项目做完了从Projects移到Archives,一个新责任出现了从Resources变成Areas,这种流动性让系统有生命力,不是死板的分类。



两层检索让AI不变成话痨

每个实体都有两个文件,这不是为了复杂而复杂,是有策略的。summary.md是一个简洁的概述,AI第一次加载某个实体的信息时,先看这个,快速了解基本情况。items.json是一个数组,里面存着所有的原子化事实,只有对话需要细节的时候才加载这个。这种两层检索的设计超级重要,因为AI的上下文窗口是有限的,就像人的工作记忆一样,塞太多东西就爆了。

想象一下,如果每次提到你老板,AI都要把你老板的全部历史、所有细节、每次互动都加载进来,那上下文窗口马上就被占满,根本没法正常对话。但有了summary.md,AI只需要加载几段话就能知道你老板是谁、什么职位、你们什么关系,足够应付大多数对话。只有当你们深入讨论某个具体项目或者某次具体会议时,AI才会去items.json里找细节。这种设计让系统能 scale,能处理成千上万的事实而不变慢。



原子化事实的格式长啥样

items.json里的每个事实都遵循一个固定的格式,这样AI才能理解和处理。

{
"id": "entity-001",
"fact": "Joined the company as CTO in March 2025",
"category": "milestone",
"timestamp": "2025-03-15",
"source": "2025-03-15",
"status": "active",
"supersededBy": null,
"relatedEntities": ["companies/acme", "people/jane"],
"lastAccessed": "2026-01-28",
"accessCount": 12
}


一个事实大概长这样:

有个id标识,比如"entity-001";有个fact字段存具体内容,比如"2025年3月加入公司担任CTO";
有个category字段说明类型,可以是relationship(关系)、milestone(里程碑)、status(状态)、preference(偏好)或context(背景);
有个timestamp记录时间;
有个source说明来源;
有个status字段标记是active(活跃)还是superseded(被取代);
如果被淘汰了,supersededBy字段指向取代它的新事实;
relatedEntities字段列出相关的其他实体,这就是知识图谱的"图谱"部分,把不同实体连接起来;

最后还有lastAccessed和accessCount,用于记忆衰减。

这里面有几个特别重要的设计。

category字段帮助过滤和综合,AI可以根据类型快速找到需要的信息。status和supersededBy实现了"不删除"规则,事实永远不会被删掉,只会被新的取代,旧的保留历史记录。relatedEntities让这成为一个真正的图结构,而不是孤立的笔记集合。lastAccessed和accessCount用来实现记忆衰减,最近用过的东西记得更牢。



永远不删除只更新是核心哲学

这套系统有一条铁律:事实永不删除。当事情发生变化时,旧的事实被标记为superseded,新的事实被创建,supersededBy指针指向新事实。这样你就有了完整的历史链条,可以追溯一个关系是如何演变的,一个项目的范围是什么时候变化的,一个人是什么时候换工作的。

这种设计超级有价值。想象一下,如果你只是简单地更新"张三现在是产品经理",那你就失去了"张三以前是工程师"的信息,也失去了"张三在2024年转行"的时间点。但在这种系统里,你可以看到完整的时间线:张三2020年加入是工程师,2024年晋升为高级工程师,2025年转岗产品经理。supersededBy指针让你能顺着时间线往前走,看到完整的演变过程。这对于理解复杂关系和做决策特别重要,因为很多事情的上下文就藏在历史里。



第二层:每日笔记是原始时间线

每日笔记这一层超级简单,就是按日期命名的markdown文件,存在memory文件夹里,比如2026-01-28.md、2026-01-29.md。这一层是原始时间线,记录"什么时候"发生了"什么",不需要结构化,不需要分类,就是按时间顺序记录每次对话的内容。

memory/
├── 2026-01-28.md
├── 2026-01-29.md
├── 2026-01-30.md
└── 2026-01-31.md


AI在对话过程中会持续往每日笔记里写,这些东西是 messy 的、按时间顺序的、完整的。你可以把它想象成工作日志或者日记,不需要写得漂亮,只需要记录事实。比如"今天用户提到他正在准备产品发布会,压力很大,提到了三个主要风险点..."这样就行。

定期会有一个提取过程,从每日笔记里把持久的事实抽出来,写入知识图谱的相应实体里。但每日笔记本身保留作为source-of-truth时间线,即使提取过程漏了什么,原始记录还在这里。这层是系统的安全网,确保信息不会丢失。



第三层:隐性知识记录你的习惯

第三层是一个单独的文件,记录的不是关于世界的事实,而是关于你这个人如何运作的事实。这包括你的沟通偏好,比如你喜欢用什么工具、喜欢什么格式、喜欢详细还是简洁的回复。包括你的工作风格,比如你怎么头脑风暴、怎么做决定、怎么管理项目。包括你的工具偏好和工作流程。还包括你希望AI遵守的规则和边界。

这层变化很慢,不是每次对话都更新,而是当AI注意到一个新模式的时候才更新。比如你连续三次在AI给出长回复后说"能简短点吗",AI就意识到你喜欢简洁,把这个模式写入隐性知识。这就像是那种"逐渐了解一个人"的过程,需要几个月的合作才能真正摸清楚。

这层特别重要,因为它让AI能预测你的需求。比如如果AI知道你习惯在早上处理邮件下午写代码,那早上给你发长报告,下午给你发代码建议,就会特别合你心意。这种"懂我"的感觉,就是来自隐性知识的积累。



记忆衰减让AI像人一样会遗忘

现在来到最有趣的部分。一个傻系统会把所有事实一视同仁,但人的记忆不是这样工作的,最近常用的信息更容易想起来,很久以前的、很少用的信息会慢慢淡出。这套系统通过recency weighting(新近度加权)来实现这种效果。

每次一个事实在对话中被用到,比如通过搜索找到、在回复中被引用,两件事情会发生:accessCount加一,lastAccessed设为今天。这就创造了一个使用信号,独立于事实创建的时间。一个五年前创建的事实,如果你每周都用,它的accessCount会很高,lastAccessed也会很新。

每周重写summary.md的时候,事实会被分成三个层级。Hot(过去7天访问过)的会 prominently 放在summary.md里,这是AI最先会想到的。Warm(8-30天访问过)的也会放在summary.md里,但优先级较低,可用但不是最优先想到的。Cold(30天以上没访问)的会从summary.md里完全去掉,但关键来了,它们不会被删除,还留在items.json里,随时可以通过搜索找到。如果访问了一个Cold的事实,它就"reheat"(重新加热)了,下次会变成Hot。

高accessCount的事实会抵抗衰减。如果你六个月来每周都引用某个事实,即使这几周没提到,它也不会马上变Cold,这防止了重要但间歇性使用的事实从雷达上消失。衰减模型故意设计得简单,没有指数曲线或可调参数,就是基于新近度的三个层级,用频率做调节器。简单系统更容易理解和调试。



自动提取:心跳机制让系统自己运转

这套系统不依赖用户手动分类和归档信息,而是用一个叫heartbeat(心跳)的定期后台任务。这个任务会扫描最近的对话,寻找新信息,提取持久的事实(关系、状态变化、里程碑、决策),把这些事实写入知识图谱的相应实体,更新每日笔记的时间线条目,增加被引用事实的访问元数据。

提取过程故意跳过闲聊、临时请求和已经捕获的信息,专注于真正重要的东西:人、公司、项目、偏好和决策。这不是无脑地把所有内容都存下来,而是有选择地提取有价值的信息。

对于实体创建,系统有简单的启发式规则:如果一个东西被提到3次以上,或者跟你直接相关,或者是你生活中的重要项目或公司,就创建一个实体文件夹。否则就留在每日笔记里。这防止知识图谱被一次性提及的东西填满,同时确保重要的实体得到适当跟踪。

每周还会进行一次synthesis(综合),从活跃事实重写summary.md,这就是应用记忆衰减的地方:加载所有活跃事实,按新近度层级排序(Hot → Warm → Cold),在每个层级内按accessCount降序排列,把Hot和Warm的事实写入summary.md,把Cold的从summary里去掉(但保留在items.json里)。结果就是summary.md总是反映你对一个实体的当前心智模型,而不是完整历史,完整历史存在items.json里以备需要时查阅。



为啥这套设计真能在实际中work

这套系统在实际使用中表现出几个特别有效的特性。首先是关注点分离,每层都有明确的任务,你不会得到一个试图成为一切的巨大文件。知识图谱处理"什么",每日笔记处理"什么时候",隐性知识处理"怎么做",各司其职。

其次是优雅降级,如果心跳提取漏了什么,它还在每日笔记里。如果summary过时了,完整事实还在items.json里。总有后备方案,不会死机。第三是无信息丢失,结合不删除规则和归档系统,没有东西会真正消失,你总能追溯到什么时候学到了什么,以及它是如何演变的。

第四是上下文窗口效率,分层检索(先看summary,需要时再查facts)意味着AI不会为了加载所有知识而爆掉上下文窗口。大多数对话只需要summary就够了。最后是自然生命周期,实体从Projects流向Archives,事实从Hot流向Warm再流向Cold,系统会呼吸,不是单调增长的静态数据库。



搜索层QMD让找东西不再痛苦

知识库的好坏取决于你能在里面找到东西的能力。随着实体、每日笔记和事实的数量增长,简单的方法比如grep搜索文件、把所有东西加载到上下文里,都会失效。你需要一个真正的搜索层。

QMD是一个本地索引和检索工具, sitting 在纯文件知识库之上。它把markdown文件索引到SQLite数据库里,提供三种搜索模式。Full-text search(BM25)是经典的关键词匹配,带相关性排序,快速可预测,适合当你知道要找什么的时候。Vector similarity search(向量相似性搜索)把文档嵌入成chunks,按语义相似性搜索,适合当你不知道确切措辞但想找相关信息的时候。Combined query(组合查询)合并两种方法,带查询扩展和重排序,是大多数检索的默认选择。

QMD用collection(集合)来组织文件,直接对应三个记忆层。你可以用命令把life目录加为life集合,把memory目录加为memory集合,把clawd目录加为clawd集合。每个集合独立索引,用qmd update命令更新。AI可以跨所有集合搜索,也可以针对特定集合。

当AI需要回忆什么时,它不加载整个知识库,而是查询QMD。比如qmd search "Jane在Acme的角色" -c life做关键词搜索,qmd vsearch "那次关于定价策略的对话"做语义搜索,qmd query "项目范围什么时候变的"做组合搜索。QMD返回带文件路径和行号的排序片段,AI只加载相关部分,几段话而不是整个知识库。这让分层检索在大规模下变得实用:summary提供快速上下文,QMD提供精确查找。

索引需要保持新鲜,因为新事实和每日笔记在不断写入。一个命令就能重新索引所有内容:qmd update重新索引所有集合,qmd update --pull先git pull再索引(如果集合在repo里),qmd embed重建向量嵌入。这作为心跳过程的一部分运行,新事实提取和每日笔记更新后,索引刷新,下次搜索就反映最新状态。



想自己动手搞一套该怎么做

如果你想给自己的AI助理实现类似的东西,这里有个循序渐进的建议。先从目录结构开始,创建PARA文件夹和index.md,别想太多。然后挑一个活跃项目和一个重要的人,创建他们的summary.md和items.json,先在两个实体上把格式搞对,再考虑扩展。

加上每日笔记,开始写带日期的markdown文件,不需要写得漂亮。自动化提取可以后面再加,第一周先手动做,建立对什么算"持久事实"的直觉,然后再建心跳机制。衰减机制最后加,直到你有足够多的事实让summary感觉臃肿,这需要几个月时间。

整套系统故意设计得低技术,markdown文件和JSON,备份到私有git repo。

没有数据库,没有特殊工具,没有厂商锁定。你的AI助理读写纯文件,如果你明天换助理,记忆可以跟着走。