上下文窗口与注意力预算
一句话定义
上下文窗口是模型一次能处理的 token 总量上限,但"能装下"和"用得好"是两回事——工程上应把窗口当作需要精打细算的注意力预算来管理。
为什么重要
新手把窗口当仓库,什么都往里塞;工程师把窗口当预算,每个 token 都要回答"它值得占用注意力吗"。窗口塞满会同时触发三重代价:可靠性下降(注意力衰减与"迷失在中间"(Lost in the Middle) 的位置衰减)、成本上升(按 token 计费)、延迟变长。本知识点给出一个可操作的预算分配模型,是后续压缩(上下文压缩:摘要、滚动与层级)与长文档组织(长文档组织:分块、裁剪与引用定位)的决策框架。
前置知识
- 分词与上下文:模型如何"读"你的话:token 是计量单位——窗口、成本、预算都以 token 计;
- 注意力衰减与"迷失在中间"(Lost in the Middle):位置效应——塞满窗口不仅贵,还会降低中部内容利用率。
直观类比
把窗口想成一页试卷的答题区:题目要求(指令)、例题(示例)、参考资料、你的作答(输出)共享同一张纸。资料抄得越多,留给作答的空间越小、阅卷人(注意力)越疲劳——会考试的人都懂得"只抄关键句"。
图示
┌────────────── 上下文窗口 W ──────────────┐
│ S 指令区(固定·小) │ F 示例区 │ K 资料区 │
│ ├─────────┤ (相关度准入) │
│ U 用户输入 │ O 输出预留(≥1.5×预估) │
└──────────────────────────────────────────┘
← 超出 K_max 触发压缩,而不是硬塞 →核心概念
- 上下文窗口(Context Window):输入 + 输出共享的 token 总上限。例如 128K 窗口,若输出预留 4K,输入最多约 124K。
- 有效窗口:考虑注意力衰减后,实际可靠利用的部分,通常小于名义窗口。
- 注意力预算:一个分配思维模型——把窗口切分为若干功能区块(指令/示例/资料/用户输入/输出预留),并为每块设定 token 上限。
- 输入与输出预算:输出预留不足是最常见的截断事故来源,规划时先定输出再定输入。
原理与机制
预算分配的关键不是"平均分",而是按信息对输出的边际贡献分配。一条 token 的价值 = 它改变输出正确率的程度。由此得到三条分配原则:
- 指令区要小而硬:系统提示控制在几百 token 内,规则编号化,每条都可追溯(见 系统提示词设计:角色、边界与结构);
- 资料区按相关度准入:不是"有多少给多少",而是"排在前 K 相关的才进"——宁缺毋滥,因为低相关资料不仅无益还会干扰(噪声段);
- 输出预留按最坏情况定:结构化输出的 token 数可预估(字段多寡 × 平均字段 token),预留 = 预估 × 1.5 安全系数。
跨轮对话还有一条动态规则:预算是滚动的。每轮新增内容挤占预算,超出时必须压缩或淘汰旧内容(见 上下文压缩:摘要、滚动与层级、记忆与状态:会话内记忆、外部记忆与状态注入),而不是放任窗口逼近上限。
公式或模型
简化预算模型:总窗口 W 拆分为
W = S(系统提示) + F(少样本示例) + K(资料/工具结果) + U(用户输入) + O(输出预留)
管理目标:S + F 固定且小(通常 < 10%);K 按相关度准入,设置上限 K<sub>max</sub>(如 40%);O ≥ 最坏输出 × 1.5。当 U + K 逼近 K<sub>max</sub> 时触发压缩流程。这个模型不追求精确,作用是让团队在"还能不能再塞一条资料"上有共同语言。
实例或案例
案例:报告生成任务的预算表。 需求:基于 10 份上传文档生成 1000 字评审意见。操作步骤:① 定输出:1000 字 ≈ 1500 token,预留 O=2500;② 定指令:角色 + 评审维度 + 格式要求,压缩到 S=400;③ 资料准入:不做全文粘贴(可能 200K+),先按章节相关性各文档抽 2~3 段,K 上限定 30K;④ 装不下 → 分批摘要后汇总(见 任务分解与规划提示、长文档组织:分块、裁剪与引用定位)。全程用 token 计量表核对,而不是凭"感觉没多少字"。
排错清单:
- 症状:输出被截断 → O 预留不足或输出过长,先查 max_tokens 与窗口余量;
- 症状:成本随会话轮数线性上涨 → 旧轮次未淘汰,启用滚动压缩(上下文压缩:摘要、滚动与层级);
- 症状:资料越多答案越差 → 相关度准入缺失,低相关片段在制造噪声,收紧 K 的准入条件。
常见误区
- 窗口越大越不需要工程:名义窗口越大,"迷失在中间"的绝对跨度也越大,无组织超长上下文的可靠性反而更不可测。
- 只预算输入不预算输出:输出截断是最高频的线上事故之一,先定 O 再定其余。
- 用"字数不多"判断:中文/英文 token 比例不同(分词与上下文:模型如何"读"你的话),一切以 token 实测为准。
自测题
- 128K 窗口跑一个输出可达 8K token 的任务,输入预算最多按多少规划?
答:约 120K 减去指令与示例的固定开销,且应远低于名义值——为注意力衰减留余量,实际把资料区上限压到几十 K 更稳。
- 为什么低相关资料比没有资料更糟?
答:它占用注意力预算、稀释关键内容的权重,还可能引入冲突信息,边际贡献为负。
- 一条 token 的"价值"应如何衡量?
答:按它对输出正确率的边际贡献——这正是"相关度准入"原则的依据。
与其他知识点的关系
上下文压缩:摘要、滚动与层级 是预算超支时的压缩手段;长文档组织:分块、裁剪与引用定位 处理"单文档就超预算"的情况;记忆与状态:会话内记忆、外部记忆与状态注入 把预算管理延伸到跨轮记忆;注意力衰减与"迷失在中间"(Lost in the Middle) 解释了为什么要给窗口留余量。
延伸阅读
- 论文:Lost in the Middle(Liu et al., 2023)——"有效窗口 < 名义窗口"的实证依据。
来源
- Lost in the Middle: How Language Models Use Long Contexts (Liu et al.
- 2023)