从一家记忆服务商迁走。
一个向量索引是你的语料与一个嵌入模型的纯函数:删掉它、把任务重跑一遍,你就回到了原处。智能体记忆不是,而这唯一一处差别就是你退出风险的全部。一家记忆服务商所持有的,是一件派生的、路径依赖的工件——由他们的提示词抽取出来的事实,按他们的策略去重与取代,并且是按你的历史恰好抵达的那个顺序形成的——而在领先的产品里,那条流水线明确就是不开放的那一部分。所以你真正搬得出去的唯一资产是原始会话历史,这意味着「你到底有没有一条退路」这个决定,是在写入通路上做的,在你集成之前,而且此后再无第二次机会。
记忆不是索引,而检验标准是你能不能把它重建出来。
先从拒绝那个让团队自满的类比开始。重建索引与嵌入迁移是一项痛苦而昂贵的操作,但它是一次重算:每个向量都由一个分块与一个模型版本所决定,而两者你都握着,所以最坏情况是算力与墙上时间。没有任何东西丢掉了而又无法重新生成。
而一条记忆至少由五项输入决定:原始历史、抽取提示词、抽取模型、那条决定什么合并、什么被取代的整合策略,以及那一段情节抵达时的先前记忆状态。你握着第一项。中间三项属于服务商。而第五项让整件事变成路径依赖的——记忆会整合、会相互矛盾、会取代、会遗忘,这正是你付钱买的那些有用行为,也正是「把同一段历史按不同顺序重放会得出一个不同的存储」的原因。没有哪一次重跑会收敛到你现在所拥有的那个东西。
所以实际的问题不是「我能导出吗」,而是「如果我导出了,我拿到的是什么」——而诚实的答案是:某一家服务商结论的一份快照,不带任何推理过程,也没有办法复现它。这是一份「防服务商消失」的对冲。它不是一条迁移路径。
有一个快办法能看出你的团队是否理解了这点:问一句,如果服务商下周悄悄上线了一个更好的抽取模型,会发生什么。对一个索引来说,什么也不会发生——在你重新嵌入之前你的向量毫无变化。而对记忆来说,你的存储会开始按新规则累积事实,而旧的那些行还待在旧规则之下,并且你系统里没有任何东西记录了哪条是哪条。你自己数据里缺的那条边界,正是让迁移变难的那同一处缺失。
读许可证,要读的是「哪项能力是演示级的」,而不是那个 SPDX 标识。
这个品类里几乎每一个认真的项目都以宽松许可证发布,而读那行头条几乎告诉不了你任何关于可携性的事——因为那道边界是穿过流水线画的,不是穿过代码画的。三个具体例子,截至 2026 年 10 月全都是项目自己说出来的:
- Mem0 是朴素、未经修改的 Apache-2.0。而它自己的 README 仍然注明,已发表的那些基准数字出自那个托管平台,其中包含「开源 SDK 中不提供的专有优化」,并且开源用户应预期「方向上相似的提升,但不是相同的数字」。许可证是真正开放的;而你在试用里量到的那份整合质量,可能不是你自托管得了的那样东西。
- Cognee 是 Apache-2.0,并提供一条「以 Postgres 作图存储」的路径,而它被标注为一项演示功能,附带那句「可用于生产的版本以授权产品形式提供」。它内置的实体抽取器也带着同一条须注意。你会拿来搭生产部署的两项能力,在那个开放仓库里是刻意做成演示级的。
- Zep 以 Apache-2.0 发布 Graphiti——它那套时序知识图谱框架——而产品自身的引擎、托管部署与用户/会话管理仍是商业的。自托管 Graphiti 是真实且受支持的;它是「自备图数据库」,而周边那套运营工具你得自己建。
这些都不是什么不正当手法——它正是一桩开放内核生意的常态形状,而这些项目都在公开处记录了它。失误在买方这一侧:一张带「许可证」字段的采购清单拿到了一个令人满意的答案就停了,而真正决定你退路的那个问题,是「哪一项具体能力在哪一档可用」。请把那个问题写进评估里,写成文字,在试用之前:请点出,我们正在测试的那个版本与我们会实际运行的那个版本之间,流水线的哪些部分不同。
在你需要它之前就把导出跑一遍,并且搞清楚导入它会做什么。
一个从未按你的量级跑过的导出端点,不算一个导出端点。在试用的第一周就按一个现实的规模跑它,并把产物留着——它既是你的对冲,也是你关于「服务商认为什么是你的」唯一一份诚实文档。
- 查清那个格式承载了什么。你通常会拿到带时间戳的抽取语句,有时有图的边,有时有派生出的用户画像。你通常拿不到抽取提示词、取代决策、嵌入模型版本,或逐条事实的置信度。没有来源溯源,你后来就无法把「智能体被告知的事实」与「流水线推断出的事实」区分开。
- 给它计时,并把它排进日程。一个要跑六小时、而且断了不能续的导出,在一次事故里是用不上的。请在试用期间弄清这件事,而不是在迁移期间。
- 要明白导入是重新抽取,不是恢复。把一家服务商的结论装进另一家的摄取通路,意味着后者的流水线现在把别人的推断当作原始输入来对待。它会再从这些东西里抽取一遍,并继承前一个系统的错误,而且没有任何标记表明这些是继承来的。被双重抽取过的记忆比冷启动的记忆更糟,因为它错得很有把握,而错法恰是你的评测当初没被设计来抓的那种。
- 把那份导出的保留期纳入范围。一份记忆转储是一堆密集的个人数据落在了一个新位置,这就把它牢牢放进了保留与法律封存之内,也让它成为一次删除请求必须触达的又一个地方——见对智能体记忆行使删除权。
保住退路的那一个决定:自己拥有原始历史。
以上的一切都指向一条架构规则,而只有当你在集成之前采纳它时,它才是便宜的。把原始会话记录——以及记忆由之派生出来的那些工具结果——在写入通路上写进你自己的持久存储,与那次服务商调用相互独立。那么服务商的存储就成了一个缓存:预热很贵,丢了很烦,但对你「走得了」这件能力并不承重。
把它说成一条性质:任何记忆服务商都绝不该成为「你无法从自己数据里重建之物」的权威记录方。如果一段会话的唯一副本活在服务商那里,那你拥有的不是一段供应商关系,而是一项依赖。
- 先写你自己的,或者并行写——绝不要只在之后写。一条「仅在服务商调用成功时才本地落盘」的写入通路,丢掉的恰恰是「当服务商就是那个问题时」你会想要的那段历史。
- 存输入,不只存消息。工具结果通常正是那些耐久事实的来源,它们常常在模型看到之前就被截断,而且它们正是没人去留存的那一部分。缺了它们,一次重放重建出来的是一段不同的会话。
- 别拿你的链路存储来当这个用。链路记录按设计就是抽样的、短保留的——按链路抽样与保留所述,这正是正确的设计——而这恰恰让它成了「那一份必须完整且持久的副本」的错误底座。
- 诚实地给它定价,因为它是便宜的那一半。原始文本很小,按冷存储计价;而把它变成记忆的那次抽取,是每段情节一次模型调用。留着历史花的是存储费。不留着历史,花掉的是「走得了」这个期权。
- 刻意决定这次双写的失效方式。如果你自己的存储不可用,这一轮还继续吗?对权威记录方来说,答案该是「不继续」——这就是失败拦截与失败放行那个问题,而这回答案异常清楚。
把切换当成一次重放来跑,并为它产生的那笔账单做预算。
历史在手,这次迁移就不再是一次数据搬运,而成了一次重建——更慢、更贵,而且可预测得多。管用的次序是:
- 从你自己的存储出发,把新的情节双写给两家服务商。不是从旧服务商出发——是从源头出发——这样新的存储就是由它自己的流水线从原始输入建起来的,而这是让它的行为与你当初基准测过的那样一致的唯一办法。
- 按最旧优先重放历史,并把它当一笔 token 账单来做预算。这是团队会低估一个数量级的那一步。抽取至少是每段情节一次模型调用,所以为一个大用户基数重放一年的会话,是一笔真金白银的开销、带着真实的墙上时间,不是一次隔夜拷贝。给它限速,别让它与生产流量争抢——这与任何一次批量与回填运行是同一套纪律。
- 按构造就该预期新存储在第一天更差。它是空的,而它会随着重放落地而恢复。团队会把这读成对新服务商的一份质量裁决,然后在第三天中止迁移。请在开始之前就定下测量窗口,并让它长于那次重放。
- 影子读要按结果来比,不按重合度来比。你可以比较两家服务商每次请求各检索出了什么,但「正确的那些记忆」并没有标准答案,所以记忆重合百分比只会告诉你「这两个系统不一样」。请改成对着录制流量给下游任务打分——用录制轨迹做重放测试就是那个机制,而它是此处唯一有意义的比较。
- 在切换期间、以及切换之后,都让旧服务商保持可读。两边都读、只往新的写、旧的设为只读——然后把那条读取通路留得足够久,好回答「三月份它知道些什么」,因为总会有人来问。
靠你自己的评测来定,绝不靠那些已发表的分数。
这个品类已发表的数字无法为一次采购决策做裁决,而原因是结构性的、不是某一家厂商诚不诚实的问题:不同的裁判模型、不同的阅读模型、不同的测试台,而那些头条数字有时是由一个托管平台跑出来的,其优化并不在你会实际运行的那个版本里。同一个产品,在名字相同的基准上被报出过天差地别的分数,取决于谁跑的、什么时候跑的——《记忆基准分不是那个采购决策》详细追了这件事是怎么发生的。请把任何跨厂商几个百分点的差距当作噪声,把任何「两家厂商自报数字之间的比较」当作不可解读。
取代它们的东西不起眼,却能定夺:一份从你自己录制流量里取出的冻结评测集,在迁移开始之前就约定好,按任务结果打分。把集合定死、把裁判定死、把阅读方定死,那么唯一在变的就只有服务商——而这正是你真正需要的那次比较,也是没人能代你发表的那一次。
- 提前约定切换门槛。迁移中途是协商「什么叫够好」的最糟时刻,而一次仍在填充中的重放,永远看起来都像是「该再等等」的理由。
- 把检索失败与抽取失败分开。「智能体不知道」有两个起因,而修法恰好相反,而服务商的仪表盘不会把它们分开。请把检索出的那一组与答案一并记录下来,这样你才分得开。
- 在服务商下一次发版之后重跑评测。抽取与整合会在你脚下变化,而且没有一个你钉得住的版本——这就是未钉住的厂商默认值那个问题,只是反馈延迟异常地长:这周写下的记忆,下个季度才被读到。
- 向你的出资人只报一个数。在约定窗口结束时,冻结集上的任务成功率,旧服务商对新服务商。本页其余的一切,都是为了让那一次比较诚实而服务的。
如果你已经集成了,而上面这些一样都不在位,那这周就做那两件便宜的事,其余的先放着。第一,开始把原始会话记录与工具结果写进你自己的存储——这是一次写入通路的改动,它花的是存储费,而从那天起你就有了一条昨天还没有的退路。第二,把服务商的导出按全量跑一次并计时,然后把它排成季度例行。重放工具、冻结评测与双写才是真正的活儿,但它们只有在历史已经存在之后才值得去建;没有历史,就没有什么可重放的,而你正在筹划的那次迁移,在任何预算下都做不成。