Clawdbot(现名Moltbot)是一个开源的本地AI助手,它的记忆系统彻底颠覆了传统AI的"健忘症"——所有记忆都以纯Markdown文件形式存储在你的硬盘上,通过向量搜索和关键词搜索的混合方式实现智能检索,配合自动压缩和预刷新机制确保重要信息永不丢失。
这套系统的核心哲学是:记忆应该是透明的、可编辑的、完全属于用户自己的,而不是被云服务商锁在黑匣子里的数据。
那个让Mac mini卖爆的AI管家
想象一下,你有一个私人助理,它记得你三个月前随口提过讨厌吃香菜,记得你上周三晚上十一点说要修改项目架构,记得你女朋友的名字和生日,而且这些信息全部存在你自己的电脑里,不是存在某个硅谷公司的服务器上。这就是Clawdbot,一个由维也纳程序员Peter Steinberger打造的开源AI助手,MIT协议完全免费,GitHub上已经有超过七万颗星星在闪烁。
这东西火到什么程度?硅谷的程序员们为了运行它,把苹果官网的Mac mini买到断货。有人一口气买了十二台,花了五千美金,就为了搭建一个7x24小时不间断运行的AI军团。为什么大家这么疯狂?因为Clawdbot干了一件其他AI都不敢干的事:它把记忆的控制权完全交还给了用户。
传统的ChatGPT或者Claude,你的聊天记录存在它们的云端,公司说删就删,说改就改,你根本不知道自己说了什么被记住了,什么被遗忘了。Clawdbot不一样,它运行在你的本地机器上,所有的记忆就是一个个普通的Markdown文件,你可以用记事本打开看,可以用Git版本控制,甚至可以手动修改。这种透明度和掌控感,让技术宅们疯狂,也让隐私控们安心。
记忆与语境:两个完全不同的世界
要理解Clawdbot的记忆系统,首先得分清楚两个概念:语境Context和记忆Memory。这俩东西在AI的世界里就像短期记忆和长期记忆在人类大脑里的区别,但很多人混为一谈。
语境是AI每次处理请求时能看到的一切信息,包括系统提示词、对话历史、工具返回的结果、你上传的附件等等。这些东西是临时的、昂贵的、有严格容量限制的。比如Claude的语境窗口是20万token,GPT-5.1是100万token,看起来很大,但聊久了照样会满。而且每多一个token,API调用就要多花钱,响应速度也会变慢。
语境Context就像你办公桌上的便签纸,写满了就得擦掉重写,不然没地方记新东西。
记忆则是存在硬盘上的持久化数据,主要是MEMORY.md文件和memory文件夹里的各种Markdown文档。这些东西是永久的、便宜的、容量无限的。你可以存几年的对话记录,占用的只是硬盘空间,调用API的时候不会多花一分钱。
记忆就像你书房里的档案柜,东西放进去就一直在那里,想什么时候查就什么时候查,想保存多久就保存多久。
Clawdbot的聪明之处在于,它不会傻乎乎地把所有历史对话都塞进语境里让模型看得眼花缭乱。相反,它只在需要的时候,通过搜索工具去记忆里找相关的信息。这样既节省了token,又提高了效率,还能让AI记住无限久远的事情。
每次对话时,模型到底看到了什么
当你给Clawdbot发一条消息时,它背后的AI模型实际上看到的是一份精心准备的"简报",而不是你所有的历史记录。这份简报由四个部分组成,像个四层汉堡一样层层叠加。
最底层是系统提示词,这是静态的指令,告诉AI它是谁、能干什么、有哪些工具可以用。这部分基本不变,是AI的"出厂设置"。
第二层是项目语境,包括AGENTS.md、SOUL.md、USER.md这些启动文件。这些也是Markdown文档,放在工作空间里,每次请求都会加载。你可以把它们理解为AI的"人设档案"和"用户手册",告诉AI它的性格是什么样的,它在帮谁干活,这个人有什么偏好。
第三层是对话历史,包括之前的消息、工具调用记录、还有压缩后的摘要。这部分是动态的,随着对话进行不断增长,但会被压缩机制控制长度。
最上面一层就是你当前发的这条消息。
在这个架构里,跟记忆最相关的就是第二层那些Markdown文件。它们和用户可编辑的记忆文件放在一起,让整个配置过程变得完全透明。你想让AI记住什么重要信息,直接打开文件打字就行,不需要什么复杂的数据库操作。
记忆的物理形态:就是纯文本文件
Clawdbot的记忆系统建立在一个极其简单但极其强大的原则上:记忆就是普通的Markdown文件,存在你的工作空间里。没有什么 proprietary 的二进制格式,没有什么只有开发者才能解析的数据库,就是纯文本,人类可读,机器可编辑。
默认情况下,这些文件存在~/clawd/目录下。结构非常清晰:根目录下有一个MEMORY.md文件,这是长期记忆的精华所在;还有一个memory文件夹,里面按日期存放着每日日志,文件名就是YYYY-MM-DD.md这样的格式,比如2026-01-26.md就是今天的笔记。
第一层记忆是每日日志,这是只追加的流水账,AI在一天里随时往里面写东西。格式很简单,就是时间戳加事件描述:
2026-01-26这一天,上午10点半讨论了API设计,决定用REST而不是GraphQL,确定了几个端点;下午2点15分部署了v2.3.0到生产环境,一切顺利;下午4点用户提到更喜欢TypeScript而不是JavaScript。这些碎片化的信息按时间顺序排列,像日记一样忠实记录着每一天的点点滴滴。
第二层记忆是MEMORY.md,这是经过整理的长期知识库。里面分门别类地存放着用户偏好、重要决策、关键联系人等信息。比如用户偏好这一节会记录你喜欢TypeScript、喜欢简洁的解释、正在做Acme Dashboard项目;重要决策这一节会记录1月15日选了PostgreSQL当数据库,1月20日决定用REST不用GraphQL,1月26日开始用Tailwind CSS做样式;关键联系人这一节会记录Alice是设计负责人,邮箱是什么,Bob是后端工程师,邮箱是什么。
这种双层结构很聪明:每日日志负责记录原始素材,像记者的速记本;长期记忆负责整理归纳,像百科全书。AI会根据情况决定往哪里写,重要的、永恒的、需要反复查阅的信息进MEMORY.md,临时的、细节的、当天发生的事情进每日日志。
SOUL.md:AI的"灵魂文件"
在Clawdbot的系统里,有一个特殊的文件叫SOUL.md,这是AI的"灵魂"所在。这个文件里写着一段指令,规定了AI每次会话开始时的标准作业程序:
首先,读SOUL.md,搞清楚自己是谁;然后读USER.md,搞清楚在帮谁干活;接着读今天和昨天的每日日志,了解最近发生了什么;如果是直接跟人类聊天的主会话,还要读MEMORY.md掌握长期记忆。做完这些准备工作之前,不要问用户"我能帮你什么",直接开始干活就行。
这段指令体现了Clawdbot的设计理念:主动性。AI不应该像个等待指令的仆人,而应该像个有准备的助手,在主人开口之前就已经了解情况、做好功课。你不需要每次都告诉它"我记得我们上周讨论过API",因为它已经自己查过笔记了。
记忆的写入:没有专用工具,只有通用工具
有趣的是,Clawdbot并没有提供一个叫做"memory_write"的专用工具来写入记忆。相反,它使用标准的文件写入和编辑工具,这些工具同样可以用来修改代码、写配置文件、或者干任何其他事情。因为记忆文件就是普通的Markdown,所以可以用普通的方式操作。
这种设计有几个好处。首先,简单。不需要维护一套专门的记忆API,现有的文件操作工具已经足够。其次,灵活。AI可以决定怎么组织记忆的结构,用什么格式,分几个文件,完全自由。第三,透明。用户可以随时打开这些文件查看和修改,AI写入的内容一目了然。
当然,这也意味着AI需要被提示才知道什么时候该写记忆。SOUL.md里会指导它:遇到重要事件、想法、决策、观点、教训时,要写入MEMORY.md;遇到日常琐事、临时信息时,写入memory/YYYY-MM-DD.md。此外,在压缩前的刷新阶段和会话结束时,系统也会自动触发记忆写入。
记忆的索引:从文本到向量的魔法
光把记忆写成Markdown文件还不够,关键在于怎么快速找到需要的信息。当你问"我们上次讨论API的时候决定用什么协议"时,AI不能打开几十个文件逐行扫描,那太慢了。Clawdbot的解决方案是建立索引,把文本变成可以语义搜索的向量。
整个过程是这样的:当你保存一个记忆文件时,文件监视器(用Chokidar库实现)会在1.5秒后检测到变化。为什么是1.5秒?为了批量处理快速连续的写入,避免每改一个字就重建一次索引。然后,文件内容会被切分成大约400个token的片段,每个片段之间有80个token的重叠。
切分的方式很有讲究。400个token既能保证语义连贯性,又不会让单个片段太大失去粒度。80个token的重叠是为了确保跨越片段边界的事实不会被遗漏。比如一句话"我们决定用REST而不是GraphQL,因为团队对REST更熟悉"如果被切成两半,前半句在片段A,后半句在片段B,重叠区就能保证这句话在两个片段里都出现,搜索时不管命中哪个都能找到完整信息。
切分完成后,每个片段会被送到嵌入模型(embedding provider)转换成向量。所谓嵌入,就是把一段文字变成一个高维空间里的坐标,语义相近的文字在这个空间里距离也相近。比如"REST API"和"HTTP接口"的向量会很接近,虽然用词不同但意思一样。Clawdbot支持多种嵌入提供商,包括OpenAI、Gemini,或者本地模型。生成的向量通常是1536维,就是一个包含1536个数字的数组,像[0.12, -0.34, 0.56, ...]这样。
最后,这些向量和对应的文本片段一起存入SQLite数据库,路径是~/.clawdbot/memory/
sqlite-vec是个神奇的扩展,它让SQLite这个轻量级数据库具备了向量搜索能力,不需要再装什么Pinecone、Milvus之类的外部向量数据库。FTS5则是SQLite的原生全文搜索,支持BM25算法,可以根据关键词找到相关文档。这两个结合起来,Clawdbot就能在一个小小的SQLite文件里实现混合搜索,既懂语义又懂关键词。
记忆的读取:两个专用工具的精妙配合
当AI需要回忆过去的事情时,它不会直接打开文件浏览,而是使用两个专门设计的工具:memory_search和memory_get。这两个工具分工明确,配合默契,构成了Clawdbot记忆检索的核心流程。
memory_search是" mandatory recall step",强制性的回忆步骤。每当你问关于之前工作、决策、日期、人物、偏好或待办事项的问题时,AI必须先调用这个工具,在MEMORY.md和memory/*.md里进行语义搜索。它的参数包括查询语句、最大返回结果数、最低相似度分数。比如查询"我们关于API决定了什么",最多返回6条结果,相似度低于0.35的就过滤掉。
返回的结果是个JSON数组,每条结果包含文件路径、起止行号、相似度分数、文本片段、来源标记。比如它可能找到memory/2026-01-20.md的第45到52行,相似度0.87,片段内容是"API Discussion\nDecided to use REST over GraphQL for simplicity..."。这个分数0.87意味着非常相关,远高于0.35的门槛。
找到相关片段后,AI会使用memory_get工具读取具体内容。这个工具需要指定文件路径、起始行号和读取行数。比如读取memory/2026-01-20.md从第45行开始的15行内容,返回的就是完整的文本,包括API讨论的详细记录、决策理由、端点列表等等。
为什么要分两步?因为效率。第一步快速定位可能相关的片段,第二步才读取完整内容。如果一步到位读取所有文件,既浪费token又慢。这种"先搜索后精读"的策略,跟人脑的工作方式很像:先想起大概在哪本书的哪一章,然后翻到那一页仔细阅读。
混合搜索:语义加关键词的双重保险
Clawdbot的搜索不是单一的向量搜索,而是向量搜索和关键词搜索的混合。这就像是给记忆上了双保险,确保不管你怎么描述,都能找到想要的东西。
向量搜索负责语义理解。你搜索"那个数据库的事",即使记忆文件里写的是"PostgreSQL选型讨论",向量也能捕捉到它们的语义关联,因为这两个词在高维空间里距离很近。这种搜索擅长处理同义词、近义词、概念关联。
关键词搜索(BM25算法)负责精确匹配。你搜索"POSTGRES_URL",向量可能不认识这个具体的环境变量名,但BM25能准确找到包含这个字符串的文档。这种搜索擅长处理专有名词、代码片段、具体日期。
最终的排序是加权组合:总分 = 0.7 * 向量分数 + 0.3 * 关键词分数。为什么向量占70%?因为语义相似性是记忆回忆的主要信号,你更可能用"上次说的那个API的事"而不是精确术语来提问。但关键词的30%权重能补上向量的盲区,确保精确术语不会被漏掉。
低于0.35分的结果会被过滤掉,避免返回太多噪声。所有这些参数——权重、阈值、片段大小、重叠量——都可以在配置里调整,适应不同的使用场景。
多智能体隔离:工作与生活分开记忆
Clawdbot支持运行多个智能体,每个智能体有完全隔离的记忆空间。这在实际使用中非常有用:你可以有一个"工作"智能体处理Slack和GitHub,有一个"个人"智能体处理WhatsApp和邮件,两者互不干扰,不会把老板的指令和女朋友的生日搞混。
在文件系统层面,这种隔离是这样实现的:~/.clawdbot/memory/目录下存放着各个智能体的索引文件,比如main.sqlite和work.sqlite。而在工作空间层面,~/clawd/是"main"智能体的家,里面有它自己的MEMORY.md和memory文件夹;~/clawd-work/是"work"智能体的家,同样有独立的记忆文件。
Markdown文件是"真相的源头",存在各自的工作空间里;SQLite索引是"派生数据",存在状态目录里。每个智能体通过agentId + workspaceDir的组合键来识别自己的记忆管理器,默认情况下不会跨智能体搜索记忆。
这种隔离是"软沙盒"而不是"硬边界"。默认的工作目录限制可以防止意外访问其他智能体的文件,但如果AI使用绝对路径,理论上还是可以读到其他工作空间的内容。如果你需要严格隔离,得额外配置沙盒机制。
压缩机制:当记忆太长装不下时
再强大的AI也有语境窗口的限制。Claude能处理20万token,GPT-5.1能处理100万token,但聊久了终究会触及天花板。当语境快满的时候,Clawdbot会启动"压缩"机制,把旧对话总结成摘要,腾出空间继续聊。
想象一下,你们已经聊了150轮,从"我们建个API吧"开始,经历了设计端点、实现JWT认证、添加限流、部署到 staging,现在语境已经用了18万token,接近20万的极限。这时候压缩机制自动触发:它会把前140轮对话总结成一段紧凑的摘要,保留最近10轮的完整内容。
摘要可能长这样:"构建了REST API,包含/users和/auth端点。实现了JWT认证和每分钟100请求的限流。使用PostgreSQL数据库。部署到staging v2.4.0。当前重点:准备生产环境部署。"而第141到150轮的详细对话则原样保留,确保上下文的连贯性。
你会在详细模式里看到提示:" Auto-compaction complete"。然后原来的请求会用压缩后的语境重新发送。重要的是,这个摘要会被写入会话的JSONL转录文件,持久化到磁盘。所以即使你重启了Clawdbot,下次会话开始时也会加载这个压缩后的历史,而不是从空白开始。
你也可以手动触发压缩,用/compact命令,后面可以跟提示词指导压缩的重点,比如"关注决策和未解决的问题"。
预压缩刷新:防止重要信息被"压丢"
压缩机制有个潜在风险:它是"有损"的,基于LLM的总结可能会漏掉重要细节。为了对抗这种信息丢失,Clawdbot设计了一个"预压缩刷新"步骤。
当语境使用量达到软阈值(通常是总窗口减去预留空间再减去安全缓冲)时,系统会插入一个"静默的记忆刷新回合"。这时候AI会收到系统提示:"会话即将压缩,现在把需要持久保存的记忆写入memory/YYYY-MM-DD.md。如果没有要保存的内容,回复NO_REPLY。"
AI会回顾整个对话,找出关键决策、重要事实、用户偏好,把它们写入每日日志。然后回复NO_REPLY,用户看不到这个中间步骤,对话界面保持干净。
这样一来,真正重要的信息已经安全地存到了硬盘上,接下来的压缩过程即使丢失了一些细节,核心知识也不会丢。这种"先存盘再压缩"的策略,就像程序员在重构代码前先提交Git一样,是风险管理的最佳实践。
这个机制在clawdbot.yaml或clawdbot.json里可以配置,包括预留的token数、软阈值、系统提示词、用户提示词等等。
剪枝机制:清理工具输出的噪音
工具调用可能会产生巨大的输出。一个exec命令可能返回5万字符的npm安装日志,一个read命令可能加载1万字符的配置文件。如果把这些都塞进语境,很快就会撑满窗口。Clawdbot的解决方案是"剪枝"(pruning),智能地修剪旧的工具输出。
剪枝是这样的:对于很久以前的工具结果,系统会保留开头和结尾各1500个字符,中间用"[truncated]"代替;对于更旧的工具结果,直接替换成"[Old tool result content cleared]"的占位符。但最近的几条工具结果会被完整保留,确保上下文的连贯性。
重要的是,这种剪枝只影响发送给模型的语境,磁盘上的JSONL转录文件保持完整,所有原始输出都还在那里。这就像是给AI看的是精简版会议纪要,但档案馆里保存着完整的会议录音。
缓存TTL剪枝:省钱的艺术
Anthropic的API有个很棒的特性:提示词前缀可以被缓存最多5分钟,缓存命中的token只需要付10%的费用。但问题是,如果会话空闲超过了5分钟,缓存就失效了,下次请求需要重新缓存整个对话历史,按"缓存写入"的全价收费。
Clawdbot的"缓存TTL剪枝"机制就是用来对付这种情况的。它检测缓存是否已经过期,如果是,就在下次请求前修剪旧的工具结果。需要重新缓存的提示词变小了,费用自然就降低了。
配置里可以设置剪枝模式为"cache-ttl",指定TTL时间(比如600秒匹配缓存控制时间),保留最近几个助手消息的工具结果,以及软剪枝和硬清除的参数。这种精细化的成本控制,对于重度用户来说能省下不少API费用。
会话重置与记忆钩子:自然的边界
会话不会永远持续,它会根据配置规则重置,创造自然的记忆边界。默认是每天重置,但也有其他模式可选。
当你运行/new命令开启新会话时,"会话记忆钩子"会自动触发:系统提取旧会话的最后15条消息,让LLM生成一个描述性的slug(短标识),然后保存到~/clawd/memory/2026-01-26-api-design.md这样的文件里。
新会话开始后,这段上下文就可以通过memory_search被检索到了。这种设计让会话之间的过渡变得平滑,既避免了单个会话无限增长,又确保了重要上下文的连续性。
Clawdbot记忆哲学的四大支柱
回顾整个系统,Clawdbot的记忆设计之所以成功,是因为它坚持了四个关键原则:
第一,透明胜过黑箱。记忆是纯Markdown,你可以读、可以编辑、可以用Git版本控制。没有什么专有格式,没有什么只有开发者才能解析的数据库。你的记忆就是你的文件,放在你的硬盘上,完全属于你。
第二,搜索胜过注入。不是把记忆都塞进语境让模型自己找,而是主动搜索只把相关的内容拿进来。这样语境保持聚焦,成本降低,效率提高。
第三,持久胜过会话。重要信息存在磁盘文件里,而不是仅仅活在对话历史中。压缩机制可能丢失对话细节,但已经写入记忆文件的内容是安全的。
第四,混合胜过单一。纯向量搜索会漏掉精确匹配,纯关键词搜索会错过语义关联,两者结合才能覆盖各种查询场景。
这套系统让Clawdbot不仅是一个工具,更像是一个真正认识你的伙伴。它记得你的喜好,记得你们的共同历史,记得那些只有你们两个知道的细节。而且这种记忆是私密的、本地的、完全受你控制的。在这个数据隐私越来越珍贵的时代,这种设计哲学显得尤为珍贵。
总结
Clawdbot的记忆系统是一套精巧的工程设计,它用最简单的技术(Markdown文件、SQLite数据库、向量搜索)解决了最复杂的问题(AI的长期记忆),同时坚持用户主权至上的原则。从每日日志到长期记忆的双层结构,从混合搜索到预压缩刷新,每个细节都体现了对实用性、透明度和用户控制的追求。
总之:
Clawdbot通过纯Markdown文件存储记忆,结合向量与关键词混合搜索、自动压缩和预刷新机制,实现了透明、持久、用户完全掌控的本地AI记忆系统。
Clawdbot证明了本地优先、用户至上的AI助手不仅可行,而且更受欢迎。
极客辣评:
本文是技术社区对Clawdbot记忆架构最深入的解析之一,其价值在于将复杂的向量检索、语义压缩等技术概念转化为清晰的工作流程说明,既保持了技术准确性又具备极高的可读性。
作者Manthan Gupta通过分层拆解(语境vs记忆、搜索vs读取、压缩vs刷新)帮助读者建立系统性的理解框架,这种"从原理到实践"的叙述方式在技术博客中较为罕见。文章对sqlite-vec、FTS5等具体技术选型的解释,以及预压缩刷新机制的设计 rationale,都为开发者提供了可直接借鉴的工程思路。
本文更像是一份架构设计文档的通俗版,对于想要理解或实现类似记忆系统或者上下文图的开发者具有重要参考价值。