三更灯火五更鸡,正是男儿读书时,黑发不知勤学早,白首方悔读书迟。——颜真卿

ai-memory:让 AI 编程助手真正记住项目的长期记忆

项目地址:https://github.com/akitaonrails/ai-memory

AI 编程助手最擅长的事情之一,是快速进入代码、阅读上下文、提出修改并执行任务。

但它们也有一个非常现实的限制:会话会结束,窗口会关闭,工具会切换,机器会更换,协作者会加入。昨天刚刚讨论过的架构决策,今天可能又要重新解释;刚刚尝试失败的方案,换一个助手后又可能被重复尝试;一个任务做到一半从 Claude Code 切换到 Codex,新的助手甚至未必知道前一个助手已经走到了哪里。

ai-memory 想解决的,就是这种持续性缺失。

它是一套面向 AI 编程助手的长期记忆方案,能够帮助不同工具之间交接任务,也能够让项目知识跨越会话、机器与人员继续存在。它将 AI 助手工作过程中产生的关键信息沉淀为可阅读的 Markdown 页面,并以 Git 支持的 Wiki 作为事实来源。

它不是让某个助手单独记住一点偏好。

它希望让一个项目拥有真正可延续的记忆。

当编程任务不该随着会话结束而失忆

一个真实的软件开发任务,很少能在一次会话中结束。

开发者可能先让 Claude Code 阅读架构,再交给 Codex 修改实现。某个问题可能在桌面设备上被定位,又在笔记本上继续排查。团队中的不同成员也可能分别与自己的 AI 助手协作,却需要面对同一个仓库、同一组规则与同一批尚未解决的问题。

如果每一次切换都需要重新讲述背景,AI 助手带来的效率就会被不断重复的上下文传递消耗掉。

ai-memory 的核心想法很直接:让记忆跟着工作走,而不是跟着某一个助手、某一台机器或某一次会话消失。

它可以记录当前任务进行到哪里,记录哪些方案已经失败,记录哪些问题仍然开放,也记录项目中已经形成的决定。当下一个助手进入同一目录时,它不必从零开始猜测,而可以从已有交接中接过工作。

这是一种更接近真实团队协作的方式。

工作不属于某一个窗口。

记忆也不应该只停留在某一个窗口里。

一个共享记忆,连接二十多种 AI 编程工具

ai-memory 支持二十多种工具与运行环境。

README 中列出的支持范围包括 Claude Code、Codex、Cursor、Gemini CLI、OpenCode、Grok、Devin、Kimi、Kiro、GitHub Copilot CLI、Factory Droid、Meta Muse Code、IBM Bob、Hermes Agent、GrizzyBot 等。

不同工具各自有不同的交互方式、扩展机制与生命周期,但 ai-memory 希望让它们汇聚到同一份共享记忆中。

这意味着,开发者可以在一个任务中使用不同的助手。

可以先在 Claude Code 中进行探索。

可以在 Codex 中继续实现。

可以在 Cursor 中查看与编辑。

也可以在其他受支持的工具中接过前一个助手留下的上下文。

当一个任务从一个助手交给另一个助手时,ai-memory 会提供交接信息,说明当前工作停在何处、已经发生过什么、哪些尝试没有成功,以及还有哪些问题等待处理。

这种交接并不是一段随意的文本。

README 将 handoff 描述为具有类型的协议。每一次交接都有所有者,并且只能被领取一次。于是,交接不只是“有人留下了一句话”,而是一根明确传递的接力棒。

不只传递摘要,也能延续会话细节

项目摘要很有价值,但摘要不可能包含所有细节。

有时,真正重要的信息藏在一次工具调用的输出中,藏在某个失败命令的报错里,藏在一段被截断的分析过程中。为了处理这种情况,ai-memory 提供 ai-memory run 方式来启动助手。

例如,可以先退出当前的 Claude Code 会话,再通过以下方式启动 Codex:

1
ai-memory run codex

在这种跨工具切换中,新的助手可以获得共享工作流信息,也可以获得一个私有、临时的本地投影,用于访问前一个助手可见的原生历史细节。

这种临时投影只保留在本地启动机器上。

