
先说个事儿
你之前有没有遇到过这种情况------跟 AI 聊得好好的,突然它来一句"我不记得你之前说过什么"?
这种情况应该以前有,现在各大产品应该都处理优化了。
makefile
我: 我正在开发一个 React 项目
AI: 好的,有什么我可以帮助你的?
我: 帮我优化一下代码
AI: 什么代码?
这就是典型的"金鱼记忆"。7 秒就忘,每次对话都是全新的开始。
我在做 mini-cc 的时候,这个问题也是我重点关注的问题。
后来我先去看了 Claude Code 的处理,还去找了一些相关文章看了看。
今天就来聊聊我是怎么给 mini-cc 加上记忆能力的。
设计思路
说实话,一开始我想搞个向量数据库,弄个 Embedding 模型,整得高大上一点。
后来一想------太复杂了。我就想让它能记住几件事儿,用不着整那些花里胡哨的。(后续我会考虑是否需要支持更复杂的记忆功能)
最后我选了个最朴素的方案:直接用文件系统存记忆。
bash
.ai_memory/
├── MEMORY.md # 索引文件,相当于目录
├── project_stack.md # 项目技术栈
├── coding_style.md # 编码风格
└── api_endpoints.md # API 配置
简单、直接、看得见摸得着。就算 mini-cc 挂了,我也能直接打开文件看看里面记了啥。
核心功能一:让 AI 会"记笔记"
我做了个 remember 技能,让 AI 能主动把重要信息存下来。
怎么用?
makefile
我: 记住,我的项目名称叫 mini-cc
AI: 好的,我已经记住了你的项目名称是 mini-cc。
(过了很久,另起一个对话)
我: 帮我启动我的项目
AI: 根据记忆,你的项目是 mini-cc,正在帮你启动...
怎么存的?
我用了"两步走"的方式:
- 详细内容 写入独立的
.md文件 - 一句话摘要 写入
MEMORY.md索引文件
比如:
markdown
# MEMORY.md(索引文件)
- [project_stack](./project_stack.md): 项目使用 TypeScript + React
- [coding_style](./coding_style.md): 使用 2 空格缩进
markdown
# project_stack.md(详细内容)
---
type: architecture
description: 项目技术栈说明
---
项目使用 TypeScript + React 架构,采用函数式编程风格。
主要依赖:
- React 18
- TypeScript 5
- Vite
防爆机制
一开始我没限制索引文件的大小,结果 AI 疯狂往里面写,几百行都不停。后来我加了个限制------索引最多 10 行,超了就截掉最老的。
这个"防爆机制"救了我好几次。
核心功能二:记忆扫描与检索
记忆存多了,怎么找到相关的?我做了个扫描机制。
扫描逻辑
- 扫描
.ai_memory目录下的所有.md文件 - 读取每个文件的 frontmatter,提取
type和description - 按修改时间排序,最新的排前面
- 最多返回 200 个文件(防止太多撑爆内存)
检索逻辑
目前我用的是关键词匹配------简单粗暴但够用。
比如用户问"我的 API 配置是什么",系统就会在记忆描述里搜 "API" 这个关键词,找到相关的记忆返回给 AI。
未来想做的:接入 Embedding 模型,做语义搜索。但现在这个关键词匹配已经能覆盖 90% 的场景了,先这样吧。
核心功能三:消息压缩
这个是处理"对话太长"的问题。
你跟 AI 聊久了,对话历史会越来越长,最后超过模型的上下文窗口,就会报错。
我的压缩策略
第一步:剥离图片
把消息里的图片块替换成 [image] 占位符。一张图片可能占几千个 tokens,替换成 6 个字符的占位符,省大了。
第二步:头部截断
如果还是超限,就直接扔掉最老的消息。默认扔 20%。
一开始我想调用 AI 做智能摘要,后来发现------太慢了。用户等不起。直接截断虽然粗暴,但快。
第三步:保底策略
至少保留一轮对话,确保 AI 还能正常工作。
这套"逃生舱"机制,虽然不优雅,但确实救急,简单粗暴有效。
还没做的功能
会话管理
我想做 /new 创建新会话,/sessions 切换会话。但目前还没实现,排期中,可关注后续更新。
语义搜索
关键词匹配够用,但不够智能。想接入 Embedding 模型,做真正的语义搜索。
自动记忆提取
现在是用户主动说"记住 xxx",AI 才会存。理想情况是 AI 自动识别重要信息,主动存下来。
我的体会
做这套记忆系统,我有几个感受:
-
简单比完美重要。一开始想搞向量数据库,后来发现文件系统就够了。别过度设计。先从简单的来。
-
防爆机制必须有。AI 写东西没轻没重,得给它设个上限。
-
关键词匹配够用。语义搜索听起来高大上,但关键词匹配能覆盖大部分场景。
-
压缩要快。用户等不起智能摘要,直接截断虽然粗暴,但有效。
源码在哪?
如果你感兴趣,可以看看这些文件:
- 记忆管理:
src/memdir/MemoryManager.ts - 记忆扫描:
src/memdir/memoryScan.ts - 相关性查找:
src/memdir/findRelevantMemories.ts - 消息压缩:
src/services/compact/compact.ts - Remember 技能:
src/skills/built-in/remember.ts
最后问一句:大家觉得 AI 的记忆系统还需要啥功能?评论区聊聊。有什么心得可以一起分享。
🌟 如果觉得有用
- ⭐ Star 一下 :GitHub 仓库
- 📝 关注博客:后续还会更新更多内容
你的支持是我继续写的动力!🚀