2025 年 7 月,Chroma 的研究团队在 18 个模型上做了一组对照实验。同一批资料、同一个问题,唯一的变量是资料的排列顺序:一组保持原文的逻辑顺序,另一组被随机打乱。结果是——所有 18 个模型在被打乱的那一组上表现更好。[1] 这个结果反直觉。常见输入通常具有明确结构:完整文档、连贯会议记录、按时间排列的聊天历史。但实验显示,长输入中的连贯性也可能成为干扰;相邻内容语义相似,真正相关的段落反而更难分离。过去三年,模型厂商把上下文窗口从 4K 扩展到百万级。独立测量却显示,可用长度远低于标称值,精度也会提前缓慢下降。关键问题有三个:长上下文何时失效、为什么失效,以及一次调用该放多少资料。文中的数字标注来源、样本和测量时点,并区分来源事实与分析。这里的“失效”指精度缓慢下降:模型仍可能输出通顺的文字、正确的格式和自信的语气,只是内容逐渐偏离资料,往往要逐条核对才会发现。
上下文越长,答案越不准:资料该喂到什么程度
窗口变大,并不会让模型自动更准确地使用所有资料。答案质量取决于无关内容占用的注意力预算。

目录
- 1.1. 长上下文何时开始失效#
- 2.标称长度与可用长度#
- 3.位置效应:中间内容更易被忽略#
- 4.真正的变量:内容竞争#
- 5.2. 退化从哪里来#
- 6.检索更多,答案未必更好#
- 7.3. 成本与延迟:另一份账#
- 8.4. 怎么办:把上下文当预算花#
- 9.一份可执行的喂料清单#
- 10.在真实任务上测试:三个对照实验#
- 11.六个常见误区#
- 12.结论#
- 13.来源与引用#
1. 长上下文何时开始失效
三组独立测量分别考察长度、位置和内容竞争,结果指向同一趋势。
标称长度与可用长度
RULER 与 NoLiMa 从不同角度测量长上下文能力。RULER(NVIDIA,COLM 2024)把针在干草堆里的检索测试扩展成 13 类任务,包含多针检索、多跳追踪、聚合与问答,在 4K 到 128K 上分级测量。它设了一条合格线:Llama2-7B 在 4K 上的 85.6% 分数。结果是,在所有声称支持 32K 及以上的模型里,只有约一半能在 32K 真正达标;几乎所有模型都在到达自己标称的长度之前就掉到线下。[2] NoLiMa(ICML 2025)采用语义检索:让问题和「针」之间几乎没有字面重叠,排除关键词匹配的影响。13 个声称支持 128K 以上的模型,在 1K 以内的短上下文里普遍表现优异,到 32K 时有 11 个掉到自己短文本基线的 50% 以下。表现最好的例外之一 GPT-4o,也从 99.3% 降到 69.7%。[3] 两份测量与常见印象不同,原因在于流传最广的测试过于简单。「针在干草堆里」(Needle in a Haystack)把一句无关的话插进长文本,再让模型找出来。它主要测词汇层面的检索:问题里的词和答案里的词高度重合,模型可以顺着字面匹配找到目标。模型在这项测试上普遍接近满分,于是「长上下文已经解决」成了默认印象。[1] RULER 与 NoLiMa 都是针对这一点重新设计的:一个把任务从「找一句话」扩展到多针检索、多跳追踪与聚合,另一个干脆去掉字面重叠。难度一升上来,分数就散了。 <table header-row="true"> <tr> <td>基准</td> <td>测的是什么</td> <td>关键结果</td> </tr> <tr> <td>RULER</td> <td>13 类长上下文任务,4K–128K 分级</td> <td>声称 ≥32K 的模型里只有约一半在 32K 达标(合格线 85.6%)</td> </tr> <tr> <td>NoLiMa</td> <td>去掉字面重叠的检索,需要语义推断</td> <td>32K 处 11/13 个模型跌破短文本基线的一半;GPT-4o 99.3% → 69.7%</td> </tr> </table>
标称长度和可用长度要分开看。窗口容量不代表精度。
位置效应:中间内容更易被忽略
2023 年的《Lost in the Middle》是这条线上最早被广泛引用的研究。Nelson F. Liu 等人用两组任务——多文档问答与合成的键值检索——固定其他条件,只改变相关文档在输入里的位置。表现呈明显的 U 形:放在最前(首位效应)或最后(近因效应)时最好,放在中间时显著下降。[4] 相关文档位于上下文中间时,GPT-3.5-Turbo 在多文档问答上的成绩低于完全不给它任何文档的闭卷成绩(56.1%)。把资料放错位置,结果甚至比不给资料更差。论文还发现,换成官方扩展上下文版本后,表现常常没有变化:窗口变大不等于更会用窗口。[4] 位置效应取决于任务。Chroma 在自己的检索任务里测试了 11 个针的位置,没有观察到明显差异。[1] 两组结果说明,位置的影响取决于任务形态:多文档、多干扰项、需要比较取舍时,位置很重要;单针、高相似度、只需定位一次时,位置可以被忽略。
真正的变量:内容竞争
Chroma 的报告把「长度」拆成了几个可操作变量。[1] <table header-row="true"> <tr> <td>实验</td> <td>操作</td> <td>结果</td> </tr> <tr> <td>针—问相似度</td> <td>让问题与目标句的语义相似度从高到低</td> <td>相似度越低,随输入变长的退化越快</td> </tr> <tr> <td>干扰项</td> <td>加入 1 个 / 4 个「看似答案但无关」的句子</td> <td>一个干扰项就足以掉分,四个叠加进一步恶化;不同干扰项影响不均</td> </tr> <tr> <td>干草堆结构</td> <td>原始顺序 vs 随机打乱</td> <td>18 个模型全部在打乱组表现更好</td> </tr> <tr> <td>对话记忆(LongMemEval)</td> <td>11.3 万 token 完整历史 vs 约 300 token 精简片段</td> <td>所有模型在精简版上显著更好</td> </tr> <tr> <td>重复词复制</td> <td>要求原样复制一串重复词,逐步加长</td> <td>一致退化:GPT-4.1 出现 2.55% 拒答,Claude Opus 4 出现 2.89% 拒答,Gemini 家族从 500–750 词起开始生成输入里根本不存在的词</td> </tr> </table> 重复词实验更能说明问题:任务只是原样复制一段文字,模型仍随长度增加而出错,说明退化由输入变长触发,任务难度并未变化。对话记忆实验最接近日常使用:同一问题分别输入 11.3 万 token 的完整聊天历史和约 300 token 的相关片段,后者稳定性更好。[1] 差别在于,完整历史要求模型先检索相关内容,再基于它作答;精简片段只需要推理。多出的检索步骤就是精度代价。
长度会放大内容竞争。无关内容越多,语义相近的段落越容易争抢注意力,精度也越容易下降。
2. 退化从哪里来
上面三组测量描述的是现象,机制仍没有统一解释。以下四个因素经常被提到,也分别对应不同的应对办法。 一、注意力需要覆盖所有 token,但总量有限。 Anthropic 将其称为「注意力预算」:模型每处理一个 token 都要消耗预算,token 越多,每段获得的份额越薄。[5] 无关内容会稀释相关内容获得的注意力。Chroma 的相似度结果也符合这一点:目标句与问题的语义距离越远,越容易在竞争中处于劣势;输入变长后,下降更早出现。[1] 二、模型接触的长样本远少于短样本。Databricks 分析失败案例时发现,以版权为由拒答、无论问题是什么都输出摘要等行为,可能与长上下文后训练不足有关。[6] 模型在几十万 token 上的表现,可能受训练长度限制。三、窗口可以通过外推扩大,能力未必同步提升。Chroma 评测 Qwen 系列时,先用 YaRN 将窗口从 32,768 扩到 131,072,才把它纳入长上下文组。[1] 这类外推手段让模型可以接收更长输入,延长部分的精度仍需单独验证。《Lost in the Middle》的对照显示,换成官方扩展上下文版本后,表现常常没有变化。[4] 标称窗口的增长,部分来自工程外推。四、一次调用里同时包含检索和推理。LongMemEval 的对照很清楚:输入完整历史时,模型要先检索再推理;输入精简片段时只需推理,前者稳定性更差。[1] 把上下文塞满,也把检索交给了模型的注意力机制;这一步最难观察。NoLiMa 专门测试了这一点:答案与问题没有字面重叠时,模型必须依靠语义定位,长输入下的成功率明显下滑。[3]
最直接能改的,是把检索从模型手里拿回来:先筛资料,再作答。注意力有限,窗口容量也不能当作精度承诺。
检索更多,答案未必更好
Databricks 团队在 20 个开源与商业模型上测量了检索增强场景下的长上下文表现。检索更多文档在一定范围内有用,因为正确信息进入上下文的概率提高;多数模型超过某个长度后开始下降——Llama-3.1-405B 在 32k 之后,GPT-4-0125-preview 在 64k 之后,只有少数模型能在所有数据集上保持稳定。[6] 研究还记录了各不相同的失败方式:有的模型以版权为由拒答,有的无论问什么都把上下文改写成摘要。[6] 这类失败通常表现为模型突然变得不可靠。
3. 成本与延迟:另一份账
精度之外,长上下文还有一份更容易算清的账。agent 类应用的负载结构和聊天完全不同。Manus 团队公开过一个数字:他们的平均输入输出比约为 100:1——绝大部分算力用于处理上下文,生成回答只占很小一部分。[7] 这意味着上下文长度几乎直接决定了成本与首字延迟。 主要的缓解手段是前缀缓存。以 Anthropic 的官方计费规则为例:5 分钟缓存的写入按基础输入价的 1.25 倍计费,1 小时缓存写入按 2 倍,而缓存命中的读取只按 0.1 倍——也就是标准输入价的一成。文档同时给出了回本点:5 分钟档写一次、读两次就能回本;只写不读反而比不缓存更贵。[8] Manus 那篇给出的是同一件事的另一种表述:当时 Claude Sonnet 的缓存输入约 0.30 美元/百万 token,未缓存约 3 美元/百万 token,差 10 倍。[7] 这条规则也约束提示写法。缓存要求前缀完全一致:系统提示不要放精确到秒的时间戳,否则每次调用都会让缓存从该 token 起失效;新内容尽量追加在后面,不要插入中间;也不要为省 token 每轮动态增删工具定义——Manus 用掩码限制可选工具,同时保留工具定义。[7] 价格结构本身也在变。2025 年 8 月 Claude Sonnet 4 首次公开 100 万 token 窗口时,超过 20 万 token 的请求会进入更贵的档位(据 The New Stack 报道);截至 2026 年 8 月,Anthropic 定价页写明 4.6 及之后的模型把完整 100 万窗口纳入标准定价,90 万 token 的请求与 9 千 token 的请求按同样单价计费。[8] 这类信息易变,引用前务必看官方页面的当期版本。
缓存和降价只降低成本,不会自动提高精度。价格越低,也不能省掉资料筛选。
4. 怎么办:把上下文当预算花
2025 年 9 月,Anthropic 的应用团队把这件事总结成一个可操作的框架:上下文是有限资源,模型有一份「注意力预算」,每多一个 token 就消耗掉一点,收益递减。因此工作重点从「写一句好提示」转移到「决定哪些内容要进入这一次调用」。[5] 三种做法对应三种场景:需要时再取(just-in-time 检索)、把旧对话压缩成摘要(compaction)、把中间结论写到外部笔记。Anthropic 的官方文档还建议:约 2 万 token 以上的长资料放在提示最前面,问题放在最后;测试中这一顺序最多提升约 30% 的回答质量;先摘出相关原文,再基于引用作答。[9] 先摘出原文再作答,也便于逐条核验。LangChain 在 2025 年 7 月将这些做法归为四个动词:写出去(write,把中间结论存到对话之外)、挑进来(select,只取这一步需要的)、压一压(compress,把旧内容变成摘要)、隔开来(isolate,让不同子任务各自持有自己的上下文)。[10] 四个动词对应四类工具,共同前提是:不要默认保留全部内容。隔离也有代价。Cognition 在 2025 年 6 月的一篇文章里发现,把任务拆给多个 agent 并行,往往换来更脆弱的系统,因为决策被分散,上下文无法在 agent 之间充分共享。[11] 隔离适合能独立完成、只需回传结论的子任务(比如各自读一份文档再汇总);子任务需要共享判断依据时,隔离会造成信息丢失。
一份可执行的喂料清单
先定预算,再选资料。把「窗口有多大」换成「这一步需要哪几段」。多数任务只需要文档中的三段。[5]
删无关内容优先于加相关内容。精度更受无关内容比例影响。[1]
长资料在前,问题在后。 超过约 2 万 token 的材料放最前面,指令与问题放最后。[9]
每份资料标上来源和日期。 用标签或分隔符把多份文档隔开,避免模型混淆出处。[9]
要求先摘引用再作答。 让模型逐字摘出它依据的句子,再给结论。[9]
长历史需要先筛选。完整聊天记录不如一段人工挑出的摘要。[1]
长对话主动重启。把已确认结论写成简短交接说明,开新一轮,控制上下文长度。[5]
关键结论重复问三次。 语义不一致的地方优先核查——这一条与长度无关,但在长上下文里命中率更高。
把长任务拆成几次调用。 每一步只带这一步需要的材料,中间结论写到对话之外,下一步再取回来。[5]
系统提示保持字节级稳定。 开头不要放精确到秒的时间戳,也不要每轮动态增删工具定义,否则前缀缓存失效,成本与延迟一起上去。[7]
新内容追加在后面。 尽量不回头改写已经进入上下文的部分——既保住缓存,也避免同一事实出现两个版本互相竞争。[7]
并行拆分要看子任务能否独立。 只需回传结论的子任务适合拆开;需要共享判断依据的,拆开只会丢信息。[11]
删掉看似有用的资料,往往比继续添加更重要。把注意力留给相关内容。
在真实任务上测试:三个对照实验
公开基准只能提供参考,实际效果要用自己的任务检验。下面三组对照实验各需十几分钟,不用写代码。它们借鉴前述研究,具体步骤经过简化。实验一:精简 vs 完整。挑一个最近问过、答得不好的问题。第一次输入相关资料的完整版本(整份文档、整段聊天历史);第二次挑出三到五段真正相关的内容。同一个问题、同一个模型、同一天。数一数两次回答中有多少条事实能逐条核对。这组实验复现 LongMemEval 的对照思路:完整历史 vs 精简片段。[1] 实验二:干扰项。在精简版基础上,插入一两段看似答案但无关的内容——比如同一指标的旧版本数字、另一个项目里的同名字段。保持问题不变,只增加这两段。如果回答开始摇摆或引用错误段落,说明资料中可能藏着类似干扰。[1] 实验三:位置。 把关键那一段分别放在输入的开头、正中间、结尾,各问一次同样的问题。如果三次结果差别明显,说明你的任务属于对位置敏感的那一类,那就固定用「长资料在前、问题在后」的写法;如果没有差别,这也是有用的信息——说明在这类任务上你可以省下排布的功夫。[4][1] 记录可用四列表格,列出问题、条件、可核对的事实条数和错误条数。测试五六个真实问题后,得到的经验值比公开基准更贴近工作场景。
六个常见误区
误区一:窗口更大,就可以少做筛选。 RULER 显示声称支持 32K 以上的模型里只有约一半在 32K 达标;NoLiMa 显示 32K 处 11 个模型跌破短文本基线的一半。[2][3] 容量变大,精度未必提高;筛选仍然必要。误区二:资料越多越保险。一个干扰项就能掉分,四个叠加更差;精简的 300 token 稳定胜过完整的 11.3 万 token。[1] 检索侧的结论一致:多数模型超过某个长度就开始下降。[6] 误区三:模型说找不到,就继续增加资料。新加资料后答案变差,通常说明它与目标内容发生竞争,问题出在筛选。[1] 误区四:NIAH 满分说明长上下文已经解决。 那项测试主要考的是词汇层面的检索,问题与答案字面高度重合。把字面重叠去掉,或者换成多跳与聚合任务,分数立刻散开。[3][1] 误区五:缓存能解决上下文膨胀。缓存让同一份前缀更便宜、更快,但注意力仍要分给同样多的 token;它影响账单和延迟,精度问题仍在。误区六:多开几个 agent 就能绕开长度限制。拆分本身不会产生共享理解。Cognition 的经验是,决策分散、上下文共享不足会让系统更脆弱。[11] 拆分应依据子任务能否独立完成,不能只看上下文容量。
结论
结论可以归纳成四点。第一,可用长度远短于标称长度。 RULER 显示声称 ≥32K 的模型里只有约一半能在 32K 达标 [2];NoLiMa 显示 32K 处 11 个模型跌破短文本基线的一半 [3]。窗口代表容量,精度仍需单独验证。第二,退化主要由内容竞争驱动,长度会放大影响。一个干扰项就能掉分,连贯结构反而不如打乱结构,精简的 300 token 胜过完整的 11.3 万 token。[1]第三,优化重点是「放进去了什么」,也包括「放了多少」。顺序和结构是免费的收益:长资料在前、问题在后、逐份标注来源、先摘引用再作答。它们不需要换模型,也不增加成本,只改变任务的组织方式。[9]第四,成本与精度指向同一个方向。 缓存与降价让长上下文更便宜,但注意力预算没有变。[7][8] 削减无关内容能同时省钱、降延迟、提精度。文中测量来自 2023 至 2025 年,价格与缓存规则依据 2026 年 8 月访问的官方文档,数字对应当时的模型和产品。后续模型与产品会变化,具体数字需要重新核对;结构性结论仍然成立:注意力有限,无关内容有代价,资料取舍由使用者决定。
来源与引用
- Context Rot: How Increasing Input Tokens Impacts LLM Performance↑
Chroma · Chroma · 正文引用
- RULER: What's the Real Context Size of Your Long-Context Language Models?↑
arXiv · arXiv · 正文引用
- NoLiMa: Long-Context Evaluation Beyond Literal Matching↑
arXiv · arXiv · 正文引用
- Lost in the Middle: How Language Models Use Long Contexts↑
arXiv · arXiv · 正文引用
- Effective context engineering for AI agents↑
Anthropic · Anthropic · 正文引用
- Long Context RAG Performance of Large Language Models↑
arXiv · arXiv · 正文引用
- Context Engineering for AI Agents: Lessons from Building Manus↑
Manus · Manus · 正文引用
- Prompt caching 与 Pricing(Anthropic 官方文档,访问于 2026 年 8 月 17 日)↑
Anthropic · Anthropic · 正文引用
- Long context prompting tips↑
Anthropic · Anthropic · 正文引用
- Context Engineering for Agents↑
LangChain · LangChain · 正文引用
- Don't Build Multi-Agents↑
Cognition · Cognition · 正文引用