远程服务器只会收到工具类型与会话身份,不会接收本地会话记录的路径或正文内容。临时文件会在受管理的子进程退出后消失。

这让跨助手延续不只依赖有限的启动摘要。

当简短交接中遗漏了具体细节时,后续助手仍然能够在本地范围内追溯前一段工作的上下文。

让个人工作习惯跨越不同项目

每个开发者都有自己的工作方式。

有人固定使用某种包管理器,有人习惯特定的测试布局,有人偏好某种架构组织方式。每次进入新仓库时,反复向 AI 助手解释这些习惯,同样是一种隐形的上下文成本。

ai-memory 提供跨项目个人档案。

这个档案可以记录开发者通常的工作偏好,并在每个新仓库的会话开始时提供默认信息。它位于每个仓库自身规则文件之下,作为更通用的默认层存在。

对于单个用户,跨项目档案默认开启。

在共享服务器中,它需要主动启用,并且会按个人保持私有。

这让记忆不只停留在项目层面。

项目有项目的架构、规则与历史。

开发者也有开发者自己的习惯、偏好与常用方式。

ai-memory 将这两种层次区分开来,让 AI 助手既能理解当前仓库,也能减少重复认识当前使用者的过程。

记忆可以跟随项目跨越机器

开发工作很少只发生在一台设备上。

桌面环境中留下的进度,可能需要在笔记本上继续。办公室中的任务,也可能需要在家庭实验室或局域网服务器中延续。若记忆只保存在当前机器上,切换设备时,AI 助手又会回到不知道历史的状态。

ai-memory 将记忆存放在由使用者运行的服务器中。

这个服务器可以位于同一台笔记本上,也可以部署在家庭实验室设备或其他位置。只要不同机器连接到同一个服务器,项目中的知识与待解决问题就可以继续存在。

于是,开发者在桌面设备上暂停的项目,可以在笔记本上继续。

新的会话不必从空白开始。

同一个项目的历史、页面、交接与待办问题,能够继续陪伴下一次工作。

团队记忆不等于公开所有私人交接

团队协作中的知识共享,需要同时处理公开与私人的边界。

ai-memory 支持多人使用同一个服务器。一个人的会话学到的项目知识,其他人的 AI 助手可以在同一项目范围内检索。与此同时,个人交接仍然保持为个人内容。

项目知识可以共享。

个人 handoff 可以保留私有。

README 中还提到,ai-memory 内置多用户认证、按人归属记录与审计日志,并且这些能力不是付费层级中的附加项目。

这使它不仅适合单人开发者,也面向需要共享项目知识的团队。

当多人共同处理同一个代码库时,很多信息原本会散落在不同对话、不同终端、不同问题单与不同人的记忆中。ai-memory 试图将其中与项目有关的知识汇集起来,让后续的 AI 助手能够检索到已经发生的工作,而不是一次又一次重复探索。

Markdown 才是记忆的事实来源

ai-memory 的一个重要选择,是使用 Git 支持的 Markdown Wiki 作为记忆的事实来源。

项目中的知识以普通 .md 文件保存。

它们可以被 grep 搜索,可以在 Obsidian 中打开,可以被手动编辑,也可以通过 rsync 同步。数据库只是从这些文件构建出来的派生索引,即使需要重建,也可以从 Markdown 文件重新生成。

这让记忆不会被锁进不透明的二进制格式中。

也不要求维护一个向量数据库作为唯一事实来源。

开发者能够直接查看记忆。

能够理解记忆写了什么。

能够编辑记忆。

能够通过版本控制追踪记忆的变化。

对于长期使用的项目而言,这种透明性尤其重要。AI 助手的记忆不再是一块无法查看的黑箱,而是能被人打开、阅读、修订和保留的项目资产。

自动捕捉工作,但不要求手动提醒

很多记忆工具需要用户主动说一句“请记住”。

ai-memory 的方向不同。

它通过生命周期钩子记录工作过程中发生的事件,包括提示词、工具调用与会话边界。记录进入存储流程之前,会经过具有类型的隐私边界清理。之后,服务器会将这些观察信息整合成更容易阅读的页面。

