那是一个周二的早晨。我的 OpenCode 会话上下文已经膨胀到 378,755 个 token——几周来交易机器人开发的全部成果。我敲下了 /compact。模型当场卡壳:只输出了 3 个 token,摘要一片空白,finish: length。压缩失败了,而我当时用的记忆插件偏偏把所有东西都存在同一次压缩调用内部。结果:彻底失忆。记忆清零。这个会话相当于被切除了前额叶。
这次翻车让我悟出了智能体记忆设计中唯一真正要紧的一条规则:永远不要只把记忆存在压缩调用里。要边干活边增量保存——这样压缩失败的代价,只是丢一份摘要,而不是丢掉你的全部过往。
于是我开发了 opencode-mempalace-persistence(v2.1.0,MIT 协议),构建在 MemPalace 之上:每一轮对话都会自动存入本地的向量记忆宫殿——全程零云端——再回注到未来的提示词中,跨压缩也跨会话。
工作原理
-
自动注入回忆——借助
experimental.chat.messages.transform,身份信息与相关记忆会自动落进每一条提示词,完全不依赖模型自觉。 - AI 检查点——每 15 条消息,模型就会通过 MemPalace 的 MCP 工具(日记 + 知识图谱)归档当前主题、关键决策和重要原话。钩子决定何时存,模型决定存什么——与官方 Claude Code 钩子是同一套模式。
- 压缩前紧急保存——每次压缩之前,先把所有关键内容归档妥当,再把核心记忆重新挂到摘要上,确保它挺过压缩。
- 退出保存——退出时(哪怕按 Ctrl+C)也会同步挖掘最后几轮对话。
-
项目专属侧翼——
bot-api的会话内容绝不会混入mobile-app的记忆。 -
历史回填——设置
OPENCODE_MEMPALACE_BACKFILL=1可一次性挖掘全部历史(我曾从一个挂掉的会话里回填出 9,448 条消息、1,735 个抽屉)。 - 内置回忆技能——一套问题驱动、“先搜索、后作答”的协议,改编自官方 MemPalace 技能。搜索结果一律逐字引用,绝不转述改写。
安装(3 步)
1. 安装 MemPalace:
uv tool install "mempalace>=3.3.5"
mempalace init ~/opencode-memory
2. 插件 + MCP 服务器,配置位于 ~/.config/opencode/opencode.json:
{
"plugin": ["opencode-mempalace-persistence"],
"mcp": {
"mempalace": {
"type": "local",
"command": ["mempalace-mcp"],
"enabled": true
}
}
}
3. Identity:在 ~/.mempalace/identity.txt 里写上两行关于你的介绍,重启 OpenCode。搞定——从此以后它会自动保存:每 15 条消息存一次,空闲时、退出时、每次压缩前也都会存。
为什么用 MemPalace 而不是摘要?
摘要工具提炼完就丢弃。MemPalace 存的是逐字记录的完整对话,外加一个带时间有效性事实的知识图谱(情况一变,就用 kg_supersede/kg_invalidate 来更新)。新会话问"为什么认证用 Postgres 而不是 Redis?"时,它拿到的是当初的决策及其完整推理——连"拍板的工程师当时正在休假"这种细节都原样保留。
相关链接
- GitHub:https://github.com/geco/opencode-mempalace-persistence
- npm:https://www.npmjs.com/package/opencode-mempalace-persistence
- MemPalace:https://github.com/MemPalace/mempalace
如果你也在用 OpenCode,而压缩焦虑让你夜不能寐,不妨试试——欢迎提 issue 和 PR。你现在跑的是什么样的记忆方案?我真心好奇,别人的技术栈里最后都留下了些什么。
