长上下文的成本结构与「甜点区间」------从推理引擎的物理约束看 200K/256K/400K
摘要 :1M 上下文是当前大模型最具营销力、也最容易被误读的指标。本文不讨论「能不能支持 1M」,而是讨论一个更实质的问题:在真实推理成本与能力衰减的双重约束下,什么长度是高效工作的甜点区间。 文中全部数值来自笔者从零实现的纯 CPU 推理引擎 llmx(目标模型 Qwen3.6-35B-A3B,40 层、词表 248320、GGUF Q4_K_XL 量化),以及公开的注意力复杂度结论。核心论点是:解码器的成本由「每 token 必须搬运的字节数」决定,而这个字节数在权重项 上是常数、在上下文项上是线性的;当上下文进入 200K~400K 区间时,上下文项开始反超权重项,能力端则因注意力稀释与位置编码外推出现可测衰减。两者的交叉带,就是本文要分析的甜点区间。
#mermaid-svg-oyISVzouMPltR1KZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oyISVzouMPltR1KZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oyISVzouMPltR1KZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oyISVzouMPltR1KZ .error-icon{fill:#552222;}#mermaid-svg-oyISVzouMPltR1KZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oyISVzouMPltR1KZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oyISVzouMPltR1KZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oyISVzouMPltR1KZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oyISVzouMPltR1KZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oyISVzouMPltR1KZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oyISVzouMPltR1KZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oyISVzouMPltR1KZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oyISVzouMPltR1KZ .marker.cross{stroke:#333333;}#mermaid-svg-oyISVzouMPltR1KZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oyISVzouMPltR1KZ p{margin:0;}#mermaid-svg-oyISVzouMPltR1KZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oyISVzouMPltR1KZ .cluster-label text{fill:#333;}#mermaid-svg-oyISVzouMPltR1KZ .cluster-label span{color:#333;}#mermaid-svg-oyISVzouMPltR1KZ .cluster-label span p{background-color:transparent;}#mermaid-svg-oyISVzouMPltR1KZ .label text,#mermaid-svg-oyISVzouMPltR1KZ span{fill:#333;color:#333;}#mermaid-svg-oyISVzouMPltR1KZ .node rect,#mermaid-svg-oyISVzouMPltR1KZ .node circle,#mermaid-svg-oyISVzouMPltR1KZ .node ellipse,#mermaid-svg-oyISVzouMPltR1KZ .node polygon,#mermaid-svg-oyISVzouMPltR1KZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oyISVzouMPltR1KZ .rough-node .label text,#mermaid-svg-oyISVzouMPltR1KZ .node .label text,#mermaid-svg-oyISVzouMPltR1KZ .image-shape .label,#mermaid-svg-oyISVzouMPltR1KZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-oyISVzouMPltR1KZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oyISVzouMPltR1KZ .rough-node .label,#mermaid-svg-oyISVzouMPltR1KZ .node .label,#mermaid-svg-oyISVzouMPltR1KZ .image-shape .label,#mermaid-svg-oyISVzouMPltR1KZ .icon-shape .label{text-align:center;}#mermaid-svg-oyISVzouMPltR1KZ .node.clickable{cursor:pointer;}#mermaid-svg-oyISVzouMPltR1KZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oyISVzouMPltR1KZ .arrowheadPath{fill:#333333;}#mermaid-svg-oyISVzouMPltR1KZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oyISVzouMPltR1KZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oyISVzouMPltR1KZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oyISVzouMPltR1KZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oyISVzouMPltR1KZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oyISVzouMPltR1KZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oyISVzouMPltR1KZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oyISVzouMPltR1KZ .cluster text{fill:#333;}#mermaid-svg-oyISVzouMPltR1KZ .cluster span{color:#333;}#mermaid-svg-oyISVzouMPltR1KZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oyISVzouMPltR1KZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oyISVzouMPltR1KZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-oyISVzouMPltR1KZ .icon-shape,#mermaid-svg-oyISVzouMPltR1KZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oyISVzouMPltR1KZ .icon-shape p,#mermaid-svg-oyISVzouMPltR1KZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oyISVzouMPltR1KZ .icon-shape .label rect,#mermaid-svg-oyISVzouMPltR1KZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oyISVzouMPltR1KZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oyISVzouMPltR1KZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oyISVzouMPltR1KZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 能力侧------随长度衰减
成本侧------每 token 搬运字节
权重项 W = 2.74GB(常数)
上下文项 K ∝ L:KV 读取随长度线性增长
注意力稀释:softmax 摊薄到 1/L
RoPE 外推:超出训练频率覆盖
记忆压实:线性注意力状态 O(1) 信息瓶颈
总带宽成本 = W + K
质量 = f(长度)
甜点区间 200K~400K
成本可接受 ∩ 能力未崩
一、问题提出:1M 上下文是「能力」还是「广告」
过去两年,各家在上下文窗口上持续军备竞赛:128K → 256K → 1M → 甚至 10M。厂商的表述通常是「支持 1M 上下文」,但工程上这是两个完全不同的命题:
- 命题 A(训练/发布窗口):模型在训练时就见过这么长的样本,或通过位置编码外推宣称支持该长度;
- 命题 B(可用窗口):在该长度下,推理延迟、显存/内存占用、每 token 成本仍然可接受,且检索质量不显著劣化。
客观地说,很多「1M 支持」落在命题 A。真正把 1M 当作日常计算预算的部署是极少数,因为每一代 token 的推理都必须「回顾」整个 1M 上下文------这部分成本不因模型变聪明而消失,它写在内存带宽的物理公式里。
本文要回答的问题是:既然模型标称支持 1M,为什么把会话工作区裁剪在 200000 / 204800 / 256000 / 262144 / 400000 这几个值上,是工程上更优的选择? 我们分别从「成本」(第三章、第五章)与「原理」(第六章、第七章)两条线展开,最后收敛到甜点区间的定量判定。
二、推理成本的物理模型:带宽决定一切
在进入具体数字之前,需要先建立正确的成本坐标系。推理(inference)不等于训练(training)。训练是计算密集型问题,FLOPs 决定成本;但自回归解码是内存带宽密集型问题,每生成一个 token,必须把相关的权重字节从内存搬到寄存器,乘完即弃。
这一点的实证来自 llmx 的三组实测:
- 权重搬运量 :Qwen3.6-35B-A3B 每个 token 解码,需要读取的权重约为 2.74GB (投影类 2138MB + 专家类 604MB;来源:
docs/09-性能优化旅程.md,gguf 精确核算)。 - 内存带宽 :GEMV 内核实测 39~42.6 GB/s(16 核 AVX-512,DDR5 双通道实际 60-70GB/s 的 65-70%)。
- 物理天花板 :2.74GB / 42.6GB/s ≈ 64ms/token → 16 tok/s。这是纯 CPU 单序列的物理上限,与算力无关------实测稳定在 3.5~6.5 tok/s(系统负载下的真实可用值)。
#mermaid-svg-nnJll9lIvILtJUzK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nnJll9lIvILtJUzK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nnJll9lIvILtJUzK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nnJll9lIvILtJUzK .error-icon{fill:#552222;}#mermaid-svg-nnJll9lIvILtJUzK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nnJll9lIvILtJUzK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nnJll9lIvILtJUzK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nnJll9lIvILtJUzK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nnJll9lIvILtJUzK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nnJll9lIvILtJUzK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nnJll9lIvILtJUzK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nnJll9lIvILtJUzK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nnJll9lIvILtJUzK .marker.cross{stroke:#333333;}#mermaid-svg-nnJll9lIvILtJUzK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nnJll9lIvILtJUzK p{margin:0;}#mermaid-svg-nnJll9lIvILtJUzK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 每 token 解码的权重读取时间(llmx 实测:2.74GB @ 42.6GB/s) 权重读取 7065605550454035302520151050 毫秒/token
上面的数恒常存在------无论上下文多短 ,只要模型是这 35B 参数,每 token 就得搬完这 2.74GB。于是立刻可以得到一个推论:任何「上下文越长越快/一样快」的说法都不成立,因为权重项不动,上下文项还在往上加。
#mermaid-svg-4AZYdo9mbv7fleFI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4AZYdo9mbv7fleFI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4AZYdo9mbv7fleFI .error-icon{fill:#552222;}#mermaid-svg-4AZYdo9mbv7fleFI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4AZYdo9mbv7fleFI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4AZYdo9mbv7fleFI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4AZYdo9mbv7fleFI .marker.cross{stroke:#333333;}#mermaid-svg-4AZYdo9mbv7fleFI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4AZYdo9mbv7fleFI p{margin:0;}#mermaid-svg-4AZYdo9mbv7fleFI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4AZYdo9mbv7fleFI .cluster-label text{fill:#333;}#mermaid-svg-4AZYdo9mbv7fleFI .cluster-label span{color:#333;}#mermaid-svg-4AZYdo9mbv7fleFI .cluster-label span p{background-color:transparent;}#mermaid-svg-4AZYdo9mbv7fleFI .label text,#mermaid-svg-4AZYdo9mbv7fleFI span{fill:#333;color:#333;}#mermaid-svg-4AZYdo9mbv7fleFI .node rect,#mermaid-svg-4AZYdo9mbv7fleFI .node circle,#mermaid-svg-4AZYdo9mbv7fleFI .node ellipse,#mermaid-svg-4AZYdo9mbv7fleFI .node polygon,#mermaid-svg-4AZYdo9mbv7fleFI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4AZYdo9mbv7fleFI .rough-node .label text,#mermaid-svg-4AZYdo9mbv7fleFI .node .label text,#mermaid-svg-4AZYdo9mbv7fleFI .image-shape .label,#mermaid-svg-4AZYdo9mbv7fleFI .icon-shape .label{text-anchor:middle;}#mermaid-svg-4AZYdo9mbv7fleFI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4AZYdo9mbv7fleFI .rough-node .label,#mermaid-svg-4AZYdo9mbv7fleFI .node .label,#mermaid-svg-4AZYdo9mbv7fleFI .image-shape .label,#mermaid-svg-4AZYdo9mbv7fleFI .icon-shape .label{text-align:center;}#mermaid-svg-4AZYdo9mbv7fleFI .node.clickable{cursor:pointer;}#mermaid-svg-4AZYdo9mbv7fleFI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4AZYdo9mbv7fleFI .arrowheadPath{fill:#333333;}#mermaid-svg-4AZYdo9mbv7fleFI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4AZYdo9mbv7fleFI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4AZYdo9mbv7fleFI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4AZYdo9mbv7fleFI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4AZYdo9mbv7fleFI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4AZYdo9mbv7fleFI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4AZYdo9mbv7fleFI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4AZYdo9mbv7fleFI .cluster text{fill:#333;}#mermaid-svg-4AZYdo9mbv7fleFI .cluster span{color:#333;}#mermaid-svg-4AZYdo9mbv7fleFI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4AZYdo9mbv7fleFI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4AZYdo9mbv7fleFI rect.text{fill:none;stroke-width:0;}#mermaid-svg-4AZYdo9mbv7fleFI .icon-shape,#mermaid-svg-4AZYdo9mbv7fleFI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4AZYdo9mbv7fleFI .icon-shape p,#mermaid-svg-4AZYdo9mbv7fleFI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4AZYdo9mbv7fleFI .icon-shape .label rect,#mermaid-svg-4AZYdo9mbv7fleFI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4AZYdo9mbv7fleFI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4AZYdo9mbv7fleFI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4AZYdo9mbv7fleFI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 单 token 解码路径------llmx
嵌入列读取
40 层串行
GQA 注意力
读取全部历史 KV
DeltaNet 状态
读取 O(1) 状态 S
GQA 层读 KV:K(L)
MoE 8 专家 + 1 共享
LM head logits
权重字节:每 token 2.74GB(常数)
KV 字节:每 token 随长度 L 线性增长
三、注意力:上下文成本从哪来
普通解码器(Transformer decoder)的每一层注意力,都有一个致命的结构:它要把当前 token 的查询 Q 与历史所有位置的键 K、值 V 做点积和加权和。这决定了:
- KV 缓存必须随上下文线性增长:存下所有历史位置的键值;
- 每个新 token 的计算、读取都要线性"回顾"全部历史。
3.1 普通注意力(MHA / GQA)
设 KV 头数为 hkh_khk,头维度为 dhd_hdh,层数为 nln_lnl,上下文长度为 LLL。KV 缓存的字节数为:
KV 字节数=nl×hk×L×dh×2 (K与V)×每元素字节 \text{KV 字节数} = n_l \times h_k \times L \times d_h \times 2 \ (\text{K与V}) \times \text{每元素字节} KV 字节数=nl×hk×L×dh×2 (K与V)×每元素字节
以 Qwen3.6-35B-A3B 的架构参数(模型配置摘自 llmx src/模型/模型配置.cpp):10 个全注意力层(40 层中每 4 层 1 个)、KV 头数 2、头维度 256。代入上式:
KV 字节数=10×2×L×256×2×4 bytes=L×40,960 bytes\text{KV 字节数} = 10 \times 2 \times L \times 256 \times 2 \times 4\ \text{bytes} = L \times 40{,}960\ \text{bytes}KV 字节数=10×2×L×256×2×4 bytes=L×40,960 bytes
#mermaid-svg-I1RaFPJ8QDOSTjRX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-I1RaFPJ8QDOSTjRX .error-icon{fill:#552222;}#mermaid-svg-I1RaFPJ8QDOSTjRX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-I1RaFPJ8QDOSTjRX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .marker.cross{stroke:#333333;}#mermaid-svg-I1RaFPJ8QDOSTjRX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-I1RaFPJ8QDOSTjRX p{margin:0;}#mermaid-svg-I1RaFPJ8QDOSTjRX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster-label text{fill:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster-label span{color:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster-label span p{background-color:transparent;}#mermaid-svg-I1RaFPJ8QDOSTjRX .label text,#mermaid-svg-I1RaFPJ8QDOSTjRX span{fill:#333;color:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .node rect,#mermaid-svg-I1RaFPJ8QDOSTjRX .node circle,#mermaid-svg-I1RaFPJ8QDOSTjRX .node ellipse,#mermaid-svg-I1RaFPJ8QDOSTjRX .node polygon,#mermaid-svg-I1RaFPJ8QDOSTjRX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .rough-node .label text,#mermaid-svg-I1RaFPJ8QDOSTjRX .node .label text,#mermaid-svg-I1RaFPJ8QDOSTjRX .image-shape .label,#mermaid-svg-I1RaFPJ8QDOSTjRX .icon-shape .label{text-anchor:middle;}#mermaid-svg-I1RaFPJ8QDOSTjRX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .rough-node .label,#mermaid-svg-I1RaFPJ8QDOSTjRX .node .label,#mermaid-svg-I1RaFPJ8QDOSTjRX .image-shape .label,#mermaid-svg-I1RaFPJ8QDOSTjRX .icon-shape .label{text-align:center;}#mermaid-svg-I1RaFPJ8QDOSTjRX .node.clickable{cursor:pointer;}#mermaid-svg-I1RaFPJ8QDOSTjRX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .arrowheadPath{fill:#333333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I1RaFPJ8QDOSTjRX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-I1RaFPJ8QDOSTjRX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I1RaFPJ8QDOSTjRX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster text{fill:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX .cluster span{color:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-I1RaFPJ8QDOSTjRX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-I1RaFPJ8QDOSTjRX rect.text{fill:none;stroke-width:0;}#mermaid-svg-I1RaFPJ8QDOSTjRX .icon-shape,#mermaid-svg-I1RaFPJ8QDOSTjRX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I1RaFPJ8QDOSTjRX .icon-shape p,#mermaid-svg-I1RaFPJ8QDOSTjRX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-I1RaFPJ8QDOSTjRX .icon-shape .label rect,#mermaid-svg-I1RaFPJ8QDOSTjRX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I1RaFPJ8QDOSTjRX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-I1RaFPJ8QDOSTjRX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-I1RaFPJ8QDOSTjRX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模型架构关键参数------llmx 模型配置.cpp
层数 40(10 全注意力 + 30 DeltaNet)
Q 头 16 / KV 头 2(GQA 8:1)
头维度 256
隐藏维 2048
上下文窗口 262144(= 2^18)
RoPE 频率基数 10^7
专家 256 / 激活 8 + 共享 1
GGUF 元数据解析
上下文长度 262144
于是可以画出一条随长度线性上升的 KV 内存曲线:
#mermaid-svg-Uk2NmqQ08ef55ySv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Uk2NmqQ08ef55ySv .error-icon{fill:#552222;}#mermaid-svg-Uk2NmqQ08ef55ySv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Uk2NmqQ08ef55ySv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Uk2NmqQ08ef55ySv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Uk2NmqQ08ef55ySv .marker.cross{stroke:#333333;}#mermaid-svg-Uk2NmqQ08ef55ySv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Uk2NmqQ08ef55ySv p{margin:0;}#mermaid-svg-Uk2NmqQ08ef55ySv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全注意力层的 KV 缓存体积(10 层 GQA,f32) 02000002560004000001000000 454035302520151050 GB
在不同甜点候选长度下的具体数值:
| 上下文 L(token) | 二进制/十六进制含义 | KV 体积(十进制 GB) | KV 体积(GiB) |
|---|---|---|---|
| 200000 | 200 × 1000 | 8.19 | 7.63 |
| 204800 | 200 × 1024 | 8.39 | 7.81 |
| 256000 | 256 × 1000 | 10.49 | 9.77 |
| 262144 | 256 × 1024 = 2^18 | 10.74 | 10.00 |
| 400000 | 400 × 1000 | 16.38 | 15.26 |
| 1000000 | 1M | 40.96 | 38.15 |
(计算式:10 × 2 × L × 256 × 2 × 4 bytes,即每 token 40,960 字节。)
这是纯 f32 的 KV。工程上常用 fp16 或 8-bit KV 量化把它再砍半甚至砍到 1/4,但线性增长的形状不变------砍掉的是常数因子,不是长度因子。
3.2 线性注意力:O(1) 状态的代价与收益
Qwen3.6 的 40 层里只有 10 层是全注意力,其余 30 层是 Gated DeltaNet ------一种带门控的线性 RNN,用固定大小的状态矩阵 S∈R128×128S \in \mathbb{R}^{128\times128}S∈R128×128 编码历史,状态体积与上下文长度无关:
DeltaNet 状态=32 头×1282 每头=524,288 浮点数/层≈2MB\text{DeltaNet 状态} = 32\ \text{头} \times 128^2\ \text{每头} = 524{,}288\ \text{浮点数/层} \approx 2\text{MB}DeltaNet 状态=32 头×1282 每头=524,288 浮点数/层≈2MB
30 层合计约 60MB------与 262K 上下文下 GQA 的 10.74GB 相比,几乎为零。
#mermaid-svg-dL5hPPjvOf1jdnaq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dL5hPPjvOf1jdnaq .error-icon{fill:#552222;}#mermaid-svg-dL5hPPjvOf1jdnaq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dL5hPPjvOf1jdnaq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dL5hPPjvOf1jdnaq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dL5hPPjvOf1jdnaq .marker.cross{stroke:#333333;}#mermaid-svg-dL5hPPjvOf1jdnaq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dL5hPPjvOf1jdnaq p{margin:0;}#mermaid-svg-dL5hPPjvOf1jdnaq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster-label text{fill:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster-label span{color:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster-label span p{background-color:transparent;}#mermaid-svg-dL5hPPjvOf1jdnaq .label text,#mermaid-svg-dL5hPPjvOf1jdnaq span{fill:#333;color:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq .node rect,#mermaid-svg-dL5hPPjvOf1jdnaq .node circle,#mermaid-svg-dL5hPPjvOf1jdnaq .node ellipse,#mermaid-svg-dL5hPPjvOf1jdnaq .node polygon,#mermaid-svg-dL5hPPjvOf1jdnaq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dL5hPPjvOf1jdnaq .rough-node .label text,#mermaid-svg-dL5hPPjvOf1jdnaq .node .label text,#mermaid-svg-dL5hPPjvOf1jdnaq .image-shape .label,#mermaid-svg-dL5hPPjvOf1jdnaq .icon-shape .label{text-anchor:middle;}#mermaid-svg-dL5hPPjvOf1jdnaq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dL5hPPjvOf1jdnaq .rough-node .label,#mermaid-svg-dL5hPPjvOf1jdnaq .node .label,#mermaid-svg-dL5hPPjvOf1jdnaq .image-shape .label,#mermaid-svg-dL5hPPjvOf1jdnaq .icon-shape .label{text-align:center;}#mermaid-svg-dL5hPPjvOf1jdnaq .node.clickable{cursor:pointer;}#mermaid-svg-dL5hPPjvOf1jdnaq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dL5hPPjvOf1jdnaq .arrowheadPath{fill:#333333;}#mermaid-svg-dL5hPPjvOf1jdnaq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dL5hPPjvOf1jdnaq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dL5hPPjvOf1jdnaq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dL5hPPjvOf1jdnaq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dL5hPPjvOf1jdnaq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dL5hPPjvOf1jdnaq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster text{fill:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq .cluster span{color:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dL5hPPjvOf1jdnaq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dL5hPPjvOf1jdnaq rect.text{fill:none;stroke-width:0;}#mermaid-svg-dL5hPPjvOf1jdnaq .icon-shape,#mermaid-svg-dL5hPPjvOf1jdnaq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dL5hPPjvOf1jdnaq .icon-shape p,#mermaid-svg-dL5hPPjvOf1jdnaq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dL5hPPjvOf1jdnaq .icon-shape .label rect,#mermaid-svg-dL5hPPjvOf1jdnaq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dL5hPPjvOf1jdnaq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dL5hPPjvOf1jdnaq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dL5hPPjvOf1jdnaq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 与全注意力的空间对比------262144 上下文
GQA 10 层:10.74GB KV
DeltaNet 30 层:60MB 状态
Gated DeltaNet 单 token 递推------llmx DeltaNet朴素.cpp
S' = S·e^g(遗忘门)
δ = (v − S·k)·β(误差×写入门)
S += k⊗δ(外积写入)
o = S·q / √d(读取)
但 O(1) 空间不是免费的 。30 层把「完整历史」压缩进一个固定大小的矩阵,可编码的信息总量有上限(矩阵容量 + 逐层衰减)。这正是 Qwen3.6 只让 30/40 层用线性注意力的原因------用便宜的层省成本,用昂贵的层保精确的长程依赖。这个架构本身就在告诉我们厂家的取舍:他们相信「大多数层不需要精确回顾全部历史,只有少数层需要」。
这一点与本文的主题直接相关:线性注意力把长上下文的成本从「线性增长」压到了「常数 + 少量层线性」,但能力端的损失(信息压缩、位置精确回忆弱于全注意力)是结构性的。所以上下文也不是越长越好------它越长,就越依赖那 25% 的全注意力层去补救,而补救本身又回到线性成本。
#mermaid-svg-zAfksvYyXLOu6PE1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zAfksvYyXLOu6PE1 .error-icon{fill:#552222;}#mermaid-svg-zAfksvYyXLOu6PE1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zAfksvYyXLOu6PE1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zAfksvYyXLOu6PE1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zAfksvYyXLOu6PE1 .marker.cross{stroke:#333333;}#mermaid-svg-zAfksvYyXLOu6PE1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zAfksvYyXLOu6PE1 p{margin:0;}#mermaid-svg-zAfksvYyXLOu6PE1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster-label text{fill:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster-label span{color:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster-label span p{background-color:transparent;}#mermaid-svg-zAfksvYyXLOu6PE1 .label text,#mermaid-svg-zAfksvYyXLOu6PE1 span{fill:#333;color:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 .node rect,#mermaid-svg-zAfksvYyXLOu6PE1 .node circle,#mermaid-svg-zAfksvYyXLOu6PE1 .node ellipse,#mermaid-svg-zAfksvYyXLOu6PE1 .node polygon,#mermaid-svg-zAfksvYyXLOu6PE1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zAfksvYyXLOu6PE1 .rough-node .label text,#mermaid-svg-zAfksvYyXLOu6PE1 .node .label text,#mermaid-svg-zAfksvYyXLOu6PE1 .image-shape .label,#mermaid-svg-zAfksvYyXLOu6PE1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zAfksvYyXLOu6PE1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zAfksvYyXLOu6PE1 .rough-node .label,#mermaid-svg-zAfksvYyXLOu6PE1 .node .label,#mermaid-svg-zAfksvYyXLOu6PE1 .image-shape .label,#mermaid-svg-zAfksvYyXLOu6PE1 .icon-shape .label{text-align:center;}#mermaid-svg-zAfksvYyXLOu6PE1 .node.clickable{cursor:pointer;}#mermaid-svg-zAfksvYyXLOu6PE1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zAfksvYyXLOu6PE1 .arrowheadPath{fill:#333333;}#mermaid-svg-zAfksvYyXLOu6PE1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zAfksvYyXLOu6PE1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zAfksvYyXLOu6PE1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zAfksvYyXLOu6PE1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zAfksvYyXLOu6PE1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zAfksvYyXLOu6PE1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster text{fill:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 .cluster span{color:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zAfksvYyXLOu6PE1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zAfksvYyXLOu6PE1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zAfksvYyXLOu6PE1 .icon-shape,#mermaid-svg-zAfksvYyXLOu6PE1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zAfksvYyXLOu6PE1 .icon-shape p,#mermaid-svg-zAfksvYyXLOu6PE1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zAfksvYyXLOu6PE1 .icon-shape .label rect,#mermaid-svg-zAfksvYyXLOu6PE1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zAfksvYyXLOu6PE1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zAfksvYyXLOu6PE1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zAfksvYyXLOu6PE1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 40 层注意力分布------qwen35moe
DeltaNet ❘GQA❘ DeltaNet ❘ DeltaNet ❘ GQA ...
每 4 层 1 个 GQA(即 full_attention_interval = 4)
模型配置.cpp full_attention_interval 字段
四、解码时的真实读取量:权重项 vs 上下文项
上面 3.1 算出的是「KV 缓存占多少内存」。但内存占用还不等于每 token 的带宽成本------解码时注意力要对每一个历史位置读一遍 K 和 V。于是每生成一个 token:
每 token 读取字节=W (权重项,常数)⏟≈2.74GB+L×40,960 B (上下文项,线性)⏟全部 GQA 层的 K+V\text{每 token 读取字节} = \underbrace{W\ (\text{权重项,常数})}{\approx 2.74\text{GB}} + \underbrace{L \times 40{,}960\ \text{B}\ (\text{上下文项,线性})}{\text{全部 GQA 层的 K+V}}每 token 读取字节=≈2.74GB W (权重项,常数)+全部 GQA 层的 K+V L×40,960 B (上下文项,线性)
#mermaid-svg-fIE4d19u7NCzLDCe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fIE4d19u7NCzLDCe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fIE4d19u7NCzLDCe .error-icon{fill:#552222;}#mermaid-svg-fIE4d19u7NCzLDCe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fIE4d19u7NCzLDCe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fIE4d19u7NCzLDCe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fIE4d19u7NCzLDCe .marker.cross{stroke:#333333;}#mermaid-svg-fIE4d19u7NCzLDCe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fIE4d19u7NCzLDCe p{margin:0;}#mermaid-svg-fIE4d19u7NCzLDCe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 每 token 读取量(权重项 + GQA KV 项) 0200000256000400000 20181614121086420 GB/token
转折点一目了然:当上下文超过 ~66K 时,GQA 的 KV 读取量就开始反超权重项;到 256K,KV 读取(10.74GB)已是权重(2.74GB)的近 4 倍;到 400K,KV 读取 16.38GB 是权重的 6 倍。
这意味着什么?在长上下文下,「回顾历史」的带宽开销取代「读权重」成为主导成本。 对于纯 CPU 推理引擎(带宽 42.6GB/s),仅 GQA 层在读 KV 这一项上,每个 token 就要:
- 256K:10.74GB / 42.6GB/s ≈ 252ms
- 400K:16.38GB / 42.6GB/s ≈ 385ms
- 1M:40.96GB / 42.6GB/s ≈ 962ms
而这还没有算权重本身的 64ms。换句话说:让单序列纯 CPU 推理在 1M 上下文下工作,每 token 光读历史就要近 1 秒------这就是「支持 1M」和「能用 1M」之间最朴素、最不可绕过的差距。
对于 GPU 推理,带宽更高(H 系列 ~3TB/s),但同样存在 KV 读取 + 显存容量两个瓶颈:1M 上下文的 f32 KV(40.96GB)就已经超过大部分消费级显卡的显存,更不用说 KV 量化后的精度损失,「满血 1M」往往要在精度与容量之间二选一。
#mermaid-svg-F0lLr9p9n8RYgnWe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-F0lLr9p9n8RYgnWe .error-icon{fill:#552222;}#mermaid-svg-F0lLr9p9n8RYgnWe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-F0lLr9p9n8RYgnWe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-F0lLr9p9n8RYgnWe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-F0lLr9p9n8RYgnWe .marker.cross{stroke:#333333;}#mermaid-svg-F0lLr9p9n8RYgnWe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-F0lLr9p9n8RYgnWe p{margin:0;}#mermaid-svg-F0lLr9p9n8RYgnWe .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-F0lLr9p9n8RYgnWe .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-F0lLr9p9n8RYgnWe .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-F0lLr9p9n8RYgnWe .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-F0lLr9p9n8RYgnWe .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-F0lLr9p9n8RYgnWe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 80%20%256K 上下文下每 token 读取分解 权重 2.74GB GQA KV 读取 10.74GB
五、成本侧判定:甜点候选长度的性价比
5.1 内存/显存适配性
把候选长度放进内存视角。Qwen3.6-35B-A3B 的量化模型本体(Q4_K_XL)约 22.4GB,f32 KV 在上面已经算过。若限定「模型 + KV 不超过本机物理内存 / 显存预算」,则:
- 200000/204800:KV 8.2-8.4GB,总量 ≈ 30.6GB------普通的 32GB 内存机器勉强能带;
- 256000/262144:KV 10.5-10.7GB,总量 ≈ 33GB------需要 32GB+ 或 KV 量化;
- 400000:KV 16.4GB,总量 ≈ 38.8GB------大内存机器或 KV 量化;
- 1M :KV 41GB,总量 ≈ 63GB------已超出单通道常规桌面内存,KV 8-bit 量化后仍 ≈ 32.7GB,代价是精度与速度。
这解释了为什么实践里 200K/256K 是最常见的「默认档」:它们让模型本体与 KV 同时放进主流内存预算,而不必为 KV 牺牲量化精度。
5.2 经济账:token 计费是线性的
API 场景下,每一轮请求的账单大致是:
成本≈Pin×输入 token 数+Pout×输出 token 数\text{成本} \approx P_{\text{in}} \times \text{输入 token 数} + P_{\text{out}} \times \text{输出 token 数}成本≈Pin×输入 token 数+Pout×输出 token 数
其中输入 token 数就是会话累计上下文。上下文裁剪到甜点区间,直接按比例砍掉输入成本。 例如把会话从 400K 砍到 256K,仅输入计费项就省约 36%;从 1M 砍到 256K,省约 74%。对于运行中的长任务,上下文每轮都在膨胀,这个系数是逐轮复利的:
#mermaid-svg-fulrbgsdYuGnnL6t{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fulrbgsdYuGnnL6t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fulrbgsdYuGnnL6t .error-icon{fill:#552222;}#mermaid-svg-fulrbgsdYuGnnL6t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fulrbgsdYuGnnL6t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fulrbgsdYuGnnL6t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fulrbgsdYuGnnL6t .marker.cross{stroke:#333333;}#mermaid-svg-fulrbgsdYuGnnL6t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fulrbgsdYuGnnL6t p{margin:0;}#mermaid-svg-fulrbgsdYuGnnL6t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fulrbgsdYuGnnL6t .cluster-label text{fill:#333;}#mermaid-svg-fulrbgsdYuGnnL6t .cluster-label span{color:#333;}#mermaid-svg-fulrbgsdYuGnnL6t .cluster-label span p{background-color:transparent;}#mermaid-svg-fulrbgsdYuGnnL6t .label text,#mermaid-svg-fulrbgsdYuGnnL6t span{fill:#333;color:#333;}#mermaid-svg-fulrbgsdYuGnnL6t .node rect,#mermaid-svg-fulrbgsdYuGnnL6t .node circle,#mermaid-svg-fulrbgsdYuGnnL6t .node ellipse,#mermaid-svg-fulrbgsdYuGnnL6t .node polygon,#mermaid-svg-fulrbgsdYuGnnL6t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fulrbgsdYuGnnL6t .rough-node .label text,#mermaid-svg-fulrbgsdYuGnnL6t .node .label text,#mermaid-svg-fulrbgsdYuGnnL6t .image-shape .label,#mermaid-svg-fulrbgsdYuGnnL6t .icon-shape .label{text-anchor:middle;}#mermaid-svg-fulrbgsdYuGnnL6t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fulrbgsdYuGnnL6t .rough-node .label,#mermaid-svg-fulrbgsdYuGnnL6t .node .label,#mermaid-svg-fulrbgsdYuGnnL6t .image-shape .label,#mermaid-svg-fulrbgsdYuGnnL6t .icon-shape .label{text-align:center;}#mermaid-svg-fulrbgsdYuGnnL6t .node.clickable{cursor:pointer;}#mermaid-svg-fulrbgsdYuGnnL6t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fulrbgsdYuGnnL6t .arrowheadPath{fill:#333333;}#mermaid-svg-fulrbgsdYuGnnL6t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fulrbgsdYuGnnL6t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fulrbgsdYuGnnL6t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fulrbgsdYuGnnL6t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fulrbgsdYuGnnL6t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fulrbgsdYuGnnL6t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fulrbgsdYuGnnL6t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fulrbgsdYuGnnL6t .cluster text{fill:#333;}#mermaid-svg-fulrbgsdYuGnnL6t .cluster span{color:#333;}#mermaid-svg-fulrbgsdYuGnnL6t div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fulrbgsdYuGnnL6t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fulrbgsdYuGnnL6t rect.text{fill:none;stroke-width:0;}#mermaid-svg-fulrbgsdYuGnnL6t .icon-shape,#mermaid-svg-fulrbgsdYuGnnL6t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fulrbgsdYuGnnL6t .icon-shape p,#mermaid-svg-fulrbgsdYuGnnL6t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fulrbgsdYuGnnL6t .icon-shape .label rect,#mermaid-svg-fulrbgsdYuGnnL6t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fulrbgsdYuGnnL6t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fulrbgsdYuGnnL6t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fulrbgsdYuGnnL6t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 长任务多轮成本复利
轮 1:上下文 L1,计费 L1
轮 2:上下文 L1+Δ,计费 L1+Δ
轮 N:上下文 L1+NΔ
累计成本 ∝ Σ(L1+iΔ) ∝ N·(L1+NΔ/2)
随上下文上限二次方增长
甜点区间的作用,是把这条二次曲线的拐点按在 200K~400K 之间------在能力足够覆盖绝大多数任务的前提下,把爆炸式增长的账单压住。
5.3 成本侧小结
| 候选长度 | 主要成本特征 | 适配硬件画像 |
|---|---|---|
| 200000 | KV 8.2GB;带宽充足;输入成本最低 | 16-32GB 内存/显存 |
| 204800 | 同上(二进制对齐) | 同上 |
| 256000 | KV 10.5GB;带宽可控;覆盖绝大部分长文档/代码库 | 32GB 内存/24GB 显存 |
| 262144 | 模型原生训练窗口(2^18);KV 10.7GB | 32GB+;无需 RoPE 外推 |
| 400000 | KV 16.4GB;带宽明显紧张;输入成本较高 | 大内存 + KV 量化 |
五之补、从 llmx 实测看「钱的去向」:成本不是均匀的
讨论甜点区间之前,值得看一眼 llmx 引擎对单 token 成本的实测分解------它揭示了一个重要事实:推理成本从来不是均匀摊在每一层上,而是被少数几类算子主导。
llmx 在 docs/09-性能优化旅程.md 里记录了完整的计时分解(系统负载 67% 下的实测):
分支 60ms(投影 29 + DeltaNet 状态 14 + GQA 注意力 16)+ MoE 52ms(专家 33 + 共享 17)= 112ms/40 层
#mermaid-svg-3uDS5xGl1NQ5ov6l{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3uDS5xGl1NQ5ov6l .error-icon{fill:#552222;}#mermaid-svg-3uDS5xGl1NQ5ov6l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3uDS5xGl1NQ5ov6l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3uDS5xGl1NQ5ov6l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3uDS5xGl1NQ5ov6l .marker.cross{stroke:#333333;}#mermaid-svg-3uDS5xGl1NQ5ov6l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3uDS5xGl1NQ5ov6l p{margin:0;}#mermaid-svg-3uDS5xGl1NQ5ov6l .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-3uDS5xGl1NQ5ov6l .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-3uDS5xGl1NQ5ov6l .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-3uDS5xGl1NQ5ov6l .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-3uDS5xGl1NQ5ov6l .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-3uDS5xGl1NQ5ov6l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 30%26%15%14%12%3%单 token 前向 112ms 的实测去向(llmx) 投影 29ms DeltaNet 状态 14ms GQA 注意力 16ms MoE 专家 33ms MoE 共享专家 17ms 其他
逐项解读:
- MoE 的 256 选 8 + 1 共享专家合计占了单 token 时间的 45% ------模型的 35B 参数中只有 3B 激活,但专家的读取是不规则随机访问(每 token 路由到不同专家),TLB/缓存命中率低。llmx 实测:随机专家的 GEMV 每层 6.56ms,而连续专家仅 0.42ms------15 倍差距 来自缓存命中率 0% vs 100%。这印证了:稀疏 MoE 把「参数容量」换成了「随机访存的成本」。
- GQA 注意力本身(16ms/10 层)并不是瓶颈 ------因为 llmx 的 GQA 是向内核对拍过的逐位置实现(
GQA注意力朴素.cpp),短上下文下它只占 14%。但注意:这 16ms 是短上下文下的数字。 上下文一长,GQA 层的成本从「每 token 16ms」随 L 线性上升,而其他三块(投影、DeltaNet、MoE)基本不动。
#mermaid-svg-Ls9y3RcAvIBe0ove{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ls9y3RcAvIBe0ove .error-icon{fill:#552222;}#mermaid-svg-Ls9y3RcAvIBe0ove .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ls9y3RcAvIBe0ove .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ls9y3RcAvIBe0ove .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ls9y3RcAvIBe0ove .marker.cross{stroke:#333333;}#mermaid-svg-Ls9y3RcAvIBe0ove svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ls9y3RcAvIBe0ove p{margin:0;}#mermaid-svg-Ls9y3RcAvIBe0ove :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 四类成本随上下文的增长(示意------基于 llmx 实测分解) 0200K256K400K 300280260240220200180160140120100806040200 ms/token
- 投影与 MoE 是「常数项」 ,与上下文无关;GQA 注意力是「可变项」,随 L 线性增长;DeltaNet 状态是「亚线性项」(固定矩阵,仅随状态更新渐变)。
这个分解定性地改变了甜点区间的理解方式 :真正该问的问题不是「多长的上下文模型支持」,而是「在全注意力层上,多长的上下文是每一层都值得回顾的」。当 L 增大,钱主要流向 GQA 那 10 层的逐位置读取;当 L 超过某个值,这 10 层就成为整个引擎的成本主体------甜点区间恰恰是把这部分「付给注意力回顾」的钱,控制在合理预算内的长度带。
对部署方同样有启发:只要把上下文的「可变项」压到甜点内,剩下的「常数项」(MoE 专家、投影、DeltaNet)就是规模效应的主场 ------多序列共享权重、批处理、GPU 卸载都在这块常数项上做文章(llmx 的批量 GEMV B=4 实测 3.24 倍提速正是带宽受限的常数项上兑现的)。换句话说:甜点区间是「常数项优化」成立的前提------没有它,可变项会先吞掉全部优化收益。
六、原理侧判定:长上下文的四种能力衰减
成本解释了「贵」,能力解释了「为什么不值」。四种效应在长上下文下可测量地劣化:
6.1 注意力稀释:softmax 摊薄
全注意力在位置上求 softmax。上下文一长,权重被摊薄到更多位置上,每个历史位置得到的注意力权重都变小。有效信息携带量随长度增加而摊薄------长距离「精确回忆」的可靠度下降。这是「lost in the middle」现象的结构性根源:模型擅长开头和结尾的信息,中间的长内容在长上下文下尤其容易被稀释。
#mermaid-svg-8HVyxbzwu7LW5Z9D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8HVyxbzwu7LW5Z9D .error-icon{fill:#552222;}#mermaid-svg-8HVyxbzwu7LW5Z9D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8HVyxbzwu7LW5Z9D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .marker.cross{stroke:#333333;}#mermaid-svg-8HVyxbzwu7LW5Z9D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8HVyxbzwu7LW5Z9D p{margin:0;}#mermaid-svg-8HVyxbzwu7LW5Z9D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster-label text{fill:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster-label span{color:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster-label span p{background-color:transparent;}#mermaid-svg-8HVyxbzwu7LW5Z9D .label text,#mermaid-svg-8HVyxbzwu7LW5Z9D span{fill:#333;color:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .node rect,#mermaid-svg-8HVyxbzwu7LW5Z9D .node circle,#mermaid-svg-8HVyxbzwu7LW5Z9D .node ellipse,#mermaid-svg-8HVyxbzwu7LW5Z9D .node polygon,#mermaid-svg-8HVyxbzwu7LW5Z9D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .rough-node .label text,#mermaid-svg-8HVyxbzwu7LW5Z9D .node .label text,#mermaid-svg-8HVyxbzwu7LW5Z9D .image-shape .label,#mermaid-svg-8HVyxbzwu7LW5Z9D .icon-shape .label{text-anchor:middle;}#mermaid-svg-8HVyxbzwu7LW5Z9D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .rough-node .label,#mermaid-svg-8HVyxbzwu7LW5Z9D .node .label,#mermaid-svg-8HVyxbzwu7LW5Z9D .image-shape .label,#mermaid-svg-8HVyxbzwu7LW5Z9D .icon-shape .label{text-align:center;}#mermaid-svg-8HVyxbzwu7LW5Z9D .node.clickable{cursor:pointer;}#mermaid-svg-8HVyxbzwu7LW5Z9D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .arrowheadPath{fill:#333333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8HVyxbzwu7LW5Z9D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8HVyxbzwu7LW5Z9D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8HVyxbzwu7LW5Z9D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster text{fill:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D .cluster span{color:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8HVyxbzwu7LW5Z9D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8HVyxbzwu7LW5Z9D rect.text{fill:none;stroke-width:0;}#mermaid-svg-8HVyxbzwu7LW5Z9D .icon-shape,#mermaid-svg-8HVyxbzwu7LW5Z9D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8HVyxbzwu7LW5Z9D .icon-shape p,#mermaid-svg-8HVyxbzwu7LW5Z9D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8HVyxbzwu7LW5Z9D .icon-shape .label rect,#mermaid-svg-8HVyxbzwu7LW5Z9D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8HVyxbzwu7LW5Z9D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8HVyxbzwu7LW5Z9D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8HVyxbzwu7LW5Z9D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 注意力权重分布
短上下文(64K)
sparse 分布,少数关键位高权重
检索可靠
长上下文(1M)
接近 uniform 摊薄,峰值压低
检索衰减
lost in the middle
6.2 RoPE 位置外推:训练频率之外不可信
Qwen3.6 的 RoPE 频率基数为 10^7(模型配置.cpp:rope.freq_base),这是一组长上下文优化的外推频率。但注意:模型的「原生窗口」是 262144 = 2^18。在原生训练窗口内,位置编码频率是模型见过的分布;一旦超过训练分布,位置向量进入外推区,旋转角度超出训练覆盖------相对位置编码精度衰减,长程定位开始模糊。
#mermaid-svg-qOGcKtl8LjlLFenv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qOGcKtl8LjlLFenv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qOGcKtl8LjlLFenv .error-icon{fill:#552222;}#mermaid-svg-qOGcKtl8LjlLFenv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qOGcKtl8LjlLFenv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qOGcKtl8LjlLFenv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qOGcKtl8LjlLFenv .marker.cross{stroke:#333333;}#mermaid-svg-qOGcKtl8LjlLFenv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qOGcKtl8LjlLFenv p{margin:0;}#mermaid-svg-qOGcKtl8LjlLFenv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qOGcKtl8LjlLFenv .cluster-label text{fill:#333;}#mermaid-svg-qOGcKtl8LjlLFenv .cluster-label span{color:#333;}#mermaid-svg-qOGcKtl8LjlLFenv .cluster-label span p{background-color:transparent;}#mermaid-svg-qOGcKtl8LjlLFenv .label text,#mermaid-svg-qOGcKtl8LjlLFenv span{fill:#333;color:#333;}#mermaid-svg-qOGcKtl8LjlLFenv .node rect,#mermaid-svg-qOGcKtl8LjlLFenv .node circle,#mermaid-svg-qOGcKtl8LjlLFenv .node ellipse,#mermaid-svg-qOGcKtl8LjlLFenv .node polygon,#mermaid-svg-qOGcKtl8LjlLFenv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qOGcKtl8LjlLFenv .rough-node .label text,#mermaid-svg-qOGcKtl8LjlLFenv .node .label text,#mermaid-svg-qOGcKtl8LjlLFenv .image-shape .label,#mermaid-svg-qOGcKtl8LjlLFenv .icon-shape .label{text-anchor:middle;}#mermaid-svg-qOGcKtl8LjlLFenv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qOGcKtl8LjlLFenv .rough-node .label,#mermaid-svg-qOGcKtl8LjlLFenv .node .label,#mermaid-svg-qOGcKtl8LjlLFenv .image-shape .label,#mermaid-svg-qOGcKtl8LjlLFenv .icon-shape .label{text-align:center;}#mermaid-svg-qOGcKtl8LjlLFenv .node.clickable{cursor:pointer;}#mermaid-svg-qOGcKtl8LjlLFenv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qOGcKtl8LjlLFenv .arrowheadPath{fill:#333333;}#mermaid-svg-qOGcKtl8LjlLFenv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qOGcKtl8LjlLFenv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qOGcKtl8LjlLFenv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qOGcKtl8LjlLFenv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qOGcKtl8LjlLFenv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qOGcKtl8LjlLFenv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qOGcKtl8LjlLFenv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qOGcKtl8LjlLFenv .cluster text{fill:#333;}#mermaid-svg-qOGcKtl8LjlLFenv .cluster span{color:#333;}#mermaid-svg-qOGcKtl8LjlLFenv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qOGcKtl8LjlLFenv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qOGcKtl8LjlLFenv rect.text{fill:none;stroke-width:0;}#mermaid-svg-qOGcKtl8LjlLFenv .icon-shape,#mermaid-svg-qOGcKtl8LjlLFenv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qOGcKtl8LjlLFenv .icon-shape p,#mermaid-svg-qOGcKtl8LjlLFenv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qOGcKtl8LjlLFenv .icon-shape .label rect,#mermaid-svg-qOGcKtl8LjlLFenv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qOGcKtl8LjlLFenv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qOGcKtl8LjlLFenv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qOGcKtl8LjlLFenv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 训练分布覆盖 0..262144
262144 以内:位置频率可信
超过 262144:RoPE 外推区
长程位置信号衰减
依赖越长的上下文越不可靠
这正是「256×1024 = 262144 = 模型原生窗口」这个值特殊的深层次原因之一:把它作为工作区上限,就保证了所有 token 的位置编码都落在模型训练时见过的分布内,不需要依赖任何外推技巧。
6.3 线性注意力的信息压缩瓶颈
30 层 DeltaNet 把历史压进固定状态 S。给定状态维 128,每层每头可编码的独立信息有硬上限;衰减门 ege^geg 还会主动遗忘旧信息。所以越长的历史,被 30 层线性注意力压得越狠,细节越难逐字恢复。长上下文的价值,本质上是在挑战线性注意力的信息瓶颈------上下文越长,「压不进去」的内容越多。
6.4 工程可维护性
从用户工作流角度(这不是物理,但同样成立):上下文一长,工具调用历史、中间推理、重复的 prompt 模板占据大量 token,真正有效的「任务定义」比例下降。把上下文裁剪在甜点区间,配合良好的记忆/笔记机制,能在不丢失长程任务关键状态的前提下,规避上述三种能力衰减。
#mermaid-svg-CL45hIcLxhCWcri4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CL45hIcLxhCWcri4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CL45hIcLxhCWcri4 .error-icon{fill:#552222;}#mermaid-svg-CL45hIcLxhCWcri4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CL45hIcLxhCWcri4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CL45hIcLxhCWcri4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CL45hIcLxhCWcri4 .marker.cross{stroke:#333333;}#mermaid-svg-CL45hIcLxhCWcri4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CL45hIcLxhCWcri4 p{margin:0;}#mermaid-svg-CL45hIcLxhCWcri4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CL45hIcLxhCWcri4 .cluster-label text{fill:#333;}#mermaid-svg-CL45hIcLxhCWcri4 .cluster-label span{color:#333;}#mermaid-svg-CL45hIcLxhCWcri4 .cluster-label span p{background-color:transparent;}#mermaid-svg-CL45hIcLxhCWcri4 .label text,#mermaid-svg-CL45hIcLxhCWcri4 span{fill:#333;color:#333;}#mermaid-svg-CL45hIcLxhCWcri4 .node rect,#mermaid-svg-CL45hIcLxhCWcri4 .node circle,#mermaid-svg-CL45hIcLxhCWcri4 .node ellipse,#mermaid-svg-CL45hIcLxhCWcri4 .node polygon,#mermaid-svg-CL45hIcLxhCWcri4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CL45hIcLxhCWcri4 .rough-node .label text,#mermaid-svg-CL45hIcLxhCWcri4 .node .label text,#mermaid-svg-CL45hIcLxhCWcri4 .image-shape .label,#mermaid-svg-CL45hIcLxhCWcri4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-CL45hIcLxhCWcri4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CL45hIcLxhCWcri4 .rough-node .label,#mermaid-svg-CL45hIcLxhCWcri4 .node .label,#mermaid-svg-CL45hIcLxhCWcri4 .image-shape .label,#mermaid-svg-CL45hIcLxhCWcri4 .icon-shape .label{text-align:center;}#mermaid-svg-CL45hIcLxhCWcri4 .node.clickable{cursor:pointer;}#mermaid-svg-CL45hIcLxhCWcri4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CL45hIcLxhCWcri4 .arrowheadPath{fill:#333333;}#mermaid-svg-CL45hIcLxhCWcri4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CL45hIcLxhCWcri4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CL45hIcLxhCWcri4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CL45hIcLxhCWcri4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CL45hIcLxhCWcri4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CL45hIcLxhCWcri4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CL45hIcLxhCWcri4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CL45hIcLxhCWcri4 .cluster text{fill:#333;}#mermaid-svg-CL45hIcLxhCWcri4 .cluster span{color:#333;}#mermaid-svg-CL45hIcLxhCWcri4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CL45hIcLxhCWcri4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CL45hIcLxhCWcri4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-CL45hIcLxhCWcri4 .icon-shape,#mermaid-svg-CL45hIcLxhCWcri4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CL45hIcLxhCWcri4 .icon-shape p,#mermaid-svg-CL45hIcLxhCWcri4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CL45hIcLxhCWcri4 .icon-shape .label rect,#mermaid-svg-CL45hIcLxhCWcri4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CL45hIcLxhCWcri4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CL45hIcLxhCWcri4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CL45hIcLxhCWcri4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 能力随上下文长度的变化------示意
64K
200K
256K
400K
1M
强
强
基准=原生窗口
开始衰减
明显衰减
七、甜点区间:为什么是这几个「别扭」的数
现在回过头来看开头给出的五个值:200000、204800、256000、262144、400000。它们看似「别扭」,实际各有来历,分两类:
7.1 十进制系(面向用户习惯)
- 200000 = 200 × 1000:惯用「200K」,便于口头与文档表述;
- 256000 = 256 × 1000:惯用「256K」,是市场上大量模型宣传窗口的标准写法;
- 400000 = 400 × 1000:惯用「400K」,某些长上下文模型推广档位。
7.2 二进制系(面向模型/硬件本性)
- 204800 = 200 × 1024:200K 的二进制对齐,容量分页友好;
- 262144 = 256 × 1024 = 2^18 :256K 的二进制对齐,同时是 Qwen3.6-35B-A3B 的原生训练窗口 (模型配置源码
context_length默认值即 262144)。
#mermaid-svg-VaMt6i1b4X8nmegf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VaMt6i1b4X8nmegf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VaMt6i1b4X8nmegf .error-icon{fill:#552222;}#mermaid-svg-VaMt6i1b4X8nmegf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VaMt6i1b4X8nmegf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VaMt6i1b4X8nmegf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VaMt6i1b4X8nmegf .marker.cross{stroke:#333333;}#mermaid-svg-VaMt6i1b4X8nmegf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VaMt6i1b4X8nmegf p{margin:0;}#mermaid-svg-VaMt6i1b4X8nmegf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VaMt6i1b4X8nmegf .cluster-label text{fill:#333;}#mermaid-svg-VaMt6i1b4X8nmegf .cluster-label span{color:#333;}#mermaid-svg-VaMt6i1b4X8nmegf .cluster-label span p{background-color:transparent;}#mermaid-svg-VaMt6i1b4X8nmegf .label text,#mermaid-svg-VaMt6i1b4X8nmegf span{fill:#333;color:#333;}#mermaid-svg-VaMt6i1b4X8nmegf .node rect,#mermaid-svg-VaMt6i1b4X8nmegf .node circle,#mermaid-svg-VaMt6i1b4X8nmegf .node ellipse,#mermaid-svg-VaMt6i1b4X8nmegf .node polygon,#mermaid-svg-VaMt6i1b4X8nmegf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VaMt6i1b4X8nmegf .rough-node .label text,#mermaid-svg-VaMt6i1b4X8nmegf .node .label text,#mermaid-svg-VaMt6i1b4X8nmegf .image-shape .label,#mermaid-svg-VaMt6i1b4X8nmegf .icon-shape .label{text-anchor:middle;}#mermaid-svg-VaMt6i1b4X8nmegf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VaMt6i1b4X8nmegf .rough-node .label,#mermaid-svg-VaMt6i1b4X8nmegf .node .label,#mermaid-svg-VaMt6i1b4X8nmegf .image-shape .label,#mermaid-svg-VaMt6i1b4X8nmegf .icon-shape .label{text-align:center;}#mermaid-svg-VaMt6i1b4X8nmegf .node.clickable{cursor:pointer;}#mermaid-svg-VaMt6i1b4X8nmegf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VaMt6i1b4X8nmegf .arrowheadPath{fill:#333333;}#mermaid-svg-VaMt6i1b4X8nmegf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VaMt6i1b4X8nmegf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VaMt6i1b4X8nmegf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VaMt6i1b4X8nmegf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VaMt6i1b4X8nmegf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VaMt6i1b4X8nmegf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VaMt6i1b4X8nmegf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VaMt6i1b4X8nmegf .cluster text{fill:#333;}#mermaid-svg-VaMt6i1b4X8nmegf .cluster span{color:#333;}#mermaid-svg-VaMt6i1b4X8nmegf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VaMt6i1b4X8nmegf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VaMt6i1b4X8nmegf rect.text{fill:none;stroke-width:0;}#mermaid-svg-VaMt6i1b4X8nmegf .icon-shape,#mermaid-svg-VaMt6i1b4X8nmegf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VaMt6i1b4X8nmegf .icon-shape p,#mermaid-svg-VaMt6i1b4X8nmegf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VaMt6i1b4X8nmegf .icon-shape .label rect,#mermaid-svg-VaMt6i1b4X8nmegf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VaMt6i1b4X8nmegf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VaMt6i1b4X8nmegf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VaMt6i1b4X8nmegf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 二进制系------面向机
= 模型原生窗口
十进制系------面向人
200000
256000
400000
204800 = 200×1024
262144 = 256×1024 = 2^18
Qwen3.6 训练分布上界
它们共同落在 200K~400K 这个带内,这不是巧合,而是三条曲线的交叠区:
- 成本曲线:在这个带内 KV 读取量从「≈3×权重」到「≈6×权重」,仍在内存/显存与带宽可承受范围内;超过 400K 后急剧失控。
- 能力曲线 :200K~400K 覆盖绝大多数真实任务(一个大型代码库、一本长书、一整段工程会话),而能力衰减在这个尺度上尚不明显;262144 更是直接钉在模型原生窗口上,完全避开外推。
- 经济曲线:输入 token 计费线性,找一个离业务需求最近、又不浪费的档位,是最优解。
#mermaid-svg-qE1uj4YqUsTVywLs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qE1uj4YqUsTVywLs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qE1uj4YqUsTVywLs .error-icon{fill:#552222;}#mermaid-svg-qE1uj4YqUsTVywLs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qE1uj4YqUsTVywLs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qE1uj4YqUsTVywLs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qE1uj4YqUsTVywLs .marker.cross{stroke:#333333;}#mermaid-svg-qE1uj4YqUsTVywLs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qE1uj4YqUsTVywLs p{margin:0;}#mermaid-svg-qE1uj4YqUsTVywLs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 甜点区间的形成:成本上升 × 能力下降的交叉带(示意) 64K200K256K400K1M 109876543210 相对值
八、工程实践:把甜点区间固化为默认
在 llmx 与配套的 opencode-goal 插件实践中,这个分析被沉淀为一个默认配置:自动压缩(auto-compact)的上下文触发阈值默认取 256000(256K 十进制档)。
#mermaid-svg-yLwJuJ5aon33mo6m{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yLwJuJ5aon33mo6m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yLwJuJ5aon33mo6m .error-icon{fill:#552222;}#mermaid-svg-yLwJuJ5aon33mo6m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yLwJuJ5aon33mo6m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yLwJuJ5aon33mo6m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yLwJuJ5aon33mo6m .marker.cross{stroke:#333333;}#mermaid-svg-yLwJuJ5aon33mo6m svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yLwJuJ5aon33mo6m p{margin:0;}#mermaid-svg-yLwJuJ5aon33mo6m .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-yLwJuJ5aon33mo6m .cluster-label text{fill:#333;}#mermaid-svg-yLwJuJ5aon33mo6m .cluster-label span{color:#333;}#mermaid-svg-yLwJuJ5aon33mo6m .cluster-label span p{background-color:transparent;}#mermaid-svg-yLwJuJ5aon33mo6m .label text,#mermaid-svg-yLwJuJ5aon33mo6m span{fill:#333;color:#333;}#mermaid-svg-yLwJuJ5aon33mo6m .node rect,#mermaid-svg-yLwJuJ5aon33mo6m .node circle,#mermaid-svg-yLwJuJ5aon33mo6m .node ellipse,#mermaid-svg-yLwJuJ5aon33mo6m .node polygon,#mermaid-svg-yLwJuJ5aon33mo6m .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yLwJuJ5aon33mo6m .rough-node .label text,#mermaid-svg-yLwJuJ5aon33mo6m .node .label text,#mermaid-svg-yLwJuJ5aon33mo6m .image-shape .label,#mermaid-svg-yLwJuJ5aon33mo6m .icon-shape .label{text-anchor:middle;}#mermaid-svg-yLwJuJ5aon33mo6m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yLwJuJ5aon33mo6m .rough-node .label,#mermaid-svg-yLwJuJ5aon33mo6m .node .label,#mermaid-svg-yLwJuJ5aon33mo6m .image-shape .label,#mermaid-svg-yLwJuJ5aon33mo6m .icon-shape .label{text-align:center;}#mermaid-svg-yLwJuJ5aon33mo6m .node.clickable{cursor:pointer;}#mermaid-svg-yLwJuJ5aon33mo6m .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yLwJuJ5aon33mo6m .arrowheadPath{fill:#333333;}#mermaid-svg-yLwJuJ5aon33mo6m .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yLwJuJ5aon33mo6m .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yLwJuJ5aon33mo6m .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yLwJuJ5aon33mo6m .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yLwJuJ5aon33mo6m .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yLwJuJ5aon33mo6m .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yLwJuJ5aon33mo6m .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yLwJuJ5aon33mo6m .cluster text{fill:#333;}#mermaid-svg-yLwJuJ5aon33mo6m .cluster span{color:#333;}#mermaid-svg-yLwJuJ5aon33mo6m div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yLwJuJ5aon33mo6m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yLwJuJ5aon33mo6m rect.text{fill:none;stroke-width:0;}#mermaid-svg-yLwJuJ5aon33mo6m .icon-shape,#mermaid-svg-yLwJuJ5aon33mo6m .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yLwJuJ5aon33mo6m .icon-shape p,#mermaid-svg-yLwJuJ5aon33mo6m .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yLwJuJ5aon33mo6m .icon-shape .label rect,#mermaid-svg-yLwJuJ5aon33mo6m .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yLwJuJ5aon33mo6m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yLwJuJ5aon33mo6m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yLwJuJ5aon33mo6m :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
每轮提交时记录输入上下文大小
cache.read + cache.write
(输入上下文估计)
last_tokens >= context_limit
且模型已知?
正常续跑
空闲时触发 summarize(auto-compact)
压缩完成 → 上下文回落
→ 继续续跑
循环
选择 256000 而非 262144 的理由是工程务实:256000(十进制 256K)在文档、对话、配置里更易读,而它与 262144 的差距(1.6%)不构成任何物理差异,同时避免「0.5 个 token」的边界纠结。 保留 262144 作为模型原生气氛值------它说明事件;256000 是动作值------它决定行为。
关键点在于:这个阈值不是「硬上限」,而是「软触发」。
- 它不删除任何历史,只是把超限的会话压缩成摘要,再继续工作;
- 它配合插件自身持久化的记忆(goal 状态、计划、进度、经验文件都在磁盘上),即使会话被压缩,长程任务的关键状态也由外部记忆承接,不会丢失;
- 它可被覆盖 :用户既可在插件初始化 options 里设默认,也可在会话中动态调整
context_limit------这正是「甜点区间」的正确用法:默认落在甜点内,按需调档。
#mermaid-svg-mvJmM0nOT9VExHtX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mvJmM0nOT9VExHtX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mvJmM0nOT9VExHtX .error-icon{fill:#552222;}#mermaid-svg-mvJmM0nOT9VExHtX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mvJmM0nOT9VExHtX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mvJmM0nOT9VExHtX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mvJmM0nOT9VExHtX .marker.cross{stroke:#333333;}#mermaid-svg-mvJmM0nOT9VExHtX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mvJmM0nOT9VExHtX p{margin:0;}#mermaid-svg-mvJmM0nOT9VExHtX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mvJmM0nOT9VExHtX .cluster-label text{fill:#333;}#mermaid-svg-mvJmM0nOT9VExHtX .cluster-label span{color:#333;}#mermaid-svg-mvJmM0nOT9VExHtX .cluster-label span p{background-color:transparent;}#mermaid-svg-mvJmM0nOT9VExHtX .label text,#mermaid-svg-mvJmM0nOT9VExHtX span{fill:#333;color:#333;}#mermaid-svg-mvJmM0nOT9VExHtX .node rect,#mermaid-svg-mvJmM0nOT9VExHtX .node circle,#mermaid-svg-mvJmM0nOT9VExHtX .node ellipse,#mermaid-svg-mvJmM0nOT9VExHtX .node polygon,#mermaid-svg-mvJmM0nOT9VExHtX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mvJmM0nOT9VExHtX .rough-node .label text,#mermaid-svg-mvJmM0nOT9VExHtX .node .label text,#mermaid-svg-mvJmM0nOT9VExHtX .image-shape .label,#mermaid-svg-mvJmM0nOT9VExHtX .icon-shape .label{text-anchor:middle;}#mermaid-svg-mvJmM0nOT9VExHtX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mvJmM0nOT9VExHtX .rough-node .label,#mermaid-svg-mvJmM0nOT9VExHtX .node .label,#mermaid-svg-mvJmM0nOT9VExHtX .image-shape .label,#mermaid-svg-mvJmM0nOT9VExHtX .icon-shape .label{text-align:center;}#mermaid-svg-mvJmM0nOT9VExHtX .node.clickable{cursor:pointer;}#mermaid-svg-mvJmM0nOT9VExHtX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mvJmM0nOT9VExHtX .arrowheadPath{fill:#333333;}#mermaid-svg-mvJmM0nOT9VExHtX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mvJmM0nOT9VExHtX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mvJmM0nOT9VExHtX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mvJmM0nOT9VExHtX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mvJmM0nOT9VExHtX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mvJmM0nOT9VExHtX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mvJmM0nOT9VExHtX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mvJmM0nOT9VExHtX .cluster text{fill:#333;}#mermaid-svg-mvJmM0nOT9VExHtX .cluster span{color:#333;}#mermaid-svg-mvJmM0nOT9VExHtX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mvJmM0nOT9VExHtX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mvJmM0nOT9VExHtX rect.text{fill:none;stroke-width:0;}#mermaid-svg-mvJmM0nOT9VExHtX .icon-shape,#mermaid-svg-mvJmM0nOT9VExHtX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mvJmM0nOT9VExHtX .icon-shape p,#mermaid-svg-mvJmM0nOT9VExHtX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mvJmM0nOT9VExHtX .icon-shape .label rect,#mermaid-svg-mvJmM0nOT9VExHtX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mvJmM0nOT9VExHtX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mvJmM0nOT9VExHtX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mvJmM0nOT9VExHtX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 插件持久化记忆------压缩不丢任务
goal 目标
磁盘 state 文件
plan 计划
progress 进度
memory 经验
压缩后:任务定义仍可恢复
同理,针对不同模型下发不同档位也是这个框架的自然推论:200K 档留给标称 200K 的模型(如 GLM5.2------这类模型自带压缩,插件不必越俎代庖);256K 档留给 1M 或 400K 上下文的模型------在一个值得轻松工作的范围内,既利用长上下文,又不为用不到的 1M 买单。
九、KV 量化:砍的是常数因子,不是长度因子
面对 KV 的体积问题,工程上最常被提起的解法是 KV 量化(KV cache quantization):把键值从 f32 降到 fp16,或进一步用 4/8 bit 块量化。这套做法立刻能把上文的体积表整体缩小:
| 上下文 | KV f32 | KV fp16 | KV 8-bit |
|---|---|---|---|
| 200000 | 8.19GB | 4.10GB | 2.05GB |
| 256000 | 10.49GB | 5.25GB | 2.62GB |
| 262144 | 10.74GB | 5.37GB | 2.68GB |
| 400000 | 16.38GB | 8.19GB | 4.10GB |
| 1000000 | 40.96GB | 20.48GB | 10.24GB |
(保守按均匀 4/8 bit 估算法;实际端点量化与逐层分组会带来具体偏差,这里只为展示量级。)
#mermaid-svg-avfhUrGarHur39bI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-avfhUrGarHur39bI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-avfhUrGarHur39bI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-avfhUrGarHur39bI .error-icon{fill:#552222;}#mermaid-svg-avfhUrGarHur39bI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-avfhUrGarHur39bI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-avfhUrGarHur39bI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-avfhUrGarHur39bI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-avfhUrGarHur39bI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-avfhUrGarHur39bI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-avfhUrGarHur39bI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-avfhUrGarHur39bI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-avfhUrGarHur39bI .marker.cross{stroke:#333333;}#mermaid-svg-avfhUrGarHur39bI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-avfhUrGarHur39bI p{margin:0;}#mermaid-svg-avfhUrGarHur39bI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-avfhUrGarHur39bI .cluster-label text{fill:#333;}#mermaid-svg-avfhUrGarHur39bI .cluster-label span{color:#333;}#mermaid-svg-avfhUrGarHur39bI .cluster-label span p{background-color:transparent;}#mermaid-svg-avfhUrGarHur39bI .label text,#mermaid-svg-avfhUrGarHur39bI span{fill:#333;color:#333;}#mermaid-svg-avfhUrGarHur39bI .node rect,#mermaid-svg-avfhUrGarHur39bI .node circle,#mermaid-svg-avfhUrGarHur39bI .node ellipse,#mermaid-svg-avfhUrGarHur39bI .node polygon,#mermaid-svg-avfhUrGarHur39bI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-avfhUrGarHur39bI .rough-node .label text,#mermaid-svg-avfhUrGarHur39bI .node .label text,#mermaid-svg-avfhUrGarHur39bI .image-shape .label,#mermaid-svg-avfhUrGarHur39bI .icon-shape .label{text-anchor:middle;}#mermaid-svg-avfhUrGarHur39bI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-avfhUrGarHur39bI .rough-node .label,#mermaid-svg-avfhUrGarHur39bI .node .label,#mermaid-svg-avfhUrGarHur39bI .image-shape .label,#mermaid-svg-avfhUrGarHur39bI .icon-shape .label{text-align:center;}#mermaid-svg-avfhUrGarHur39bI .node.clickable{cursor:pointer;}#mermaid-svg-avfhUrGarHur39bI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-avfhUrGarHur39bI .arrowheadPath{fill:#333333;}#mermaid-svg-avfhUrGarHur39bI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-avfhUrGarHur39bI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-avfhUrGarHur39bI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-avfhUrGarHur39bI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-avfhUrGarHur39bI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-avfhUrGarHur39bI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-avfhUrGarHur39bI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-avfhUrGarHur39bI .cluster text{fill:#333;}#mermaid-svg-avfhUrGarHur39bI .cluster span{color:#333;}#mermaid-svg-avfhUrGarHur39bI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-avfhUrGarHur39bI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-avfhUrGarHur39bI rect.text{fill:none;stroke-width:0;}#mermaid-svg-avfhUrGarHur39bI .icon-shape,#mermaid-svg-avfhUrGarHur39bI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-avfhUrGarHur39bI .icon-shape p,#mermaid-svg-avfhUrGarHur39bI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-avfhUrGarHur39bI .icon-shape .label rect,#mermaid-svg-avfhUrGarHur39bI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-avfhUrGarHur39bI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-avfhUrGarHur39bI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-avfhUrGarHur39bI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} KV 量化流程
注意力输出 K/V(f32)
逐层/逐通道量化
存入量化 KV 缓存
注意力读取时反量化
键 K 对量化相对鲁棒,值 V 更敏感(V 直接求和进输出)
实战常给 V 更高位宽
但这里要澄清一个容易被营销话术混淆的事实:KV 量化砍掉的是常数因子(2 倍或 4 倍),长度因子 LLL 依旧线性。 1M 上下文即使全量 kv8,仍要 10.24GB------它只是把一个「1M 不可能」变成「1M 或许可行但很挤」,并没有改变「越接近 1M,KV 越主导一切」的斜率。甜点区间的结论对量化后的系统同样成立,只是绝对值整体下移、阈值可以稍微放宽。这也是为什么在 llmx 的工程实践中,量化被用在中低内存机器上「挤进」256K 而不是「堆到」1M。
#mermaid-svg-qwDyigjW9T4MdO6i{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qwDyigjW9T4MdO6i .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qwDyigjW9T4MdO6i .error-icon{fill:#552222;}#mermaid-svg-qwDyigjW9T4MdO6i .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qwDyigjW9T4MdO6i .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qwDyigjW9T4MdO6i .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qwDyigjW9T4MdO6i .marker.cross{stroke:#333333;}#mermaid-svg-qwDyigjW9T4MdO6i svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qwDyigjW9T4MdO6i p{margin:0;}#mermaid-svg-qwDyigjW9T4MdO6i :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} KV 体积:f32 / fp16 / 8bit 三条平行线(斜率不变) 02621444000001000000 454035302520151050 GB
9.1 KV 量化引入的精度代价并非均匀
值得写一句技术细节:量化 KV 的误差与「注意力结果对误差的敏感度」绑定。注意力输出是两个加权和的嵌套------softmax 权重来自于 Q·K 内积,值 V 直接参与线性求和。因此:
- K 的量化误差会进入 softmax 权重,改变「谁被关注」,是二阶、间接的;
- V 的量化误差会直接叠加进输出向量,是一阶、直接的。
实践中 V 通常需要比 K 更高的位宽。这个不对称不是本文新结论,而是量化推理的标准共识;在 llmx 里同样遵循(反量化路径对 K/V 分别处理,见 src/内核/反量化/)。它提醒我们:长上下文的每一厘内存,都是用精度换来的------而精度正是能力衰减曲线的组成部分。
十、Prefill 与 Decode 的不对称:上下文有两笔账单
说到成本,不能只算 decode。一次请求其实是两段:**prefill(预填充)**处理整个输入,**decode(解码)**逐 token 生成。两者的复杂度形状完全不同:
| 阶段 | 全注意力计算量 | 说明 |
|---|---|---|
| Prefill(输入 L 个 token) | O(L²)·层系数 | 每个输入位置与它之前的所有位置做注意力,因果掩码下总对数约为 L2/2L^2/2L2/2 |
| Decode(每生成 1 个 token) | O(L)·层系数 | 新 token 与全部历史做注意力,每步线性 |
#mermaid-svg-Jwe3X0nBIb8GyzfE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Jwe3X0nBIb8GyzfE .error-icon{fill:#552222;}#mermaid-svg-Jwe3X0nBIb8GyzfE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Jwe3X0nBIb8GyzfE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .marker.cross{stroke:#333333;}#mermaid-svg-Jwe3X0nBIb8GyzfE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Jwe3X0nBIb8GyzfE p{margin:0;}#mermaid-svg-Jwe3X0nBIb8GyzfE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster-label text{fill:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster-label span{color:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster-label span p{background-color:transparent;}#mermaid-svg-Jwe3X0nBIb8GyzfE .label text,#mermaid-svg-Jwe3X0nBIb8GyzfE span{fill:#333;color:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .node rect,#mermaid-svg-Jwe3X0nBIb8GyzfE .node circle,#mermaid-svg-Jwe3X0nBIb8GyzfE .node ellipse,#mermaid-svg-Jwe3X0nBIb8GyzfE .node polygon,#mermaid-svg-Jwe3X0nBIb8GyzfE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .rough-node .label text,#mermaid-svg-Jwe3X0nBIb8GyzfE .node .label text,#mermaid-svg-Jwe3X0nBIb8GyzfE .image-shape .label,#mermaid-svg-Jwe3X0nBIb8GyzfE .icon-shape .label{text-anchor:middle;}#mermaid-svg-Jwe3X0nBIb8GyzfE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .rough-node .label,#mermaid-svg-Jwe3X0nBIb8GyzfE .node .label,#mermaid-svg-Jwe3X0nBIb8GyzfE .image-shape .label,#mermaid-svg-Jwe3X0nBIb8GyzfE .icon-shape .label{text-align:center;}#mermaid-svg-Jwe3X0nBIb8GyzfE .node.clickable{cursor:pointer;}#mermaid-svg-Jwe3X0nBIb8GyzfE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .arrowheadPath{fill:#333333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Jwe3X0nBIb8GyzfE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Jwe3X0nBIb8GyzfE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Jwe3X0nBIb8GyzfE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster text{fill:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE .cluster span{color:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Jwe3X0nBIb8GyzfE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Jwe3X0nBIb8GyzfE rect.text{fill:none;stroke-width:0;}#mermaid-svg-Jwe3X0nBIb8GyzfE .icon-shape,#mermaid-svg-Jwe3X0nBIb8GyzfE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Jwe3X0nBIb8GyzfE .icon-shape p,#mermaid-svg-Jwe3X0nBIb8GyzfE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Jwe3X0nBIb8GyzfE .icon-shape .label rect,#mermaid-svg-Jwe3X0nBIb8GyzfE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Jwe3X0nBIb8GyzfE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Jwe3X0nBIb8GyzfE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Jwe3X0nBIb8GyzfE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Decode------输出侧账单
每生成 1 个 token 前向一次
每步回顾全部 L 个历史位置
每步计算量 ∝ L
Prefill------输入侧账单
L 个输入 token 并行处理
全注意力层:对全部历史位置算注意力
计算量 ∝ L²(因果掩码下 ≈ L²/2)
一次完整请求总成本 = O(L²) + O(G·L)
这意味着两件事:
- prompt 越长,prefill 越贵 ,而且是二次方地贵。把 prompt 从 200K 拉到 400K,prefill 计算量翻到 4 倍(4002/2002=4400^2/200^2=44002/2002=4);从 256K 拉到 1M,是 15 倍以上。即便 GPU 的矩阵运算并行度能部分吸收,时延与能耗的二次增长仍然真实存在。
- 生成越长,decode 越贵,每步线性。多轮对话的上下文每轮都在涨,于是「输出的每一句」都要对着越来越长的历史做注意力------这就是第五节里那条二次曲线在输出侧的真实成因。
#mermaid-svg-IDQFLmrQo34ezvAi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IDQFLmrQo34ezvAi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IDQFLmrQo34ezvAi .error-icon{fill:#552222;}#mermaid-svg-IDQFLmrQo34ezvAi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IDQFLmrQo34ezvAi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IDQFLmrQo34ezvAi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IDQFLmrQo34ezvAi .marker.cross{stroke:#333333;}#mermaid-svg-IDQFLmrQo34ezvAi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IDQFLmrQo34ezvAi p{margin:0;}#mermaid-svg-IDQFLmrQo34ezvAi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Prefill 相对计算量随输入长度(全注意力层,因果≈L²/2) 2002564001000 302826242220181614121086420 相对 L²
甜点区间在 prefill 上的意义:把它控制在 200K~400K,等于把 prefill 的二次爆炸压在「任意一次都能在秒级完成」的当量内。绝大多数真实任务(代码库检索、文档问答、长对话摘要)的输入远小于 200K------也就是说甜点区间的上界,甚至比很多任务的实际需求还要宽裕(见第十二节)。
十一、为什么「有效上下文」总是小于「名义上下文」
成本只是硬币的一面,另一面是质量。业界针对长上下文模型做过大量检索基准(passkey retrieval、需要从长文中定位信息的任务),一致的观察结果是:真实可检索的上下文长度,往往明显小于模型宣称的窗口。 模型在中长距离上「记得住」,在极长距离上「觉得很熟但找不准」。
原因可以拆成三个可计算的机制:
10.1 注意力摊薄的数学直觉
对第 ttt 个位置、长度为 LLL 的上下文,softmax 把注意力权重分配到 ttt 个历史位置。当 ttt 从 10K 增长到 400K,单点权重的期望从「千分之一量级」降到「百万分之一量级」。一个要精确回忆的位置,其注意力权重被周围 39.9 万个位置稀释------峰值权重压低,softmax 的「尖峰」变得扁平,检索信号变弱。
#mermaid-svg-UZIoRBMuXNNMPTvl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UZIoRBMuXNNMPTvl .error-icon{fill:#552222;}#mermaid-svg-UZIoRBMuXNNMPTvl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UZIoRBMuXNNMPTvl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UZIoRBMuXNNMPTvl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UZIoRBMuXNNMPTvl .marker.cross{stroke:#333333;}#mermaid-svg-UZIoRBMuXNNMPTvl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UZIoRBMuXNNMPTvl p{margin:0;}#mermaid-svg-UZIoRBMuXNNMPTvl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster-label text{fill:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster-label span{color:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster-label span p{background-color:transparent;}#mermaid-svg-UZIoRBMuXNNMPTvl .label text,#mermaid-svg-UZIoRBMuXNNMPTvl span{fill:#333;color:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl .node rect,#mermaid-svg-UZIoRBMuXNNMPTvl .node circle,#mermaid-svg-UZIoRBMuXNNMPTvl .node ellipse,#mermaid-svg-UZIoRBMuXNNMPTvl .node polygon,#mermaid-svg-UZIoRBMuXNNMPTvl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UZIoRBMuXNNMPTvl .rough-node .label text,#mermaid-svg-UZIoRBMuXNNMPTvl .node .label text,#mermaid-svg-UZIoRBMuXNNMPTvl .image-shape .label,#mermaid-svg-UZIoRBMuXNNMPTvl .icon-shape .label{text-anchor:middle;}#mermaid-svg-UZIoRBMuXNNMPTvl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UZIoRBMuXNNMPTvl .rough-node .label,#mermaid-svg-UZIoRBMuXNNMPTvl .node .label,#mermaid-svg-UZIoRBMuXNNMPTvl .image-shape .label,#mermaid-svg-UZIoRBMuXNNMPTvl .icon-shape .label{text-align:center;}#mermaid-svg-UZIoRBMuXNNMPTvl .node.clickable{cursor:pointer;}#mermaid-svg-UZIoRBMuXNNMPTvl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UZIoRBMuXNNMPTvl .arrowheadPath{fill:#333333;}#mermaid-svg-UZIoRBMuXNNMPTvl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UZIoRBMuXNNMPTvl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UZIoRBMuXNNMPTvl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UZIoRBMuXNNMPTvl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UZIoRBMuXNNMPTvl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UZIoRBMuXNNMPTvl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster text{fill:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl .cluster span{color:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UZIoRBMuXNNMPTvl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UZIoRBMuXNNMPTvl rect.text{fill:none;stroke-width:0;}#mermaid-svg-UZIoRBMuXNNMPTvl .icon-shape,#mermaid-svg-UZIoRBMuXNNMPTvl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UZIoRBMuXNNMPTvl .icon-shape p,#mermaid-svg-UZIoRBMuXNNMPTvl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UZIoRBMuXNNMPTvl .icon-shape .label rect,#mermaid-svg-UZIoRBMuXNNMPTvl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UZIoRBMuXNNMPTvl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UZIoRBMuXNNMPTvl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UZIoRBMuXNNMPTvl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} softmax 分布随长度变化------示意
短:峰值明显(~0.1 甚至更高)
可精确定位
长:峰值被 1/L 摊平(~10⁻⁵~10⁻³)
定位模糊
10.2 「lost in the middle」的结构根源
长上下文评测反复报告的一种模式:模型对开头 与结尾 附近的检索显著好于中间。这与 attention 的分布特性自洽------开头被重复引用(包括模板、系统提示的叠加效应),结尾最接近当前输出位置;中间的 80% 既无叠加也无近因优势,是注意力摊薄最严重的区域。
#mermaid-svg-mDjHt50CKKfA7Q6g{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mDjHt50CKKfA7Q6g .error-icon{fill:#552222;}#mermaid-svg-mDjHt50CKKfA7Q6g .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mDjHt50CKKfA7Q6g .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mDjHt50CKKfA7Q6g .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mDjHt50CKKfA7Q6g .marker.cross{stroke:#333333;}#mermaid-svg-mDjHt50CKKfA7Q6g svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mDjHt50CKKfA7Q6g p{margin:0;}#mermaid-svg-mDjHt50CKKfA7Q6g .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster-label text{fill:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster-label span{color:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster-label span p{background-color:transparent;}#mermaid-svg-mDjHt50CKKfA7Q6g .label text,#mermaid-svg-mDjHt50CKKfA7Q6g span{fill:#333;color:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g .node rect,#mermaid-svg-mDjHt50CKKfA7Q6g .node circle,#mermaid-svg-mDjHt50CKKfA7Q6g .node ellipse,#mermaid-svg-mDjHt50CKKfA7Q6g .node polygon,#mermaid-svg-mDjHt50CKKfA7Q6g .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mDjHt50CKKfA7Q6g .rough-node .label text,#mermaid-svg-mDjHt50CKKfA7Q6g .node .label text,#mermaid-svg-mDjHt50CKKfA7Q6g .image-shape .label,#mermaid-svg-mDjHt50CKKfA7Q6g .icon-shape .label{text-anchor:middle;}#mermaid-svg-mDjHt50CKKfA7Q6g .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mDjHt50CKKfA7Q6g .rough-node .label,#mermaid-svg-mDjHt50CKKfA7Q6g .node .label,#mermaid-svg-mDjHt50CKKfA7Q6g .image-shape .label,#mermaid-svg-mDjHt50CKKfA7Q6g .icon-shape .label{text-align:center;}#mermaid-svg-mDjHt50CKKfA7Q6g .node.clickable{cursor:pointer;}#mermaid-svg-mDjHt50CKKfA7Q6g .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mDjHt50CKKfA7Q6g .arrowheadPath{fill:#333333;}#mermaid-svg-mDjHt50CKKfA7Q6g .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mDjHt50CKKfA7Q6g .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mDjHt50CKKfA7Q6g .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mDjHt50CKKfA7Q6g .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mDjHt50CKKfA7Q6g .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mDjHt50CKKfA7Q6g .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster text{fill:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g .cluster span{color:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mDjHt50CKKfA7Q6g .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mDjHt50CKKfA7Q6g rect.text{fill:none;stroke-width:0;}#mermaid-svg-mDjHt50CKKfA7Q6g .icon-shape,#mermaid-svg-mDjHt50CKKfA7Q6g .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mDjHt50CKKfA7Q6g .icon-shape p,#mermaid-svg-mDjHt50CKKfA7Q6g .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mDjHt50CKKfA7Q6g .icon-shape .label rect,#mermaid-svg-mDjHt50CKKfA7Q6g .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mDjHt50CKKfA7Q6g .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mDjHt50CKKfA7Q6g .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mDjHt50CKKfA7Q6g :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 检索可靠度示意------X 轴为文档内位置
开头 高
中段 低(lost in the middle)
结尾 高
这个现象不随标称窗口消失:当窗口从 256K 扩到 1M,摊薄区域只是变长,中段凹陷依旧,甚至更深。 因此「加大上下文」不是「提升检索」的单调解。甜点区间的意义,是把摊薄区间的总规模压到可接受范围------让中段在大部分任务里仍然「够用」。
10.3 线性注意力的「压不进去」
前面提到 30 层 DeltaNet 用 O(1) 状态编码历史。固定大小的 SSS 能承载的独立信息流有上界;衰减门 ege^geg 又主动丢弃旧信息。于是上下文越长,被强制压缩、逐字精确性下降的内容比例就越高 。这不是 bug,是线性注意力的设计取舍------它用「主动遗忘」换「常数内存」。对甜点区间而言,这意味着:与其让模型在 1M 上下文里用一个 128×128 的矩阵回忆第 90 万位的细节,不如把上下文裁短、把关键事实写进外部记忆。长上下文的边界,就是线性注意力信息瓶颈的真实写照。
#mermaid-svg-rtFKFGAl0OhHKdjE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rtFKFGAl0OhHKdjE .error-icon{fill:#552222;}#mermaid-svg-rtFKFGAl0OhHKdjE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rtFKFGAl0OhHKdjE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rtFKFGAl0OhHKdjE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rtFKFGAl0OhHKdjE .marker.cross{stroke:#333333;}#mermaid-svg-rtFKFGAl0OhHKdjE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rtFKFGAl0OhHKdjE p{margin:0;}#mermaid-svg-rtFKFGAl0OhHKdjE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster-label text{fill:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster-label span{color:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster-label span p{background-color:transparent;}#mermaid-svg-rtFKFGAl0OhHKdjE .label text,#mermaid-svg-rtFKFGAl0OhHKdjE span{fill:#333;color:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE .node rect,#mermaid-svg-rtFKFGAl0OhHKdjE .node circle,#mermaid-svg-rtFKFGAl0OhHKdjE .node ellipse,#mermaid-svg-rtFKFGAl0OhHKdjE .node polygon,#mermaid-svg-rtFKFGAl0OhHKdjE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rtFKFGAl0OhHKdjE .rough-node .label text,#mermaid-svg-rtFKFGAl0OhHKdjE .node .label text,#mermaid-svg-rtFKFGAl0OhHKdjE .image-shape .label,#mermaid-svg-rtFKFGAl0OhHKdjE .icon-shape .label{text-anchor:middle;}#mermaid-svg-rtFKFGAl0OhHKdjE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rtFKFGAl0OhHKdjE .rough-node .label,#mermaid-svg-rtFKFGAl0OhHKdjE .node .label,#mermaid-svg-rtFKFGAl0OhHKdjE .image-shape .label,#mermaid-svg-rtFKFGAl0OhHKdjE .icon-shape .label{text-align:center;}#mermaid-svg-rtFKFGAl0OhHKdjE .node.clickable{cursor:pointer;}#mermaid-svg-rtFKFGAl0OhHKdjE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rtFKFGAl0OhHKdjE .arrowheadPath{fill:#333333;}#mermaid-svg-rtFKFGAl0OhHKdjE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rtFKFGAl0OhHKdjE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rtFKFGAl0OhHKdjE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rtFKFGAl0OhHKdjE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rtFKFGAl0OhHKdjE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rtFKFGAl0OhHKdjE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster text{fill:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE .cluster span{color:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rtFKFGAl0OhHKdjE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rtFKFGAl0OhHKdjE rect.text{fill:none;stroke-width:0;}#mermaid-svg-rtFKFGAl0OhHKdjE .icon-shape,#mermaid-svg-rtFKFGAl0OhHKdjE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rtFKFGAl0OhHKdjE .icon-shape p,#mermaid-svg-rtFKFGAl0OhHKdjE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rtFKFGAl0OhHKdjE .icon-shape .label rect,#mermaid-svg-rtFKFGAl0OhHKdjE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rtFKFGAl0OhHKdjE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rtFKFGAl0OhHKdjE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rtFKFGAl0OhHKdjE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} DeltaNet 信息瓶颈
历史长度 L
压缩进 S(128×128×32/层)
可精确恢复的细节 ∝ 常数
L 越大,细节/总信息 比例越小
十二、任务建模:什么任务真的需要多少上下文
把服务端数字(第四章、第五章)和模型能力(第六章、第 10 节)放一边,回到一个朴素问题:一个具体任务,到底需要多长的上下文? 对日常工程与文档工作做粗略的 token 预算可以给出量级参考:
| 任务类型 | 典型上下文占用(token) | 甜点内? |
|---|---|---|
| 单文件代码审查 / 修改 | 5K~30K | 远低于 |
| 多文件模块重构 | 30K~80K | 低于 |
| 大型代码库全局检索 / 全文问答 | 100K~250K | 甜点内 |
| 长文档(书/技术手册)理解 | 100K~300K | 甜点内 |
| 整仓库静态分析与长程工程会话 | 250K~500K | 临界 |
| 多日、多会话的复合长任务 | 通过记忆承接,不压在窗口上 | 见第八节 |
#mermaid-svg-mkYeYfGnzad0lJ1Z{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mkYeYfGnzad0lJ1Z .error-icon{fill:#552222;}#mermaid-svg-mkYeYfGnzad0lJ1Z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mkYeYfGnzad0lJ1Z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .marker.cross{stroke:#333333;}#mermaid-svg-mkYeYfGnzad0lJ1Z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mkYeYfGnzad0lJ1Z p{margin:0;}#mermaid-svg-mkYeYfGnzad0lJ1Z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster-label text{fill:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster-label span{color:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster-label span p{background-color:transparent;}#mermaid-svg-mkYeYfGnzad0lJ1Z .label text,#mermaid-svg-mkYeYfGnzad0lJ1Z span{fill:#333;color:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .node rect,#mermaid-svg-mkYeYfGnzad0lJ1Z .node circle,#mermaid-svg-mkYeYfGnzad0lJ1Z .node ellipse,#mermaid-svg-mkYeYfGnzad0lJ1Z .node polygon,#mermaid-svg-mkYeYfGnzad0lJ1Z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .rough-node .label text,#mermaid-svg-mkYeYfGnzad0lJ1Z .node .label text,#mermaid-svg-mkYeYfGnzad0lJ1Z .image-shape .label,#mermaid-svg-mkYeYfGnzad0lJ1Z .icon-shape .label{text-anchor:middle;}#mermaid-svg-mkYeYfGnzad0lJ1Z .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .rough-node .label,#mermaid-svg-mkYeYfGnzad0lJ1Z .node .label,#mermaid-svg-mkYeYfGnzad0lJ1Z .image-shape .label,#mermaid-svg-mkYeYfGnzad0lJ1Z .icon-shape .label{text-align:center;}#mermaid-svg-mkYeYfGnzad0lJ1Z .node.clickable{cursor:pointer;}#mermaid-svg-mkYeYfGnzad0lJ1Z .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .arrowheadPath{fill:#333333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mkYeYfGnzad0lJ1Z .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mkYeYfGnzad0lJ1Z .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mkYeYfGnzad0lJ1Z .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster text{fill:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z .cluster span{color:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mkYeYfGnzad0lJ1Z .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mkYeYfGnzad0lJ1Z rect.text{fill:none;stroke-width:0;}#mermaid-svg-mkYeYfGnzad0lJ1Z .icon-shape,#mermaid-svg-mkYeYfGnzad0lJ1Z .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mkYeYfGnzad0lJ1Z .icon-shape p,#mermaid-svg-mkYeYfGnzad0lJ1Z .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mkYeYfGnzad0lJ1Z .icon-shape .label rect,#mermaid-svg-mkYeYfGnzad0lJ1Z .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mkYeYfGnzad0lJ1Z .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mkYeYfGnzad0lJ1Z .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mkYeYfGnzad0lJ1Z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务分布示意
小型任务(<30K)多数
中型(30-100K)常见
大型(100-250K)少数但真实
极端(>400K 或 1M)极少
结论有两个层面:
- 多数任务在 200K 内就足够。把上限设在 256K 并没牺牲什么------它覆盖了上表 90% 以上的场景。
- 真正「必须用上 400K+」的任务,往往是资源与能力的边际案例 。对它们,甜点理论给出的建议不是「硬抗」,而是「拆分 + 记忆」:把长会话拆成阶段,用外部结构化记忆(目标、计划、进度、经验)承接跨阶段状态(这正是 llmx 工程实践与配套插件持久化记忆所做的)。把 1M 的承诺,组织成一个 256K 会话加一个无限延伸的记忆层,比在一个 1M 会话里硬找东西更可靠、更便宜。
十三、GQA 的「压缩比」:头数算术不是免费的
我们在第三章算 KV 体积时,用的 KV 头数是 2------这是 GQA 写给长上下文的情书。如果不是 GQA,而是最朴素的 MHA(每个查询头一个 KV 头),这棵树的形状会完全不同。
Qwen3.6-35B-A3B 的注意力参数是:16 个查询头、2 个 KV 头、256 头维度。GQA 把「每查询头一份 KV」压缩成「8 个查询头共享一份 KV」------8:1 的压缩比。用 MHA 的公式重算一下 KV 体积:
MHA: 10×16×L×256×2×4 B=L×327,680 BMHA:\ \ 10 \times 16 \times L \times 256 \times 2 \times 4\ \text{B} = L \times 327{,}680\ \text{B}MHA: 10×16×L×256×2×4 B=L×327,680 B
对比 GQA:L×40,960 BL \times 40{,}960\ \text{B}L×40,960 B。MHA 的 KV 体积是 GQA 的 8 倍。 这 8 倍正是上下文套餐里最大的单笔折扣------如果 Qwen3.6 的 10 层全注意力采用 MHA,那么 262144 上下文需要 85.9GB 的 KV,直接让这台 64GB 内存的机器失去工作能力。
#mermaid-svg-3qLfhDdCHlM85O51{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3qLfhDdCHlM85O51 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3qLfhDdCHlM85O51 .error-icon{fill:#552222;}#mermaid-svg-3qLfhDdCHlM85O51 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3qLfhDdCHlM85O51 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3qLfhDdCHlM85O51 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3qLfhDdCHlM85O51 .marker.cross{stroke:#333333;}#mermaid-svg-3qLfhDdCHlM85O51 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3qLfhDdCHlM85O51 p{margin:0;}#mermaid-svg-3qLfhDdCHlM85O51 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} KV 体积:MHA vs GQA(16→2 头,8:1 压缩)------同样模型同样上下文 0200000262144400000 160140120100806040200 GB
但「压缩比不免费」。查询头共享 KV 头意味着:不同查询头从同一份键值里提取信息,各自的匹配能力被绑定------8 个查询头看同一份记忆,能压出的独立表征变少。GQA 是「用表达能力换内存/带宽」的工程折中,就像 DeltaNet 是「用精确回忆换 O(1) 状态」一样。这两个折中叠加,才是 Qwen3.6 能在个人电脑上把 262K 当日常窗口的结构原因:
#mermaid-svg-gh6R9gS34EFm67vB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gh6R9gS34EFm67vB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gh6R9gS34EFm67vB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gh6R9gS34EFm67vB .error-icon{fill:#552222;}#mermaid-svg-gh6R9gS34EFm67vB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gh6R9gS34EFm67vB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gh6R9gS34EFm67vB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gh6R9gS34EFm67vB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gh6R9gS34EFm67vB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gh6R9gS34EFm67vB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gh6R9gS34EFm67vB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gh6R9gS34EFm67vB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gh6R9gS34EFm67vB .marker.cross{stroke:#333333;}#mermaid-svg-gh6R9gS34EFm67vB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gh6R9gS34EFm67vB p{margin:0;}#mermaid-svg-gh6R9gS34EFm67vB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gh6R9gS34EFm67vB .cluster-label text{fill:#333;}#mermaid-svg-gh6R9gS34EFm67vB .cluster-label span{color:#333;}#mermaid-svg-gh6R9gS34EFm67vB .cluster-label span p{background-color:transparent;}#mermaid-svg-gh6R9gS34EFm67vB .label text,#mermaid-svg-gh6R9gS34EFm67vB span{fill:#333;color:#333;}#mermaid-svg-gh6R9gS34EFm67vB .node rect,#mermaid-svg-gh6R9gS34EFm67vB .node circle,#mermaid-svg-gh6R9gS34EFm67vB .node ellipse,#mermaid-svg-gh6R9gS34EFm67vB .node polygon,#mermaid-svg-gh6R9gS34EFm67vB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gh6R9gS34EFm67vB .rough-node .label text,#mermaid-svg-gh6R9gS34EFm67vB .node .label text,#mermaid-svg-gh6R9gS34EFm67vB .image-shape .label,#mermaid-svg-gh6R9gS34EFm67vB .icon-shape .label{text-anchor:middle;}#mermaid-svg-gh6R9gS34EFm67vB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gh6R9gS34EFm67vB .rough-node .label,#mermaid-svg-gh6R9gS34EFm67vB .node .label,#mermaid-svg-gh6R9gS34EFm67vB .image-shape .label,#mermaid-svg-gh6R9gS34EFm67vB .icon-shape .label{text-align:center;}#mermaid-svg-gh6R9gS34EFm67vB .node.clickable{cursor:pointer;}#mermaid-svg-gh6R9gS34EFm67vB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gh6R9gS34EFm67vB .arrowheadPath{fill:#333333;}#mermaid-svg-gh6R9gS34EFm67vB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gh6R9gS34EFm67vB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gh6R9gS34EFm67vB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gh6R9gS34EFm67vB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gh6R9gS34EFm67vB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gh6R9gS34EFm67vB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gh6R9gS34EFm67vB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gh6R9gS34EFm67vB .cluster text{fill:#333;}#mermaid-svg-gh6R9gS34EFm67vB .cluster span{color:#333;}#mermaid-svg-gh6R9gS34EFm67vB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gh6R9gS34EFm67vB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gh6R9gS34EFm67vB rect.text{fill:none;stroke-width:0;}#mermaid-svg-gh6R9gS34EFm67vB .icon-shape,#mermaid-svg-gh6R9gS34EFm67vB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gh6R9gS34EFm67vB .icon-shape p,#mermaid-svg-gh6R9gS34EFm67vB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gh6R9gS34EFm67vB .icon-shape .label rect,#mermaid-svg-gh6R9gS34EFm67vB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gh6R9gS34EFm67vB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gh6R9gS34EFm67vB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gh6R9gS34EFm67vB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 两个「用能力换资源」的取舍叠加
GQA 8:1:KV 缩到 1/8
(查询精度小损)
DeltaNet 30/40 层:KV 变成 O(1) 状态
(精确回忆小损)
262K 日常可行的总 KV:10.74GB
这对甜点区间的启示是:模型的架构本身就在定义「它的上下文应该怎么花」。 Qwen3.6 把 75% 的层设计成 O(1)、25% 的层保持线性记忆,并在 2^18(262144)处刻下训练窗口上界------它的一切参数都指向「在 256K 上下最划算」。工程上把工作区对齐这个值,是在顺着架构的纹理做预算,而不是跟它对抗。
十四、batch 场景下的上下文:为什么「人均预算」进一步收紧
llmx 的多序列 API(批量推理)提供了一个容易被忽略的视角:上下文预算不是给「一个会话」的,而是给「一个进程同时承载的所有会话」的。
llmx 的批量路径为每个序列维护独立的 KV 与状态缓存(推理引擎.cpp:批量缓存初始化 8 份),并刻意把批量 KV 上下文设为 2048 (而非 262144)------因为 8 份 × 262144 的 KV 会超出 85GB 虚拟内存。这是内存层的直接现实:上下文是独占资源,服务端多序列并行时,窗口预算被序列数瓜分。
#mermaid-svg-UGEm566Zk9HN3JD7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UGEm566Zk9HN3JD7 .error-icon{fill:#552222;}#mermaid-svg-UGEm566Zk9HN3JD7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UGEm566Zk9HN3JD7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UGEm566Zk9HN3JD7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UGEm566Zk9HN3JD7 .marker.cross{stroke:#333333;}#mermaid-svg-UGEm566Zk9HN3JD7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UGEm566Zk9HN3JD7 p{margin:0;}#mermaid-svg-UGEm566Zk9HN3JD7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster-label text{fill:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster-label span{color:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster-label span p{background-color:transparent;}#mermaid-svg-UGEm566Zk9HN3JD7 .label text,#mermaid-svg-UGEm566Zk9HN3JD7 span{fill:#333;color:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 .node rect,#mermaid-svg-UGEm566Zk9HN3JD7 .node circle,#mermaid-svg-UGEm566Zk9HN3JD7 .node ellipse,#mermaid-svg-UGEm566Zk9HN3JD7 .node polygon,#mermaid-svg-UGEm566Zk9HN3JD7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UGEm566Zk9HN3JD7 .rough-node .label text,#mermaid-svg-UGEm566Zk9HN3JD7 .node .label text,#mermaid-svg-UGEm566Zk9HN3JD7 .image-shape .label,#mermaid-svg-UGEm566Zk9HN3JD7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-UGEm566Zk9HN3JD7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UGEm566Zk9HN3JD7 .rough-node .label,#mermaid-svg-UGEm566Zk9HN3JD7 .node .label,#mermaid-svg-UGEm566Zk9HN3JD7 .image-shape .label,#mermaid-svg-UGEm566Zk9HN3JD7 .icon-shape .label{text-align:center;}#mermaid-svg-UGEm566Zk9HN3JD7 .node.clickable{cursor:pointer;}#mermaid-svg-UGEm566Zk9HN3JD7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UGEm566Zk9HN3JD7 .arrowheadPath{fill:#333333;}#mermaid-svg-UGEm566Zk9HN3JD7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UGEm566Zk9HN3JD7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UGEm566Zk9HN3JD7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UGEm566Zk9HN3JD7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UGEm566Zk9HN3JD7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UGEm566Zk9HN3JD7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster text{fill:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 .cluster span{color:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UGEm566Zk9HN3JD7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UGEm566Zk9HN3JD7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-UGEm566Zk9HN3JD7 .icon-shape,#mermaid-svg-UGEm566Zk9HN3JD7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UGEm566Zk9HN3JD7 .icon-shape p,#mermaid-svg-UGEm566Zk9HN3JD7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UGEm566Zk9HN3JD7 .icon-shape .label rect,#mermaid-svg-UGEm566Zk9HN3JD7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UGEm566Zk9HN3JD7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UGEm566Zk9HN3JD7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UGEm566Zk9HN3JD7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 批量推理的 KV 预算
B 个并发序列
每序列独立 KV/状态
总 KV = B × 单序列 KV
窗口上限 ∝ 可用内存 / B
生产 API 服务(vLLM、TensorRT-LLM 等)同样受此约束:P50~P99 的长上下文请求会抬高整机的 KV 峰值,挤压其他请求的批大小与调度。 于是服务商通常会为长上下文设置配额、按 token 计费、或者用连续批处理在请求间共享 KV 页。
这对用户侧的结论直白:把每个会话都开成 1M,等于在说服服务商「你的机器只能服务很短的批」------最终要么被限流,要么被按更长单价计费。 甜点区间的存在,让单请求的内存足迹保持小到服务商愿意以常规批大小处理,这本身就是成本结构的组成部分。「人均上下文」比「名义上下文」更能代表真实系统里可用预算的形状。
十五、与自动压缩/缓存复用的工程交互
最后,把甜点区间放回它所在的生产系统。以配套插件(opencode-goal)的自动压缩机制为例:它监测每轮实际提交给模型的上下文大小 (按输入缓存口径 cache.read + cache.write 统计),一旦达到配置的 context_limit(默认 256000),在空闲时触发 summarize 压缩,把超限历史合并成摘要,再继续工作。
#mermaid-svg-p99Qh6g2XcQ4p9Qc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .error-icon{fill:#552222;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .marker.cross{stroke:#333333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc p{margin:0;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster-label text{fill:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster-label span{color:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster-label span p{background-color:transparent;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .label text,#mermaid-svg-p99Qh6g2XcQ4p9Qc span{fill:#333;color:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .node rect,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node circle,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node ellipse,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node polygon,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .rough-node .label text,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node .label text,#mermaid-svg-p99Qh6g2XcQ4p9Qc .image-shape .label,#mermaid-svg-p99Qh6g2XcQ4p9Qc .icon-shape .label{text-anchor:middle;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .rough-node .label,#mermaid-svg-p99Qh6g2XcQ4p9Qc .node .label,#mermaid-svg-p99Qh6g2XcQ4p9Qc .image-shape .label,#mermaid-svg-p99Qh6g2XcQ4p9Qc .icon-shape .label{text-align:center;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .node.clickable{cursor:pointer;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .arrowheadPath{fill:#333333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-p99Qh6g2XcQ4p9Qc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p99Qh6g2XcQ4p9Qc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster text{fill:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .cluster span{color:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-p99Qh6g2XcQ4p9Qc rect.text{fill:none;stroke-width:0;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .icon-shape,#mermaid-svg-p99Qh6g2XcQ4p9Qc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .icon-shape p,#mermaid-svg-p99Qh6g2XcQ4p9Qc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .icon-shape .label rect,#mermaid-svg-p99Qh6g2XcQ4p9Qc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p99Qh6g2XcQ4p9Qc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-p99Qh6g2XcQ4p9Qc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-p99Qh6g2XcQ4p9Qc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
每轮提交前记录输入上下文
cache.read + cache.write
>= context_limit?
正常续跑
触发 summarize(auto-compact)
上下文回落到甜点内
续跑
几个值得明确的工程要点:
- 压缩不删数据,只合并表述 :历史仍在会话内(以摘要形式)、仍在插件持久化记忆里。长程任务的关键状态通过计划/进度/经验文件续接,不因会话压缩而丢失。这化解了「长任务怕压缩」的担忧------前提是恰当地把状态外置。
- 阈值是可调参数,不是戒律:初始化 options 可设默认,会话中可动态覆盖。甜点区间给出的是一组「可靠起步点」,而不是「禁止越界」。需要极端长程时,调高上限是合理的;需要保守省成本时,调低同样合理。
- 缓存口径下发生的事:API 计费中 cache.read(命中缓存)远比 cache.write(新写入)便宜。把上下文控制在甜点内,等于让每次缓存命中率最高、写入量最小------这是成本侧另一层(未展开)的增益。
#mermaid-svg-oE0uj6RzN3i3a2ot{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oE0uj6RzN3i3a2ot .error-icon{fill:#552222;}#mermaid-svg-oE0uj6RzN3i3a2ot .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oE0uj6RzN3i3a2ot .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oE0uj6RzN3i3a2ot .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oE0uj6RzN3i3a2ot .marker.cross{stroke:#333333;}#mermaid-svg-oE0uj6RzN3i3a2ot svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oE0uj6RzN3i3a2ot p{margin:0;}#mermaid-svg-oE0uj6RzN3i3a2ot .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster-label text{fill:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster-label span{color:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster-label span p{background-color:transparent;}#mermaid-svg-oE0uj6RzN3i3a2ot .label text,#mermaid-svg-oE0uj6RzN3i3a2ot span{fill:#333;color:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot .node rect,#mermaid-svg-oE0uj6RzN3i3a2ot .node circle,#mermaid-svg-oE0uj6RzN3i3a2ot .node ellipse,#mermaid-svg-oE0uj6RzN3i3a2ot .node polygon,#mermaid-svg-oE0uj6RzN3i3a2ot .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oE0uj6RzN3i3a2ot .rough-node .label text,#mermaid-svg-oE0uj6RzN3i3a2ot .node .label text,#mermaid-svg-oE0uj6RzN3i3a2ot .image-shape .label,#mermaid-svg-oE0uj6RzN3i3a2ot .icon-shape .label{text-anchor:middle;}#mermaid-svg-oE0uj6RzN3i3a2ot .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oE0uj6RzN3i3a2ot .rough-node .label,#mermaid-svg-oE0uj6RzN3i3a2ot .node .label,#mermaid-svg-oE0uj6RzN3i3a2ot .image-shape .label,#mermaid-svg-oE0uj6RzN3i3a2ot .icon-shape .label{text-align:center;}#mermaid-svg-oE0uj6RzN3i3a2ot .node.clickable{cursor:pointer;}#mermaid-svg-oE0uj6RzN3i3a2ot .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oE0uj6RzN3i3a2ot .arrowheadPath{fill:#333333;}#mermaid-svg-oE0uj6RzN3i3a2ot .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oE0uj6RzN3i3a2ot .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oE0uj6RzN3i3a2ot .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oE0uj6RzN3i3a2ot .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oE0uj6RzN3i3a2ot .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oE0uj6RzN3i3a2ot .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster text{fill:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot .cluster span{color:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oE0uj6RzN3i3a2ot .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oE0uj6RzN3i3a2ot rect.text{fill:none;stroke-width:0;}#mermaid-svg-oE0uj6RzN3i3a2ot .icon-shape,#mermaid-svg-oE0uj6RzN3i3a2ot .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oE0uj6RzN3i3a2ot .icon-shape p,#mermaid-svg-oE0uj6RzN3i3a2ot .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oE0uj6RzN3i3a2ot .icon-shape .label rect,#mermaid-svg-oE0uj6RzN3i3a2ot .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oE0uj6RzN3i3a2ot .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oE0uj6RzN3i3a2ot .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oE0uj6RzN3i3a2ot :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 压缩前后对比------示意
压缩前:上下文 262K ≈ model 上限
压缩后:上下文 < 100K
KV 体积:10.7GB → <4GB(f32)
prefill O(L²) 与 decode O(L) 同步回落
这一节想表达的最终观点是 :甜点区间不只是「挑一个好看的默认值」。它是一套工程哲学的起点------让上下文窗口服务于任务,而不是让任务迁就上下文窗口。 深窗极限用在刀刃上(长程记忆/精读),普通工作量走甜点,既省成本,又避免命中能力衰减曲线。
十六、甜点值之间的取舍:该选哪一个
现在把五个候选值放在同一张决策表里,按不同的优先维度给建议:
| 候选值 | 位置编码 | KV(f32) | 主要优点 | 适用场景 |
|---|---|---|---|---|
| 200000 | 训练窗内 76% | 8.19GB | 最省内存/带宽;数字好记 | 16GB 预算、保守成本、多数任务足够 |
| 204800 | 训练窗内 78% | 8.39GB | 二进制对齐,分页友好 | 在意二进制边界/字面「200K」 |
| 256000 | 训练窗内 98% | 10.49GB | 十进制易读;覆盖几乎所有任务 | 一般的默认推荐值 |
| 262144 | 训练窗上界 100% | 10.74GB | 模型原生窗口,零外推 | 标称就是 2^18 的模型 |
| 400000 | 外推区 153% | 16.38GB | 真·超大任务 | 显存/内存富余且确需更长的场景 |
#mermaid-svg-6laPflGnenSC751e{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6laPflGnenSC751e .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6laPflGnenSC751e .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6laPflGnenSC751e .error-icon{fill:#552222;}#mermaid-svg-6laPflGnenSC751e .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6laPflGnenSC751e .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6laPflGnenSC751e .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6laPflGnenSC751e .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6laPflGnenSC751e .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6laPflGnenSC751e .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6laPflGnenSC751e .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6laPflGnenSC751e .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6laPflGnenSC751e .marker.cross{stroke:#333333;}#mermaid-svg-6laPflGnenSC751e svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6laPflGnenSC751e p{margin:0;}#mermaid-svg-6laPflGnenSC751e .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6laPflGnenSC751e .cluster-label text{fill:#333;}#mermaid-svg-6laPflGnenSC751e .cluster-label span{color:#333;}#mermaid-svg-6laPflGnenSC751e .cluster-label span p{background-color:transparent;}#mermaid-svg-6laPflGnenSC751e .label text,#mermaid-svg-6laPflGnenSC751e span{fill:#333;color:#333;}#mermaid-svg-6laPflGnenSC751e .node rect,#mermaid-svg-6laPflGnenSC751e .node circle,#mermaid-svg-6laPflGnenSC751e .node ellipse,#mermaid-svg-6laPflGnenSC751e .node polygon,#mermaid-svg-6laPflGnenSC751e .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6laPflGnenSC751e .rough-node .label text,#mermaid-svg-6laPflGnenSC751e .node .label text,#mermaid-svg-6laPflGnenSC751e .image-shape .label,#mermaid-svg-6laPflGnenSC751e .icon-shape .label{text-anchor:middle;}#mermaid-svg-6laPflGnenSC751e .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6laPflGnenSC751e .rough-node .label,#mermaid-svg-6laPflGnenSC751e .node .label,#mermaid-svg-6laPflGnenSC751e .image-shape .label,#mermaid-svg-6laPflGnenSC751e .icon-shape .label{text-align:center;}#mermaid-svg-6laPflGnenSC751e .node.clickable{cursor:pointer;}#mermaid-svg-6laPflGnenSC751e .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6laPflGnenSC751e .arrowheadPath{fill:#333333;}#mermaid-svg-6laPflGnenSC751e .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6laPflGnenSC751e .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6laPflGnenSC751e .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6laPflGnenSC751e .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6laPflGnenSC751e .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6laPflGnenSC751e .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6laPflGnenSC751e .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6laPflGnenSC751e .cluster text{fill:#333;}#mermaid-svg-6laPflGnenSC751e .cluster span{color:#333;}#mermaid-svg-6laPflGnenSC751e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6laPflGnenSC751e .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6laPflGnenSC751e rect.text{fill:none;stroke-width:0;}#mermaid-svg-6laPflGnenSC751e .icon-shape,#mermaid-svg-6laPflGnenSC751e .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6laPflGnenSC751e .icon-shape p,#mermaid-svg-6laPflGnenSC751e .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6laPflGnenSC751e .icon-shape .label rect,#mermaid-svg-6laPflGnenSC751e .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6laPflGnenSC751e .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6laPflGnenSC751e .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6laPflGnenSC751e :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
模型原生 2^18
通用默认
确实需要 400K
内存预算 ≤ 32GB 且<200K 内够用?
200000 / 204800
需要 200-400K 的能力?
256000 / 262144
262144
256000
400000 + KV 量化
需要特别强调:256000 与 262144 的差距仅 1.6%,物理上几乎无差别。256000 的优势在「十进制、好写、好念、好配置」;262144 的优势在「钉在模型原生窗」,完全规避 RoPE 外推。实践中二者可互换------这也是为什么插件默认取 256000、文档里又保留 262144 作为「原生值」的表态逻辑。真正拉开差距的是 200K 档与 400K 档:一个偏省、一个偏能,中间 256K 档才是多数系统的平衡点。
16.1 一个具体的算例:20K 与 256K 的实际代价差
把上面所有公式收紧成一个可复算的实例,能让「甜点」的含义落到数字上。设一次会话在某个时刻的上下文为 LLL,输出再生成 G=2000G=2000G=2000 个 token;只算 GQA 的 KV 读取与输入计费两项(权重项每 token 相同,比较中抵消):
| 当前上下文 L | KV 读取/轮(GQA,f32) | 2000 步输出 KV 读取 | prefill(输入)相对量(∝L²) |
|---|---|---|---|
| 20000 | 0.82GB | ≈ 1.64TB | 1(基准) |
| 100000 | 4.10GB | ≈ 8.19TB | 25 |
| 256000 | 10.49GB | ≈ 20.98TB | 164 |
| 400000 | 16.38GB | ≈ 32.77TB | 400 |
(KV 读取/轮 = L×40,960L \times 40{,}960L×40,960 B;生成 2000 步累计 = 每步值 × 2000。它不代表「一定要搬这么多字节」,在同一注意力实现里,这些字节从内存到寄存器的往返确实会发生------这正是长上下文 generation 的真实带宽账单。)
单看这组数就能理解生产环境里一个常被忽略的暗坑:上下文一长,真正吃掉预算的往往不是「权重」而是「回顾」------是每一次解码都要把历史再扫一遍。 而把 L 控制在甜点内,不影响任务完成度,却直接把这个「回顾税」压在一档可承担的规模。这就是甜点区间作为工程默认的最终理由:它同时约束了 KV 的瞬时占用、解码的逐轮读取、以及 prefill 的二次方,三本账一起算,甜点值才成立。
十七、结论
把成本与原理两条线合起来,可以给出一个冷静的判断框架:
- 解码器成本由每 token 的字节搬运量决定,它 = 常数权重项 + 线性上下文项(KV 读取)。长度越长,上下文项占比越高,最终主导一切。
- 能力在长上下文下结构性衰减:注意力摊薄、RoPE 外推、线性注意力的 O(1) 信息瓶颈,三者共同决定了「支持 1M」≠「1M 都好用」。
- 200000 / 204800 / 256000 / 262144 / 400000 正好是人类语言(十进制)与机器本性(二进制、2^18 原生窗口)的交叉带,是成本可承受 ∩ 能力未崩 ∩ 经济可控三条件的共同区域。
- 262144 的特殊性:它是 Qwen3.6-35B-A3B 的原生训练窗口,工作区钉在该值下可完全规避位置外推;256000 是它的工程化易读版本。
- 默认取甜点值而非标称最大值,配合「软压缩 + 外部记忆 + 动态调档」,是对长上下文最诚实、最高效的使用方式。
1M 上下文是很好的「容量承诺」,但一个负责任的工程系统应当回答的不是「最长能用多少」,而是「在这个长度下,每一 token 花得值不值」。甜点区间的意义就在于此:它把有限的算力预算,花在能力最有效的那段上下文上。
十八、讨论:几个值得澄清的误解
围绕「长上下文」有太多被营销话术包装的表述,站在引擎实现的角度把它们逐条澄清,比争论窗口数字本身更有价值。
误解一:上下文等于记忆。 模型处理 1M 上下文,不等于「记住」了 1M 的信息。KV 缓存只是把原始键值放在那里,每次解码都要重新读取、重新计算注意力;DeltaNet 的 SSS 矩阵则是有损压缩。记忆的本质是「可检索」,而检索本身的成本随长度线性、prefill 呈平方。上下文是一种「可用预算」,不是「耐用资产」。
误解二:窗口越大,智能越强。 上下文影响的是「处理多长信息」的上限,不是推理能力本身。从第五至第六节的分解可以看到,把窗口做大,增加的主要是 GQA 层来回扫描历史的成本;模型每层参数不因此变多,能力曲线反而因注意力摊薄、RoPE 外推而走低。「更长」与「更强」是两个正交的轴。
误解三:KV 量化可以「白嫖」长上下文。 量化帮你把常数因子砍下去(f32→fp16→8bit),但长度因子线性不变。1M 上下文的体积、带宽与 prefill 二次方全部保留。量化是「降档运行」的调剂,不是「打破物理」的开关------它在甜点区间里让中低端硬件也能舒适工作,但它不会让 1M 变得「便宜到可以整天用」。
误解四:框架支持 400K,默认就该用 400K。 支持上限与默认档位是两个决策。默认档位应回答「多数任务的最优工作区在哪」,而不是「模型最多能到哪」。在 llmx 与配套实践中,默认取 256000 正是基于「覆盖率近 100% + 带宽可控 + 好写好念」的综合决策;400K 甚至 1M 作为按需档保留,而不是默认推进。
误解五:压缩/摘要会「丢失任务」。 这只在不把状态外置时成立。甜点区间的完整配套是把关键状态写入外部持久化记忆(目标、计划、进度、经验),压缩再狠也不丢长程任务的定义与中间产物。共享窗口的上下文是易失的,磁盘上的状态才是任务的锚点。
#mermaid-svg-2t0UrXqYDfDLMUL2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2t0UrXqYDfDLMUL2 .error-icon{fill:#552222;}#mermaid-svg-2t0UrXqYDfDLMUL2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2t0UrXqYDfDLMUL2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .marker.cross{stroke:#333333;}#mermaid-svg-2t0UrXqYDfDLMUL2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2t0UrXqYDfDLMUL2 p{margin:0;}#mermaid-svg-2t0UrXqYDfDLMUL2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster-label text{fill:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster-label span{color:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster-label span p{background-color:transparent;}#mermaid-svg-2t0UrXqYDfDLMUL2 .label text,#mermaid-svg-2t0UrXqYDfDLMUL2 span{fill:#333;color:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .node rect,#mermaid-svg-2t0UrXqYDfDLMUL2 .node circle,#mermaid-svg-2t0UrXqYDfDLMUL2 .node ellipse,#mermaid-svg-2t0UrXqYDfDLMUL2 .node polygon,#mermaid-svg-2t0UrXqYDfDLMUL2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .rough-node .label text,#mermaid-svg-2t0UrXqYDfDLMUL2 .node .label text,#mermaid-svg-2t0UrXqYDfDLMUL2 .image-shape .label,#mermaid-svg-2t0UrXqYDfDLMUL2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2t0UrXqYDfDLMUL2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .rough-node .label,#mermaid-svg-2t0UrXqYDfDLMUL2 .node .label,#mermaid-svg-2t0UrXqYDfDLMUL2 .image-shape .label,#mermaid-svg-2t0UrXqYDfDLMUL2 .icon-shape .label{text-align:center;}#mermaid-svg-2t0UrXqYDfDLMUL2 .node.clickable{cursor:pointer;}#mermaid-svg-2t0UrXqYDfDLMUL2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .arrowheadPath{fill:#333333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2t0UrXqYDfDLMUL2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2t0UrXqYDfDLMUL2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2t0UrXqYDfDLMUL2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster text{fill:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 .cluster span{color:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2t0UrXqYDfDLMUL2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2t0UrXqYDfDLMUL2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2t0UrXqYDfDLMUL2 .icon-shape,#mermaid-svg-2t0UrXqYDfDLMUL2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2t0UrXqYDfDLMUL2 .icon-shape p,#mermaid-svg-2t0UrXqYDfDLMUL2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2t0UrXqYDfDLMUL2 .icon-shape .label rect,#mermaid-svg-2t0UrXqYDfDLMUL2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2t0UrXqYDfDLMUL2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2t0UrXqYDfDLMUL2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2t0UrXqYDfDLMUL2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 误解 → 澄清
误解:上下文=记忆
事实:可检索≠已记住
误解:窗口大=更强
事实:更长≠更强
误解:量化=免费长上下文
事实:只砍常数,不砍长度
误解:支持400K就该用400K
事实:默认档=最优工作区
误解:压缩=丢任务
事实:外置记忆保任务
这些澄清并不否定长上下文的价值------1M 窗口对特定任务(超大文档精读、全仓库检索、复杂推理链)是有用的工具。它否定的是把「标称窗口」误当成「日常工作区」的使用方式。甜点区间所划定的,正是在「工具可用」与「日常划算」之间的那条理性分界线。
附:文中所用 llmx 数据出处(可复现)
| 数据 | 数值 | 出处 |
|---|---|---|
| 模型 | Qwen3.6-35B-A3B(qwen35moe) | README.md / src/模型/模型配置.cpp |
| 层数 | 40(10 全注意力 + 30 DeltaNet) | 模型配置.cpp block_count / full_attention_interval |
| KV 头数 / 头维度 | 2 / 256 | 模型配置.cpp attention.head_count_kv / key_length |
| 上下文窗口 | 262144 | 模型配置.cpp context_length 默认值 |
| RoPE 频率基数 | 10^7 | 模型配置.cpp rope.freq_base |
| 专家 / 激活 | 256 / 8+1 | 模型配置.cpp expert_count / expert_used_count |
| KV 缓存 = 层×头×上下文×维×2×4B | 262K→10.74GB | src/推理/KV缓存.cpp / docs/04 |
| DeltaNet 状态 32×128² | 2MB/层,30 层≈60MB | docs/04-算子-GatedDeltaNet.md |
| 每 token 权重读取 | 2.74GB | docs/09-性能优化旅程.md 四·4.1 |
| 内存带宽 / 物理上限 | 42.6GB/s / 16 tok/s | docs/09 三·3.2 / 四·4.2 |
| GQA 逐位置点积读取全部历史 | O(L) | src/内核/注意力/GQA注意力朴素.cpp |
| DeltaNet O(1) 状态递推 | S'=S·e^g+k⊗(v−S·k)·β | src/内核/DeltaNet/DeltaNet朴素.cpp / docs/04 |
本文不声称提供任何新的实验数据,仅以 llmx 已实测的引擎数字与公开的注意力复杂度结论为依据做定量整理;所有计算均可由上述源文件与公式复现。