返回文章列表

5 个 AI Agent 各自失忆,我用 Git 和 Markdown 做了一个共享记忆中枢

Claude Code、OpenCode、Hermes 各自保存记忆,换工具或换设备就要重新解释背景。我用一个 Git 仓库、Markdown 和指针文件做了 agent-memory-hub,也重新想清楚了轻量记忆层能解决什么、不能解决什么。

多 Agent 协作最先暴露的,往往不是模型能力不足,而是上下文无法流动:Claude Code 记住了代码风格,OpenCode 不知道;Hermes 聊过项目进展,下一次编码会话又要从头解释。

agent-memory-hub:一个 Git 仓库连接 5 个 AI Agent
图 1:Claude Code、OpenCode、Hermes、QClaw 和 OpenClaw 通过指针文件连接到同一个 Git 与 Markdown 记忆仓库

我同时使用多个 AI Agent 之后,逐渐遇到一个很具体的问题:每个工具都在积累上下文,但这些上下文被锁在各自的目录、数据库或会话里。

工具越多,我越像在管理一支每天都会局部失忆的团队。为了让它们共用用户画像、项目进展和长期经验,我做了一个小型开源项目:agent-memory-hub

它没有向量数据库,没有独立服务,也没有新的 Agent Runtime。核心只是一个 Git 仓库、一组 Markdown 文件和几份告诉 Agent “去哪里读写记忆”的指针文件。

这篇文章不只介绍它怎么用,更重要的是解释:为什么我选择这个看起来很朴素的方案,以及它真正的能力边界在哪里。


一、真正的问题不是没有记忆,而是记忆没有共同地址

Claude Code、OpenCode、Hermes 等工具都有自己的上下文机制。单独使用时没有问题,多工具并行后却会出现四种割裂:

  • 用户偏好只存在于某一个 Agent;
  • 项目阶段结论散落在不同会话目录;
  • 新设备没有旧设备的本地记忆;
  • 同一事实被复制多份,更新后互相矛盾。

最消耗人的不是保存文件,而是反复充当“人工同步总线”:把这边的结论复制到另一边,再解释哪些信息已经过期。

多 Agent 各自失忆与共享记忆层的对比
图 2:左侧的用户画像与项目记忆散落在不同工具目录;右侧由一个共享仓库提供统一画像、索引和跨设备同步

所以我给问题换了一个定义:

多 Agent 记忆的第一阶段,不一定需要更聪明的检索,而是先需要一个稳定、可迁移、可审计的共同地址。

这个定义很关键。它把项目从“再造一套记忆数据库”收缩成了三个工程目标:

  • 所有 Agent 能找到同一份用户画像和记忆索引;
  • 记忆以普通文件保存,可以搜索、审查、回滚;
  • 换设备时只需要恢复仓库并重新分发指针。

二、为什么没有直接上向量数据库

我调研过 mem0、Letta 等方案。它们擅长语义检索、长期记忆抽取或完整 Agent 平台,但也意味着新的服务、存储、模型调用和运维边界。

我的实际规模只有几百个 Markdown 文件。这个阶段最常见的查询不是“寻找语义相似度为 0.83 的片段”,而是:

  • 之前对这个项目做过什么决定?
  • 用户偏好放在哪里?
  • 上次发布踩过什么坑?
  • 某个 Agent 保存过哪些长期结论?

目录、索引和全文搜索已经能够回答这些问题。此时先引入数据库,增加的可能不是能力,而是迁移、备份、权限和故障排查成本。

因此 agent-memory-hub 的选择是:

需求当前方案
统一用户画像USER.md
长期记忆归档memory/ 下按 Agent 分目录
快速定位自动生成 memory/INDEX.md
跨设备同步私有 Git 仓库
Agent 接入各工具约定位置的指针文件
语义检索暂不内置,需要时再叠加

Markdown 不是因为它最先进,而是因为它在当前规模下最容易拥有、检查和迁移。将来即使接入向量检索,Markdown 仍然可以继续作为事实源。


三、三层架构:数据、适配与引导

项目把职责拆成三层。

agent-memory-hub 的三层架构
图 3:数据层保存画像和记忆,适配层为不同 Agent 提供指针模板,引导层负责检测环境、替换路径并完成分发