使用者不必不断提醒系统记住某件事。

在默认路径中,捕捉、搜索与交接都不需要 API 密钥,也不需要调用大语言模型。

这意味着,即使完全不配置 LLM 提供方,ai-memory 仍然能够完成自动捕捉、检索与交接。

它让长期记忆的基础能力不依赖于额外的模型调用。

工作发生时,信息被记录。

会话结束时,信息被整理。

下一次会话开始时,信息重新被带回。

从捕捉到交接,一条持续运行的记忆链路

ai-memory 将自身的基本工作过程概括为四个阶段:

1
capture ──▶ consolidate ──▶ recall ──▶ handoff

捕捉阶段由生命周期钩子安静地观察工作过程。

整合阶段会在会话结束后,将观察结果转化为项目 Wiki 中连贯的 Markdown 页面。

回忆阶段让下一次会话能够通过搜索与简报重新获得项目上下文。

交接阶段则把任务明确地传递给下一个助手,无论它使用的是哪一种受支持工具。

这条链路并不要求所有内容都被压缩为一句简单摘要。

搜索可以覆盖全文、实体、链接,并可选地结合向量检索。不同结果会被融合到同一个排序中。

因此,下一次会话获得的不是一个孤立标签,而是一套能够继续搜索、继续阅读、继续追踪的项目记忆体系。

不用 LLM,也能让记忆逐渐变得有秩序

长期记忆如果只会增加,最终也会变得难以使用。

ai-memory 因此提供了无需 LLM 的记忆老化机制。

记忆可以按照不同层级配置衰减计划。

被使用过的记忆会衰减得更慢。打开页面、搜索页面,或通过链接访问页面,都会被视为使用行为。

当情节型笔记逐渐变冷时,它们可以被压缩为更持久的事实,例如文件路径、错误代码与已经形成的决策,而不是直接被丢弃。

近似重复的内容可以收敛为一份。

可能互相矛盾的内容可以被标记。

这些过程默认不需要 API 调用。

项目还强调,原始内容不会被硬删除。原始版本仍然保留在 Git 中,版本链也能够通过 restore-page 恢复。

访问加权保留始终开启,因为它只会让记忆保留得更久。

而会改写或丢弃内容的部分,包括压缩、去重与分层衰减曲线,则默认关闭,直到使用者主动启用。

这种设计体现出一种克制的记忆管理方式。

记忆可以变化,但不会轻易失去来源。

记忆可以被压缩,但不会直接失踪。

可选的梦境整理,让冷记忆重新汇聚

ai-memory 还提供一个可选能力,被称为 dream。

当配置了 LLM 后,系统可以在空闲时对成组的冷记忆进行后台整理,将多个页面重写为一份更连贯的页面。当使用者重新开始工作时,这个过程会取消。

这种能力默认关闭。

它不会删除源页面,合并之前的版本仍然可以访问。项目还要求这一能力在可能成为默认行为之前,先通过回忆评估。

这使 dream 更像一项主动选择的增强能力,而不是强制发生的自动改写。

不配置 LLM 时,ai-memory 仍然可以正常工作。

配置 LLM 后,记忆则可以获得额外的整合能力。

两条路径共同存在,但默认仍然站在零 LLM 调用的一侧。

一个二进制文件,承载服务器与数据目录

ai-memory 以单个 Rust 二进制文件的形式提供。

这个二进制文件运行 MCP 与 HTTP 服务,并管理一个数据目录。目录结构中包含 Wiki、原始观察记录、SQLite 索引、预留的本地嵌入模型位置与日志。

1
2
3
4
5
6
<data_dir>/
├── wiki/
├── raw/
├── db/
├── models/
└── logs/

其中,wiki/ 保存作为事实来源的 Git 版本化 Markdown 内容。

raw/ 保存不可变的、经过清理的受管理工作流会话片段。

db/ 保存 SQLite 索引,其中包括 FTS5、实体与嵌入相关内容。

models/ 为本地嵌入模型保留。

logs/ 则保存滚动追踪输出。

