1. 项目概述:为AI编码助手构建一个“会思考”的本地记忆系统
如果你和我一样,长期与Claude Code、Cursor这类AI编码助手并肩作战,一定遇到过这个痛点:每次开启新会话,它都像一张白纸,之前项目里踩过的坑、验证过的方案、对特定代码库的深刻理解,全都得从头再来一遍。我们像是在和一个“金鱼脑”的天才合作,它能力超群,却记不住任何事。这种重复劳动不仅低效,更关键的是,它阻碍了AI助手与我们建立真正的、持续进化的协作关系。
今天要聊的Agentic Memory,就是为解决这个问题而生。它不是另一个需要你部署向量数据库、调用API的复杂中间件,而是一个极简、固执己见、完全基于本地文件的记忆系统。它的核心思想很简单:让AI助手像人类一样,在Markdown文件中记住重要的事实、经验、信念和反思,并在需要时回忆起来,还能定期反思,提炼出更高阶的认知。这套系统由开发者fcarucci开源,我深度使用并改造后,发现它彻底改变了我的AI工作流。
简单来说,Agentic Memory给你的AI编码助手装上了“长期记忆”。它通过一个清晰的“保留 → 召回 → 反思”循环,将零散的会话信息沉淀为结构化的知识资产。所有记忆都以纯文本Markdown格式存储在磁盘上,你可以直接阅读、用Git进行版本管理、用Diff工具对比变化。这种透明性和可控性,对于追求稳定和可审计的开发者而言,是任何“黑盒”向量数据库方案无法比拟的。
2. 核心设计理念与架构解析
2.1 为什么是“固执己见”的文本优先方案?
在AI记忆系统领域,主流方案通常是向量化嵌入+向量数据库检索。这固然强大,但也引入了复杂性:你需要管理嵌入模型、处理相似度阈值、面对一个不透明的“语义搜索”黑箱。对于编码助手这种高度依赖精确事实和具体上下文的场景,语义相似有时会带来无关甚至错误的召回。
Agentic Memory选择了一条不同的路:文本优先,结构为王。它放弃了复杂的向量检索,回归到最基础的文本文件和精确匹配/关键词搜索。这听起来有点“复古”,但其设计哲学非常务实:
- 可读、可调、可版本控制:所有记忆都是
.md文件。你可以用任何编辑器打开MEMORY.md,快速了解AI记住了什么;可以用git diff查看记忆的演变;可以手动编辑或清理过时的条目。这种透明性赋予了开发者终极的控制权。 - 降低幻觉风险:基于关键词和上下文的精确召回,比向量检索更不容易产生“似是而非”的结果。当AI需要回忆“如何在项目X中配置Y”时,它更可能找到你之前确实验证过的那个具体步骤,而不是一个语义相关但细节错误的类似方案。
- 零外部依赖:整个系统只用Python标准库实现。安装即用,无需担心网络、API密钥或额外的服务依赖。这对于在隔离环境或追求极致简洁的开发者来说至关重要。
- 为“反思”而设计:系统强制将“记忆”和“反思”分开。记忆是原始素材,反思是对素材的加工和升华。通过定期运行“反思”子任务,AI可以主动梳理记忆,发现模式,更新自己的“信念”,从而实现认知的进化,而不仅仅是数据的堆积。
这种“固执己见”体现在它强制推行一套清晰的内存分类和存储规范。作为使用者,你需要接受这套规范,但换来的是极低的认知负担和极高的可靠性。
2.2 双层存储与五种记忆类型
系统采用双层存储结构,区分了个人经验与团队知识:
- 用户记忆:存储在
~/.agents/memory/。这里存放的是与你个人工作习惯、跨项目的通用经验相关的记忆。例如,你偏好某种代码风格、常用的Shell命令技巧、对某个特定技术栈的通用理解。 - 项目记忆:存储在
<你的代码仓库根目录>/memory/。这里存放的是与特定代码库强相关的记忆。例如,这个项目的架构决策、曾遇到的诡异Bug及其解决方案、对某个复杂模块的解读、项目特有的环境配置要点。
在这两层结构中,每种记忆又被细分为五种类型,分别存储在不同的Markdown文件中:
经验:存储在
experiences.md。这是最基础的记忆单元,记录具体的交互事件。格式通常是“在什么上下文下,做了什么,结果如何”。例如:“[2024-10-27 15:30] [project:api-server] 尝试将数据库连接池从HikariCP切换到Tomcat JDBC,以解决在K8s中偶发的连接泄漏问题。经过压力测试,Tomcat JDBC表现更稳定。” 一个关键设计是,你可以为经验添加{outcome: success/failure}和{evidence: ...}标签,这能极大地帮助后续的反思过程,尤其是系统会优先审视那些标记为“失败”的经验。世界知识:存储在
world_knowledge.md。这里存放被验证过的客观事实和信息。它来源于经验的提炼,但去除了主观性和上下文。例如:“PostgreSQL 16的gen_random_uuid()函数性能优于uuid-ossp扩展的uuid_generate_v4()。” 这不再是“我那次尝试...”,而是“经确认,事实是...”。信念:存储在
beliefs.md。这是系统的主观判断和启发式规则。它是可变的,会随着新经验的积累和反思而更新。例如:“信念:在本项目的微服务架构中,使用gRPC进行服务间通信比RESTful HTTP更可靠,但调试复杂度更高。” 信念是AI决策的重要依据。反思:存储在
reflections.md。这是最高阶的记忆,是AI对一系列经验或知识进行深度思考后得出的模式、原则或教训。例如:“反思:项目初期对数据库选型的犹豫(考虑过MongoDB,最终选择PostgreSQL)导致了数据模型的重构。教训:对于强事务一致性的核心业务,应尽早确定关系型数据库,避免后期切换成本。”实体摘要:存储在
entity_summaries.md。这是对系统中重要“实体”(如关键函数、核心类、主要配置文件、重要外部服务)的浓缩描述。它综合了关于该实体的所有相关记忆。例如:“实体:UserService.createUser方法。摘要:负责用户创建的核心方法。历史问题:2024-09曾因未校验邮箱唯一性导致重复数据。当前逻辑:包含密码加密、邮箱校验、初始角色分配。关联模块:AuthService, EmailQueue。”
2.3 核心工作流:保留、召回、反思
整个系统的运作围绕一个核心循环展开:
- 保留:当你在与AI的对话中说“记住这个”或完成一项实质性任务时,会触发
remember操作。系统不会让主AI直接写文件,而是会生成一个子AI,专门负责评估当前信息,将其分类并格式化后,写入对应的记忆文件。这个过程是“受保护的写入”,会进行去重、有效性等基础检查。 - 召回:在会话开始、或深入某个任务前,AI可以主动
recall相关记忆。你可以问“关于X你记得什么?”,系统会从多层记忆文件中搜索关键词,并组织成上下文提供给AI。这相当于给AI加载了“背景知识”。 - 反思:这是系统“变聪明”的关键。通过
reflect操作(同样由专属子AI执行),AI会审视积累的经验和知识,尝试更新信念、生成新的反思、或提炼实体摘要。反思可以手动触发,也可以在积累一定量的新记忆后自动进行。
这个循环使得记忆不是静态的存档,而是一个动态的、不断进化的知识体系。AI助手通过它,实现了从“单次会话工具”到“持续学习的伙伴”的转变。
3. 实战部署与集成指南
3.1 安装与初始化
安装过程极其简单,在你的项目根目录下执行一行命令即可:
curl -fsSL https://github.com/fcarucci/agentic-memory/raw/main/install.sh | bash -s --这条命令会将agentic-memory的技能文件克隆到你的项目下的skills/memory/目录中。安装完成后,用户记忆目录~/.agents/memory/会在第一次使用时自动创建。项目记忆目录<repo>/memory/则会在你首次执行项目范围的记忆操作(如remember this in the project)时创建。
注意:安装脚本默认克隆到
skills/memory/。如果你使用的AI助手(如Cursor)有特定的技能目录规范(例如.cursor/skills/),你可能需要在安装后手动移动目录,或修改后续集成步骤中的引用路径。
3.2 与AI助手深度集成:修改AGENTS.md
安装文件只是第一步,要让你的AI助手真正“学会”使用记忆,关键在于修改它的指导文件——通常是项目根目录或全局配置中的AGENTS.md或类似文件。你需要在这里明确告诉AI助手记忆技能的存在和规则。
以下是一个强推荐的集成配置片段,你可以直接粘贴到你的AGENTS.md中:
## 记忆系统使用规范 你装备了**Agentic Memory**技能。所有与记忆相关的操作,**必须**严格遵循 `skills/memory/SKILL.md` 中的定义。你是记忆系统的“宿主”,负责调度,但绝不能越权直接操作记忆文件。 ### 核心规则 1. **会话初始化**:每次新会话开始时,自动从相关记忆(用户和本项目)中加载一个摘要作为上下文。不要询问用户是否需要。 2. **深度工作前**:在开始一项复杂任务(如重构模块、调试复杂问题)前,自动执行针对该任务主题的`recall`,检索相关记忆。 3. **记忆写入**:当用户说“记住这个”、“备注一下”或暗示需要保存信息时,你必须**生成一个子AI**来执行`remember`操作。宿主AI不得直接编写记忆文件。 4. **反思与维护**:`reflect`(反思)、`maintain`(维护清理)、`promote`(提升至项目记忆)操作**同样必须**由专属的子AI执行。 5. **任务结束**:当用户明确表示会话或任务完成(如说“我们完成了”、“就这样吧”、“谢谢,结束了”),且本次会话有实质性工作时,必须触发`task-done`清扫流程:询问本次会话的收获,并为每一条有价值的收获生成一个`remember`子AI进行保存。 6. **文件操作**:禁止直接编辑`MEMORY.md`或`memory/`目录下的单个记忆文件。所有写入必须通过技能定义的`remember`子流程完成。 7. **用户交互**:不要指导用户去运行`skills/memory/scripts/`下的任何Python脚本。用户应始终通过自然语言与你交互来使用记忆功能。 ### 路径与配置 - 技能路径:`skills/memory/` - 主规则文件:`skills/memory/SKILL.md` - 模型配置(如适用):会参考 `~/.agents/memory/memory-skill.config.json`。这段指令的核心是确立技能的权威性,并明确宿主与子AI的职责边界。这能有效防止AI助手因为“热心”而破坏记忆系统的结构。
3.3 关键配置详解:为不同任务分配不同AI模型
这是一个高级但极具价值的功能。在~/.agents/memory/目录下,你可以创建一个memory-skill.config.json文件,来精细控制执行不同记忆任务时使用的AI模型。其目的是用更便宜、更快的模型处理简单记录,用更强、更贵的模型进行深度反思。
配置采用分层覆盖机制:
- 全局层:定义默认的模型预设和动作映射。
- 主机层:针对不同的AI开发工具(如Cursor, Claude Code),覆盖全局设置。
{ "version": 1, "default_preset": "balanced", "presets": { "strong": "claude-3-5-sonnet-20241022", "balanced": "claude-3-haiku-20240307", "fast": "claude-3-haiku-20240307" }, "actions": { "remember": "fast", "reflect": "strong", "maintain": "balanced", "promote": "balanced" }, "overrides": { "remember_when_auto_reflect": "strong" }, "hosts": { "cursor": { "presets": { "strong": "claude-sonnet-4-5-thinking", "balanced": "default", "fast": "claude-haiku-4-5" } }, "claude": { "presets": { "strong": "claude-opus-4-5-20251101", "balanced": "claude-sonnet-4-5-20250929", "fast": "claude-haiku-4-5-20251001" } } } }配置解析:
presets:定义了名为strong,balanced,fast的模型配置,其值是具体平台的模型ID。actions:将记忆操作映射到某个预设。这里让常规的remember用fast(快而省),让reflect用strong(需要深度思考)。overrides:特殊情况覆盖。remember_when_auto_reflect表示当remember操作触发了自动反思时,则使用strong模型,确保反思质量。hosts:针对特定工具覆盖presets。因为不同工具内的模型ID命名不同。
系统如何知道用哪个hosts配置?它会自动检测环境变量(如CLAUDECODE=1或CURSOR_AGENT)。你也可以通过设置MEMORY_SKILL_HOST环境变量或使用--host参数来手动指定。
实操心得:一开始可以不用配置,使用默认设置。当你发现
reflect输出的内容质量不高,或者想优化API成本时,再配置这个文件。将remember设为快速模型,能显著降低频繁记录带来的token消耗。
4. 日常使用:自然语言驱动的记忆工作流
集成完成后,你几乎不需要学习任何命令。所有操作都通过与你AI助手的自然对话完成。下面是一些核心场景的对话示例。
4.1 场景一:保存重要信息(保留)
当你和AI助手讨论出一个有价值的结论或解决方案时,直接告诉它。
- 你说:“记住这一点:在这个项目里,我们决定用
Pydantic Settings来管理配置,因为它能很好地处理环境变量和嵌套模型。” - AI助手响应:它会识别出这是
remember意图。然后,它会暂停当前对话,生成一个子AI。这个子AI会分析这句话,将其分类为“世界知识”或“项目相关信念”,并格式化成标准条目,写入对应的world_knowledge.md或beliefs.md文件。完成后,主AI会告诉你:“已将此决策作为项目记忆保存。”
4.2 场景二:查询已有记忆(召回)
在开始一项新工作前,或者遇到一个似曾相识的问题时,主动询问。
- 你说:“关于用户认证模块,你之前记得什么?”
- AI助手响应:它会执行
recall操作,在用户和项目记忆文件中搜索“用户认证”、“auth”等关键词。然后它会整理出一段摘要,例如:“根据记忆,我们在2024年10月重构了认证流程,引入了JWT,并将密钥管理移到了K8s Secret中。有一个关于Token刷新机制的实体摘要,指出当前实现存在竞态条件风险。” 这样,AI在开始新工作前就拥有了上下文。
4.3 场景三:定期总结与升华(反思)
记忆积累多了,需要整理和提炼。你可以定期(比如每周)或在大里程碑后主动触发。
- 你说:“反思一下你最近的记忆。”
- AI助手响应:它会识别出
reflect意图,并生成一个专用的反思子AI。这个子AI会浏览近期的experiences.md,特别是那些标记了outcome: failure的经验,结合world_knowledge和beliefs,尝试总结模式。它可能会输出:“反思:过去两周三次数据库超时问题,均与批量插入未分页有关。更新信念:‘在本项目中,任何超过100条的批量操作都必须实现分页和间歇提交’。同时,为‘BatchInsertService’生成新的实体摘要,强调此分页要求。” 这些新内容会被写入reflections.md和beliefs.md。
4.4 场景四:会话结束时的学习(任务完成清扫)
这是将单次会话价值最大化的关键。当你完成一个有效的编程会话后,不要只是说“谢谢”。
- 你说:“好了,这个问题解决了,我们完成了。”
- AI助手响应:它会识别出任务结束信号,触发
task-done sweep流程。它会问你:“我们从刚才的会话中学到了什么值得长期记住的东西吗?” 你可能会回答:“学到了用asyncio.gather并发调用这三个API时,需要为每个任务设置独立的超时,否则一个阻塞会拖慢全部。” - AI助手会为每一条你确认的收获,生成一个独立的
remember子AI,将这条经验保存下来。这个过程确保了有价值的对话片段不会流失。
4.5 场景五:记忆维护与清理
记忆系统不是只增不减的。无用的、过时的记忆会污染检索结果。
- 你说:“清理一下记忆库。”
- AI助手响应:触发
maintain操作,并由子AI执行。子AI会扫描所有记忆,识别出可能“陈旧”的条目(例如很久未提及、来源模糊的信念),或“薄弱”的条目(缺乏证据支持的经验),生成一份报告供你审查,或根据规则自动清理。
5. 文件结构与工作原理解析
理解文件结构,有助于你在必要时进行手动审查或调试。
5.1 项目记忆的文件布局
假设你的项目叫my-api-server,项目记忆的完整结构如下:
my-api-server/ ├── MEMORY.md # 【核心】精编主索引文件 ├── memory/ # 详细记忆分区目录 │ ├── experiences.md # 按时间排序的具体经历 │ ├── world_knowledge.md # 客观事实库 │ ├── beliefs.md # 主观信念与启发式规则 │ ├── reflections.md # 高阶反思与模式总结 │ └── entity_summaries.md # 关键实体(类、函数等)摘要 └── (其他项目文件...)MEMORY.md的精髓:这个文件不是所有记忆的简单堆积。它是通过curate命令生成的精编索引。其内容类似:
# 项目记忆精编 ## 世界知识精选 - [数据库] PostgreSQL 16的gen_random_uuid()性能优于uuid-ossp。 [详情](./memory/world_knowledge.md#postgresql-16-gen_random_uuid) - [部署] 在K8s中,应用就绪探针比存活探针的初始延迟应设置得更长。 [详情](./memory/world_knowledge.md#k8s-probes) ## 当前核心信念 - 信念:API响应时间超过200ms必须优化。 [详情](./memory/beliefs.md#api-response-time) - 信念:错误日志必须包含请求ID。 [详情](./memory/beliefs.md#error-logging) ## 实体摘要 - [Service] UserService:负责用户CRUD,历史上有邮箱唯一性Bug。 [详情](./memory/entity_summaries.md#userservice)这个文件非常“薄”,只包含最关键信息的链接。它的目的是让AI(或你)在会话初始化时能快速加载一个高质量的知识概览。当记忆条目非常多时,这种“索引-详情”的结构比一个庞大的单体文件要高效得多。
5.2 记忆的写入与更新机制
所有写入操作都通过skills/memory/scripts/下的Python助手脚本完成,但用户不直接调用。以remember为例,其内部流程如下:
- 触发:用户说出触发短语。
- 子AI生成:宿主AI根据
SKILL.md的规则,生成一个带有特定指令的子AI。指令会要求子AI分析输入内容,判断其类型(经验/知识/信念等),并格式化为标准Markdown。 - 调用脚本:宿主AI调用
memory_helper.py的retain函数,传入子AI格式化好的内容、记忆类型、作用域等参数。 - 守护写入:脚本执行守护逻辑:
- 去重检查:计算新内容的哈希或关键特征,与已有记忆对比,避免完全重复的记录。
- 格式验证:确保内容符合该记忆类型的模板。
- 文件写入:将新条目追加到对应的
memory/*.md文件末尾。 - 更新索引:如果此次写入的内容属于
world_knowledge,beliefs, 或entity_summaries,脚本会在操作结束后自动触发curate流程,重新生成精编的MEMORY.md索引文件,确保索引与详情同步。
重要提示:
reflect和maintain操作可能会修改或删除已有的记忆条目。系统设计上,这些“改写”操作是安全的,因为它们也由专门的子AI在严格指令下执行,并且会再次触发curate来更新索引。不过,由于所有文件都是纯文本且受版本控制,你随时可以回滚。
6. 故障排查与最佳实践
6.1 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| AI助手说“找不到记忆技能”或“SKILL.md不存在”。 | 1. 安装路径不正确。 2. AGENTS.md中引用的技能路径错误。 | 1. 检查skills/memory/目录是否存在于项目根目录下。2. 核对 AGENTS.md中skills/memory/SKILL.md的路径是否正确。如果是全局配置,需使用绝对路径或环境变量。 |
| 触发“记住”后,AI没有生成子AI,而是尝试自己写文件。 | AGENTS.md中的指令不够强硬,AI没有严格遵守子AI规则。 | 强化AGENTS.md中的指令,明确强调“必须生成子AI”、“宿主禁止直接写入”。参考本文3.2节的示例。 |
MEMORY.md文件内容混乱,或与memory/目录下的文件不同步。 | 1. 有人或AI直接编辑了MEMORY.md。2. curate过程未自动执行或失败。 | 1.禁止任何直接编辑MEMORY.md的行为。所有编辑应通过remember/reflect等技能操作间接完成。2. 手动运行一次 curate操作:对AI说“整理一下记忆索引”。系统会重新从分区文件生成干净的MEMORY.md。 |
| 记忆检索时感觉相关条目没被找到。 | 1. 记忆条目中的关键词与你查询的词不匹配。 2. 记忆条目格式不规范,影响脚本解析。 | 1. 记忆系统基于文本搜索,尽量使用在记忆中可能出现的精确术语进行查询。 2. 确保记忆是通过技能操作写入的,以保证格式统一。可以检查 memory/下的文件,条目是否清晰分点、带有日期和上下文标签。 |
| 在Claude Code中工作正常,切换到Cursor后记忆不生效。 | 未正确配置memory-skill.config.json中的hosts部分,导致模型预设解析失败,子AI生成指令错误。 | 1. 检查环境变量,确认MEMORY_SKILL_HOST是否设置,或AI工具是否提供了正确的检测信号。2. 在 memory-skill.config.json中明确为hosts.cursor配置适合Cursor的模型ID预设。 |
| 任务结束时,AI没有询问学习收获。 | 用户结束会话的短语未被识别为“实质性任务完成”。系统可能将“谢谢”等礼貌用语与任务结束信号混淆。 | 使用更明确的结束短语,如“我们完成了”、“这个任务结束了”、“没有其他问题了,本次工作结束”。确保在AGENTS.md中明确这些触发短语。 |
6.2 个人实践中的经验与技巧
从“项目记忆”开始:个人记忆容易变得杂乱。建议先在一个具体的项目中启用此系统,专注于积累该项目相关的技术决策、Bug解决方案和架构理解。看到它在具体上下文中的价值后,再考虑使用用户记忆。
主动引导“反思”:不要等到记忆堆积如山。在完成一个功能模块或解决一个复杂问题后,主动对AI说:“基于我们刚才的工作,做一次反思。” 这能及时将新鲜经验转化为高质量的知识和信念。
善用“实体摘要”:对于项目中的核心类、关键函数、重要配置文件,可以主动命令AI为其创建或更新实体摘要。例如:“为
PaymentGateway这个类创建一个实体摘要,总结它的职责、已知问题和关联模块。” 这相当于为代码库建立了活的、由AI维护的注释文档。版本控制你的记忆:将
MEMORY.md和memory/目录纳入Git仓库。这样,记忆的演变就成了项目历史的一部分。你可以清晰地看到,随着项目发展,AI(和团队)的认知是如何变化的。这在复盘和新人 onboarding 时极具价值。保持记忆的“精炼”:定期使用
maintain(维护)功能。系统可能会标记出一些陈旧、模糊的记忆。审视并清理它们,能保持记忆库的检索效率和相关性。记住,记忆的质量远比数量重要。不要害怕手动微调:虽然系统强调通过AI操作,但你是最终所有者。如果发现某个信念条目表述不准确,或者某个反思不够深入,可以直接用文本编辑器打开对应的
.md文件进行修改。系统的兼容性很好,手动编辑后,只要格式保持大致一致,后续的curate操作仍然能正常工作。
这个系统的魅力在于,它用一种极其简单、透明的方式,解决了AI助手缺乏持久化记忆的核心难题。它不追求炫酷的向量检索,而是用严谨的结构和清晰的工作流,将每一次人机对话的精华沉淀下来,让AI真正成为你项目中一个“有记性”、“会成长”的长期伙伴。