什么是 context rot?为什么上下文越长模型反而变笨?

Q1-12上下文工程高频新增context rot注意力预算长上下文失败模式

谁在问:大厂二面;常用来反向测「长窗口取代 RAG」的判断力

口语化问法

  • 你听过 context rot 吗?说说是怎么回事。
  • 上下文塞满和只塞相关的那几段,效果差别有多大?为什么?
  • 模型都百万窗口了,我们把整个知识库塞进去不就完事了?

考察意图

这题问的是机制,测的是判断力。面试官在看:

  1. 你能不能说出衰减的原因,而不只是「太长了模型会忘」;
  2. 你知不知道它有多种失败形态——「记不住」只是其中最温和的一种;
  3. 你有没有度量过,还是只在转述别人的结论。

它常常被当作反向测试题:如果你被「百万窗口」这个数字说服了,后面 RAG、压缩、记忆三个方向的判断大概率都是虚的。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

Context rot 指的是随着上下文里 token 数增加,模型从中准确召回信息的能力会下降。这是在大海捞针类基准上观测到的现象,所有模型都有,只是衰减快慢不同。

所以上下文应该被当成有限资源来用,只放这一轮真正需要的内容,而不是能塞多少塞多少。这也是 RAG、上下文压缩这些手段在长窗口时代依然有价值的原因。

90

90 分答案(有生产经验的回答)

在上面基础上加三层:

第一,机制。 至少三条叠加:注意力权重是在全序列上归一化分配的,序列越长单个位置分到的越稀释;长上下文里必然混入大量语义相近但无关的内容,它们和正确内容抢注意力——所以「多塞点也没坏处」是错的,多塞的每一段都是潜在干扰项;再加上长序列样本在训练分布里本来就稀疏,超长位置的泛化天然更弱。它不是 bug,是这套机制的统计性质,所以不会被下一代模型「修好」,只会变缓。

第二,失败形态不止「记不住」。 我在 Agent 上遇到过四类,危险程度递增:

  • 污染:一次幻觉或一个错误的工具返回进了上下文,此后每轮都被当成事实,还会自我强化;
  • 干扰:历史太长后模型开始复读历史里做过的动作,表现为原地打转,但最终答案看起来正常;
  • 混淆:工具或检索结果太多,无关的把信号挤掉,选错工具还讲得头头是道;
  • 冲突:不同来源的指令互相矛盾,模型要先仲裁,既慢又飘。

第三,我们是这么度量的:把每轮进入窗口的 token 按来源分桶看占比;做位置敏感性测试(同样的关键信息放开头、中间、末尾,看准确率差);做长度对照测试(精准注入 800 token vs 全量塞入,同一批问题跑两遍)。我们真实的对照结果是全量塞入更差——而且贵 20 倍、慢 8 秒。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
五层都在拆同一句话:「反正塞进去也没坏处」错在哪

  1. 机制上为什么会衰减?

    期望三条叠加:注意力权重在全序列上归一化,序列越长单个位置分到越稀释;语义相近但无关的内容在抢注意力;长序列样本在训练分布里本就稀疏。关键是点明这是统计性质不是可修复的缺陷,下一代模型只会让它变缓
    信号只说「太长了模型会忘」→ 停在现象层;说出「干扰项也在抢注意力,多塞有害而非中性」→ 懂机制
  2. 大海捞针满分的模型,是不是就没这个问题了?

    期望不是。「在一大堆无关文本里找一句明显异质的话」和「在几十份语义相近的文档里做多跳推理」差一个难度量级;基准饱和只说明这个基准没区分度了,不等于问题被解决 —— 真实业务里的干扰项恰恰和答案高度相似
    信号分得清「捞一根针」和「有干扰的多跳推理」→ 自己跑过评测;拿榜单分数当结论 → 在转述
  3. 除了「记不住」,还有哪些具体的失败形态?

    期望四类,危险递增:污染(一次幻觉或错误工具返回进了上下文,此后每轮被当事实,还自我强化)、干扰(复读历史动作、原地打转)、混淆(无关结果挤掉信号,选错工具还讲得头头是道)、冲突(多来源指令互斥,要先仲裁)。干扰在最终答案上看不出来,得靠轨迹指标:重复动作率、无效工具调用率
    信号主动提「有些失败在最终答案上看不出来,得看轨迹」→ 真做过 Agent 评测
  4. 你怎么知道自己的系统已经开始腐烂了?

    期望四件可执行的事:上下文构成分桶 → 位置敏感性测试(同一信息放开头 / 中间 / 末尾比准确率)→ 长度对照测试(精准注入 800 token vs 全量塞入,我们实测全量更差、贵 20 倍、慢 8 秒)→ 轨迹指标监控。测试必须用自己业务的语料,干扰项相似度分布是业务特有的
    信号给得出具体测试设计 → 是做过的;只说「多观察线上效果」→ 没有度量手段
  5. 产品说「100 万窗口,把知识库整个塞进去,还能省掉 RAG」,你怎么回应?

    期望别只说「不行」,先给可算的账 —— 贵(每轮线性增长不是一次性)、慢(prefill 拉长首 token 延迟)、笨(有效召回衰减)→ 拿现有评测集跑「精准注入 vs 全量塞入」对照,一周出结论 → 承认长窗口的合理场景:文档少、更新慢、query 简单时全塞就是对的 → 给边界,尤其全塞做不了行级权限隔离 → 落点是长窗口 + 粗粒度检索
    信号认长窗口的合理场景 + 提权限隔离 → 给出了产品想不到的硬约束;喊「RAG 没死」口号或直接答应全塞 → 两头都不及格
只会说「上下文太长模型会忘」的,第 1 层就见底,后面机制、形态、度量三层全空;第 5 层测的是给账、给实验、给边界,不是喊口号。

评分要点

  1. 能准确定义 context rot(召回能力随长度下降,各模型都有)
  2. 说得出至少两条机制原因
  3. 指出它是统计性质,不会被下一代模型「修好」
  4. 知道基准饱和不等于问题解决
  5. 能说出「记不住」以外的失败形态
  6. 有可执行的度量方法,而非定性描述
  7. 面对「长窗口取代 RAG」时给账、给实验、给边界条件
  8. 能承认长窗口的合理适用场景

常见错误

把 context rot 说成「上下文太长模型会忘」,问机制就没了。
认为塞多了「顶多是浪费钱,不会更差」。
拿大海捞针的满分当作「这个问题已经解决了」的证据。
只会说「所以要做 RAG」,说不出长窗口真正省掉了什么。
从没度量过,被问「差多少」时只能给一个印象。
含糊标志词:「上下文太长效果肯定不好」「一般不建议塞太多」「模型会自己抓重点」。

关联学习