
记忆不是上下文:智能体状态的实用架构
2026年8月12日工程

可迁移的桌面快照必须保留什么、哪些内容可以重建,以及恢复过程如何避免残留半成品状态。
备份不是点击“导出”后得到的那个文件。备份是一项经过验证的承诺:设备损坏、升级出错或误替换之后,用户仍能恢复自己真正关心的状态。对本地记忆系统而言,这远不止界面当前显示的几行数据。
FishMem Desktop 把备份定义为带版本的命名空间快照。规范记录及其历史随快照迁移;搜索索引和其他投影明确标记为可重建,而不会被抬升为来源真相。
第一项设计决定不是文件格式,而是哪类数据可以重新生成、哪类绝对不能。这个答案应写进格式契约,而不是留在某位工程师的经验里。
| 数据 | 可迁移的权威 | 恢复行为 |
|---|---|---|
| 记忆内容与作用域 | 规范记录 | 保留稳定 ID、时间、有效期与删除状态 |
| 纠正与审计 | 不可变历史和事件 | 随记录一起恢复,使旧决策仍可解释 |
| 实体与关联 | 规范图记录 | 提交前验证内部引用 |
| 来源文档 | 带版本的来源内容和描述 | 先恢复来源家族,再重建检索 |
| 向量、全文索引、sidecar 视图 | 派生投影 | 从规范内容重建并核验 |
直接复制数据库对紧急取证可能有用,但它把恢复绑定到某个 schema 版本、某种存储引擎和某个进程时刻。复制可能撞上正在进行的写入,也可能漏掉数据库之外的来源对象。产品级备份需要位于这些实现细节之上的稳定、可验证表示。
FishMem 快照包含格式版本和来源命名空间身份。导出会把文档来源装入可迁移形式,并声明向量与 sidecar 状态需要重建。导入可以把快照绑定到另一个空命名空间,同时保留规范身份和历史。
Desktop 让用户选择保存位置,通过引擎导出默认命名空间,先写临时 JSON 文件,再原子重命名为最终文件。最终文件使用受限权限。序列化中途崩溃时,磁盘上应当保留旧文件或没有最终文件,而不是留下一个看起来可用的半截备份。
当前恢复入口对文件设有 512 MB 安全上限。这是一道保护栏,不代表任何 512 MB 快照都能瞬间恢复。大型本地资料库仍需要足够磁盘、时间和模型资源来重建语义投影。
恢复具有破坏性,因此 Desktop 服务契约要求明确输入 RESTORE 确认。在清理现有数据前,主进程会确认所选路径是上限以内的普通 JSON 文件,并针对目标命名空间解析完整可迁移快照。
验证不能停在“JSON 能解析”。它需要检查格式版本、记录形状、命名空间重绑定、稳定身份和内部引用。如果一条历史记录指向不存在的记忆,替换开始前就应失败。
如果导入或投影重建失败,Desktop 会清除部分目标,再导入操作前保存的快照。如果主恢复和回滚都失败,它会返回聚合错误,而不是声称其中一个资料库健康。
回滚可以降低风险,但不能替代独立备份。断电、磁盘损坏或文件系统错误可能同时中断主恢复与本地回滚。
语义检索依赖本地多语言嵌入模型和兼容的索引身份。在新设备上,模型可能仍在下载;模型或索引版本改变后,向量可能需要全部重建。Desktop 因此公开就绪错误,而不会悄悄降级为质量不同的远程路径或纯关键词路径。
界面至少应区分:
对比 JSON 数量是必要条件,但远远不够。发布演练应从已经安装的应用开始,验证用户实际依赖的行为:
这条路径证明 UI、主进程、服务层、SQLite、本地嵌入运行时和 CLI 对恢复后的状态达成一致。窗口能重新打开,只能证明 Electron 启动了。
Desktop 快照不是连续复制、云同步、多设备合并,也不能防御已经被攻破的操作系统。Desktop 仍是单机本地权威,备份由用户拥有。需要共享运营、托管恢复、组织与后台 worker 的团队,应评估 Cloud 或自托管服务。