为AI编程助手构建本地持久化记忆系统:告别重复对话,实现上下文共享
1. 项目概述:为AI编程助手构建持久化记忆系统
如果你和我一样,日常开发中重度依赖Claude Code、Cursor这类AI编程助手,那你一定遇到过这个痛点:每次开启一个新的对话会话,AI助手就像得了“健忘症”,完全不记得你之前是谁、在做什么项目、有什么特殊偏好。你不得不一遍又一遍地重复介绍自己:“我是后端工程师”、“我们项目用的是TypeScript”、“部署窗口是每周三下午”。这种重复劳动不仅低效,更关键的是,它阻碍了AI助手真正成为你的“长期搭档”——一个能记住你工作习惯、项目上下文和个人偏好的智能伙伴。
agent-memory 这个开源项目,就是为了解决这个核心痛点而生的。它是一个轻量级、本地优先的持久化记忆系统,专门为AI编程助手设计。简单来说,它在你本地电脑上运行一个SQLite数据库,让所有你使用的AI助手(无论是Claude Code、Cursor、Aider还是Gemini CLI)都能共享同一个“记忆库”。你告诉一个助手的信息,其他助手在下一次会话中也能“回忆”起来。它的工作原理是通过一个“钩子”(hook)脚本,在每次你向AI发送消息前,自动查询这个记忆数据库,并将相关的上下文信息(比如你的职业、项目关键决策、今天的日志)作为前缀注入到对话中,AI助手在回复时就能看到这些背景信息。
这个项目的核心价值在于“一次录入,处处可用”。想象一下这样的场景:周一你用Claude Code讨论了一个新的微服务架构决策,并让它记住“API网关的认证层决定采用JWT”。周二你切换到Cursor继续开发,在讨论相关代码时,Cursor会自动看到这条决策记录,避免提出与既定方案冲突的建议。这不仅仅是省去了重复输入的时间,更是让AI助手的工作流具备了连续性和一致性。
2. 核心架构与设计思路拆解
2.1 为什么选择SQLite作为存储后端?
agent-memory 的核心存储是一个SQLite数据库( ~/.agent-memory/memory.db )。这个选择看似简单,实则经过了深思熟虑,完美契合了项目的目标和场景。
首要考量是零依赖与极致轻量。 AI助手本身已经是资源消耗大户,为其增加的记忆系统绝不能成为新的负担。SQLite作为一个进程内数据库,无需安装和运行独立的数据库服务(如PostgreSQL或MySQL),它只是一个 .db 文件。Python 3.9+和大多数Linux/macOS系统都内置了SQLite支持,这意味着 agent-memory 在绝大多数开发者的机器上可以做到真正的“开箱即用”,没有任何额外的环境配置负担。这对于一个旨在提升体验的工具来说至关重要,安装复杂度每增加一分,用户流失率就可能呈指数上升。
其次是读写性能与并发安全。 AI助手的交互是高频、低延迟的。每次用户提问前,钩子脚本都需要查询数据库并生成上下文。SQLite在应对这种轻量级、高并发的读操作(每个会话可能触发多次查询)时表现优异。虽然它不适合高并发的写操作,但在 agent-memory 的场景下,“写”操作(保存新记忆)的频率远低于“读”操作,且通常由AI助手在后台异步执行,不会阻塞用户交互。SQLite的ACID事务特性也保证了即使在多个AI助手进程同时尝试写入时(虽然不常见),数据的一致性和完整性也不会被破坏。
最后是灵活性与可控性。 使用SQLite意味着所有数据都存储在你本地的一个文件里。这带来了几个关键优势:第一是 隐私安全 ,你的所有记忆(工作内容、个人偏好)都不会离开你的电脑,这对于处理公司代码和敏感信息的开发者来说是底线要求。第二是 可移植性和备份 ,你可以轻松地复制、备份这个 .db 文件,甚至通过 mem export/dump 命令导出为JSON,在不同机器间迁移你的“AI记忆”。第三是 可扩展性 ,项目暴露了 mem query 命令,允许执行原始SQL,为高级用户提供了无限的自定义查询和分析可能。
2.2 三层架构:钩子、CLI与数据库的协同
agent-memory 采用了清晰的三层架构,每一层职责分明,共同构成了一个既自动化又支持手动干预的系统。
第一层:钩子与上下文注入(自动化层)。 这是实现“无感记忆”的关键。以Claude Code为例,安装后会在其配置目录( ~/.claude/settings.json )的 hooks 部分注册一个 UserPromptSubmit 钩子,指向 mem-context-hook 脚本。这个脚本的工作流程是:
- 触发 :每次你在Claude Code界面按下回车发送消息时,Claude Code的运行时都会自动执行这个钩子脚本。
- 查询 :脚本调用
mem库函数,连接本地的memory.db,执行预定义的查询。它会获取所有facts(事实)、soul(偏好)以及当天daily_logs(日志)的记录。 - 格式化与注入 :脚本将这些查询结果格式化为一个结构清晰的Markdown块,例如:
=== MEMORY CONTEXT [Tue 18 Mar 2026, 09:15] === FACTS: work / employer: Acme Corp work / role: backend engineer decisions / deploy-freeze: starts March 20 SOUL: tone: prefers direct answers without preamble TODAY‘S LOG: - 09:00: Started debugging authentication middleware. === END MEMORY CONTEXT === - 注入 :脚本将这个文本块输出到标准输出。Claude Code的钩子系统会捕获这个输出,并将其 自动拼接 在你实际输入的用户消息之前。因此,AI模型看到的完整提示是“记忆上下文 + 你的问题”。这个过程对用户完全透明,你无需任何额外操作。
注意 :不同AI助手对钩子的支持程度不同。Claude Code和Gemini CLI原生支持最好,可以做到全自动。对于Cline、Cursor等,可能需要通过自定义规则文件或包装脚本来模拟这一过程,这也是项目文档中为不同助手提供不同配置指南的原因。
第二层:统一CLI工具(交互层)。 mem 命令行工具是用户和AI助手与记忆系统交互的主要桥梁。它的设计遵循了Unix哲学——“做一件事,并做好”。它提供了一组原子化的子命令:
mem fact/soul/log用于 写入 记忆。mem search/query用于 读取和查询 记忆。mem status/export/import用于 维护 记忆。
这个CLI不仅供AI助手在后台调用(例如,AI在对话中识别到需要保存的信息,就会执行 mem fact ... ),也允许开发者直接从终端手动管理记忆。比如,你可以快速输入 mem fact projects my_project “deadline is next Friday” 来记录一个项目截止日期,或者用 mem search “deadline” 来查找所有相关记录。这种设计赋予了系统极大的灵活性。
第三层:SQLite数据库(存储层)。 如前所述,这是数据的最终归宿。其表结构设计简洁而实用:
facts表是核心,用于存储结构化的“事实”,采用(category, subject, content)的三元组形式,便于组织和检索。soul表存储交互“灵魂”(偏好),如对话风格、输出格式偏好等。daily_logs表按日期记录流水日志,适合记录会话中的关键事件。embeddings表是为facts内容存储的向量嵌入,用于支持语义搜索。
这种分层架构使得系统易于理解和维护。自动化层负责无缝集成,交互层提供控制能力,存储层保证数据持久化。
2.3 语义搜索的优雅降级策略
“语义搜索”是 agent-memory 的一个亮点功能。简单来说,当你使用 mem search “前端负责人喜欢Rust” 进行搜索时,系统会尝试理解这句话的 语义 ,而不仅仅是匹配关键词“前端”、“Rust”,从而找到“people / alice: frontend lead, loves Rust”这样的相关记录。
其实现依赖于Google的Gemini Embedding API。当保存一条 fact 时, mem CLI会(如果配置了API密钥)调用该API,将 content 字段的文本转换为一个高维向量(即“嵌入”),并存入 embeddings 表。搜索时,将查询语句也转换为向量,然后在数据库中进行向量相似度计算(通常是余弦相似度),找出最相关的几条 fact 记录。
实操心得 :这里设计了一个非常巧妙的“优雅降级”机制。如果用户没有配置Gemini API密钥(在
~/.agent-memory/.env中设置GEMINI_API_KEY),mem search会自动回退到基于关键词的简单文本匹配。这意味着 核心的记忆存储和检索功能完全不受影响 ,你只是失去了更智能的语义搜索能力。这种设计极大地降低了使用门槛,用户可以先体验核心功能,再决定是否需要升级到语义搜索。对于许多场景,基于分类和主题的关键词搜索已经足够有效。
3. 核心功能解析与实操要点
3.1 记忆的三种类型:Facts, Soul 与 Logs
agent-memory 将记忆分为三类,这种分类源于对AI协作场景的深刻观察,每种类型服务于不同的目的。
1. Facts(事实):结构化的长期知识 这是记忆系统的骨架。它采用 (category, subject, content) 的三级结构,强制进行有条理的信息存储。
- Category(类别) :定义信息的领域,如
people(人物)、projects(项目)、decisions(决策)。这相当于文件系统的文件夹,是最高级的过滤维度。 - Subject(主题) :在类别下的具体条目,如
people类别下的alice,projects类别下的website_redesign。它必须是唯一的(在同一类别内),这保证了信息的可更新性。 - Content(内容) :具体的描述信息。内容应尽量简洁、客观、包含关键信息。
使用场景示例 :
# 记录同事信息
mem fact people alice “前端负责人,精通React和TypeScript,对性能优化有深入研究”
# 记录项目关键信息
mem fact projects api_gateway “采用Kong作为网关,认证方式为JWT,部署在K8s的prod命名空间”
# 记录技术决策
mem fact decisions database “从MongoDB迁移至PostgreSQL,因需要更强的事务一致性,迁移截止日期Q3”
注意事项 :
subject的命名要有辨识度且稳定。避免使用“那个新项目”、“我的经理”这种模糊的指代。好的subject如project_ecommerce_v2、manager_sarah,差的subject如new_project、boss。这能保证后续搜索和引用的准确性。
2. Soul(灵魂/偏好):个性化的交互设定 如果说 facts 是关于“世界”的知识,那么 soul 就是关于“你”和“你希望AI如何与你互动”的知识。它存储的是交互偏好和元认知。
- Aspect(方面) :描述偏好的维度,如
tone(语气)、format(格式)、focus(关注点)。 - Content(内容) :具体的偏好描述。
使用场景示例 :
# 设定对话语气偏好
mem soul tone “偏好直接、简洁的回答,避免冗长的客套和背景介绍”
# 设定代码风格偏好
mem soul code_style “写TypeScript时使用严格的ESLint规则,函数优先使用箭头函数,接口命名以I开头”
# 设定安全边界
mem soul security “切勿在代码示例或解释中提及任何内部服务器IP、域名或API密钥格式”
实操心得 :
soul的设置至关重要,它能显著提升AI输出的质量。例如,设置了code_style后,AI在生成代码片段时会自动遵循你的习惯,减少后续格式化的工作。建议在项目开始时,花几分钟通过soul命令将你的核心工作偏好“告诉”AI,这会在长期的协作中节省大量时间。
3. Daily Logs(日志):会话流水账 日志用于记录临时性的、与时间强相关的会话活动。它不像 facts 那样追求永久性,而是为当天的对话提供上下文。
- 通常由AI助手在会话中自动调用
mem log来记录,例如:“用户开始调试登录模块”、“用户决定重构用户服务API”。 - 这些日志会在每天结束时(或次日)被新的日志覆盖(取决于实现),主要服务于短期上下文连贯性。
3.2 语义搜索的实现与优化
语义搜索功能是将记忆系统从“简单数据库”升级为“智能助手”的关键。下面深入其实现细节和优化点。
实现流程:
- 嵌入生成(写操作) :当执行
mem fact ...时,CLI会检查是否配置了Gemini API密钥。如果有,则调用gemini-embedding-2-preview模型(或其他配置的模型)的API,将content文本转换为一个1536维的浮点数向量(嵌入)。这个向量捕获了文本的语义信息。随后,CLI将这条fact的id和对应的向量(通常序列化为JSON字符串或二进制)存入embeddings表。 - 向量存储 :SQLite本身并不原生支持向量运算。项目 likely 采用了一种实用方法:将向量以文本(如JSON数组)或二进制BLOB格式直接存储在
TEXT或BLOB字段中。在进行搜索时,需要将全部或部分向量加载到内存中进行计算。 - 相似度计算(读操作) :当执行
mem search “查询语句”时:- 首先,将查询语句通过同样的Gemini Embedding API转换为查询向量。
- 然后,从
embeddings表中取出所有或部分事实的向量(为了提高性能,可能会只计算最近或特定类别的事实)。 - 接着,在内存中计算查询向量与每个事实向量之间的 余弦相似度 。余弦相似度的值在-1到1之间,越接近1表示语义越相似。
- 最后,按相似度得分降序排列,返回得分最高的事实内容。
性能优化考量:
- 缓存策略 :对于频繁搜索的场景,可以考虑在内存中缓存热点
facts的向量,避免每次搜索都从数据库读取和反序列化。 - 限制搜索范围 :
mem search可以结合category或近期时间进行过滤,减少需要计算相似度的向量数量。例如,在项目上下文中搜索时,可以优先在projects和decisions类别中查找。 - 近似最近邻搜索 :如果记忆库变得非常庞大(例如数万条),线性扫描计算所有向量的相似度会变慢。未来可以考虑集成轻量级的ANN(近似最近邻)库,但会引入额外依赖,与项目的“零依赖”哲学相悖。目前来看,个人开发者的记忆条目数量远未达到需要ANN的程度。
使用技巧 :
- 搜索时使用 自然语言短语 比使用 关键词 效果更好。例如,搜索“我们怎么处理用户认证?”比搜索“认证”更能找到关于“JWT”、“OAuth”、“登录流程”等相关事实。
- 如果语义搜索返回的结果不理想,可以回退到使用
mem query执行精确的SQL查询,例如mem query “SELECT * FROM facts WHERE content LIKE ‘%JWT%’”。
3.3 与各类AI助手的集成实战
agent-memory 的强大在于其广泛的适配性。以下是针对不同助手的集成要点和避坑指南。
Claude Code(集成度最高) 这是体验最完美的组合。通过 npm install 或 install.sh 脚本可以完成全自动配置。
- 钩子 :自动修改
~/.claude/settings.json,实现上下文自动注入。 - 技能 :自动安装
agent-memory技能包。这个技能包至关重要,它“教育”Claude Code理解记忆系统的能力、命令以及 何时应该主动使用记忆 。例如,当Claude检测到你在介绍新同事或做出重要技术决策时,它会主动询问:“需要我将此信息保存到记忆库中吗?”或直接执行mem fact命令。 - 检查 :安装后,可以在Claude Code中直接输入
/skills查看已安装技能,确认agent-memory在列。
Cursor / Windsurf(基于规则的集成) 由于这些IDE插件通常没有公开的钩子API,集成需要一些手动步骤。
- 创建上下文文件 :按照指南,在shell配置文件中添加
alias refresh-memory=‘mem-context-hook < /dev/null > .agent-memory-context.md 2>/dev/null’。每次开始重要工作前,在项目根目录执行一次refresh-memory,生成包含最新记忆的Markdown文件。 - 创建规则文件 :
- 对于Cursor,在项目根目录创建
.cursor/rules/memory.mdc。 - 对于Windsurf,在项目根目录创建
.windsurfrules。
- 对于Cursor,在项目根目录创建
- 规则内容 :规则文件必须明确指示AI去读取
.agent-memory-context.md文件,并告知其可以使用mem系列命令。 关键点 :规则中要说明, 在保存了新记忆后,需要手动再次执行refresh-memory命令来更新上下文文件 ,否则本次会话中AI看到的还是旧上下文。
踩坑记录 :最初我忘记在规则中强调“保存后需刷新”,导致AI记住了新信息,但后续对话的上下文注入中却没有体现,造成了混乱。务必在规则中清晰写出这个步骤。
Aider(通过包装脚本或配置集成) Aider支持 --read 参数和 system-prompt-extras 配置。
- 推荐方法(包装脚本) :创建
aider-mem脚本。这个脚本的妙处在于,它每次启动Aider时都会 动态生成 一个全新的、包含最新记忆的临时上下文文件。这确保了记忆的实时性,无需手动刷新。
记得给脚本加执行权限:#!/usr/bin/env bash CONTEXT_FILE=$(mktemp /tmp/memory-context.XXXXXX.md) # 生成记忆上下文,错误输出静默 mem-context-hook < /dev/null > “$CONTEXT_FILE” 2>/dev/null # 将上下文文件和其他参数传递给aider aider --read “$CONTEXT_FILE” “$@” # 清理临时文件 rm -f “$CONTEXT_FILE”chmod +x aider-mem,然后就可以用./aider-mem代替原来的aider命令了。 - 备选方法(修改配置) :在
.aider.conf.yml中增加system-prompt-extras。这种方法更简单,但缺点是提示词长度可能有限制,且记忆上下文不是结构化的块,可能影响AI的理解。
通用法则 :对于任何其他能执行Shell命令的AI助手,你只需要在其系统指令(System Prompt)或规则文件中添加 mem 命令的使用说明,并手动或自动地在对话前执行 mem-context-hook 来获取上下文。核心就是两点: 教会AI如何使用命令 ,以及 确保AI在回复前能接收到记忆上下文 。
4. 实战部署与日常使用工作流
4.1 从零开始:安装与初始化最佳实践
虽然 npm install -g 是最快的方式,但通过 git clone 安装能让你更了解系统构成,也便于后续贡献或自定义修改。
步骤一:克隆与安装
git clone https://github.com/OctavianTocan/agent-memory.git
cd agent-memory
# 在执行安装脚本前,建议先检查依赖
python3 --version # 确保 >= 3.9
which sqlite3 # 确保SQLite命令存在
# 执行安装
./install.sh
install.sh 脚本会完成以下几件事,你可以打开脚本查看其具体逻辑:
- 在你的家目录下创建
~/.agent-memory/数据目录。 - 将
memory.db数据库文件初始化在该目录下(运行mem init)。 - 将
bin/目录下的mem和mem-context-hook等核心脚本软链接到~/.local/bin/(确保该目录在你的PATH环境变量中)。 - 如果检测到
~/.claude目录,会自动配置Claude Code的钩子和技能。 - 如果检测到
~/.gemini目录,会自动配置Gemini CLI的钩子。
步骤二:配置语义搜索(可选但推荐)
- 前往 Google AI Studio 获取一个免费的Gemini API密钥。
- 编辑
~/.agent-memory/.env文件(如果不存在,从项目根目录复制.env.example):cp agent-memory/.env.example ~/.agent-memory/.env nano ~/.agent-memory/.env - 在文件中填入你的API密钥:
GEMINI_API_KEY=your_actual_api_key_here安全提示 :
.env文件包含敏感信息。确保其权限为600(仅所有者可读写):chmod 600 ~/.agent-memory/.env。切勿将其提交到版本控制系统。
步骤三:验证安装
# 验证CLI是否可用
mem status
# 预期输出类似:Database: /Users/you/.agent-memory/memory.db, Facts: 0, Soul entries: 0, Logs today: 0
# 手动添加一条记忆测试
mem fact test verification “agent-memory is working”
mem search “working”
# 如果配置了API密钥,应能搜到上一条;如果未配置,使用关键词‘working’也应能搜到。
4.2 构建你的初始记忆库:引导式录入
安装完成后,一个空的记忆库价值有限。你需要主动“喂养”它。以下是一个高效的初始录入策略,建议按顺序进行:
第一阶段:录入个人与工作核心信息(Soul + Facts) 这些是AI理解你背景的基础。
# 1. 设定你的交互灵魂(Soul)
mem soul tone “回答请直接切入主题,无需问候和总结。解释技术概念时请附带简短示例。”
mem soul code_output “代码块请使用明确的语法高亮语言标记,如 ```python。除非特别要求,否则优先给出代码而非文字描述。”
mem soul security “绝对不要生成或讨论任何涉及网络代理、绕过网络限制或相关工具的内容。”
# 2. 录入关于你自己的事实(Facts)
mem fact user_info myself “全名:[你的名字],居住城市:[城市],时区:[UTC+8]”
mem fact work employer “[公司名]”
mem fact work role “[你的职位,如高级后端工程师]”
mem fact work tech_stack “主要语言:Go, Python;熟悉框架:Gin, Django;数据库:PostgreSQL, Redis;云平台:AWS”
mem fact preferences editor “主用VS Code,配色主题:One Dark Pro,常用插件:GitLens, Docker, Remote - SSH”
第二阶段:录入当前项目上下文(Facts) 如果你正在进行的项目会频繁与AI讨论,那么录入项目细节能极大提升效率。
# 假设你正在开发一个叫‘OctoShop’的电商项目
mem fact projects octoshop “一个基于微服务的电商平台,当前处于v1.2开发阶段,核心团队5人。”
mem fact projects octoshop_tech “后端:Go微服务,gRPC通信,PostgreSQL,Redis缓存,K8s部署。前端:Next.js 14, Tailwind CSS。”
mem fact decisions octoshop_auth “用户认证已决定采用JWT,令牌有效期24小时,刷新令牌有效期7天。”
mem fact decisions octoshop_deploy “生产环境部署在AWS EKS,CI/CD使用GitLab Runner,部署冻结窗口为每周五。”
mem fact people project_manager “Alice,负责项目管理和客户沟通,偏好每日站会同步进度。”
mem fact people tech_lead “Bob,负责后端架构,代码审查严格,强调测试覆盖率。”
第三阶段:测试与验证 录入完成后,进行搜索测试,确保信息能被准确召回。
mem search “我用的编程语言”
# 应返回 work / tech_stack 相关内容
mem search “电商项目用什么认证”
# 应返回 decisions / octoshop_auth 相关内容
mem search “谁管项目进度”
# 应返回 people / project_manager 相关内容
4.3 日常使用模式:主动保存与被动调取
记忆系统融入工作流后,会形成两种主要使用模式:
1. 主动保存(由你或AI触发)
- 你手动保存 :在终端中直接使用
mem命令。适合记录明确的、离散的信息。# 开会后记录决策 mem fact decisions meeting_20240415 “决定将用户头像存储从本地迁移到S3,由David负责,两周内完成。” # 遇到一个有用的技术方案 mem fact knowledge react_optimization “大型列表渲染使用虚拟滚动库(如react-window),并配合React.memo避免不必要的子组件重渲染。” - AI主动询问并保存 :得益于Claude Code的技能,AI会在对话中识别到可能值得保存的信息,并主动询问。你应该积极同意。这是让AI学习你模式的最佳方式。
用户 :“我们这次把错误日志从文件改成了发送到Elasticsearch集群,方便追踪。” Claude Code :“这听起来像是一个重要的架构变更。需要我将‘错误日志改用Elasticsearch’这个信息保存到您的记忆库中吗?(我可以使用命令:
mem fact decisions logging “将应用错误日志从本地文件改为集中发送至Elasticsearch集群,便于分布式追踪和分析。”)” 用户 :“好的,保存吧。”
2. 被动调取(由钩子自动注入) 这是系统的核心自动化能力。你无需做任何事,每次对话开始,相关的 facts 、 soul 和当日的 logs 会自动出现在AI的“脑海”里。你会发现在后续对话中,AI不再问你“你是做什么的?”,或者会基于已知的技术栈给出更精准的建议。
3. 主动查询(当你需要时) 当你在复杂讨论中需要追溯某个具体信息时,可以直接在AI对话中或终端里查询。
- 在AI对话中 :你可以直接要求AI帮你查。“查一下我们之前关于数据库分库的决策是什么?” AI可以执行
mem search “数据库分库”来找到相关记录。 - 在终端中 :使用
mem search或更精确的mem query。# 模糊搜索 mem search “AWS 配置” # 精确SQL查询(如果你熟悉表结构) mem query “SELECT * FROM facts WHERE category=‘decisions’ AND content LIKE ‘%S3%’ ORDER BY updated_at DESC”
4.4 维护与备份策略
记忆库会随着时间增长,合理的维护能保证其长期有效性。
1. 定期清理与更新
- 更新过时信息 :使用
mem fact命令重复相同的category和subject会自动更新内容(基于UNIQUE约束)。mem fact work role “从高级后端工程师晋升为技术专家” - 归档或删除无用信息 :对于已完结的项目或失效的决策,可以考虑将其
category改为archive,或者直接通过SQL删除。mem query “DELETE FROM facts WHERE category=‘projects’ AND subject=‘old_legacy_system’”注意 :删除操作不可逆,请谨慎执行。建议先使用
SELECT语句确认要删除的内容。
2. 数据备份与迁移 你的记忆库是宝贵的数字资产,应定期备份。
- 轻量级备份(仅数据) :
mem export命令将facts和soul表导出为JSON,不包含向量嵌入,文件很小。mem export > ~/backups/agent_memory_$(date +%Y%m%d).json - 完整备份(包含向量) :
mem dump命令导出整个数据库的完整副本,包括embeddings表,文件较大。mem dump ~/backups/agent_memory_full_$(date +%Y%m%d).json - 迁移到新机器 :
- 在新机器上安装
agent-memory。 - 将备份的JSON文件复制到新机器。
- 执行导入(使用
--force会先清空现有数据库):mem import ~/backups/agent_memory_full_20240415.json --force
- 在新机器上安装
3. 状态监控 使用 mem status 随时查看记忆库的健康状况和数据统计。
5. 常见问题排查与进阶技巧
5.1 安装与集成问题排查
问题1:安装后, mem 命令未找到。
- 原因 :
install.sh脚本将可执行文件软链接到了~/.local/bin/,但该目录可能不在你的PATH环境变量中。 - 解决 :
# 检查链接是否存在 ls -la ~/.local/bin/mem # 检查PATH echo $PATH | grep ‘.local/bin’ # 如果不在,将以下行添加到你的 ~/.bashrc 或 ~/.zshrc export PATH=“$HOME/.local/bin:$PATH” # 然后重新加载配置 source ~/.bashrc # 或 source ~/.zshrc
问题2:Claude Code没有自动注入记忆上下文。
- 原因1 :钩子配置未成功写入
~/.claude/settings.json。 - 排查 :检查该文件,查看
hooks部分是否包含指向mem-context-hook的UserPromptSubmit命令。 - 解决 :可以手动编辑
settings.json添加,或重新运行./install.sh。 - 原因2 :
mem-context-hook脚本本身执行出错。 - 排查 :在终端手动运行该脚本看是否有错误输出。
mem-context-hook < /dev/null- 如果提示数据库错误,可能是
~/.agent-memory/memory.db文件权限问题。 - 如果提示Python模块错误,请确保使用Python 3.9+。
- 如果提示数据库错误,可能是
- 解决 :根据错误信息修复,例如
chmod 755 ~/.agent-memory确保目录可执行,或重装Python依赖。
问题3:语义搜索( mem search )返回“Keyword fallback activated”。
- 原因 :未配置Gemini API密钥,或配置的密钥无效、网络无法访问API。
- 排查 :
# 检查.env文件是否存在且包含有效密钥 cat ~/.agent-memory/.env # 测试API连通性(假设你有curl和jq) API_KEY=$(grep GEMINI_API_KEY ~/.agent-memory/.env | cut -d= -f2) curl -s -X POST “https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2-preview:embedContent?key=$API_KEY” \ -H ‘Content-Type: application/json’ \ -d ‘{“content”: {“parts”:[{“text”: “test”}]}}’ | jq .- 如果返回
403或404错误,说明密钥无效或格式错误。 - 如果请求超时,可能是网络问题。
- 如果返回
- 解决 :确认密钥正确,检查网络,或暂时接受关键词回退模式。
5.2 使用中的典型问题
问题1:AI助手似乎“忘记”了刚刚保存的信息。
- 原因 :记忆上下文是在 每条消息发送前 动态生成的。如果你在同一个会话中保存了新记忆,但后续提问前没有触发上下文更新,AI就看不到新内容。
- 解决 :
- 对于Claude Code/Gemini CLI(自动钩子):通常在下一条消息发送时,钩子会重新运行并包含新记忆。如果没有,可以尝试发送一条空消息或刷新会话。
- 对于Cursor/Windsurf(文件方式):你需要手动在终端执行一次
refresh-memory别名命令来更新.agent-memory-context.md文件,并 确保AI助手重新读取了该文件 (有时需要重启AI对话或重新打开文件)。 - 最佳实践 :重要的新记忆保存后,可以在对话中加一句提示:“请记住,我们刚刚决定采用X方案。” 这既能提醒AI,也能触发其内部可能的重读上下文机制。
问题2: mem search 返回的结果不相关或太多。
- 原因 :搜索查询太宽泛,或者语义搜索的相似度阈值设置问题(如果项目可配置)。
- 解决 :
- 优化查询 :使用更具体、包含更多实体的自然语言句子。例如,用“我们电商项目的用户认证方案”代替“认证”。
- 结合分类过滤 :如果知道信息的大致类别,可以先通过
category缩小范围。目前CLI不支持直接组合过滤,但可以通过mem query实现:mem query “SELECT * FROM facts WHERE category=‘decisions’ AND content LIKE ‘%认证%’” - 审视记忆质量 :检查保存的
content是否足够清晰、包含关键信息。模糊的记录(如“用了那个新框架”)很难被有效检索。
问题3:数据库文件( memory.db )越来越大。
- 原因 :
embeddings表存储的向量数据占用空间较大(每条记录约几十KB)。 - 解决 :
- 定期清理无用记忆 :如前所述,归档或删除过期项目。
- 考虑禁用语义搜索 :如果空间紧张且关键词搜索已够用,可以删除
.env中的API密钥,系统将不再生成和存储嵌入向量。注意,这不会删除已存在的向量,但会停止新增。要清理旧向量,需要执行SQL:mem query “DELETE FROM embeddings”。 - SQLite维护 :可以定期对数据库执行
VACUUM命令来回收空间( 操作前请备份 )。sqlite3 ~/.agent-memory/memory.db “VACUUM;”
5.3 进阶技巧与自定义
1. 自定义记忆类别(Categories) 项目建议了一些默认类别( user_info , people , projects 等),但你可以完全自定义。选择对你和你的项目有意义的分类体系。例如,增加 bugs (记录遇到的棘手bug和解决方案)、 learning (学到的知识点)、 meetings (会议纪要要点)等。
2. 利用 mem query 进行高级操作 mem query 是你的瑞士军刀,可以执行任何SQLite支持的SQL语句。
- 批量操作 :
# 将某个分类下的所有subject加上前缀 mem query “UPDATE facts SET subject=‘old_’ || subject WHERE category=‘archive’” # 查找并删除所有空内容或测试内容 mem query “DELETE FROM facts WHERE content=‘test’ OR content IS NULL OR trim(content)=’’” - 数据分析 :
# 查看最常更新的记忆类别 mem query “SELECT category, COUNT(*) as count, MAX(updated_at) as last_updated FROM facts GROUP BY category ORDER BY count DESC” # 查找超过30天未更新的陈旧记忆 mem query “SELECT * FROM facts WHERE julianday(‘now’) - julianday(updated_at) > 30”
3. 为其他工具创建别名或包装脚本 你可以创建更便捷的别名来快速记录。
# 添加到 ~/.bashrc 或 ~/.zshrc
alias remember=‘mem fact’
alias whatwas=‘mem search’
alias howdo=‘mem soul’
# 快速记录日志
alias did=‘mem log’
现在,在终端里你可以直接输入:
remember decisions design_system “决定采用原子设计方法论”
whatwas “设计系统”
howdo code_review “提交PR时,请在描述中附上测试覆盖率和性能影响分析”
did “完成了用户登录模块的重构”
4. 探索数据库直接操作(谨慎!) 对于高级用户,可以直接用 sqlite3 命令行工具打开数据库文件进行查看或紧急修复。
sqlite3 ~/.agent-memory/memory.db
.tables
SELECT * FROM facts LIMIT 5;
重要警告 :直接操作数据库有风险,可能破坏数据一致性。尤其是
embeddings表与facts表有外键关联。非必要不直接操作,优先使用memCLI。
更多推荐

所有评论(0)