主题
对比 JavaGuide《上下文工程》、《LLM 运行机制》 与二哥《什么是上下文窗口》《为什么上下文窗口不能无限大》《什么是上下文工程》《Agent 怎么避免上下文爆炸》,及小林《长上下文与 Lost in the Middle》《上下文工程》《会话状态》。
多版对比
窗口定义:JavaGuide 给了必须记住的公式——窗口 ≥ 输入 Token + 最大输出 Token,上下文窗口 ≠ 最大生成长度。二哥补了窗口里实际装着什么:系统提示、工具定义、历史对话、当前输入、模型回复五样,比喻是草稿纸,满了擦最早的。
为什么不能无限大:两边给出同一条因果链——注意力计算量随长度平方增长,显存按 KV Cache 线性堆。二哥的数字有体感(128K 到 1M 计算量约 60 倍、70B 模型 1M 窗口 KV Cache 要几百 GB),JavaGuide 补了 Softmax 注意力的结构性原因和「攻击面变大」。但二哥「1M 就是现在最大」「越长越差」说得绝对;JavaGuide 明确退化程度取决于模型、结构和任务,拒绝一刀切——这个谨慎口径更稳。
怎么失效:两边共识两个机制——Context Rot(越长每条信息利用率越低)和 Lost in the Middle(关键信息放开头结尾准、放中间掉,二哥引的实验是 75% vs 55%)。二哥独有「上下文四风险」:中毒、干扰、混淆、冲突,适合当答题的展开面。
Context Engineering 是什么:JavaGuide 引 Tobi Lutke 的定义「为任务补齐可解所需的全部上下文」,本质是 LLM 的内存管理(类比操作系统的页面置换);二哥引 Karpathy 的类比(LLM 是 CPU、窗口是内存、你是操作系统)和「Agent 80% 的失败源于信息供给不足而非模型不够聪明」(数字当观点用)。两边共同结论:Prompt 管这句话怎么说,Context 管该给模型看什么——PE 是 CE 的子集。
防爆炸手段(两边高度一致):工具输出截断、历史摘要压缩(Compaction)、Sub-agent 隔离(只回传千字级摘要)、按需加载。JavaGuide 补了工程闭环:先记录每轮上下文、建可回放基线、每次只改一个变量。
小林:给了这道题最锋利的概念手术——把「窗口」拆成三个数字:训练时见过的长度、接口窗口上限、有效上下文长度,第三个才对业务有意义,「装得下多少」不等于「稳定用得好多少」。方法上把「窗口多大」的争论转成评测问题:长度梯度 × 证据位置 × 干扰数量 × 任务类型的测试矩阵,产出「本任务输入不超过 40K 达标」这种结论;对策是「长素材、短上下文」——压缩在库外做,给模型的部分切小。上下文工程被定义为每次调用前的「运行时装配流程」,和记忆压缩明确切开(压缩只是预算不够时的手段之一);并提醒指令区与数据区必须隔离,网页里藏「忽略之前的要求」是间接注入入口。
结论:窗口公式用 JavaGuide,平方律和显存约束用二哥的数字,有效长度与评测矩阵采纳小林——它把「退化取决于模型」落成了可操作的方法。
最优题解
上下文窗口是一次调用能装的最大 Token 数,必须满足窗口 ≥ 输入 + 最大输出。它不能无限大有两条硬约束:注意力计算随长度平方涨,KV Cache 显存随长度线性堆;而且「放得进去 ≠ 用得好」——Context Rot 和 Lost in the Middle 决定了窗口越大、单条信息的利用率越低,关键信息要放两头。
所以上下文工程就是给 LLM 做内存管理:按「为任务补齐可解所需的全部上下文」来供给信息,缺了补、多了删。防爆炸四招——工具输出截断、历史摘要压缩、Sub-agent 隔离回传摘要、按需加载;判断信号是利用率长期在高位(六到七成)就该主动压缩。工程上先记录每轮上下文建可回放基线,改动一次只动一个变量,否则分不清是哪招起了作用。
追问链
追问:窗口 1M 了,RAG 还有必要吗? 参考答:有。窗口解决「装得下」,检索解决「找得准」——全量塞进去不仅成本按 Token 线性涨,利用率还随长度下降;RAG 是把窗口预算花在刀刃上的手段,长窗口和检索是互补不是替代。
追问:压缩(Compaction)会丢信息,怎么兜底? 参考答:分层保真——摘要保留决策和结论,关键原文(约束、失败记录)单独挂载不进摘要,重要规则写进系统提示从根上不参与压缩;压缩前留可回放的完整记录,出问题能回溯。
我的理解
这组题的核心记忆锚:窗口是内存,上下文工程是内存管理。答「为什么不能无限大」时给平方律 + KV 显存两条硬约束,答「怎么用」时给四招和压缩判断信号。特别注意别学二哥把「1M 最大」「越长越差」说死——「退化取决于模型和任务」这句谨慎话本身就是加分项。