服务器会通过单个 SQLite 写入者序列化写入操作,并将会话观察信息编译为 Markdown 页面。检索过程会结合 FTS5、实体匹配、图邻居相关排序、可选向量排序、观察证据流与其他受限调整机制。

这让 ai-memory 的结构具备两层含义。

一层是使用者可以直接阅读和控制的 Markdown Wiki。

另一层是用于高效搜索与索引的数据库结构。

前者保证透明与可拥有。

后者保证检索与服务能力。

两条命令开始安装

在 Linux 与 macOS 上,README 提供了两条命令的安装方式:

1
2
curl -fsSL https://github.com/akitaonrails/ai-memory/releases/latest/download/install.sh | sh
ai-memory setup

安装脚本会下载适用于当前操作系统与 CPU 的发行版本,并使用已发布的 SHA-256 校验和进行检查。校验不匹配时,脚本会拒绝安装。

之后,ai-memory setup 会创建数据目录,在仅所有者可访问的文件中创建 Bearer Token,并启动每用户服务。

在 Linux 上,它会使用 systemd 用户服务。

在 macOS 上,它会使用 launchd LaunchAgent。

安装流程还会查找已安装的 AI 助手,并为检测到的工具配置 MCP、生命周期钩子与 Agent Skills。它会先展示计划,说明找到了哪些工具,并等待确认。

如果只想查看计划而不修改任何内容,可以使用:

1
ai-memory setup --plan

如果希望在浏览器中查看计划并选择需要配置的工具,可以使用:

1
ai-memory setup --web

如果希望跳过确认,可以使用:

1
ai-memory setup --yes

安装完成后,重启对应的 AI 助手,再询问它“你还记得这个项目什么”,便可以通过 ai-memory 获取项目记忆。

Windows 也可以无管理员权限开始

在 Windows PowerShell 中,可以执行:

1
2
irm https://github.com/akitaonrails/ai-memory/releases/latest/download/install.ps1 | iex
ai-memory setup

安装脚本会校验发行包的 SHA-256,然后将内容解压到用户本地应用程序目录,并将对应路径加入当前用户的 PATH。

之后,ai-memory setup 会创建数据目录、Token 与工具配置,并使用登录项启动服务。服务会在用户登录时启动,不显示控制台窗口,并在失败时尝试重启。

README 也说明了 Windows via WSL2 属于受支持范围,而原生 Windows 目前属于实验性支持。

从 Arch Linux 到 Fedora 的安装路径

对于 Arch Linux,项目提供 AUR 包。

预构建二进制包可以通过以下命令安装:

1
yay -S ai-memory-bin

如果希望从源代码构建,可以使用:

1
yay -S ai-memory

安装后,再执行:

1
ai-memory setup

对于 Fedora,README 提供 RPM 安装路径。下载对应架构的 RPM 后,可以使用:

1
sudo dnf install ./ai-memory-*.rpm

随后继续执行:

1
ai-memory setup

不同系统的安装方式不同,但后续目标一致:准备数据目录,启动服务,为已使用的 AI 工具建立捕捉、检索与交接能力。

使用插件连接 Claude Code 与 Codex

Claude Code 与 Codex 用户还可以通过插件市场连接 ai-memory。

Claude Code 的安装方式为:

1
2
claude plugin marketplace add akitaonrails/ai-memory
claude plugin install ai-memory@ai-memory

Codex 的安装方式为:

1
2
codex plugin marketplace add akitaonrails/ai-memory
codex plugin add ai-memory@ai-memory

Codex 会要求使用者信任 /hooks 中的钩子。

这些插件不携带二进制文件,不需要单独构建,也不会在首次运行时下载二进制内容。插件中包含清单、路由技能、状态技能、MCP 入口和一个 POSIX Shell 脚本。

生命周期事件最终由已安装的本地 ai-memory hook 命令处理。

这个本地命令会在事件进入队列或网络之前,应用捕捉策略,包括忽略路径、允许列表模式与服务器配置。插件脚本本身不会直接发送任何内容。

插件文件中没有遥测内容,也不保存凭据。钩子与 MCP 桥接使用的是 ai-memory CLI 已经保存的凭据。

