中间迷失:上下文放得下,为何模型仍可能找不到?
理解长上下文中的位置效应,学会用受控实验测量它,并用检索、重排和结构设计降低关键证据被忽略的概率。
1. “中间迷失”具体指什么?
“中间迷失”指的是这样一种经验现象:同样一段对回答问题至关重要的信息,只是因为它被放在了长上下文的中间位置,模型就明显更不容易找到并利用它,表现随之下降。直觉上,上下文里凡是放进去的内容,模型理应一视同仁;但实验观察到的结果并非如此——相关信息处在不同位置时,模型的输出质量会发生可以测量、且方向大体稳定的变化,中段往往是最薄弱的区域。
这个效应不是凭感觉下的结论,而是一个需要用实验确认的位置效应。要确认它,实验的输入应当是一组彼此只有证据位置不同的输入:同一个问题、同一份关键证据、同一批干扰文档,唯一改变的是关键证据被插在上下文中的位置。实验的输出则是按位置分桶统计的指标,例如回答准确率,或者模型在生成答案时对正确文档的引用命中率。判定的逻辑是:如果只是移动关键证据的位置,就足以引起稳定的指标变化,那么系统对位置敏感这一结论就得到了支持;反之,如果各位置的指标波动在误差范围内没有方向性,就不能宣称存在中间迷失。
这类实验中经常被提及的 U 形曲线,含义也需要精确理解。U 形指的是在某个具体实验里,上下文开头和结尾位置的成绩优于中间位置,因此按位置画出的曲线两头高、中间低。它描述的是那次实验的观测结果,并不意味着每个模型、每一种上下文长度、每一类任务都会呈现完全相同的曲线形状。
经典实验的做法就是把同一条关键证据分别放到上下文的开头、中间或结尾,其余条件尽量保持不变。部分模型在这样的控制实验下呈现出类似 U 形的位置曲线:开头和结尾的内容被利用得较好,中间的内容相对较弱。值得注意的是,这始终是一个经验现象:它来自对具体模型、具体长度、具体任务的观测,而不是一条对所有模型、所有任务、所有长度都必然成立的普遍规律。某个模型在某个任务上中间迷失,不代表另一个模型或另一项任务也一定如此;反过来,没有观测到该效应的组合也不否定它在其他组合中的存在。
以一个具体例子说明:假设有 30 份候选文档,其中只有一份包含答案。把这 30 份文档喂给模型时,答案所在的那份文档被放在哪个位置,是可以人为控制的。如果仅改变这份文档的位置,回答的准确率就随之发生变化,就说明该系统对位置敏感,中间迷失效应在这个系统上成立。这个例子的关键在“仅”字:其他一切保持不变,位置是唯一的变量,这样才能把表现差异干净地归因于位置,而不是归因于内容本身。
2. 上下文窗口与有效上下文有什么区别?
上下文窗口与有效上下文描述的是两件不同的事。上下文窗口是一个容量概念:它说明模型在一次请求里最多能够接收多少个 token,超出之后接口通常会直接拒绝或截断。它回答的问题是“能不能放进去”,而不保证放进来的每一个 token 都会被稳定、等价地利用。有效上下文则是一个表现概念:在窗口放得下的前提下,模型实际能够在多大范围、多大程度上正确利用其中的信息。它回答的问题是“放进去之后用不用得上”。
两者在测量方式上的差别,源于输入与输出的不同。窗口容量的评测输入只有请求的 token 数,输出只有一个二元结果:接口接受还是拒绝。这条边界由服务端设定的上限决定,属于工程约束。而有效利用程度的评测,输入要丰富得多:除了内容本身,还包括关键证据处在哪个位置、上下文里有多少干扰项、要完成的是什么任务;输出也不再是接受与否,而是正确率、对正确证据的引用命中率等任务指标。这些指标没有接口可以直接告诉你,必须靠针对具体任务的实验去测。
因此,一句“支持 128K”只能被解释为“可接收 128K 的容量”,不能被解释为“能在 128K 任意位置可靠取证”。前者是容量声明,后者是任务表现,两者之间隔着模型真实的利用能力。把容量声明直接当作取证能力的保证,就会高估系统在长上下文里的可靠性,这正是很多长上下文产品上线后表现不及预期的原因之一。
有效上下文还受多种因素影响:任务本身的难度、干扰项的数量与相似度、任务对检索能力的要求、提示的结构、以及模型的版本。同一窗口规格下,简单任务的有效范围可能比困难任务大得多;干扰项密集时,中间位置的内容更容易被淹没;不同版本的模型即使窗口数字相同,实际利用能力也可能明显不同。也就是说,有效上下文不是一个由硬件规格决定的常数,而是模型能力、任务特征与输入结构共同作用的结果。
所以,厂商给出的窗口数字不能替代自己在真实工作负载上的位置与长度评测。判断一个系统能否胜任某项长上下文任务,正确做法是拿自己的任务、自己的干扰项、自己的证据分布去测,而不是依据宣传页上的窗口上限作推论。
3. 怎样把位置效应测成一条曲线?
把位置效应测成一条曲线,核心做法只有一个:固定证据和问题,只改变证据在上下文中的相对位置,然后重复足够多的样本。只有位置是变量,其他一切都尽量保持不变,观测到的成绩差异才可能归因于位置本身。
一次曲线实验的输入是多个可配对的题目实例,以及对应的位置、上下文长度、干扰项设置;输出则是每个条件下的准确率、置信区间和样本量。三个输出缺一不可:准确率给出点估计,置信区间给出波动范围,样本量决定这个波动范围有多大可信度。对于每一道题,都要生成证据在开头、中间、结尾的多个版本,并把其余材料的顺序随机化,让题目自身成为对照——同一道题在三种位置下的成绩之差,比不同题目之间的成绩差干净得多,因为题目难度、所需知识都被配对控制住了。如果曲线上的差异小于统计波动范围,就不能宣称出现了位置效应;一条看起来中间低、两头高的曲线,只有在样本量足够、置信区间不与相邻位置重叠时才有说服力。
准确率与各变量的关系可以写成:
A = f(p, L, d)
其中 A 是当前条件下实测的任务准确率;p 是证据在上下文中的归一化相对位置,取值靠近 0 表示接近开头,靠近 1 表示接近结尾;L 是上下文的总 token 长度;d 是相似干扰项的数量或强度。这个写法表达的是准确率可能随三个变量共同变化,而不是预先假定它们之间存在某个固定的代数公式——p、L、d 各自怎样影响 A,正是实验要回答的问题,所以用函数记号 f 而不是一个具体算式来写。
测量时要把 p 归一化到 0 至 1 的区间,这样不同长度的上下文放在同一张图上才有可比性;同时要对不同的长度 L 和干扰强度 d 分别报告,因为位置效应很可能随这两个条件改变,把它们混在一起平均会把不同条件下的曲线互相抹平。除此之外,还要随机化无关文档的顺序、控制上下文的总 token 数、并记录模型版本和解码参数:无关文档顺序若固定,位置差异可能与文档内容差异混淆;总 token 数变化会改变密度;模型版本和解码参数不同,整个系统的行为就可能不同。
最后是判定边界:只比较一个开头样本和一个中间样本,无法排除样本难度和偶然波动。单个样本的差异可能是这两道具体题目本身难度不同造成的,与位置无关。要得到一条可信的位置曲线,必须依靠配对题目在多个位置上的重复测量,而不是一两次孤立的对照。
4. 为什么会发生?
中间迷失被反复观测到,但“为什么会发生”并没有一个对所有模型都成立的单一答案。研究确认了位置偏差这个现象本身,而其成因可能同时来自训练分布、模型机制与任务设计三个层面,并且在不同系统上三者的比重可能完全不同。
对成因做诊断时,输入应当包括三类材料:已经复现的位置曲线、注意力或检索轨迹、以及受控消融实验;输出则是经过这些证据检验之后仍然站得住的候选解释。诊断的基本方法是逐一改变可疑因素,观察位置曲线如何变化:改变训练时的上下文长度分布,看训练分布是否塑造了模型对位置的偏好;改变干扰项的相似度,看中间段的下降是否主要由相似文档的竞争引起;改变提示的结构,看提示没有明确指出证据所在的位置是否放大了效应。哪个因素被改变后曲线随之变化,哪个因素就更可能是原因的一部分;改变后曲线不变的因素,则可以从候选名单中降级。这一过程是逐步缩小原因范围,而不是一次找到唯一元凶。
目前被提出的可能因素大致有四类。一是首因/近因偏置:模型在训练中更常遇到关键信息出现在开头或结尾的分布,因而对首尾位置形成偏好。二是长距离检索困难:中间位置的信息距离当前生成步骤更远,模型需要跨越更长距离才能把它取出来。三是相似干扰项竞争:上下文里与证据相似的材料越多,中间的证据就越容易被别的文档“淹没”。四是提示结构问题:如果提示本身没有明确指出证据的结构和位置,模型只能自行在整段上下文里搜索,出错空间更大。此外,不同的架构与训练方法本身就会改变表现,两个系统即使窗口大小相同,其位置曲线的形状和成因也可能不同。
注意力权重在这类诊断中扮演的角色需要被谨慎界定。注意力权重可以告诉我们模型在生成某个 token 时把注意力放在了上下文的哪些位置,因而能作为诊断线索;但它只是一种相关性观察,不能单独证明“模型因为某个注意力头失效而遗忘了中间”这样的因果叙述。一个注意力头对中间位置的权重偏低,可能是遗忘的原因,也可能是遗忘的结果,还可能只是伴随发生的无关现象。只有结合消融实验改变模型结构或输入条件后观察行为变化,才能向因果结论靠近。
因此应当警惕过度解释:现象得到复现,不等于存在一个适用于所有模型的单一机制答案。同一个中间迷失的曲线,可能在这个模型上主要由训练分布造成,在另一个模型上主要由干扰项竞争造成,在第三个模型上则是提示结构与检索机制共同作用。面对具体系统时,正确的问题是“在它身上,哪些因素在起作用、各自占多大比重”,而不是套用一个放之四海皆准的机制解释。
5. 如何降低关键证据被淹没?
降低关键证据被淹没的风险,核心策略只有两条:尽量减少无关上下文,同时让任务与关键证据彼此更容易定位。窗口越大,能塞进去的东西越多,但塞得越多,中间的信息越容易被稀释和遮蔽。因此工程上的努力方向不是“把更多东西放进去”,而是“让放进去的东西里,该被用到的部分更容易被找到”。
一个典型的缓解流程,输入是原始候选文档、当前问题和 token 预算,输出是一份经过去重、重排、带来源标记的紧凑上下文。流程先做筛选,把与当前问题无关的内容剔除,减少干扰项的数量;再做重排,把高价值的证据放到任务附近,避开中间位置的弱点;同时为保留的内容打上来源标记,让模型生成的每个结论都能追溯回具体片段。这样处理之后的效果,应当解释为“证据更容易被定位了”,而不是“模型的窗口能力被永久改变了”——窗口和模型本身并没有因为这次输入整理而升级,变化只发生在这一次输入的构造方式上。
这条流水线里有一个不可补救的环节:召回。如果召回阶段就把正确的证据漏掉了,那么后续的重排和位置调整都无法补救——再怎么排,上下文里根本没有正确答案,模型也不可能无中生有。因此缓解措施的有效性是有上限的:它只能让已经进入上下文的证据更容易被找到,不能替代一个能把正确证据捞出来的检索阶段。
在具体做法上,先检索、重排和去重,只装配解决当前问题真正需要的片段,而不是把整批资料原样倒入;用标题、编号、来源标识与分隔符建立清晰的结构,避免把长文档拼成一堵“文本墙”,让模型无从分辨哪些是证据、哪些是噪音。位置安排上,可以把问题在证据之后重申一遍,让任务与证据在上下文里靠近;或者把最高价值的证据直接放到任务附近。至于放在任务前还是任务后、放多近最好,没有放之四海皆准的答案,具体位置应当以实验为准——不同模型、不同任务对位置的敏感程度不同。
对于复杂任务,应当拆成检索、核验、综合等多个阶段,每个阶段都保留中间引用,而不是指望模型一次读完整个上下文后直接给出最终答案;拆解让每一步面对的都是小而明确的目标,中间证据被淹没的机会随之下降。面对超长资料,首先生成一份可追溯的索引,让模型先按索引定位再读取对应段落,而不是直接生成一段无法核验的摘要——摘要压缩了信息,也切断了结论与原文之间的联系。
6. 缓解方案怎样验证才可信?
缓解方案能不能用,取决于它是否在足够严苛的验证条件下仍然成立。最容易犯的错误是只测试“答案刚好被放在最前面”的理想布局——这种情况下任何方案看起来都不会差,因为它避开了问题最严重的位置。可信的验证必须覆盖位置、长度和干扰项的组合,尤其是中间位置、长上下文和高相似度干扰同时出现的场景。
验证的输入是基线与候选方案在同一批位置、长度、干扰组合上的完整结果;输出则是分桶后的质量指标、引用情况、延迟和成本差异。这里“同一批”是关键:基线不用方案,候选方案用方案,除此之外的题目、数据、评估方式必须完全一致,只有缓解方案本身允许变化。同时要保存最终的完整请求,事后检查证据集合是否如预期那样被装配进上下文——如果实际发出的请求与设计不符,评估结果就无从谈起。
有一条硬性判定规则:即使平均分上升,只要某个高风险位置桶的成绩下降,方案仍不能通过。平均分的提升可能完全来自原本就不成问题的头部位置,而中间位置——恰恰是方案要解决的地方——反而变差了。对缓解方案来说,最差桶的表现比平均值更能说明问题。
验证流程可以按顺序展开:先建立位置基线,在不加任何方案的情况下测出证据在不同位置的原生成绩;再引入长度梯度,逐步拉长上下文,看效应随长度如何演变;然后加入相似干扰项,模拟真实场景中证据与噪音混杂的情况;之后应用重排或结构化方案;对比应用前后的准确率与引用命中率;最后按模型版本分别做回归,确认结论在新版本上仍然成立,而不是只在旧版本上成立。
记录指标时,正确率、证据引用是否命中、延迟和 token 成本四者都要留。如果准确率上升但引用错误,说明模型可能并没有真正找到证据,而是凭先验知识猜对了答案——这种“正确”在验证中不可信。如果方案只在单一提示模板上有效,换一种结构就失效,则它很可能只是过拟合了那一种提示格式,而不是真正缓解了位置效应。
7. 哪些失败不能简单叫“中间迷失”?
中间迷失是一个有严格含义的归因结论,不是长上下文里一切失败的统称。如果证据根本没被检索进来、在进入上下文之前被截断、用的版本是错的,或者问题本身就含糊得无法定位答案,那么失败的根因很可能根本不在位置——把一个数据管道故障说成中间迷失,只是用流行术语掩盖了真正的问题。
归因排查的输入是三类材料:失败的那次完整请求、最终装配进上下文的内容、以及检索和文档解析的日志。输出则是对故障类型的判断:要么是数据管道故障,要么是模型的位置利用问题。判定标准是严格的:只有当确认正确证据确实存在于最终上下文中、并且仅改变它的位置就会改变结果时,才能把失败解释为中间迷失;如果无法构造出“其他一切不变、只移动证据位置”这一对照实验,就应该保留“原因未定”,而不是急着下结论。
排查应当按固定的顺序进行,先排除管道问题,最后才考虑模型。第一步确认最终请求里确实包含了正确证据:如果证据根本不在里面,模型答不对是必然的,与位置无关。第二步检查 token 截断:内容可能在超长时被截掉,或者关键段落恰好落在被丢弃的部分。第三步检查权限过滤和文档解析:访问控制可能过滤掉了证据,解析器可能在转 PDF 或网页时丢失了关键段落。第四步检查召回与排序:召回阶段有没有把正确文档捞出来,排序有没有把它排进最终装配。只有这几关都确认无误——正确证据确实在最终上下文里,且没有发生截断、过滤、解析丢失或召回遗漏——最后才用位置置换实验判断是否属于模型的利用问题。
这样的顺序能把大量“看起来像中间迷失”的失败重新归类到它们真正所属的地方。一个常见的教训是:用户抱怨“长文档中间的内容模型总是找不到”,排查后却发现是解析器把中间几页转丢了,模型从头到尾都没见过那段话。把这类问题说成中间迷失,既错失了修复管道的机会,也让模型的位置问题被虚假地放大了。
8. 在产品中应设什么回归测试?
位置效应不是测一次就一劳永逸的。模型升级、提示调整、检索器更新,任何一环变化都可能改变系统的有效上下文,甚至可能让之前不明显的中间迷失重新出现。因此位置测试不能停留在一次性评估,而要进入持续评测:把位置敏感度当作一项长期跟踪的产品质量指标。
持续回归的输入是一组固定的、可置换的任务集,加上每次发布的新系统版本;输出则是按位置、长度、任务类型和风险等级分桶的趋势曲线与告警。每次升级后,都要用与基线完全相同的装配流程和评分流程重跑一遍,再和基线对比。判定上有一条不可通融的规则:即使总平均分保持稳定甚至上升,只要某个关键位置桶越过了最低门槛,仍然必须阻断发布。平均分掩盖不了局部崩溃,而位置桶正是局部崩溃最常发生的地方。
测试集本身也要定期更新。如果永远用同一批题目、同一种模板,方案和评测都会不知不觉地过拟合到这套固定格式上,测出的“稳定”只是对模板的稳定,不是对真实输入的稳定。持续的测试集轮换,是为了让回归始终面对新鲜而多样的输入分布。
测试集应当保留几类可以置换位置的任务:多文档问答(同一问题的证据可在多个文档间换位)、键值检索(在长列表中查找指定键对应的值)、以及多跳任务(需要综合上下文里多处信息才能作答)。这些任务类型覆盖了从简单定位到跨段综合的不同难度。每次升级后,绘制的是分桶的位置曲线,而不是只报一个总平均分——曲线才能看出究竟是哪一段位置在退化。
对于高风险的答案,还应当要求模型给出引用的证据,作为答案之外的强制输出。当引用缺失、或者引用与答案互相冲突时,触发补检索或人工复核,而不是让一个没有证据支撑的答案直接流出。这条机制把“位置迷失”从评测指标进一步转化为线上兜底:即使模型在某个位置上没有找到证据,系统也能通过引用校验拦住它,而不是让它基于先验猜测作答。
9. 案例推演:一条位置曲线怎样算出来?
用一个具体场景把前面的测量方法串起来:假设有一项客服任务,30 个等长文档里只有一份包含退款例外条款,答案就藏在这份文档里。把这份证据分别放到上下文的首部、中部和尾部,其余 29 份文档保持不变,然后统计各位置下的回答正确率。问题是:得到的曲线差异,究竟是真实的位置效应,还是样本偶然波动?
图 1 给出一条示意性的 U 形位置曲线:横轴是证据在上下文中的相对位置,纵轴是准确率;红线代表原始长上下文下的结果,在中间位置明显下凹;绿虚线代表经过检索重排后的结果,中段的凹陷被抬高。必须强调这张图是示意:真实曲线的形状必须在具体模型、具体长度、具体任务上实测,不能把这张图当作任何系统都适用的通用常数。
图 1:示意性的 U 形位置曲线。红线是原始长上下文,绿虚线是检索重排后的结果;真实形状必须在具体模型、长度和任务上测量,不能把这张图当通用常数。
配套的数值例可以整理成下表。每一行是一个位置条件,正确数按总共 60 个样本计:
对数值的解释要一步步来。原始中段为 34/60 ≈ 56.7%,重排后为 46/60 ≈ 76.7%,绝对提升约 20 个百分点。表面上看重排效果显著,但归因时有一个陷阱:如果重排的同时还删除了 8 篇干扰文档,那么这 20 个百分点的提升里,有一部分来自干扰减少,另一部分才来自位置移动,二者无法分开。此时不能把全部提升都归因于“证据位置更靠后了”;应当补做一个只改变位置、不动文档集合的消融实验,把位置这一个变量的贡献单独量出来。
更稳妥的做法是配对实验:对同一个问题实例分别生成开头、中间、结尾三个版本,让证据内容、干扰项、总长度和答案完全一致,唯一不同的是证据位置。这样每道题都以自身为对照,题目难度差异被配对抵消,位置效应才能从题目噪声中浮出来。如果任务需要综合两条分散在上下文里的证据才能作答,还应单独测试“两条都在中间”“一条开头一条结尾”“两条彼此相邻”等布局——多跳综合的失败不一定等同于单条事实检索失败,两类任务的曲线可能形状完全不同,混在一起测会互相污染。
样本量较小时,百分比的起伏很可能只是偶然。例如 60 个样本里多对或少对 2 个,准确率就浮动约 3.3 个百分点;样本更少时波动更大。因此小样本下的曲线必须同时给出置信区间,并在多个不同的问题措辞上复验,看效应是否在不同表述下都成立。
产品门槛应当按风险分级设定。普通推荐类场景可以容忍轻微的位置敏感;但高风险的政策解读、合规回答,则应在每个位置桶都达到最低正确率与引用命中率,任何一桶不达标即视为不合格。绝不能让较高的总平均掩盖中段失效:如果采样时开头样本多、中间样本少,总分会偏向表现好的头部,最危险的位置反而在报告里消失。因此至少按相对位置、上下文长度和干扰强度三个维度分桶,并在每个桶上报告样本量或置信区间,而不是只报一个总平均分。
| 证据位置 | 正确 / 60 | 准确率 | 95% 区间之外还要控制 |
|---|---|---|---|
| 开头 0–10% | 51 | 85% | 文档顺序、总 token、问题措辞 |
| 中间 45–55% | 34 | 57% | 同一证据、相似干扰项与解码参数 |
| 结尾 90–100% | 48 | 80% | 模型版本、随机种子与重复次数 |
| 中间 + 重排 | 46 | 77% | 成本、引用正确率和是否只适配模板 |