AI 记忆改了不生效:新值就在上下文里,模型偏偏选旧值
用户在对话开头说自己吃无麸质(gluten-free),聊了几十轮后改口:「最近改成地中海饮食了。」再过几轮你问模型「我现在的饮食偏好是什么」,它答「无麸质」。这不算胡编:它取对了变量,只是取到了这个变量的旧值。如果它答成你的音乐偏好,那是另一种错——串了变量。
做过 AI 记忆(AI memory)功能的人对这个场景不陌生:用户改了偏好,下一轮模型还按旧的来。第一反应通常是「没存上」或「没召回」。UC Berkeley 的 Junyu Guo、Yuchen Fang、Shangding Gu、Costas Spanos、James Demmel、Javad Lavaei 在 arXiv:2609.38866(When Context Changes: Understanding Update Failures in LLMs,2026-09-30)里研究的是更麻烦的情况:**新值已经在上下文里、而且是对的,模型还是选了旧值。**他们把这种错叫 stale binding(过期绑定),做了专门测它的基准 CICM(Controlled In-Context Memory,受控上下文记忆),再一路追进模型内部:错的时候新值还在不在?在的话为什么没被用上?能不能不改权重把它拨回来?[1]
| 记住了更新 ≠ 用上了更新 |
|---|
| 新值还读得出来,答案却选了旧值——这是选择失败,不是遗忘。 |
论文里最扎眼的一组数:在 2,048 步的仓库调度 / 构建发布日志上,规则写明、历史完整,GPT-5.6 Sol 只答对 9/40 个「当前状态」问题,Claude Opus 4.8 答对 18/40;把算好的当前状态快照直接给它们,两者都是 40/40。[1] 难的不是读状态,是从历史里把状态重建出来。
站内写过几篇 agent 记忆:JitMem 讲读时合成,CTWM 讲记忆使用的 core–tail 形状,Jev-Mem 把记忆检索拆成单独的控制层。这篇补的是更底层的一环:**信息已经在窗口里,模型也可能不用它。**所以 AI 记忆的目标不能停在「放进去」,要落到「让它被选中」。
先把名词钉住
一个 binding 就是「变量 ↔ 值」的一对。同一变量被赋值多次时,最后一次显式赋值是当前值,之前的都是旧值,旧值仍原样留在窗口里。答出被问变量的旧值,就是 stale binding。CICM 把每个回答归进四类:当前值(对)、同一变量的旧值、另一个变量的值、上下文里根本没有的值。只看准确率,这四类会被揉成一个数;要修,得先知道错答复用了哪条信息。[1]
最干净的实验是改写任务:
x = 71 ··· y = 4 ··· x = 15 ··· x = 63 ··· What is x?
表示旧值个数(上例 ),中间插无关行控制长度。Qwen2.5-7B 在 时几乎全对;旧值一多就掉,上下文越长掉得越狠:20 / 40 / 80 行的 prompt, 时准确率 91% / 85% / 70%, 时 51% / 45% / 38%。333 个错误里 331 个是被问变量的旧值,两个抄了别的值,没有一个是编出来的。而且偏爱最近那个旧值: 时 92/113 的旧值错误选的是最近旧值,均匀乱选的参照只有 25%。[1]
这类错误特征很稳定:不是幻觉,不是串台,就是拿了同一变量的过时版本,偏爱「刚被替换掉的那个」。
难的是更新,不是长度
会不会只是长文本退化?论文用等长对照堵上了这条路:
- **规模只能推迟。**70B 级模型和 GPT-4o 扛得住更多次改写,但 时仍出错;而所有等长 320 行、没有改写的对照都答对。Qwen2.5-72B 和 GPT-4o 的每个错误都是旧值,GPT-4o 的 7 个错误全落在最近两个旧值里。[1]
- 多给输出预算没用,简短推理有一点用。80 行配对 prompt 上,Qwen2.5-7B 直接作答的上限从 16 token 提到 512 token,87/150 → 86/150;加一句「先用一句话找出该变量最近一次赋值」,升到 111/150。但剩下 39 个错误全是旧值, 时 52%,配对的无改写对照是 98%。[1]
- **负载再高就分化。**36 个操作类标识符场景(会议室、配送路线、储物格等六个领域)里, 时 Qwen 和 GPT-4o 即使用简短推理也各有 32/36 答成旧值;GPT-5 和 Gemini 3.1 Pro Preview 全对,DeepSeek V4 Pro 有两个旧值。[1]
所以「让模型多想想」不是可靠解法。较新的推理模型在显式改写上更稳,但结构一复杂,前沿模型照样栽。
还有一个测量陷阱:**答题格式会把这种错藏起来。**ICF-Bench 动态偏好任务上,Qwen2.5-7B 自由作答和多选题准确率几乎一样(69.3% 对 70.9%),但自由作答的失败里 82.1% 是旧偏好,多选题下只有 29.4%。[1] 给选项没防住它取旧值,只是把取法盖住了。和站内Agent 评测可靠性一文是一个道理:题型选错,题再多也只是在量一个被掩盖过的数。
前沿模型也会栽:从历史里重建状态
真实的 agent 日志里,状态是一步依赖一步滚出来的。论文的日志有 16 个槽位,放着不可变的包裹或产物编号;每次 handoff 把两到四个槽位原子轮换,只有 committed 的 production 操作生效,sandbox 和 aborted 不算。prompt 给出规则、初始状态和全部 2,048 条操作,问某个槽位现在该发哪个编号,没有隐藏更新。直接调 API,不给工具、不给外部记忆、不套上下文管理 harness。[1]
| 模型 | 完整历史 | 当前状态快照 |
|---|---|---|
| GPT-5.6 Sol(high reasoning) | 9/40 | 40/40 |
| Claude Opus 4.8(adaptive thinking) | 18/40(9 个撞到 128k 输出上限) | 40/40 |
Sol 的 80 个请求全部正常完成。Opus 的 22 个失败里,13 个答成该槽位的某个旧占用者,9 个在 128,000 token 输出上限处停住;只算完成的是 18/31。Claude Sonnet 5 在四个试点上全部撞上限,论文只记为输出可用性问题。[1] 论文展示的一个 Opus 失败案例里,它倒推的链条在最近 210 次转移上都对,到第 514 步跟错了槽位,最后答出的正是这个槽位早先的占用者。[1] 不是没在算,是长依赖链上某一步选错来源,后面整条偏到旧值上。
快照是可解性对照:两个模型都全对,说明题能解、模型会读状态,卡在「重建」这一步。作者也写明快照在长度和计算量上不匹配,不是在评测某个已部署的 harness。[1]
两组补充:一是依赖感知变体,部分 handoff 记为 pending,要等后面 resolve(seq=N); result=committed 才执行。Opus 4.8 在 17 个预先指定场景上,延迟版 12/17,把同样操作逐行写明的线性化对照 16/17,快照 17/17,精确 McNemar 检验 ,方向明显但不显著。二是探索性诊断:四个试点场景上,在最后 512 条操作之前插一个准确的检查点,Sol 和 DeepSeek 都 4/4,Sol 只多 147 个 token。作者明说这是复用案例上的探索结果,对应的 40 场景相关性研究因服务额度耗尽没做完。[1] 不能当结论,但和快照 40/40 指向同一方向:把状态算好交给模型,比让它自己从历史里滚出来可靠得多。
要分清:前沿模型这部分只是行为证据。后面的探针、注意力、部件实验都只在开源模型上做,论文没声称看到了 GPT 或 Claude 内部。[1]
CICM 怎么搭
CICM 的思路是:更新规则显式,答案由程序算出,于是每个错答都能追溯来源。偏好核心基于 PrefEval [2],1,200 段关于饮食、音乐、学习方式的对话,生成器控制取值、顺序和竞争提及,语言模型只管措辞;另有 180 份六个领域的试点台账、24 个修订约束的决策场景,以及上面的 40 份操作历史和延迟变体。答案在评测前固定,用片段校验、独立重放或动作枚举核对;截断、服务错误单独记录。[1]
同名旧值压过最近的别的变量
答案被什么拉走?一边是同一变量的旧值(身份相同),一边是别的变量最近的取值(位置更近)。论文在 Qwen2.5-7B 上做了析因实验:当前赋值固定放远,交叉「最近旧值在后文有没有被再次提及」和「别的变量离问题远 / 中 / 只隔两轮」,每格 200 段对话。[1]
- **问题附近复述一次旧值,基本就决定答案。**即使别的变量更近,旧值错误仍占 75.5%–94.5%。
- **没有复述时,新近性才能竞争。**别的变量只隔两轮时,旧值错误和串变量错误差不多(16.0% 对 16.5%)。
- 复述还决定回来的是哪个旧值:被复述的那个占旧值答案的 94.5%–100%(Qwen 和 Llama 都是)。
- 标成「历史」有用但不够:Qwen 的旧值率降到 25.5%,没归零。[1]
作者的说法是 identity outweighs recency——身份压过新近。翻成工程语言:模型先按「是不是我要的变量」匹配,同名的几个值再比谁更突出;后文再提一次旧值,旧值就格外突出。agent 日志和记忆摘要里满是这种句子:「之前是 A,现在改成 B」「注意 A 已废弃」——每一句都在给 A 加分。
措辞实验里有个反直觉的结果。600 段旧值靠近问题的对话上,把复述改成「A 是我以前的选择,已经不是当前的了」,Qwen 准确率从 74/600 升到 375/600;但只在问题里加一句「后面提到的早先选择不算更新」,反而降到 44/600。作者猜测这句澄清又提了一次「早先的选择」,让历史选项更显眼,但承认还没单独验证;GPT-4o 在同样改写下是升的。[1] 稳妥的读法是:想压住旧值,最好别再提它,而不是反复强调它作废了。
新值还读得出来:不是「忘了」
最直观的解释是模型「丢了」新值。论文用线性探针(linear probe,在隐藏状态上训一个线性分类器,看信息能否被线性读出)检验:读答案位置的最后一层隐藏状态,在 21 个候选值上分类,按对话分五折交叉验证。[1]
在旧值错误上,探针给当前值的平均概率在 Qwen 是 84.8%,Llama 是 82.2%;打乱标签的对照只有 3.2%–6.4%。作者说得很克制:失败时可读性确实降了,按长度校正后比答对时低约 7 个百分点;而且能读出来只说明信息还在,不等于模型用了它。问题在下一步:选择。[1] 附录引了 Tulving 关于 availability(存着)与 accessibility(取得到)的老区分 [3],但明说只是类比;而且人会真的想不起旧记忆,LLM 的窗口里新旧两条都原样可见。
注意力往旧值那边偏
论文把这叫 attention drift(注意力漂移):生成答案时,注意力给旧值的权重高过当前值。证据有两层。一是和等长、无冲突的对话比,冲突改写会让注意力和 query–key 匹配往旧值偏,五个对照可靠的模型都是,连答对的样本也偏——漂移是更新带来的普遍压力,答对只是这次没翻盘。二是答错对答对:定义旧值占比 ,Qwen 答错时平均高 19.4 个百分点,集中在靠后的层;但 Llama 只有 +1.2,区间包含零。[1] 这一点容易漏读:新值读得出来在两个模型上都成立,注意力层面的解释目前只在 Qwen 上清楚。
哪些部件真正决定答案
注意力偏移仍是相关。论文用部件替换做因果检验:对 120 个失败的改写 prompt 构造候选值和位置完全一致的成功版本(把早先赋值的变量名换掉),再把失败运行里的部件换成成功版的,看「当前值减旧值」的分数差恢复多少。[1]
| 替换的部件(Qwen2.5-7B) | 平均恢复(%) |
|---|---|
| 早 / 中层隐藏状态 | −0.5 |
| 晚层隐藏状态 | 78.1 |
| 旧赋值位置的 key | 49.2 |
| 当前赋值位置的 key | −21.3 |
恢复集中在晚层和旧值的 key:问题在晚期选择,以及旧值「太容易被匹配上」。要落到具体的头,作者换到够小的 Pythia-160M:在留出数据上,移除被选出的偏向旧值的头能纠正 38.4% 的旧值错误,同层随机移除只有 8.7%;替换单个头的 key 输入能恢复 75% 的分数差,随机只有 6%。其中 L8H10 的 query–key 差值答对时 1.70、答错时 −0.26,而它的 value 通路几乎没变。[1] 白话说:这个头传的内容没坏,坏在它看向了哪里。
错在更新时埋下,在最后才定
在 Pythia-160M 上把更新位置的 key 换成成功版:问题紧跟更新时能纠正 92.8% 的失败;先让剩下的对话(含一次旧值再提及)跑完再问,同样的修补只纠正 8.7%。探针给当前值的概率从更新后的 0.81 一路降到提问时的 0.35,但仍高于随机标签上限约 0.22。[1] 对 AI 记忆设计这很要紧:写入那一刻放对,不保证几十轮后还被选中。
反过来,晚期干预管用。在答案位置沿探针方向加扰动,和同样大小的随机扰动比,强度 0.4 时原错误类型的持续率在 Qwen 多降 39.5 个百分点,Llama 多降 69.5 个;放在中间层几乎没效果。这用到了已知答案,只证明「选择到最后一刻仍可改」,不是修复方法。[1]
一层 Transformer 的账:旧值为什么能「合伙」赢
为说清「没丢却选错」,论文用一个简化模型:一层 Transformer,几次赋值共享同一个内容 key、只靠位置区分,复制哪个值的概率等于该位置的注意力权重。[1]
**第一笔:位置编码不保证越近越强。**当前值对旧值的对数几率等于两者注意力分数差除以温度 ;在 RoPE(旋转位置编码)下这个差是一串正弦项之和,可正可负。差相对 很小时,过期值几乎和当前值一样可能被选中。附录的例子:旋转周期 10,当前值距离 1、旧值距离 5,当前值约 6:1 占优;两者整体平移 5 个位置,顺序没变,优势却反转给旧值。作者还证明单靠 RoPE 匹配,不存在对所有位置都成立的新近优势——不是每个 prompt 都会翻车,而是架构不提供保证。[1]
**第二笔:旧值越多,当前值被稀释。**有 个旧值时,当前值对「任一旧值」的几率是 。分数不变,每多一个旧值这个比值就严格变小;若当前值的优势固定在有限范围内, 趋于无穷时选中它的概率趋于零。[1] 真实的头上也看得到:Pythia-160M 的 L8H10 在旧值失败上,当前值平均拿 0.40 的注意力,所有旧值合起来拿 0.60。单个旧值只比当前值强一点,合起来就赢了。
**第三笔:身份对新近。**把分数写成「同一变量的身份加分」加「其余上下文证据」,旧值错误和串变量错误的分界线是:别的变量的证据要比旧值多出这份身份加分。复述抬高旧值的证据,拉近别的变量抬高它的证据——正好对应上面的析因结果。[1] 作者也说明边界:这个模型不预测完整网络;用线性的「身份分 + 新近分」去预测真实回答,Qwen 只对 43.0%,还不如只用身份分(79.2%)。[1]
不改权重,把注意力拨回来
既然问题在选择,就直接改选择:在最后一个 prompt 位置,对选中的头,给当前值位置的注意力分数加偏置 、给旧值位置减 。有事先校准的固定偏置,也有按输入自动调整的自适应偏置;头和参数在测试前选好。对照组是「提醒」:问题前直接写出解析出的当前值。[1]
| 模型 | 原始准确率 | 注意力路由 | 提醒 | 纠正的旧值错误 | 保住的原本正确答案 |
|---|---|---|---|---|---|
| Qwen2.5-3B(自适应) | 16.46 | 95.21 | 99.27 | 678/711 | 98.73 |
| Llama-3.2-3B(自适应) | 27.71 | 93.12 | 68.85 | 514/541 | 100.00 |
| Llama-3.1-8B(自适应) | 41.71 | 88.63 | 65.38 | 395/467 | 100.00 |
| Mistral-7B(自适应) | 5.42 | 81.35 | 98.44 | 564/674 | 98.08 |
| Gemma-2-9B(自适应) | 47.08 | 91.88 | 82.81 | 407/455 | 100.00 |
| Qwen2.5-7B(固定) | 37.60 | 68.85 | 88.02 | 208/487 | 100.00 |
| Qwen2.5-14B(固定) | 40.52 | 41.67 | 98.54 | 13/491 | 98.46 |
五个自适应配置提升 44.79–78.75 个百分点,原本答对的保住 98.08%–100%,都超过随机头和随机位置对照,反向路由会降低准确率。路由在两个 Llama 和 Gemma 上胜过提醒,在 Qwen 和 Mistral 上提醒更强。[1]
这张表要连着限制读:固定偏置不一定行(Qwen2.5-14B 只纠正 13/491);路由需要一个规则解析器先标出新旧值位置,作者直说这个解析器本身就能答题,所以实验证明的是「改注意力能让模型用上它」,不是「模型能自己找到它」;还需要内部访问和带标签的校准,闭源 API 用不了。[1] 对 agent 建造者,结论其实朴素:如果系统已经能解析出当前值,先直接给出它;路由更适合当诊断工具。
这篇论文没有说什么
- 不估计线上发生率,所有对话和日志都是构造的诊断。[1]
- **不是所有长上下文错误都是 stale binding。**按严格定义复核,BABILong 只有 1.4% 的错误、Entity Tracking 有 25.9% 的错误是答成旧状态;RULER 变量追踪是串了引用链,另一回事。[1]
- 前沿模型在「改了约束再决策」上大多没事:四个推理模型在 96 个完整历史决策 prompt 上有 88–95 个最优,其余是无效输出、截断或服务错误。[1] 出事的地方是状态要靠一长串相互依赖的操作重建的时候。
放回 AI 记忆系统:日志给审计,快照给模型
一个顺手的类比是 event sourcing(事件溯源):系统保留完整事件日志,查询读的是由日志算出的物化视图,而不是每次让查询者从头重放。9/40 对 40/40 几乎就在说:让模型自己重放日志,是在最不可靠的那一步上赌结果。
这和站内几篇能对上。扩张 Harness 说反复出现的控制决策该长成代码,「从历史算出当前状态」正是这种决策。LLM Agents 篡改自身 Traces 要求主机外 append-only 日志——完整历史要留,但它是给审计的,不必每轮塞进 prompt。Global Coherence 里 commit 前核对 read-set,本质也是不让五轮前读到的旧报价直接参与决策。反过来也要警惕:AI 记忆常见的「只追加不覆盖」,以及把对话压缩成「用户先说 A、后来改成 B」,都在无意中制造身份压过新近的条件。
建造者清单
标「推论」的是我从结果出发的工程推断,不是论文直接结论。
- **记忆按键覆盖,不只追加。**同一偏好槽位只留一个当前值和版本号,旧值进历史表、不进默认 prompt。(推论:旧值越多当前值越被稀释,同名旧值压过别的变量)
- **给模型快照,不让它重放日志。**状态由 harness 算好;必须给长历史时,在末尾附近插准确的检查点。(完整历史 9/40、18/40 对快照 40/40;探索性检查点多 147 token 即 4/4)
- **别在问题附近复述旧值,哪怕是为了说它作废。**必须提就标成历史并放远。(复述时旧值错误 75.5%–94.5%,标成历史后 25.5%;同样提及只挪近,14.8% → 36.7%)
- 延迟生效的操作,在 harness 里展开成逐行记录。(12/17 对 16/17,未显著)
- 记忆压缩写「当前状态」,不写「变更故事」。(推论)
- 别把「多想想」当修复。(87/150 → 86/150;简短推理 111/150 但剩下全是旧值;高负载下 32/36 旧值)
- 评测用自由作答,按四类给错误分类,配等长无更新对照,按 扫一遍。(多选 29.4% 对自由作答 82.1%,准确率几乎相同)
- 截断单独记成「没答」。(Opus 4.8 有 9/40 撞到 128k 上限)
- 自部署开源模型时,可把注意力路由当诊断工具;但若已有能给出答案的解析器,先试直接提醒或快照。
局限
作者写得直接:构造数据不估计部署失败率;内部测量只覆盖开源模型,且不同对照下模式不一;探针证明可恢复,已知答案的 steering 证明可控制输出;路由需要内部访问、标注校准和结构化解析器。[1] 前沿部分样本不大,检查点结果是探索性的;代码和数据要等双盲评审后公开。
结语
这篇论文把常被归为「AI 记忆不好」的现象拆开了:很多时候模型没有忘,只是在新旧两个都看得见的值里选错了。位置编码不保证越近越强,旧值越多当前值越被稀释,一句复述就足以让旧值翻盘。所以上下文管理的目标要往前挪一步:不止「把更新放进去」,而是「让当前状态没有竞争对手」——按键覆盖、算好快照、别复述旧值。下次用户抱怨「我明明说过改了」,先别急着查记忆有没有存上,看看喂给模型的上下文里,旧值是不是还在跟新值抢。
参考
[1] Junyu Guo, Yuchen Fang, Shangding Gu, Costas Spanos, James Demmel, Javad Lavaei. When Context Changes: Understanding Update Failures in LLMs. arXiv:2609.38866, 2026-09-30. abs · PDF.
[2] Siyan Zhao, Mingyi Hong, Yang Liu, Devamanyu Hazarika, Kaixiang Lin. Do LLMs Recognize Your Preferences? Evaluating Personalized Preference Following in LLMs(PrefEval). ICLR 2025. OpenReview.
[3] Endel Tulving, Zena Pearlstone. Availability versus Accessibility of Information in Memory for Words. Journal of Verbal Learning and Verbal Behavior, 5(4):381–391, 1966.