模型自己记住经验之后,检索增强还要不要做:先看分工边界

一、先划边界:哪层放什么,不由参数量决定
据公开报道,记忆张量发布并开源了”记忆原生”基础模型 MemT 1.0 系列,做法是在 Transformer 结构里加入原生记忆模块,权重与推理代码经 Hugging Face 与 GitHub 提供。消息一出,讨论就滑向”是不是不用再搭检索了”。这个问题问错了方向。参数表告诉我们容量与算力,不告诉我们一条具体的经验应当存在哪里、由谁负责它过期。存在哪一层是数据治理决定,不是模型架构决定。
我们把判断拆成三个必须分别回答的问题,顺序不能换:
- 经验存在哪一层——这条知识是跨会话稳定的规律,还是随时可能被修订的当前事实?
- 什么时候需要被撤销——有没有一天会有人拿着合同或合规要求来说”这条要消失”?
- 两层各自承担什么验收——记住了要能证明是记住的,检索到了要能证明出处是对的,两件事用同一套指标必然互相掩盖。
适合被写进模型状态的经验有共同特征:变更频率远低于对话频率、允许滞后生效、错了也不会引发外部动作、不要求逐条出处。典型如团队的代码风格偏好、某类工单的常见处置路径、某个行业术语的稳定用法。这类东西的价值恰恰是”不必每次再解释一遍”。
必须留在检索层的也有共同特征:有时效(价格、版本、政策、库存)、有出处要求(要引用到具体文档段落)、有撤回义务(客户删除请求、合同到期、纠错声明)、有范围限制(只对某个租户或某个项目生效)。把这四类交给模型状态去承载,等于把一份可增删改的清单编进了混凝土。
| 经验类型 | 变更频率 | 是否要求出处 | 撤回义务 | 归属层 |
|---|---|---|---|---|
| 表述风格与偏好 | 低 | 不要求 | 无或很弱 | 模型状态可承担 |
| 领域稳定概念 | 低 | 建议有 | 弱 | 模型状态 + 检索兜底 |
| 价格与配额 | 高 | 必须 | 强 | 只进检索层 |
| 政策与条款 | 中 | 必须且到段 | 强 | 只进检索层 |
| 客户业务数据 | 不定 | 必须 | 最强(含删除) | 只进检索层 |
| 故障处置经验 | 中 | 建议有 | 中 | 先检索层验证,再考虑沉淀 |
二、撤销成本要在写入之前算,不是之后谈
记忆层最容易被忽略的工程属性是撤销的代价不对称:写进去是一次动作,抹掉它可能是完全不同的量级。
能想到的撤销手段大致四条,各有前提。一是反向微调或”遗忘训练”,需要知道要抹的到底是哪一段关联,否则训练信号本身就没有靶子,还容易顺带伤到邻近能力。二是输出侧过滤,工程上最便宜,但它是围堵而非移除,同一条记忆在别的表述下仍会漏出来,且过滤规则会变成新的技术债。三是模块级擦除,前提是这个记忆机制的写入位置对开发者可观测、可定位到具体结构;黑盒状态下谈”精确擦除”多半是宣传。四是重训或换一个不含该数据的版本,最彻底也最贵,代价是整个能力基线一起变动,你得重跑全部回归才知道换掉了什么。
因此在决定”让模型记住”之前,我们要求先填三个字段:这条经验未来是否需要被撤回、撤回能接受的成本档位、能否定位到写入的载体。三个字段里只要有一个答不上来,结论就是先放检索层——检索层的撤销是一次删除操作,代价可控且可验证。
这里有个反直觉的点:撤销成本决定的是准入策略,不是运维策略。很多团队的做法是先享受记忆带来的连贯体验,等真出现撤回要求时再想办法,此时数据分布已经扩散,评估和清理都无从下手。把顺序倒过来,代价才留在能算清的地方。
三、同一事实两层都有,一致性责任必须有唯一归属
双层并存的真实风险不是冗余,是版本错位:检索层的条款已经改到第三版,模型状态里还留着第二版的表述。模型不会声明自己依据哪个版本,检索结果却带着明确的段号。这时同一句话里出现两个口径,最终答复到底以哪边为准,成了一个没人签字的决定。
我们的规则只有一条:检索层是唯一真源,模型状态不承载可版本化的事实。凡是能用”这条何时生效、被谁改过、原文在哪”三问描述的,一律不进模型。允许留在模型里的,只有不随单条文档变更而变更的规律性内容。这样冲突的定义就变简单了——只要模型的说法与检索层带版本的文本不一致,就是模型的错,不存在”两边都对”的状态。
但规则不写责任人是空的。我们把一致性做成一个定期跑的回归:挑出一批已知发生过变更的事实,同一问题分别用”两层都在”与”只留检索层”两种方式提问,比较答案口径与版本标识。不一致即告警,处置动作是关闭该条记忆的准入并把这条事实重新登记为”仅检索”。同时要求日志里留下每次回答是否使用了检索片段、片段标识是什么,否则回归结果无法归因,只能得出”有点不对”。
四、评测要能区分”记住了”与”检索到了”
把两层混在一个准确率里,会得到一个对项目立项最有用、对运维最没用的数字。要拆开,方法是对照实验,不是加指标。
三个开关组合分别读出不同结论:
- 检索层关闭、记忆层保留:剩下的正确率近似反映”模型自己记住了多少”。这一档的下降幅度还能看出哪些能力完全依赖外部注入,一旦检索服务不可用就整体塌掉。
- 记忆层冻结或替换为不含该经验的版本、检索层保留:退化幅度反映”检索贡献了多少”,同时能验证检索链路本身的健康度。
- 两层都开:上界与协同效应。如果这一档明显高于前两档之和的意义水平,说明提示拼装与模型先验在配合;如果几乎等于单开检索,那记忆层在这个场景就是没换来东西。
这套实验有两个陷阱,不处理就白跑。第一个是”关掉检索”不彻底——检索服务的结果缓存、会话内已注入的历史片段、上层应用把文档写进系统提示的旁路,都会让被关掉的那一层继续漏进信息。关闭动作要做在网关与应用两层,并验证提示里确实没有目标文档的痕迹。第二个是评测集自污染——如果新任务的样本本身进入了记忆写入通道,第二次跑分就是在测自己见过的题。评测集要么冻结版本、要么与记忆写入通道物理隔离,并在记录里写明这一条。
另外要单独度量该拒答时是否拒答。记忆层的一个典型失效模式是把过时内容说得很有把握;检索层的一个典型失效模式是召回了不相关片段仍然照读。二者在”自信的错误答案”上表现相同,只有配上出处检查与时效检查才能分开。
五、客户数据进了模型状态,数据边界要重画
企业交付里这条最实际:一旦某份客户语料被写进模型状态,数据的留存形态就变了。以前它是一份可读、可列清单、可逐条删除的文档集合;之后它变成模型能力的一部分,可能无法逐条枚举。这直接影响三件事。
- 导出:客户要求”把我们的数据给我们”时,能否导出与这层数据对应的内容?答不出范围,就不能允许它进模型状态。
- 遗忘:删除请求要能覆盖模型状态,否则流程上删干净了、行为上还在回答,这属于最难解释的一类审计发现。
- 多租户:记忆是否跨租户共享是必须先确认的属性,而不是事故后再查的问题。共享的记忆模块配上”某客户的内部规则”就是数据外泄路径;隔离的记忆层则要面对容量与成本核算。
私有部署在这件事上并不天然更安全,区别只是可观测性在你手里:你能检查写入通道、能拿到状态快照、能控制冻结与替换的时机。用托管接口时,上面三条全部要变成接口侧的书面能力声明,问不出来就按不支持处理。
六、把结论落成一份可执行清单
我们不在立项会上争论要不要记忆,只让下面这张表通过与否决定路线。它同样适合作为交付附件给客户看。
| 检查项 | 通过标准 | 不通过时的默认动作 |
|---|---|---|
| 变更频率评估 | 该经验在两个发布周期内不变 | 归入检索层 |
| 撤回义务确认 | 无删除要求,或删除可接受重训代价 | 归入检索层 |
| 定位能力 | 能说明记忆写在什么载体上 | 禁止写入 |
| 真源归属 | 检索层为唯一真源,模型不复述可版本化事实 | 补回归用例后再上线 |
| 双层一致性回归 | 已变更事实的答案口径一致 | 关闭该条记忆准入 |
| 关检索对照实验 | 可执行且能验证提示中无残留 | 评测结论不采信 |
| 评测集污染检查 | 评测样本与写入通道隔离 | 更换评测集版本 |
| 拒答与时效度量 | 有单独指标与阈值 | 补指标后再评估 |
| 数据导出与遗忘路径 | 书面能力声明或本地可控 | 该语料不进模型状态 |
| 多租户共享属性确认 | 明确不共享或范围可控 | 禁止接入跨租户语料 |
洹拓在给客户做这类方案时,最后交付的不该是一个模型加一个向量库,而是这张表里每一项的证据:谁签字、多久跑一次、不通过时退到哪条路径。记忆层能不能上,取决于撤得回来;检索层能不能省,取决于它承担的那部分验收有没有别的机制接住。两件事各自答清楚,”要不要做检索增强”这个问题就不再需要靠情绪回答了。