ai-memory run,让启动助手时自动带上记忆

README 特别推荐通过 ai-memory run 启动工具。

第一次使用它启动某个助手时,系统会自动检查并安装该助手所需的钩子与 MCP 配置。它会按照构造好的方式连接正确的项目范围,并在共享记忆之上增加跨工具的会话连续性。

例如:

1
ai-memory run claude

也可以通过以下命令启动 Codex 并传递参数:

1
ai-memory run codex --yolo

如果希望使用可复用的配置预设,可以这样执行:

1
ai-memory run --profile work claude

对于最近的受管理工作流,可以使用:

1
ai-memory continue

也可以恢复当前仓库中的工作流:

1
ai-memory resume

如果希望通过名称搜索工作流,可以使用:

1
ai-memory resume --search auth

如果希望跨越所有关联工作目录进行选择,可以使用:

1
ai-memory resume --all

当之前的启动器已经终止,但活动租约仍然存在时,可以使用:

1
ai-memory run --force-unlock codex

这一选项会立即使所选工作流的活动租约过期,但不会终止原生进程,也不能驱逐另一位已认证操作者正在进行的工作。

这些命令让记忆不只停留在后台服务中,也真正进入日常的 AI 助手启动动作。

离线时继续工作,服务恢复后再补回

网络或服务并不总是稳定。

当 ai-memory 服务不可达时,ai-memory run 会给出提示,但仍然启动助手,并在本地保存捕捉内容。服务恢复后,可以使用 ai-memory recover 进行恢复。

如果希望在服务不可用时直接停止启动,而不是允许降级运行,可以添加:

1
--require-server

这种设计让记忆服务不会成为开发工作无法继续的单点阻塞。

服务可用时,内容正常进入共享记忆。

服务暂时不可用时,工作仍然可以继续。

之后再进行恢复,让记录重新回到长期记忆中。

Docker 部署,让记忆服务运行在容器里

ai-memory 也提供 Docker 或 Podman 使用方式。

发布的镜像同时包含 linux/amd64 与 linux/arm64 变体,因此 Apple Silicon Mac 与 ARM64 Linux 主机可以直接拉取对应镜像,而不需要额外指定 x86_64 仿真平台。

README 中的 Docker 快速开始默认不启用认证,容器也只绑定到回环地址。这样,外部网络无法直接访问服务,但本机进程与浏览器页面可以访问。

以下命令展示了服务容器启动方式:

1
2
3
4
5
docker run -d --name ai-memory \
--restart unless-stopped \
-p 127.0.0.1:49374:49374 \
-v ai-memory-data:/data \
docker.io/akitaonrails/ai-memory:latest

如果不使用 LLM 与嵌入提供方,依然可以运行零 LLM 模式,FTS5 搜索也可以继续工作。

在容器化环境中,使用者还可以通过 CLI 包装器为不同工具安装 MCP 与钩子,从而让容器服务与本地 AI 助手连接起来。

从日常使用中逐步形成记忆

ai-memory 的目标不是让使用者每天花时间维护一套复杂知识库。

README 对日常使用的描述十分朴素:大多数时候,不需要特别想到 ai-memory 的存在。

钩子会捕捉提示词、工具调用与会话边界。

会话结束后,内容会变成可阅读的 Wiki 页面。

下一次会话开始时,助手会从交接中获得上下文。

开发者可以直接对助手说:

  • 我们上次做到哪里了
  • 我们讨论过某个问题吗
  • 搜索关于某个主题的记忆
  • 帮我回顾近期项目活动

对于已经存在很久的项目,还可以执行:

1
ai-memory bootstrap

这项命令用于在采用 ai-memory 时,为已有项目建立初始记忆基础。

项目也提供只读浏览器视图与 JSON API。通过启用 Web 功能,可以在浏览器中阅读 Wiki,并通过 API 获取相关内容。

多机器与团队共享,但仍保留归属与审计

当 ai-memory 服务器部署在局域网主机、家庭实验室设备或其他可访问位置时,多台机器与多个团队成员可以连接到同一份项目记忆。

项目知识按项目共享。

个人 handoff 保持个人属性。

