同一份经验分别落在模型权重与外部索引两侧,中间有一道待核对的接缝

一、先划边界:哪层放什么,不由参数量决定

据公开报道,记忆张量发布并开源了”记忆原生”基础模型 MemT 1.0 系列,做法是在 Transformer 结构里加入原生记忆模块,权重与推理代码经 Hugging Face 与 GitHub 提供。消息一出,讨论就滑向”是不是不用再搭检索了”。这个问题问错了方向。参数表告诉我们容量与算力,不告诉我们一条具体的经验应当存在哪里、由谁负责它过期。存在哪一层是数据治理决定,不是模型架构决定。

我们把判断拆成三个必须分别回答的问题,顺序不能换:

  1. 经验存在哪一层——这条知识是跨会话稳定的规律,还是随时可能被修订的当前事实?
  2. 什么时候需要被撤销——有没有一天会有人拿着合同或合规要求来说”这条要消失”?
  3. 两层各自承担什么验收——记住了要能证明是记住的,检索到了要能证明出处是对的,两件事用同一套指标必然互相掩盖。

适合被写进模型状态的经验有共同特征:变更频率远低于对话频率、允许滞后生效、错了也不会引发外部动作、不要求逐条出处。典型如团队的代码风格偏好、某类工单的常见处置路径、某个行业术语的稳定用法。这类东西的价值恰恰是”不必每次再解释一遍”。

必须留在检索层的也有共同特征:有时效(价格、版本、政策、库存)、有出处要求(要引用到具体文档段落)、有撤回义务(客户删除请求、合同到期、纠错声明)、有范围限制(只对某个租户或某个项目生效)。把这四类交给模型状态去承载,等于把一份可增删改的清单编进了混凝土。

经验类型 变更频率 是否要求出处 撤回义务 归属层
表述风格与偏好 低 不要求 无或很弱 模型状态可承担
领域稳定概念 低 建议有 弱 模型状态 + 检索兜底
价格与配额 高 必须 强 只进检索层
政策与条款 中 必须且到段 强 只进检索层
客户业务数据 不定 必须 最强(含删除) 只进检索层
故障处置经验 中 建议有 中 先检索层验证,再考虑沉淀

二、撤销成本要在写入之前算,不是之后谈

记忆层最容易被忽略的工程属性是撤销的代价不对称:写进去是一次动作,抹掉它可能是完全不同的量级。

能想到的撤销手段大致四条,各有前提。一是反向微调或”遗忘训练”,需要知道要抹的到底是哪一段关联,否则训练信号本身就没有靶子,还容易顺带伤到邻近能力。二是输出侧过滤,工程上最便宜,但它是围堵而非移除,同一条记忆在别的表述下仍会漏出来,且过滤规则会变成新的技术债。三是模块级擦除,前提是这个记忆机制的写入位置对开发者可观测、可定位到具体结构;黑盒状态下谈”精确擦除”多半是宣传。四是重训或换一个不含该数据的版本,最彻底也最贵,代价是整个能力基线一起变动,你得重跑全部回归才知道换掉了什么。

因此在决定”让模型记住”之前,我们要求先填三个字段:这条经验未来是否需要被撤回、撤回能接受的成本档位、能否定位到写入的载体。三个字段里只要有一个答不上来,结论就是先放检索层——检索层的撤销是一次删除操作,代价可控且可验证。

这里有个反直觉的点:撤销成本决定的是准入策略,不是运维策略。很多团队的做法是先享受记忆带来的连贯体验,等真出现撤回要求时再想办法,此时数据分布已经扩散,评估和清理都无从下手。把顺序倒过来,代价才留在能算清的地方。

三、同一事实两层都有,一致性责任必须有唯一归属

双层并存的真实风险不是冗余,是版本错位:检索层的条款已经改到第三版,模型状态里还留着第二版的表述。模型不会声明自己依据哪个版本,检索结果却带着明确的段号。这时同一句话里出现两个口径,最终答复到底以哪边为准,成了一个没人签字的决定。

我们的规则只有一条:检索层是唯一真源,模型状态不承载可版本化的事实。凡是能用”这条何时生效、被谁改过、原文在哪”三问描述的,一律不进模型。允许留在模型里的,只有不随单条文档变更而变更的规律性内容。这样冲突的定义就变简单了——只要模型的说法与检索层带版本的文本不一致,就是模型的错,不存在”两边都对”的状态。

