上下文腐烂
上下文腐烂(Context Rot)是指随着输入上下文变长,LLM 在准确率、指令遵循和引用忠实度上逐渐下降的现象。即便上下文窗口已达到 100 万 token,实际可用的准确率早在远未触及上限之前就已崩塌,32k、128k 和 1M 之间的差距远比营销宣传所暗示的要小。
上下文腐烂(Context Rot)是指随着输入上下文变长,LLM 在准确率、指令遵循和引用忠实度上逐渐下降的现象。即便上下文窗口已达到 100 万 token,实际可用的准确率早在远未触及上限之前就已崩塌,32k、128k 和 1M 之间的差距远比营销宣传所暗示的要小。
为什么重要
基准测试大肆宣传百万 token 的窗口,但 2025 年以来的实证研究描绘了另一番图景:来自 Chroma、Anthropic 和 Databricks 的评测一致显示,同一个模型在相同任务上,准确率从 8k 时的 95% 跌到 64k 时的约 60%。在检索增强生成(RAG)中,一次性塞进 30 个片段,通常只会用到开头和结尾的几个,而忽略中间部分(迷失在中间),模型甚至可能声称自己"参考"了从未真正用到的内容。上下文腐烂是 GEO 和 RAG 系统设计中最大的隐藏陷阱,它直接与"上下文越大 = 答案越好"这种直觉相矛盾。
症状表现
中间信息被忽略:放在上下文中部的关键事实进不了答案,而开头和结尾的内容则得以保留。
指令漂移:在一段很长的用户消息之后,系统提示中的指令开始被无视,语气、格式和禁令统统失守。
引用幻觉:模型说"根据上文第五段……",但根本不存在这样一段,或者那段内容来自另一篇文档。
记忆崩塌:在多轮对话中,早期的上下文实际上被遗忘了。经过 4 至 5 轮后,模型就跟不上此前达成的约定。
工具调用丢失:在长上下文中定义的工具被调用得更少,或者被以错误的参数调用。
为什么会发生
注意力稀释:每个 token 都必须关注其他每一个 token,因此随着序列变长,每个 token 上的信号就会减弱。
位置编码的限制:超出训练时的长度后,位置信息就失去了意义。RoPE 和 ALiBi 有所帮助,但并不能完全解决。
训练数据分布:训练时见到的大多数文档都很短。100 万 token 的窗口并不意味着模型是在 100 万 token 的文档上训练的。
大海捞针的局限:简单的查找任务即便在长上下文下也能通过,但推理、综合和多事实整合的退化要快得多。
对 GEO 的影响
答案引擎会进行检索、分块和综合,把检索到的片段堆进 LLM 的上下文来生成答案。上下文腐烂意味着:
排名靠前的片段占据主导:如果你的片段在重排之后进不了前 1 至 3 名,那么即便它"在上下文里",实际上也等于没被引用。
简短、自成一体的片段会胜出:较长的片段会稀释注意力。100 至 300 字是最佳区间。
直接给出答案的开头很重要:能回答问题的第一段,无论它处于上下文的什么位置都能存活下来。
引用忠实度需要核验:答案可能产生看似有依据的引用幻觉,因此需要做后处理检查。
缓解策略
上下文压缩:不要把原始文档直接丢进上下文,而要用查询感知的摘要只抽取相关部分。
激进的重排:检索 30 至 50 个候选,重排到前 5 至 10 个,再把这些放进上下文。
刻意安排关键信息的位置:把最重要的片段放在开头或结尾(避开中间)。
分层综合:采用 map-reduce 式的做法,先综合各个片段子组,再综合这些摘要。
设定上下文预算:刻意把上下文限制在比如 8k token,并在这一范围内做优化。
自动化 RAG 评测:通过 LLM-as-judge 或嵌入相似度,核验答案与来源片段之间的事实一致性。
常见误解
"上下文越大总是越好":宣传的窗口 ≠ 可用的窗口。可靠的实际上限大约是标称容量的 10% 至 30%。
"能通过大海捞针就说明长上下文管用":单事实查找很容易。多事实推理崩塌得早得多。
"微调能解决它":微调有一定帮助,但结构性的局限依然存在。系统设计是更有效的变通办法。
"新模型已经解决了它":截至 2026 年,即便是前沿模型,在超过 32k 至 64k token 之后仍会出现可测量的退化。
常见错误
把所有检索结果都倒进上下文:把前 30 个片段原样粘贴进去,必然导致迷失在中间。
把系统提示放在末尾:放在一段很长的用户消息之后的系统指令会被忽略。要把它放在开头。
轻信上下文窗口的营销宣传:100 万 token 的广告并不意味着有 100 万可用 token。
跳过 RAG 验证:如果以"看起来有依据"为标准,幻觉就会越积越多。
统一的片段大小:把所有文档都切成相同长度会破坏意义。请使用语义分块。
Sources: