把最相关的证据放在开头、次相关的放在结尾,可能改善某些长上下文任务,也可能打乱时间顺序、因果链或文档中的例外条件。U 型编排应当是一条可以失败的实验假设,而不是“破解中部遗忘”的通用按钮。
《Lost in the Middle》提供了位置敏感性的研究依据;LangChain 10 月 14 日关于长期上下文的文章则讨论把信息移出活动窗口并保留恢复入口。两者解决的问题不同:一种考察放进窗口后的使用,另一种管理什么时候把什么放进去。位置研究;上下文管理
先固定集合与预算,再改变排列
如果 U 型方案使用了更短摘要、更多证据或不同的提示词,得分变化就不能只归因于排序。更干净的实验应固定候选集合、文本内容、预算与模型参数,只交换位置,并随机化查询呈现顺序。
对于需要连续阅读的原始段落,保持块内顺序。排序的单位可以是一组已经完整引用的证据块,而不是把一句主张与下一句例外拆开放到两端。文档关系不明时,先保持原文顺序通常比机械交错更容易审计。
用确定性排列器检查最基本的守恒
下面把排名 A、B 分别放到左右两端,其余依次填中间。它只生成一个实验组排列,确保没有重复、丢失或改变文档文本,不声称模型已经答得更好。
图把降序与两端排列作为两组输入,位置变化不是质量评分。字符体积相同只是这个教学例子的检查;真实 Token 开销仍需要目标 tokenizer。
def u_layout(items): result = [None]*len(items) left, right = 0, len(items)-1 for rank, item in enumerate(items): if rank % 2 == 0: result[left] = item left += 1 else: result[right] = item right -= 1 return result ranked = list("ABCDEF") reordered = u_layout(ranked) assert reordered == list("ACEFDB") assert sorted(reordered) == sorted(ranked) assert u_layout([]) == [] and u_layout(["A"]) == ["A"] texts = {x: "evidence-"+x for x in ranked} assert sum(len(texts[x]) for x in ranked) == sum(len(texts[x]) for x in reordered) print("ABCDEF -> ACEFDB; same evidence set and character volume")例子跑通以后,还要验证什么
这段代码已在本地 macOS、CPython 3.9.6 下运行,实际输出为ABCDEF -> ACEFDB; same evidence set and character volume。它验证的是例子中的数据约束与分支,不包含线上服务的吞吐或延迟测量。
没有调用长上下文模型、运行 Needle 基准或评估答案。真实实验应检查无答案查询、跨块引用、时间线问题和拒答表现,并按位置分组报告。若交错提高了一个任务、伤害了另一个任务,这个差异本身就是选择策略的依据。
延伸阅读
- Lost in the Middle:2023 年的位置研究,不给当前模型固定收益保证。
- Context Engineering: How Deep Agents Remember:2026 年 10 月 14 日,信息移出与可恢复记忆的工程思路。