大模型上下文扩展的性能衰减规律
研究揭示输入 token 增加如何导致 LLM 性能下降,对 prompt 优化和 RAG 设计提供实证指导。
研究揭示输入 token 增加如何导致 LLM 性能下降,对 prompt 优化和 RAG 设计提供实证指导。
最近 LLM 的发展呈现出一种趋势,即上下文窗口变得更长,最新模型的输入令牌数已达到数百万。由于这些模型在被广泛采用的基准(如 Needle in a Haystack (NIAH) [1])上取得了接近完美的得分,人们通常假定它们在长上下文任务中的性能是一致的。
然而,NIAH 从根本上讲是一个简单的检索任务,其中一个已知的句子("needle")被放在大量不相关的文本文档("haystack")中,并提示模型检索它。虽然这个基准具有可扩展性,但它通常只评估直接的词汇匹配,这可能无法代表灵活的、面向语义的任务。
我们扩展了标准的 NIAH 任务,以调查模型在之前未充分探索的设置中的行为。我们检查了具有语义而非直接词汇匹配的 needle 的影响,以及引入 haystack 内容变化的影响。
此外,我们使用 LongMemEval [2] 进行了对话式问答评估,以及一个合成任务,其中模型需要复制一系列重复的单词。每个任务都刻意保持简洁,并经过仔细控制,以隔离单独上下文长度的影响。
我们证明,即使在这些最小条件下,模型性能也会随着输入长度的增加而降低,且通常以令人惊讶和不一致的方式降低。现实应用通常涉及更大的复杂性,这意味着输入长度的影响在实践中可能更为显著。
我们深入的技术报告如下。如果您觉得我们的工作有用,请考虑引用我们:
@techreport{hong2025context,
title = {Context Rot: How Increasing Input Tokens Impacts LLM Performance},
author = {Hong, Kelly and Troynikov, Anton and Huber, Jeff},
year = {2025},
month = {July},
institution = {Chroma},
url = {https://trychroma.com/research/context-rot},
}
有兴趣从事改进 AI 应用检索工作吗?Chroma 正在招聘
现代 LLM 拥有数百万令牌的输入上下文长度已很普遍。Gemini 1.5 Pro [3] 在 2024 年初首次推出了其 1M 上下文窗口,随后是最近的 GPT-4.1 的 1M 上下文窗口 [4] 和具有 10M 的 Llama 4 [5]。长上下文的用例很有吸引力:更长的上下文意味着 LLM 可以在每次调用中处理更多信息,并生成更明智的输出。
这些模型的长上下文评估通常展示了在不同输入长度下的一致性能。然而,这些评估范围狭窄,不能代表长上下文在实践中的使用方式。最常用的测试 Needle in a Haystack(NIAH)是一个简单的词汇检索任务,通常用于评估模型可靠处理长上下文的能力。现实应用,如 AI 智能体任务或摘要,需要在更广泛、通常更模糊的信息上进行明显更多的处理和推理。
设计现实的长上下文基准很困难。随着输入长度的增加,任务通常会变得更加复杂,这使得很难确定性能下降是由于输入更长还是问题本身更难。为了解决这个问题,我们的实验保持任务复杂性恒定,仅改变输入长度,从而允许我们直接衡量单独输入长度的影响。
我们展示以下内容:
对 18 个 LLM 的评估,包括领先的闭源和开源权重模型,揭示了随着输入长度增加而出现的不均匀性能。
对 18 个 LLM 的评估,包括领先的闭源和开源权重模型,揭示了随着输入长度增加而出现的不均匀性能。
对在处理干扰项和改变问题-答案相似性时观察到的模型特定行为模式的说明。
对在处理干扰项和改变问题-答案相似性时观察到的模型特定行为模式的说明。
完整的代码库用于复现我们的结果。
完整的代码库用于复现我们的结果。
评估模型长上下文能力最广泛使用的基准之一是 Needle in a Haystack(NIAH)。虽然作为可扩展测试很有用,但它只评估一个狭隘的能力:词汇检索。模型通常在 NIAH 上表现良好,这导致了人们认为长上下文问题基本上已解决。
然而,NIAH 低估了大多数长上下文任务在实践中的要求。NIAH 的变体,如 NoLiMa [6],包括具有非词汇匹配的 needle-question 对,显示出显著的性能下降。其他在难度上看起来相似的任务,如 AbsenceBench [7],它测试模型识别给定文本片段的缺失,也显示出随着输入长度增加而性能下降。
此外,长上下文任务通常涉及在任务的一部分中消除干扰项的歧义。一个例子是多轮共指消解 (MRCR) [8] [9],它涉及在多轮对话中检索特定用户询问的第 i 个实例,并在相似的用户询问中进行消除歧义。然而,对干扰项在长上下文设置中的影响的调查仍然不足。
在长上下文任务中,一个重要因素是如何扩展输入长度。Latent List [8] 是一个任务,其中模型必须在各种输入长度中执行固定数量的 Python 列表操作。测试了填充无关上下文的各种方式,这些方式对模型性能的影响不均匀 [1]。例如,添加彼此局部抵消的列表操作比添加 print 语句对模型性能的降低更显著。这强调了"无关内容"的类型有多重要,因为有些可能会随着输入长度而引入增加的复杂性。
同样,Graphwalks [10] 是一个图遍历任务,其中模型被给予一个由十六进制哈希组成的有向图,然后被要求从随机节点执行广度优先搜索。增加输入长度意味着增加要遍历的图的大小,这会导致任务难度增加。很难区分任务复杂性的增加和输入长度,这使得很难隔离由输入长度单独造成的性能影响。这表明了隔离输入长度作为感兴趣的变量的重要性,这对于理解 LLM 如何真正处理长输入至关重要。
经典的 Needle in a Haystack 任务涉及在长上下文窗口的中间放置一个随机事实("needle"),然后要求模型回答关于该事实的问题。
该任务的原始实现使用具有词汇匹配的 needle-question 对。然而,在实践中使用长上下文通常需要对模糊任务的语义理解。
NoLiMa 已证明非词汇匹配对于随着上下文长度增加的模型来说是一个挑战。该任务利用要求模型推断潜在关联的 needle-question 对,例如:
为了回答这个问题,模型首先必须知道 Kiasma 博物馆位于赫尔辛基,然后建立该潜在关联链接。这不仅测试了模型的非词汇匹配能力,而且测试了它的世界知识。NoLiMa 中 72.4% 的 needle-question 对需要这样的外部知识,使得该基准更接近于测试模型如何同时处理两个任务,而不仅仅是纯粹的非词汇匹配。
隔离测试非词汇匹配的影响仍然未充分探索。此外,"词汇"与"非词汇"的二元区分过度简化了现实情景中问答的复杂性。Needle-question 对存在于相似性的连续体上,但它们都被归类在这些宽泛的类别下。
模型通常还必须处理干扰项,这已被证明会降低性能 [11]。
在整个报告中,我们区分干扰项和无关内容:
干扰项在主题上与 needle 相关,但不能完全回答问题
无关内容与 needle 和问题无关
先前的工作已证明干扰项具有不均匀的影响,但大多数评估涉及短输入长度和较旧的模型。据称当前最先进的模型对干扰项更有弹性,但它们的性能还没有在各种输入长度中进行广泛测试。
NIAH 的另一个未充分探索的方面是 haystack 本身,它通常只是被视为扩展输入长度的手段,但这假设了 haystack 内容本身对任务性能没有影响。如果模型确实对 haystack 内容不敏感,那么改变此内容(例如 haystack 的主题或叙述流),应该对结果没有影响。然而,这一假设在很大程度上仍未得到测试。
我们设计了四个对照实验,以研究这些因素的影响:
我们使用嵌入计算针与问题配对之间的余弦相似度。为了提高稳健性,我们对五种嵌入模型的结果取平均值:text-embedding-3-small、text-embedding-3-large、jina-embeddings-v3、voyage-3-large 和 all-MiniLM-L6-v2。我们测量随着输入长度增加,针与问题的相似度如何影响模型性能。
我们选取一个高相似度的针与问题配对,并编写四个干扰项。实验设置如下:
基线:仅包含针,不包含干扰项
单个干扰项:针 + 一个随机放置的干扰项
多个干扰项:针 + 随机放置的全部四个干扰项
我们测试随着输入长度增加,干扰项对模型性能的影响,以衡量不同干扰项及不同输入长度之间影响的非均匀性。
我们使用两个主题截然不同的干草堆,即 Paul Graham 的文章和 arXiv 论文 [12],并分别为其编写对应的针。为了测量针与干草堆的相似度,我们对干草堆进行嵌入,为每根针检索排名前 5 的文本块,然后计算这些文本块余弦相似度分数的平均值。为了提高稳健性,我们在五种不同的嵌入模型上重复这一过程。
在典型的 NIAH 设置中,干草堆由多篇连贯文本拼接而成,每篇文本都有各自符合逻辑的思想脉络。例如,最初的 NIAH 基准使用了一系列 Paul Graham 的文章,其中每篇文章都遵循结构化的观点组织方式来形成论证。为了评估这种结构是否会影响模型性能,我们比较以下两种条件:
原始:保留每段摘录中观点的自然脉络
打乱:在整个干草堆中随机重排句子,在保持整体主题不变的同时消除逻辑连续性
我们证明了以下几点:
在所有实验中,模型性能都会随着输入长度增加而持续下降。
针与问题的相似度越低,性能下降的速度越快。
不同干扰项对模型性能的影响并不均匀,其差异取决于它们彼此相比具有多强的干扰性。随着输入长度增加,这种影响更加明显,而且不同模型对这些干扰项的响应方式存在差异。
针与干草堆的相似度对模型性能没有一致的影响,这表明还需要进一步研究。
干草堆的结构模式始终会影响模型处理长输入的方式。
对于针类型、干草堆主题和干草堆结构的每一种独特组合,我们都会在以下条件下测试每个模型:
除非该设置不兼容(例如 o3)或被明确建议不要使用(例如 Qwen 的“思考模式”),否则我们会在每个模型的最大上下文窗口范围内使用 temperature=0 进行评估。对于 Qwen 模型,我们采用 YaRN 方法 [13],将上下文窗口从 32,768 个 token 扩展到 131,072 个 token。
在适用的情况下,我们会同时测试模型的标准模式和“思考模式”。
我们使用经过对齐的 GPT-4.1 评审模型来评估模型输出,具体采用附录中概述的方法。
我们注意到,模型在极少数情况下会拒绝尝试执行任务(总计 194,480 次 LLM 调用中有 69 次,占 0.035%)。例如,Claude Opus 4 有时可能输出为空,且 stop_reason=”refusal”。
在现实应用中,人们通常期望模型能够处理模糊任务,并在不依赖精确词汇匹配的情况下识别相关信息。例如,当一个 AI 智能体接到需要在大型语料库中搜索的任务时,用户很少会为相关部分指定精确的关键词。相反,模型必须自行推断相关性。
我们改变针与问题配对的相似度,并通过其嵌入的余弦相似度对其进行量化。我们发现,随着针与问题的相似度降低,输入长度增加所导致的模型性能下降会更加显著。这更贴近现实场景:问题与答案精确匹配的情况很少见,而语义歧义会进一步加剧处理长输入的难度。
我们的干草堆内容来自两个领域:Paul Graham 的文章(与最初的 NIAH 实验一致)和 arXiv 论文。对于每个干草堆主题(PG 文章、arXiv),我们首先确定其中的常见主题,用来指导问题和针的编写。
我们使用聚类来识别给定语料库中最常出现的主题:
将文档切分为每块包含 1~3 个句子的文本块
将文档切分为每块包含 1~3 个句子的文本块
使用 text-embedding-3-large 对每个文本块进行嵌入
使用 text-embedding-3-large 对每个文本块进行嵌入
使用 UMAP [14] 进行降维,参数如下:n_neighbors=30、min_dist=0.05、n_components=50、random_state=42
使用 UMAP [14] 进行降维,参数如下:n_neighbors=30、min_dist=0.05、n_components=50、random_state=42
使用 HDBSCAN [15] 创建聚类,参数如下:min_cluster_size=10、min_samples=15
使用 HDBSCAN [15] 创建聚类,参数如下:min_cluster_size=10、min_samples=15
使用最大边际相关性(MMR),从最大的聚类中获取 20 个代表性文本块
使用最大边际相关性(MMR),从最大的聚类中获取 20 个代表性文本块
人工检查最大的聚类,以确定其主题和风格
人工检查最大的聚类,以确定其主题和风格
使用这种方法,我们发现写作建议是 PG 文章中的常见主题,并且通常以轶事形式呈现。对于 arXiv 论文,我们发现信息检索是一个常见主题,具体来说是重排序。
我们为每个主题编写一个相应的问题:
在编写针之前,我们会验证这些问题的答案并不存在于干草堆内容中:
将此前计算出的干草堆文本块嵌入存储在向量数据库中。
使用问题的嵌入从该向量数据库中查询排名前 10 的结果。
人工检查这些结果,确认它们没有回答给定的问题。
这构建了一个公平的测试环境,因为它可以确保不存在其他可能的答案,而任何错误答案都是由模型幻觉造成的。
针对每个问题,我们编写 8 根针,每根针都属于前述大型聚类,并通过近似预测对此进行验证。以超过 0.9 的概率属于写作/检索聚类的针,被认为能够在主题上融入干草堆。我们人工编写这些针,以避免数据污染。
对于这 8 根针,我们还改变了歧义程度,并通过以下方法进行量化:
使用嵌入模型计算针和问题的嵌入及其余弦相似度。
在五种嵌入模型上重复这一过程(text-embedding-3-small、text-embedding-3-large、jina-embeddings-v3、voyage-3-large 和 all-MiniLM-L6-v2)。
对于 PG 文章主题,针与问题的相似度范围为 0.445~0.775,且五种嵌入模型结果的标准差小于 0.1。对于 arXiv 主题,针与问题的相似度范围为 0.521~0.829,标准差同样小于 0.1。
我们观察到一个清晰的规律:针与问题的相似度越低,性能随输入长度增加而下降得越快。
在输入长度较短时,即使面对低相似度配对,模型也表现良好。我们在高性能和中等性能模型中最清楚地观察到了这一点,这表明这些模型有能力成功处理所有针与问题配对的任务。
在输入长度较长时观察到的性能下降,并不是由针与问题配对本身的固有难度造成的。通过固定针与问题的配对,仅改变无关内容的数量,我们将输入规模分离出来,确定其为性能下降的主要因素。
我们还研究了针的位置是否会影响性能。在 11 个针位置上进行测试后,我们发现对于这一特定的 NIAH 任务,性能没有显著差异。
此前已经有研究在较旧的模型上证实,干扰项会降低模型性能,并且不同干扰项的影响并不均匀。有人声称,较新的模型能够可靠地处理任何干扰项,但随着输入长度增加,这一说法是否仍然成立?
我们的实验表明,在包括最新前沿模型在内的各种模型中,随着输入长度增加,干扰项的影响及其非均匀性都会被放大。我们还观察到,不同模型家族在处理歧义时表现出不同的行为。
我们从每个干草堆主题(PG 文章和 arXiv 论文)中选取一根针与问题相似度较高的针(在八根针中排名第二),并人工编写 4 个干扰项:
我们不再使用干扰项测试全部八根针,而是使用一根“针—问题相似度”较高的针,从而构造一种相对容易识别该针的条件。从先前的结果可以看出,由于“针—问题相似度”较高,模型在不同输入长度下通常都能较好地处理这根针,这使我们能够更好地单独隔离并衡量干扰项的影响。
我们运行三种测试条件:
无干扰项(基线):仅包含针
单个干扰项:针 + 一个干扰项(随机放置)
多个干扰项:针 + 全部四个干扰项,随机分布在整个干草堆中
即使只有一个干扰项,性能也会相较于基线(仅包含针)有所下降;加入四个干扰项后,这种性能退化会进一步加剧。
我们还发现,不同干扰项的影响并不一致。例如,在 arXiv 干草堆与 PG 随笔针的组合中,可以看到干扰项 3(红色)造成的性能下降幅度大于其他干扰项。
为了进一步研究这种不一致的影响,我们分析了各种模型在包含 4 个干扰项的条件下失败的尝试。对于 arXiv 干草堆与 PG 随笔针的组合,我们发现干扰项 2 和 3 在各模型产生的幻觉回答中出现得最为频繁。
这些失败案例也揭示了不同模型在处理歧义时的差异。Claude 模型始终表现出最低的幻觉率。具体而言,Claude Sonnet 4 和 Opus 4 尤其保守,在不确定时往往会放弃作答,并明确表示找不到答案。相比之下,GPT 模型的幻觉率最高,在存在干扰项时经常生成看似自信但实际错误的回答。
在长上下文任务中,无关上下文通常被视为一种中性的占位内容,用于增加输入长度。通常的假设是,只要这些无关上下文不直接干扰任务,其具体内容并不重要。
然而,一个自然的问题随之出现:“针—干草堆相似度”是否会影响任务难度?直观来看,如果针与干草堆中的内容融为一体,模型可能会更难提取出这根针。
我们的研究结果表明,“针—干草堆相似度”对模型性能的影响并不一致。
我们使用“针—问题相似度”实验中的针来设置实验,以测试“针—干草堆相似度”的影响。
我们通过以下方式衡量“针—干草堆相似度”:对干草堆进行嵌入,并为每根针检索与其最相似的五个文本块,然后计算这些文本块余弦相似度分数的平均值。为确保稳健性,我们使用五种不同的嵌入模型重复这一过程。
在 PG 随笔干草堆中,PG 随笔针的平均“针—干草堆相似度”得分为 0.529,变异值为 0.101;arXiv 针的平均“针—干草堆相似度”为 0.368,变异值为 0.111。反过来,在 arXiv 干草堆中,arXiv 针的平均“针—干草堆相似度”为 0.654,变异值为 0.0858;而 PG 随笔针的得分较低,“针—干草堆相似度”为 0.394,变异值为 0.105。
对于每种干草堆,我们都将语义相似的针与不相关的针进行比较测试。例如,我们同时把 PG 随笔针和 arXiv 针放入 Paul Graham 随笔干草堆中,以比较这两种条件:
我们在两种类型的干草堆中测试 PG 随笔针和 arXiv 针:Paul Graham 随笔与 arXiv 论文。在 Paul Graham 随笔干草堆中,arXiv 针的表现明显优于 PG 随笔针;换言之,当针在语义上不会融入干草堆时,模型的表现更好。然而,在 arXiv 干草堆中,我们观察到 arXiv 针与 PG 随笔针之间的性能差异非常小。
仅测试两个主题,不足以得出具有普适性的结论,即更高的“针—干草堆相似度”会降低模型在该任务上的性能。不过,这确实凸显了长上下文处理的不一致性。即使任务结构和“针—问题相似度”保持不变,改变针与干草堆之间的语义相似度仍可能影响结果。这指出了长上下文基准测试中一个尚未得到充分探索的领域,也为未来研究提供了一个有意义的方向。
除了“针—干草堆相似度”,我们还考虑了干草堆的结构模式。
如果干草堆由连贯的随笔组成,随机插入的一根针可能会打断观点之间的逻辑脉络,从而更容易被注意到。相比之下,在由随机排序句子组成的打乱版干草堆中,由于整体上下文缺乏结构,针可能更容易融入其中。这种推断建立在一个假设之上:模型对上下文的逻辑脉络敏感,会以一种结构化且依赖顺序的方式处理上下文。
令人意外的是,我们发现结构连贯性始终会损害模型性能。
虽然这看起来有违直觉,但当干草堆保留观点之间的逻辑脉络时,模型的表现反而更差。打乱干草堆并消除局部连贯性,始终能够改善模型性能。
为了评估干草堆结构的影响,我们创建了两个变体:
原始版:保留每段摘录中观点的自然脉络
打乱版:在整个干草堆中随机重排句子,以保持总体主题不变,但不保留逻辑连续性
在全部 18 个模型和所有“针—干草堆”配置中,我们都观察到一种一致的模式:模型在打乱版干草堆上的表现优于逻辑结构完整的干草堆。
这些结果可能对理解模型的内部处理机制造成一些启示:输入的结构模式可能会影响注意力机制的应用方式,尤其是在输入长度增加时。
虽然这超出了本报告的范围,但它为可解释性研究指出了一个潜在方向,即研究注意力如何受到输入结构的影响。理解这些随输入长度增加而出现的结构性影响,可能有助于解释这些长上下文失败模式。
为了在更贴近现实的环境中评估这些模型,我们使用了 LongMemEval,这是一项面向对话式问答的长上下文基准测试。
对于聊天助手而言,使用长输入来保留与后续对话相关的历史记录是一种常见做法。为了将“记忆”引入聊天助手,一种朴素的方法是将完整的聊天历史记录包含在