上下文窗口与注意力预算

kp-004核心20 分钟01-心智与基础最小路径

一句话定义

上下文窗口是模型单次能读入的 token 上限,而「注意力预算」是指即使窗口够大,注意力也会随材料增多而稀释——上下文管理的目标是用最少的材料换最准的产出。

为什么重要

「窗口有 200K token,所以把整个仓库贴进去」是最昂贵的误区。注意力随位置与数量衰减(材料过多时中段内容被弱化),无关代码是噪声而非储备;上下文管理能力直接决定补全命中率、对话准确率与 Agent 成功率。模块 02 的所有技能(规则文件、上下文包、会话管理)都是本知识点在操作层的展开。

前置知识

kp-001(AI 辅助编程的版图与核心术语)。

核心概念

  • Token:模型的最小处理单位,中文约 1 字 1-2 token,代码符号密度更高。
  • 窗口上限:单次请求的输入+输出总预算;超出即截断或报错。
  • 有效上下文:窗口大小不等于可用大小。材料越多,单份材料获得的注意力越少;中段内容最易被弱化(lost in the middle 现象)。
  • 注意力预算:把窗口当作预算来分配——每一份贴入的材料都要「挣得」它的位置。
  • 分层注入:常驻层(规则文件)<会话层(任务上下文)<即时层(当前 diff/报错),各层预算不同。

原理与机制

注意力机制让每个输出 token 对所有输入 token 计算相关度权重;材料越多,权重被摊薄,与任务无关的材料还会「抢权重」。因此上下文工程的第一原则是最小充分集:只放与当前任务因果相关的材料。第二原则是位置敏感:最重要的约束放开头(规则/系统提示)或结尾(任务与验收),中间放参考代码。第三原则是替换优先于追加:会话变长时用摘要替换旧细节,而不是无限堆叠。

实例或案例

操作步骤(减少无效上下文的四个动作):

  1. 贴 diff 不贴整文件:只贴改动涉及的函数及其调用方签名。
  2. 报错日志裁剪:保留完整栈 + 首次出现,删去重复重试段。
  3. 用文件路径+行号引用代替整段粘贴,让代理层自己按需读取。
  4. 新任务开新会话:上一任务的残留上下文是本任务的噪声。

Before/After:任务「修复分页越界」。Before:贴整个 800 行 service 文件 + 三份无关报错。After:一句话任务 + list.py:82-96 当前实现 + 调用方断言 + 一份最小复现报错。后者通常一轮命中。

排错清单:

  • AI「忘了」开头给过的约束 → 约束没进常驻层,写进规则文件(kp-006)。
  • 长对话后半段质量下降 → 触发会话衰减,见 kp-009。
  • 回答引用了不存在的函数 → 你贴的可能是旧版本代码,核对文件版本。

公式或模型

  • 有效上下文 ≈ 窗口上限 × 材料相关度(相关性越高衰减越慢)。
  • 预算参考分配(编程任务):常驻规则 ≤ 5%,任务描述与验收约 15%,相关代码与报错约 60%,参考示例约 15%,留 5% 余量。
  • 材料取舍判据:删掉它,模型是否可能给出不同且更差的答案?不会则删。

图示

窗口预算(横条)
[规则 5%][任务+验收 15%][ 相关代码/报错 60% ][示例 15%][余量 5%]
  常驻层          └──────── 会话层 ────────┘      即时层随任务替换

直观类比

上下文像考试时的草稿纸容量:不是把整本教材抄上去,而是只抄会考的公式——草稿纸越干净,越看得清关键那道题。

常见误区

  • 窗口大 = 不用管理上下文:稀释与噪声随窗口同比增长。
  • 上下文越多越好:无关材料主动损害输出质量。
  • 只贴报错不贴代码:模型只能猜,产出「看起来合理」的幻觉修复。

与其他知识点的关系

kp-005 讲模型如何自动检索代码库以补充窗口;kp-008 的上下文包清单是本节预算分配的落地工具;kp-009 处理预算耗尽后的会话策略。

自测题

要点:注意力随材料数量稀释、中段弱化;无关材料抢权重、增加噪声。

要点:删掉该材料后模型是否可能给出更差答案;不会则删。

  1. 为什么窗口大不等于可用上下文大?
  2. 「最小充分集」的取舍判据是什么?

延伸阅读

《Attention Is All You Need》Vaswani et al., 2017——注意力机制的原始论文。

#上下文窗口#token#注意力