但规则不写责任人是空的。我们把一致性做成一个定期跑的回归:挑出一批已知发生过变更的事实,同一问题分别用”两层都在”与”只留检索层”两种方式提问,比较答案口径与版本标识。不一致即告警,处置动作是关闭该条记忆的准入并把这条事实重新登记为”仅检索”。同时要求日志里留下每次回答是否使用了检索片段、片段标识是什么,否则回归结果无法归因,只能得出”有点不对”。

四、评测要能区分”记住了”与”检索到了”

把两层混在一个准确率里,会得到一个对项目立项最有用、对运维最没用的数字。要拆开,方法是对照实验,不是加指标。

三个开关组合分别读出不同结论:

  • 检索层关闭、记忆层保留:剩下的正确率近似反映”模型自己记住了多少”。这一档的下降幅度还能看出哪些能力完全依赖外部注入,一旦检索服务不可用就整体塌掉。
  • 记忆层冻结或替换为不含该经验的版本、检索层保留:退化幅度反映”检索贡献了多少”,同时能验证检索链路本身的健康度。
  • 两层都开:上界与协同效应。如果这一档明显高于前两档之和的意义水平,说明提示拼装与模型先验在配合;如果几乎等于单开检索,那记忆层在这个场景就是没换来东西。

这套实验有两个陷阱,不处理就白跑。第一个是”关掉检索”不彻底——检索服务的结果缓存、会话内已注入的历史片段、上层应用把文档写进系统提示的旁路,都会让被关掉的那一层继续漏进信息。关闭动作要做在网关与应用两层,并验证提示里确实没有目标文档的痕迹。第二个是评测集自污染——如果新任务的样本本身进入了记忆写入通道,第二次跑分就是在测自己见过的题。评测集要么冻结版本、要么与记忆写入通道物理隔离,并在记录里写明这一条。

另外要单独度量该拒答时是否拒答。记忆层的一个典型失效模式是把过时内容说得很有把握;检索层的一个典型失效模式是召回了不相关片段仍然照读。二者在”自信的错误答案”上表现相同,只有配上出处检查与时效检查才能分开。

五、客户数据进了模型状态,数据边界要重画

企业交付里这条最实际:一旦某份客户语料被写进模型状态,数据的留存形态就变了。以前它是一份可读、可列清单、可逐条删除的文档集合;之后它变成模型能力的一部分,可能无法逐条枚举。这直接影响三件事。

  • 导出:客户要求”把我们的数据给我们”时,能否导出与这层数据对应的内容?答不出范围,就不能允许它进模型状态。
  • 遗忘:删除请求要能覆盖模型状态,否则流程上删干净了、行为上还在回答,这属于最难解释的一类审计发现。
  • 多租户:记忆是否跨租户共享是必须先确认的属性,而不是事故后再查的问题。共享的记忆模块配上”某客户的内部规则”就是数据外泄路径;隔离的记忆层则要面对容量与成本核算。

私有部署在这件事上并不天然更安全,区别只是可观测性在你手里:你能检查写入通道、能拿到状态快照、能控制冻结与替换的时机。用托管接口时,上面三条全部要变成接口侧的书面能力声明,问不出来就按不支持处理。

六、把结论落成一份可执行清单

我们不在立项会上争论要不要记忆,只让下面这张表通过与否决定路线。它同样适合作为交付附件给客户看。

检查项 通过标准 不通过时的默认动作
变更频率评估 该经验在两个发布周期内不变 归入检索层
撤回义务确认 无删除要求,或删除可接受重训代价 归入检索层
定位能力 能说明记忆写在什么载体上 禁止写入
真源归属 检索层为唯一真源,模型不复述可版本化事实 补回归用例后再上线
双层一致性回归 已变更事实的答案口径一致 关闭该条记忆准入
关检索对照实验 可执行且能验证提示中无残留 评测结论不采信
评测集污染检查 评测样本与写入通道隔离 更换评测集版本
拒答与时效度量 有单独指标与阈值 补指标后再评估
数据导出与遗忘路径 书面能力声明或本地可控 该语料不进模型状态
多租户共享属性确认 明确不共享或范围可控 禁止接入跨租户语料

洹拓在给客户做这类方案时,最后交付的不该是一个模型加一个向量库,而是这张表里每一项的证据:谁签字、多久跑一次、不通过时退到哪条路径。记忆层能不能上,取决于撤得回来;检索层能不能省,取决于它承担的那部分验收有没有别的机制接住。两件事各自答清楚,”要不要做检索增强”这个问题就不再需要靠情绪回答了。