每一次写入都可以归属到具体人员,并被记录在审计日志中。

项目提供多用户认证,包括密码与 API 凭据。也提供可选的会话管理与自助 API Key 能力。

会话管理允许已登录用户查看会话,并删除属于自己的会话。

自助 API Key 功能则允许用户签发与撤销自己的 aim_ API Key。

这些 HTTP 能力默认关闭,需要主动启用。

这让 ai-memory 的团队使用方式保持谨慎:共享能力存在,但不会在默认情况下把所有管理功能暴露出来。

默认绑定本机,安全从本地开始

ai-memory 默认只绑定到回环地址。

新的 ai-memory init 会在数据目录中生成根 Bearer Token,钩子、CLI 与 ai-memory mcp-bridge 都从该位置读取 Token,而不会将它写入 AI 工具配置文件中。

对于较早安装的实例以及 Docker 快速开始环境,可能默认未启用认证。项目提供 ai-memory auth enable 来启用认证,ai-memory status 也会显示当前认证状态。

README 描述了一条渐进式加固路线。

可以先从局域网 Bearer Token 开始。

然后使用按用户划分的账号。

再到用于钩子的 OIDC 设备认证。

最后可在反向代理前配置 TLS。

在捕捉侧,内容会先经过具有类型的隐私边界清理。每个仓库也可以通过 [capture] 规则排除路径,或切换到允许列表模式。仓库还能够将捕捉路由到与默认钩子服务器不同的服务器。

这使安全并不是一个只有开启或关闭的选项,而是一条可逐步建立的路径。

LLM 是可选增强,不是默认前提

ai-memory 支持可选的 LLM 提供方。

配置 LLM 后,可以提升会话摘要能力,并启用语义搜索。项目支持 Anthropic、OpenAI、OpenAI OAuth、Codex CLI 凭据复用、GitHub Copilot、Gemini、OpenCode 相关提供方,以及兼容 OpenAI API 的端点,例如 Ollama、LM Studio 与 vLLM。

嵌入能力则支持 OpenAI、Voyage、Gemini 与无需密钥的 OpenAI 兼容端点。

但这些都不是 ai-memory 基础运行的必要条件。

没有 API Key 时,自动捕捉、全文搜索、交接、记忆老化、提取式压缩、去重、矛盾标记与访问加权保留仍然可以工作。

这种设计让使用者可以先从本地、零 LLM、零 API 调用的方式开始。

之后,如果需要更丰富的整合与语义检索,再主动引入模型能力。

记忆质量,也需要被认真评估

ai-memory 仓库中包含评估工具。

这些工具不是发布版本的一部分,而是用于比较不同模型、不同提供方或不同提示词调整下的整合效果与检索表现。

评估程序可以并排运行两个 LLM 提供方,保存双方输出,并对文本忠实度进行评分。也可以在不使用任何模型的情况下,测试观察投影是否将应保留的事实送入了整合请求。

项目还提供 LongMemEval 检索基准评估。

这一评估通过真实的 ai-memory serve 子进程运行,使用实际服务的检索链路,并报告命中情况、延迟以及代理可能接收的上下文 token 估计。

这种评估体系说明,ai-memory 不只关注“看起来记住了什么”。

它也尝试追问:关键事实是否真的被保留,检索是否能找到相关会话,性能与上下文成本处于怎样的状态。

对于长期记忆系统而言,这种追问很重要。

记忆不是写下来就结束了。

它还必须在需要时被找回来。

让 AI 助手从临时对话者变成持续协作者

ai-memory 的意义,不在于为 AI 助手增加一段更长的上下文。

它所尝试构建的,是一种更持续的协作关系。

今天的助手可以留下工作痕迹。

明天的助手可以接手。

不同工具可以共享项目知识。

不同机器可以继续同一条工作线。

团队成员可以让自己的助手检索共同积累的项目记忆。

而所有这些内容,最终都落在可以查看、编辑、搜索、同步与版本控制的 Markdown Wiki 中。

它让 AI 编程助手不再只是一场会话中的临时参与者。

它们可以开始拥有共同的过去。

也可以在同一个项目里,继续走向下一步。