1. 数据层:真正需要长期保存的内容

数据层位于共享仓库本体:

  • USER.md:用户画像和稳定偏好,是单一事实来源;
  • memory/:按 Agent 归档长期记忆;
  • memory/INDEX.md:同步时重新生成的文件索引;
  • SKILLS.md:可选的共享技能索引;
  • machines/:为设备差异预留的位置。

这层故意保持普通。任何编辑器都能打开,任何 Git 工具都能查看变更历史,仓库损坏时也不需要先恢复数据库服务。

2. 适配层:让不同 Agent 学会找同一个地址

不同工具读取全局指令的位置不同:

Agent指针文件
Claude Code~/.claude/CLAUDE.md
OpenCode~/AGENTS.md
HermesMEMORY.md 与 USER.md
QClawworkspace/MEMORY.md
OpenClawworkspace/MEMORY.md

agents/ 目录为每个工具准备一份模板。setup 脚本把模板里的 {{SHARED}} 替换成当前仓库的真实路径,再复制到对应位置。

指针文件不保存完整记忆,只保存三个约定:启动时读哪里,需要历史时查哪里,新长期记忆写到哪里。

3. 引导层:把接入动作做成可重复脚本

setup.ps1 与 setup.sh 负责:

  • 检测当前操作系统和已安装的 Agent;
  • 找到各 Agent 的配置目录;
  • 展开指针模板中的共享路径;
  • 在不覆盖现有文件的前提下安装指针;
  • 运行第一次同步。

这使接入不依赖一份容易过期的人工操作手册。新增 Agent 也不需要改数据层,只要增加模板和检测逻辑。


四、同步脚本真正做了什么

scripts/sync_memory.py 只使用 Python 标准库,当前主要完成四件事:

  • 扫描 Claude Code 项目记忆并复制变化文件;
  • 读取 Hermes 的根记忆文件,并从 state.db 导出可识别的会话;
  • 重新生成 memory/INDEX.md;
  • 保存本机同步状态,并在有变化时创建 Git commit;传入 --push 后再推送。

OpenCode、QClaw 和 OpenClaw 的指针则要求 Agent 直接把长期记忆写入共享目录,因此不需要额外搬运。

整个过程更像“归档器 + 索引器”,不是一个持续在线的双向同步服务。Windows 可以用任务计划程序定时运行 sync.bat,Linux 与 macOS 可以使用 cron,但这些定时任务需要用户自行配置。

# 首次接入
git clone https://github.com/<you>/agent-memory-hub.git ~/.shared
cd ~/.shared
bash setup.sh

# 日常归档并推送
python scripts/sync_memory.py --push

项目 README 里的“10 秒恢复”是一句设计目标,而不是经过多设备基准测试的 SLA。真实耗时取决于 Git 网络、Python 环境、Agent 数量以及现有配置是否冲突。


五、三个看似朴素、其实很重要的设计决定

1. 复制指针,而不是依赖符号链接

符号链接看起来更优雅,但 Windows 上可能需要开发者模式或额外权限;工具卸载、目录迁移后,死链也不容易被发现。

复制文件的代价是模板更新后要重新执行 setup;好处是目标文件真实存在,排障更直接,也可以通过 --force 明确覆盖。

2. 同步脚本主动提交,而不是只依赖 Git hooks

Git hooks 只能在 Git 命令发生时触发,无法发现 Agent 直接写入本地目录。让同步脚本负责“采集、建索引、提交”,才能形成完整动作。

这不代表所有环境都应该自动 push。提交可以作为本地审计点,是否推送应该由用户根据隐私与冲突风险决定。

3. 路径探测,而不是写死某一台电脑

Hermes 在不同系统上的目录可能不同。PowerShell、Bash 和 Python 脚本都维护候选路径并自动探测,仓库本身则通过脚本位置动态得到共享目录。

路径动态化,是这个方案能够跨设备复用的基础;machines/ 只保留真正无法统一的设备差异。


六、代码审校后,我认为必须明确的五个边界

把一个项目写成文章,最容易发生的问题是把“已经能运行”写成“已经解决所有问题”。基于当前仓库代码,我给 agent-memory-hub 留下五条明确边界。

