mini-cc 的记忆引擎:让 AI 别再当金鱼了

先说个事儿

你之前有没有遇到过这种情况------跟 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,正在帮你启动...

怎么存的?

我用了"两步走"的方式:

  1. 详细内容 写入独立的 .md 文件
  2. 一句话摘要 写入 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 行,超了就截掉最老的。

这个"防爆机制"救了我好几次。

核心功能二:记忆扫描与检索

记忆存多了,怎么找到相关的?我做了个扫描机制。

扫描逻辑

  1. 扫描 .ai_memory 目录下的所有 .md 文件
  2. 读取每个文件的 frontmatter,提取 typedescription
  3. 按修改时间排序,最新的排前面
  4. 最多返回 200 个文件(防止太多撑爆内存)

检索逻辑

目前我用的是关键词匹配------简单粗暴但够用。

比如用户问"我的 API 配置是什么",系统就会在记忆描述里搜 "API" 这个关键词,找到相关的记忆返回给 AI。

未来想做的:接入 Embedding 模型,做语义搜索。但现在这个关键词匹配已经能覆盖 90% 的场景了,先这样吧。

核心功能三:消息压缩

这个是处理"对话太长"的问题。

你跟 AI 聊久了,对话历史会越来越长,最后超过模型的上下文窗口,就会报错。

我的压缩策略

第一步:剥离图片

把消息里的图片块替换成 [image] 占位符。一张图片可能占几千个 tokens,替换成 6 个字符的占位符,省大了。

第二步:头部截断

如果还是超限,就直接扔掉最老的消息。默认扔 20%。

一开始我想调用 AI 做智能摘要,后来发现------太慢了。用户等不起。直接截断虽然粗暴,但快。

第三步:保底策略

至少保留一轮对话,确保 AI 还能正常工作。

这套"逃生舱"机制,虽然不优雅,但确实救急,简单粗暴有效。

还没做的功能

会话管理

我想做 /new 创建新会话,/sessions 切换会话。但目前还没实现,排期中,可关注后续更新。

语义搜索

关键词匹配够用,但不够智能。想接入 Embedding 模型,做真正的语义搜索。

自动记忆提取

现在是用户主动说"记住 xxx",AI 才会存。理想情况是 AI 自动识别重要信息,主动存下来。

我的体会

做这套记忆系统,我有几个感受:

  1. 简单比完美重要。一开始想搞向量数据库,后来发现文件系统就够了。别过度设计。先从简单的来。

  2. 防爆机制必须有。AI 写东西没轻没重,得给它设个上限。

  3. 关键词匹配够用。语义搜索听起来高大上,但关键词匹配能覆盖大部分场景。

  4. 压缩要快。用户等不起智能摘要,直接截断虽然粗暴,但有效。

源码在哪?

如果你感兴趣,可以看看这些文件:

  • 记忆管理: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 仓库
  • 📝 关注博客:后续还会更新更多内容

你的支持是我继续写的动力!🚀

相关推荐
JavaGuide14 小时前
终于有好用的 Claude Code 状态栏增强插件了!
前端·后端·ai编程
丷丩14 小时前
MapLibre GL JS第12课:检查WebGL支持
前端·javascript·map·webgl·mapbox·maplibre gl js
巴巴博一14 小时前
【AI 赋能前端】告别手写样式!ui-ux-pro-max-skill 插件完整使用指南(附高阶 Prompt 模板)
前端·css·人工智能·ui
shibushi11414 小时前
mediawiki安装
前端
Irissgwe14 小时前
十、LangGraph能力详解(1)LangGraph介绍及核心概念
python·ai·langchain·ai编程·工作流·langgraph
KaMeidebaby14 小时前
卡梅德生物技术快报|斑点杂交 + 膜芯片:6 种水果源性成分检测技术实操拆解
前端·人工智能·物联网·其他·百度·新浪微博
我有满天星辰14 小时前
【那些年踩过的坑-前端篇- Mac版本】Mac 从零搭建 Node 环境:nvm + Node + Vue 实战(避坑终极版)
前端·vue.js·macos
Beginner x_u15 小时前
前端八股整理(手写 03)|防抖节流、深拷贝、函数柯里化
前端·深拷贝·防抖节流·手撕·函数柯里化
纸枫林15 小时前
Notebooklm的cli来了
ai编程·skill