
设计经得起重试的异步记忆写入
2026年8月5日指南

盘点真实调用、映射语义、重放脱敏轨迹,并在持久状态与召回通过前保留独立回滚。
记忆系统迁移不是修改一个 import。两个 API 都可能提供 add、search、update 和 delete,却对提取、身份、时间字段、过滤、分页、历史,以及何时算写入完成有不同理解。
安全路径从已经部署的真实契约开始,而不是从今天的 quickstart 开始;只有持久状态和下游答案都通过观察期,迁移才结束。
记录 mem0 SDK 与服务版本、托管方式、向量后端、模型配置、自定义提示词、图或重排功能、默认限制,以及应用从响应中读取的每个字段。改变依赖前保存有代表性的请求与输出。
最低限度要盘点:
生产契约可能比今天读到的文档更旧,也可能经过定制。当前文档可以参考,但不是产品曾经部署过什么的证据。
| 关注点 | 来源问题 | FishMem 决策 |
|---|---|---|
| 外层租户 | 哪个账户或项目拥有数据? | 绑定已认证项目命名空间,绝不信任正文传入值 |
| 用户与 agent 作用域 | 谁应该召回记录? | 只有含义一致时才映射到 user_id、agent_id、run_id |
| 推理 | 导出内容是持久事实还是原始对话? | 已提炼记录使用 infer=false;推理另行评估 |
| 时间 | 时间戳代表写入、事件还是有效期? | 保留已知含义,不制造精度 |
| 历史 | 更新是替换、追加还是替代? | 明确选择当前状态和不可变历史行为 |
| 完成 | 来源调用何时报告成功? | 确定写入同步完成;Cloud 推断写入返回持久事件 |
mem0 导出通常包含记忆记录,而不是生成它们的原始对话。再经过另一个提取模型会改变措辞、丢失细节,也让团队无法区分迁移损失和新产品行为。
使用 infer=false 确定性导入记录内容,把来源标识保存在迁移 provenance 中,并在观察期结束前把原始导出独立保存。如果同时拥有原始对话并想比较新推理策略,那应该是一项单独实验。
每条来源记录都需要持久迁移状态。实用账本包括:
幂等键应来自稳定迁移身份,而不是循环计数器。导入程序重启后,应收敛到同一组目标记录。
创建隔离 FishMem 项目并重放脱敏用户旅程。比较的内容不能只限于搜索文字:
案例要包括无相关记忆、冲突事实、变化偏好、重复请求、缺失元数据,以及具有相似历史的不同用户。只测试第一次成功 add,既没有测试检索,也没有测试隔离。
影子阶段继续让来源系统保持权威。把同一查询发送给 FishMem,记录两组结果并比较下游决策,但不把 FishMem 输出呈现给用户。这样可以在影响生产前发现排序和格式差异。
不要要求上下文字节完全一致。两个系统可能以不同措辞和顺序支持同一个正确决策。应定义必须出现的证据、禁止出现的证据和预期答案行为。
依赖目标系统健康才能执行的回滚,不是独立回滚。保留来源导出、来源到目标账本、旧读取路径,以及对金丝雀期间新增写入进行对账的方法。
退役前先导出 FishMem,并验证该命名空间能够恢复到空目标。这不仅证明可以进入 FishMem,也证明可以离开。
user_id 可能代表最终用户、账户或对话参与者。映射的是授权含义,不是字符串。
导入时间可能只代表某行何时写入,并不代表事实何时成立。应该分开,或让事件时间保持未知。
迁移在声称保存内容时改变了内容。应按原文导入已提炼记录,再用原始证据单独评估新提取策略。
如果任一后端成功就向应用报告成功,两边必然漂移。分别记录结果,并在每个阶段明确定义谁是权威。
FishMem 与 mem0 没有关联,也不声称在所有场景中无缝替代。迁移界面有意保持熟悉,但语义差异依然存在。只发布已经验证的版本和案例,其余一律标记为未测试。