边界一:它统一的是地址,不是 Agent 的理解能力

指针文件可以要求 Agent 读取 USER.md 和 memory/INDEX.md,但最终是否读取、如何提取、是否正确应用,仍取决于各 Agent 的指令加载机制和执行质量。

边界二:它没有语义检索和自动去重

INDEX.md 是文件索引,不会判断两条记忆是否冲突,也不会自动合并同义内容。文件规模继续增长后,需要增加整理流程或叠加检索层。

边界三:Hermes 会话不是无损备份

当前导出逻辑会把每条 Hermes 消息截取到前 500 个字符。这足以生成轻量归档,但不能称为完整会话备份。真正重要的长期结论仍应主动整理为独立 Markdown。

边界四:Git 冲突需要人工处理

多设备同时写同一文件时,Git 仍可能冲突。当前项目没有自动合并、锁或冲突仲裁服务,更适合单人、多 Agent、低并发的工作流。

边界五:记忆仓库必须按敏感数据管理

同步脚本提交时会暂存仓库中的全部变化。用户画像、项目上下文和会话摘要可能包含隐私、客户信息或密钥,所以必须先完成脱敏,并把自己的记忆仓库设为私有。

模板仓库可以公开,真实记忆仓库不应该默认公开。运行 --push 前,先执行 git status 和 git diff --cached,确认没有敏感内容。


七、一条更安全的首次接入路径

如果你要试用,我建议不要直接在公开模板仓库里积累个人记忆,而是按下面的顺序:

  • Fork 或复制项目骨架;
  • 删除模板 remote,创建自己的私有仓库;
  • 检查 .gitignore,并补充你自己的敏感文件规则;
  • 编辑 USER.md,只保留真正需要跨 Agent 共享的信息;
  • 先用 --no-git 运行一次同步,检查 memory/ 和 INDEX.md;
  • 人工审阅 Git diff;
  • 确认无敏感内容后再提交和推送;
  • 最后再配置计划任务或 cron。

这条路径比“clone 后立即 --push”多几分钟,却能避免把个人长期记忆推到错误仓库。


八、它适合谁,又不适合谁

场景是否适合
单人同时使用多个编码或对话 Agent适合
几十到几百个 Markdown 记忆文件适合
希望通过 Git 审计和跨设备恢复适合
需要毫秒级语义召回与复杂排序暂不适合
多人高并发写同一记忆空间暂不适合
需要细粒度权限、加密与合规审计需要额外基础设施
想完整备份所有 Agent 会话当前实现不保证

我更愿意把它称为“个人多 Agent 记忆底座”,而不是通用记忆平台。它解决的是拥有权、共同地址和可迁移性;检索智能、冲突治理与企业权限可以在未来按真实需求增加。


写在最后

多 Agent 系统很容易从模型、协议和向量数据库开始设计,但我的真实痛点更基础:同一个人、同一批项目、同一组长期决策,为什么要在每个工具里重复维护?

agent-memory-hub 给出的答案并不复杂:

先让记忆有一个所有 Agent 都能找到、用户自己能够拥有的地址,再讨论如何让检索更聪明。

Git 提供版本、同步和回退,Markdown 提供透明度与可迁移性,指针文件负责把不同 Agent 接到同一个事实源。对几百个文件的个人工作流来说,这种简单不是缺陷,而是一种有意控制复杂度的选择。

项目已经以 MIT 协议开源。如果你正在同时使用多个 Agent,可以从骨架开始,但请把隐私审查和私有仓库放在第一次同步之前。


项目与审校依据

说明:本文根据 agent-memory-hub 本地仓库的 5ffeee0 版本审校。支持范围、脚本行为与限制来自当前 README、setup.ps1、setup.sh、指针模板和 scripts/sync_memory.py;“10 秒恢复”属于项目口号,本文没有把它作为独立性能结论。

版权与声明

本站所有内容仅代表作者个人观点,与作者供职的公司、客户或其他关联机构无关。

本文除特别声明外,采用 CC BY-NC-SA 4.0 许可协议。转载或改编请署名、附原文与许可证链接,并标明改动;不得用于商业用途,演绎作品须以相同许可发布。

评论