本节摘要:本节讲预算的第二个自由度——顺序。Stanford 的 Liu 等人在《Lost in the Middle: How Language Models Use Long Contexts》(TACL 2023)中做了一个干净的实验:把含正确答案的文档插在多文档序列的不同位置,让模型回答——结果是 U 型曲线:答案在开头或结尾时表现最好,落在中部时显著变差,幅度可达 10~30 个百分点(实测,随模型与任务而异);且无关文档越多,整体越差。本章把它翻译成两条实用推论:重要放两端(系统提示天然在最前;关键约束在最近的用户消息末尾复述;检索片段把最相关的放首尾);中部装低熵内容(可预测、信息密度低的内容放中间,高熵的事实、数字、约束绝不住中部;长输出截断时保尾部)。结论:排序与 token 一样是预算——同样的片段集合,顺序不同,命中率不同。
阅读完本节,你应当能够:
实验设计干净得像教科书(实测,Liu et al. 2023):给模型 20 篇文档,其中只有一篇含正确答案,唯一变量是这篇文档放在第几位;其余 19 篇全是无关但看似合理的干扰项。反复测量准确率随位置的变化,得到这条曲线:
准确率 高 ┤ ● ● │ ● ● │ ● ● │ ● ● 低 ┤ ●● ●● │ ●●● ●●●●●●●● └──────────────────────────────────────→ 文档位置 1 5 10 12 18 20 开头 中部 结尾 U 型:首尾最好,中部最差(实测,幅度 10~30 个百分点)
三个值得记住的细节:
为什么是 U 型?两个够用的直觉,不必深究注意力数学:
⚠️ 位置效应是统计规律,不是物理定律:不同模型代际的敏感度差异很大,同一个 U 型在你的任务上可能平缓也可能陡峭。正确姿势是拿自己的任务做一次小规模位置评测(把同一段关键信息挪三个位置各测十轮),再决定投入多少精力调序。
把 U 型反过来用——最需要被读到的内容,放窗口首尾:
| 手段 | 做法 | 说明 |
|---|---|---|
| 系统提示在最前 | 指令成分天然位于窗口开头(3.1 节) | 位置红利是系统提示权威性的来源之一 |
| 关键约束末尾复述 | 长 history 之后、最近的用户消息末尾,用一行重申红线:"再次强调:不要修改 config" | 复述不是啰嗦——首尾双保险,中部历史无论多长都冲不掉 |
| 检索片段首尾排序 | 多段素材按相关性排:最相关的两段放最前与最后 | 排序本身是重排器的职责,机制见《语义代码检索》第 5 章 |
| 多文档问答先粗排 | 无法精确排序时,至少把确认无关的移出窗口 | 减少干扰项对 U 型曲线的整体压低(实测) |
"熵"借用信息论直觉:低熵 = 可预测、信息密度低(背景说明、格式约定、常识性描述);高熵 = 不可预测、信息密度高(具体数字、唯一事实、约束条件、异常状态)。推论:
装配一条长上下文的位置模板(示意): [开头] 系统提示(指令) → 最高优先的检索片段 → 任务原文与红线 [中部] 低熵素材:背景、格式说明、中等相关片段、已引用化的旧结果 [结尾] 最近 K 轮对话 → 次高优先片段 → 关键约束复述 → 本轮用户输入
token 预算回答"装多少",位置预算回答"怎么摆"——同样的片段集合、同样的 token 花费,仅因顺序不同,命中率可以差出一截(实测)。至此,一条完整的动态层装配策略成形:
装配 = 分配表(2.1,给多少) × 驱逐顺序(2.1,丢什么) × 位置编排(2.2,怎么摆)
这套公式此后全书通用:第 5.2 节(后半)的检索片段组装是它的直接应用;第 6 章(后半)压缩后的"结构化任务简报"同样按此模板摆放。
量与序都齐了,动态层的装配算法完整。从下一章起逐成分深潜,先从设计期就能定型的常驻层开始——系统提示与工具 schema,开发者写下的每一个字都在这里被审计。