清华大学和香港中文大学的研究人员开源了 AKV,这是一个面向 LLM 智能体 KV 缓存工程的服务系统。它不总结旧历史,而是让智能体丢弃选定的 KV 缓存条目并继续复用其余部分。在 3 个模型和 4 个智能体基准测试上,平均成本下降 27.7%,平均任务得分提升 1.7 分。代码采用 Apache-2.0 许可,基于 SGLang 构建。

TL;DR

是什么:服务系统加策略库,不含权重。在 GPT-OSS-120B(5.1B 激活)、MiniMax-M2.7(总参数 230B,10B 激活)和 MiroThinker-1.7-Mini(总参数 30B,3B 激活)上测试。

运行环境:通过 SGLang 在 NVIDIA GPU 上运行。论文使用 8 块 A800-80GB GPU,BF16 精度。快速启动可在 2 块 GPU 上服务 GPT-OSS-120B(张量并行 2)。

性能:相比阈值摘要,平均成本降低 27.7%,平均得分提升 1.7 分。

最佳:GPT-OSS-120B 在 SWE-bench Verified 上:每任务成本从 20.0 美分降至 9.7 美分,得分从 40.0 提升至 43.2。

最差:MiniMax-M2.7 在 BrowseComp-Plus 上得分为 58.9,比 Text Engineering 的 62.3 低 3.4 分。

什么是缓存工程,它与上下文工程有何不同?

AKV 是清华大学的服务系统,让 LLM 智能体丢弃并重新定位自己的 KV 缓存。

上下文工程会裁剪或总结文本历史。编辑该前缀会使后续所有 KV 状态失效,保留的后缀必须重新预填充。因此,执行框架会较晚且激进地进行总结,这可能丢失中间轮次的细节。

缓存工程保持文本轨迹不变,只改变哪些 KV 条目对注意力可见。保留的条目无需重新计算即可复用,它们仍可携带来自被丢弃消息的信息。在论文的成本分析中,KV 缓存读取占总 API 成本的 82.4%。

AKV 如何工作?

AKV 定义了 3 种缓存操作。Append 是新 token 的标准更新。Drop 从未来注意力中移除选定条目而不改变位置。Repos 使用 RoPE 旋转将保留的键重写到位置 0 到 r-1。值保持不变,因此不重新计算隐藏状态。在消融实验中,加入 Repos 将 GPT-OSS-120B 在 BrowseComp-Plus 上的通过率从 55% 提升至 62%。

难点在于服务。相同的 token 在不同操作历史下可能产生不同的缓存状态。简单的 prefix matching 可能复用错误的状态。AKV 扩展了 SGLang 的 radix tree,增加了 drop 和 reposition 节点。只有当没有活跃请求仍需要被丢弃的 KV 时,它才会释放这些 KV。Segment-batch attention 在 1 次 prefill 中恢复被驱逐的状态。

AKV API 长什么样?

该接口是无状态的,且兼容 OpenAI。客户端发送完整消息历史和两个可选字段。drop_message 将触发消息索引映射到要丢弃的消息。reposition 列出在其之后位置会被压缩的索引。

CachePolicy 根据 trigger、selector 和 reposition 规则构建这些字段。内置策略基于轮次、基于 token 或基于模型。CacheTool 让模型自行调用 drop_context。

AKV 在智能体基准测试上表现如何?

主要策略是工具响应滚动丢弃,保留最新的 12 条工具响应。Standard 基线在 96K token 时进行摘要(MiroThinker 为 192K)。Text Engineering 在 48K 时进行摘要。基准测试为 BrowseComp-Plus、GAIA-Text、SWE-bench Verified 和 xbench-DeepSearch-2510。

模型Standard 得分 / 成本Text Eng. 得分 / 成本AKV 得分 / 成本MiniMax-M2.752.4 / 5.052.8 / 5.753.7 / 4.4GPT-OSS-120B51.0 / 11.248.3 / 10.253.1 / 7.3MiroThinker-1.7-Mini44.1 / 20.437.1 / 18.145.8 / 14.8

4 个基准测试的平均通过率(%)和成本(每任务美分)。来源:论文表 1。

AKV 相比 Text Engineering 还将成本降低了 21.9%。准确率差距在长任务运行中显现。根据项目页面,在 BrowseComp-Plus 上,当 token 达到 96K 及以上时,GPT-OSS-120B 使用 AKV 得分为 37%。Standard 得分为 24%,Text Engineering 为 32%。

成本是根据已公布费率估算的 API 等效值。重新定位的 token 按缓存命中费率计费,这是一个刻意保守的选择。

裁剪旧的工具结果 A</button><button class="btn" id="mtp-akv-reset">Reset</button></div>

<div class="cmp" style="margin-top:12px">

<div class="box"><h4>上下文工程(摘要文本)</h4>

<div class="lane" id="mtp-akv-ce"></div>

<div class="meter"><i id="mtp-akv-cem" style="width:0%"></i></div>

重新预填充工作量:0 个块

</div>

<div class="box"><h4>缓存工程(AKV 丢弃)</h4>

<div class="lane" id="mtp-akv-ae"></div>

<div class="meter"><i id="mtp-akv-aem" style="width:0%"></i></div>

重新预填充工作量:0 个块

</div>

</div>

<p class="note" id="mtp-akv-n1">两个智能体都持有一个用户提示、助手轮次和工具结果。按下按钮以移除旧的工具结果 <b>A</b>。</p>

<div class="lg"><span><i style="background:#5a3a6a"></i>用户</span><span><i style="background:#7d2f93"></i>助手</span><span><i style="background:#a64bbd"></i>工具结果</span><span><i style="background:#ffb347"></i>重新计算</span><span><i style="background:#76B900"></i>新轮次</span></div>

</div>

<!-- P2 -->

<div class="panel" id="mtp-akv-p2">

<div class="row">

<button class="btn" data-op="append">1. 追加 D</button>

<button class="btn" data-op="drop">2. 丢弃 B</button>

<button class="btn" data-op="repos">3. 重定位</button>

<button class="btn" data-op="reset2">重置</button>

</div>

<div class="lbl">活跃 KV 缓存(数字 = 位置编码索引)</div>

<div class="lane" id="mtp-akv-ops"></div>

<p class="note" id="mtp-akv-n2">起始状态:token A、B、C 分别位于位置 0、1、2。逐步执行这 3 个操作。</p>

<pre id="mtp-akv-req">{"messages": [...], "drop_message": {}, "reposition": []}</pre>

</div>

<!-- P3 -->

<div class="panel" id="mtp-akv-p3">

<div class="lbl" style="margin-top:0">模型</div>

<div class="row" id="mtp-akv-models"></div>

<div class="lbl">基准测试</div>

<div class="row" id="mtp-akv-bench"></div>

<div class="grid2" style="margin-top:14px">

<div><div class="lbl" style="margin-top:0">通过率(%)· 越高越好</div><div class="bars" id="mtp-akv-sc"></div></div>

<div><div class="lbl" style="margin-top:0">成本(美分/任务)· 越低越好</div><div class="bars" id="mtp-akv-co"></div></div>

</div>

<p class="note" id="mtp-akv-n3"></p>

</div>

<!-- P4 -->

<div class="panel" id="mtp-akv-p4">

<div class="lbl" style="margin-top:0">并发数:<b id="mtp-akv-cv" style="color:#f3eaf6">14</b> · GPT-OSS-120B · 80 个长上下文 SWE-bench Verified 任务 · 8 块 A800 GPU</div>

<input type="range" id="mtp-akv-c" min="0" max="4" step="1" value="3">

<div class="grid2" style="margin-top:12px">

<div><div class="lbl" style="margin-top:0">P95 请求延迟(秒)· 越低越好</div><div class="bars" id="mtp-akv-lat"></div></div>

<div><div class="lbl" style="margin-top:0">输出吞吐量(tokens/s)· 越高越好</div><div class="bars" id="mtp-akv-out"></div></div>

</div>

<div class="stats" style="margin-top:14px">

<div class="stat"><div class="big">1.18x</div><span>输出吞吐量,峰值对比峰值</span></div>

<div class="stat"><div class="big">1.53x</div><span>输入吞吐量,峰值对比峰值</span></div>

<div class="stat"><div class="big">1.51x</div><span>P95 延迟更快,峰值对比峰值</span></div>

<div class="stat"><div class="big">2.849ms</div><span>每个解码步骤的完整注意力(原为 7.082)</span></div>

</div>

<p class="note" id="mtp-akv-n4"></p>

</div>

<!-- P5 -->

<div class="panel" id="mtp-akv-p5">

<ul class="lim" id="mtp-akv-lim">

<li>支持的模型系列较少<em>Drop 和 Repos 已为 Qwen、GPT-OSS 和 MiniMax-M2 文本架构启用。线性注意力模型属于未来工作。</em></li>

<li>仅限自托管<em>你需要自行运行 AKV 服务器。它在 SGLang 基础上扩展了缓存操作支持。</em></li>

<li>自报结果,单一硬件配置<em>所有结果均来自作者,在 8 块 A800-80GB GPU 上以 BF16 运行。</em></li>

<li>测量窗口不同<em>高并发 AKV 运行以完成前 30 个任务为测量窗口。标准运行使用 1 小时窗口。</em></li>

<li>并非所有基准测试都有提升<em>MiniMax-M2.7 在 BrowseComp-Plus 上使用 AKV 得分为 58.9,低于 Text Engineering 的 62.3。</em></li>

<li>丢弃推理缓存会带来损失<em>在 SWE-bench Verified 上,丢弃推理缓存降至 36.5,两者都丢弃降至 34.5,而仅丢弃工具为 41.0。</em></li>

</ul>

<p class="note">点击一行以展开。</p>

</div>

<div class="ft">

<span>来源:<a href="https://arxiv.org/abs/2610.28577" target="_blank" rel="noopener">论文</a> · <a href="https://github.com/thu-nics/AKV" target="_blank" rel="noopener">GitHub</a> · <a href="https://fuvty.github.io/thinking_yard_project_page/projects/akv/" target="_blank" rel="noopener">项目主页</a> · 数据为自行报告</span>

<span class="mtp">© Marktechpost</span>

</div>

<script>

(function(){

var R=document.getElementById('mtp-akv');

function $(id){return document.getElementById('mtp-akv-'+id)}

function post(){try{var h=R.offsetHeight+40;parent.postMessage({mtpAkvHeight:h},'*')}catch(e){}}

R.querySelectorAll('.tab').forEach(function(b){b.addEventListener('click',function(){

R.querySelectorAll('.tab').forEach(function(x){x.classList.remove('on')});

R.querySelectorAll('.panel').forEach(function(x){x.classList.remove('on')});

b.classList.add('on');$(b.getAttribute('data-t').replace('p','p')).classList.add('on');

if(b.getAttribute('data-t')==='p3')drawBench();

if(b.getAttribute('data-t')==='p4')drawServe();

setTimeout(post,60);setTimeout(post,500);

})});

function blk(t,cls,sub){var d=document.createElement('div');d.className='blk '+cls;d.innerHTML=t+(sub!==undefined?'<small>'+sub+'</small>':'');return d}

/* P1 */

var seq=[['U','k-u'],['A','k-t'],['B','k-a'],['C','k-t'],['D','k-a']];

function initP1(){var ce=$('ce'),ae=$('ae');ce.innerHTML='';ae.innerHTML='';

seq.forEach(function(s){ce.appendChild(blk(s[0],s[1]));ae.appendChild(blk(s[0],s[1]))});

$('cem').style.width='0%';$('aem').style.width='0%';$('cet').textContent='Re-prefill work: 0 blocks';$('aet').textContent='Re-prefill work: 0 blocks';

$('n1').innerHTML='Both agents hold a user prompt, assistant turns and tool results. Press the button to remove old tool result <b>A</b>.';}

initP1();

var playing=false;

$('play').addEventListener('click',function(){if(playing)return;playing=true;initP1();

var ce=$('ce').children,ae=$('ae').children;

setTimeout(function(){ce[1].classList.add('drop');ae[1].classList.add('drop');

$('n1').innerHTML='Step 1: A is removed. Left: the text is summarized, so the prefix changes.';},300);

setTimeout(function(){for(var i=2;i<5;i++)ce[i].classList.add('re');$('cem').style.width='75%';$('cet').textContent='重预填充工作量:3 个块(B、C、D 被重新计算);

$('n1').innerHTML='步骤 2:<b>上下文工程</b>必须重新预填充编辑之后的所有内容。<b>AKV</b> 只是把 A 从注意力中隐藏起来。';},1300);

setTimeout(function(){for(var i=2;i<5;i++)ce[i].classList.remove('re');

var n1=blk('E','k-n new');var n2=blk('E','k-n new');$('ce').appendChild(n1);$('ae').appendChild(n2);

$('aet').textContent='重预填充工作量:0 个块(B、C、D 被复用)';

$('n1').innerHTML='步骤 3:两者都追加新的轮次 E。AKV 原样复用了 B、C 和 D,它们仍然保留着从 A 中学到的内容。';playing=false;post();},3000);

});

$('reset').addEventListener('click',function(){playing=false;initP1()});

/* P2 */

var st;function initP2(){st={toks:[['A',0],['B',1],['C',2]],dropped:{},next:3,stage:0,drop:{},rep:[]};renderP2();

$('n2').innerHTML='初始状态:token A、B、C 分别位于位置 0、1、2。逐步执行这 3 个操作。';$('req').textContent='{"messages": [m0:A, m1:B, m2:C], "drop_message": {}, "reposition": []}';}

function renderP2(mark){var L=$('ops');L.innerHTML='';st.toks.forEach(function(t){var c=t[0]==='D'?'k-n':(t[0]==='B'?'k-a':'k-t');

var b=blk(t[0],c,'pos '+t[1]);if(st.dropped[t[0]])b.classList.add('drop');if(mark&&mark.indexOf(t[0])>-1)b.classList.add(mark==='D'?'new':'mv');L.appendChild(b)});post();}

initP2();

R.querySelectorAll('[data-op]').forEach(function(b){b.addEventListener('click',function(){var op=b.getAttribute('data-op');

R.querySelectorAll('[data-op]').forEach(function(x){x.classList.remove('on')});b.classList.add('on');

if(op==='reset2'){initP2();b.classList.remove('on');return}

if(op==='append'){if(st.toks.some(function(t){return t[0]==='D'})){$('n2').innerHTML='D 已经追加过了。试试 <b>Drop B</b>。';return}

st.toks.push(['D',st.next]);st.next++;renderP2('D');

$('n2').innerHTML='<b>Append</b>:D 基于活跃缓存计算,并占用下一个位置索引。';

$('req').textContent='{"messages": [m0:A, m1:B, m2:C, m3:D], "drop_message": {}, "reposition": []}';}

if(op==='drop'){if(!st.toks.some(function(t){return t[0]==='D'})){$('n2').innerHTML='先追加 D,再丢弃 B。';b.classList.remove('on');return}st.dropped.B=true;renderP2();

$('n2').innerHTML='<b>丢弃</b>:B 离开后续注意力。位置不变,文本历史仍保留 B。';

$('req').textContent='{"messages": [m0..m3], "drop_message": {"3": [1]}, "reposition": []}';}

if(op==='repos'){if(!st.dropped.B){$('n2').innerHTML='先丢弃 B,这样才有空隙可以压缩。';return}

var p=0;st.toks.forEach(function(t){if(!st.dropped[t[0]]){t[1]=p;p++}});st.next=p;

st.toks=st.toks.filter(function(t){return !st.dropped[t[0]]});st.dropped={};renderP2(['A','C','D']);

$('n2').innerHTML='<b>重定位</b>:保留的键被重新旋转(RoPE)到位置 0 到 '+(p-1)+'。值保持不变,因此无需重新计算。';

$('req').textContent='{"messages": [m0..m3], "drop_message": {"3": [1]}, "reposition": [3]}';}

})});

/* P3 */

var M={'MiniMax-M2.7':{s:[[58.9,35.0,75.2,40.5,52.4],[62.3,36.9,72.0,40.0,52.8],[58.9,40.8,74.4,40.5,53.7]],c:[[5.2,2.4,7.0,5.5,5.0],[5.3,2.7,9.4,5.2,5.7],[4.8,2.6,5.5,4.7,4.4]]},

'GPT-OSS-120B':{s:[[57.5,68.0,40.0,38.5,51.0],[52.7,65.1,36.8,38.5,48.3],[61.9,69.9,43.2,37.5,53.1]],c:[[13.1,5.4,20.0,6.2,11.2],[12.6,6.8,15.8,5.4,10.2],[11.4,4.1,9.7,3.8,7.3]]},

'MiroThinker-1.7-Mini':{s:[[60.0,68.0,7.8,40.5,44.1],[45.7,66.0,4.2,32.5,37.1],[63.5,68.9,7.4,43.5,45.8]],c:[[25.2,9.2,33.6,13.5,20.4],[17.6,11.0,28.4,15.3,18.1],[15.3,9.5,26.3,8.1,14.8]]}};

var B=['BrowseComp-Plus','GAIA-Text','SWE-bench Verified','xbench-DS','Average'];var mSel='GPT-OSS-120B',bSel=4;

var NM=['Standard','Text Eng.','AKV'],CL=['c-s','c-t','c-a'];

Object.keys(M).forEach(function(k){var b=document.createElement('button');b.className='btn'+(k===mSel?' on':'');b.textContent=k;b.onclick=function(){mSel=k;$('models').querySelectorAll('.btn').forEach(function(x){x.classList.toggle('on',x===b)});drawBench()};$('models').appendChild(b)});

B.forEach(function(k,i){var b=document.createElement('button');b.className='btn'+(i===bSel?' on':'');b.textContent=k;b.onclick=function(){bSel=i;$('bench').querySelectorAll('.btn').forEach(function(x){x.classList.toggle('on',x===b)});drawBench()};$('bench').appendChild(b)});

function bars(el,vals,max,fmt){el.innerHTML='';vals.forEach(function(v,i){var r=document.createElement('div');r.className='bar';

r.innerHTML='<div class="nm">'+NM[i]+'</div><div class="tr"><div class="fl '+CL[i]+'"></div></div><div class="v">'+fmt(v)+'</div>';el.appendChild(r);

(function(f,w){setTimeout(function(){f.style.width=w+'%'},40)})(r.querySelector('.fl'),Math.max(2,v/max*100));});}

function drawBench(){var d=M[mSel];var s=d.s.map(function(r){return r[bSel]}),c=d.c.map(function(r){return r[bSel]});

bars($('sc'),s,100,function(v){return v.toFixed(1)});bars($('co'),c,Math.max.apply(null,c)*1.1,function(v){return v.toFixed(1)+'¢'});

var ds=(s[2]-s[0]).toFixed(1),dc=((c[2]/c[0]-1)*100).toFixed(1);

$('n3').innerHTML='<b>'+mSel+' · '+B[bSel]+'</b>: AKV vs Standard is '+(ds>=0?'+':'')+ds+' points and '+(dc>0?'+':'')+dc+'% cost. Source: Table 1, self-reported.';post();}

/* P4 */

var C=[8,10,12,14,16],LAT=[[43.57,45.03,43.16,108.86,229.90],[43.57,50.27,52.82,60.67,69.96],[25.93,27.11,27.18,28.49,30.63]],OUT=[[217,254,313,146,138],[228,246,264,267,267],[245,295,339,369,369]];

function drawServe(){var i=+$('c').value;$('cv').textContent=C[i];

bars($('lat'),LAT.map(function(r){return r[i]}),235,function(v){return v.toFixed(2)+'s'});

bars($('out'),OUT.map(function(r){return r[i]}),380,function(v){return v});

var x=(LAT[0][i]/LAT[2][i]).toFixed(2);

$('n4').innerHTML='At concurrency '+C[i]+', AKV P95 latency is <b>'+x+'x</b> faster than Standard. '+(i>=3?'Above 12, KV pressure forces Standard into re-prefill, so its latency jumps.':'Peak-vs-peak compares AKV at 14 with Standard at 12.');post();}

$('c').addEventListener('input',drawServe);

/* P5 */

R.querySelectorAll('#mtp-akv-lim li').forEach(function(li){li.addEventListener('click',function(){li.classList.toggle('open');post()})});

window.addEventListener('load',post);window.addEventListener('resize',post);setTimeout(post,300);

})();

</script>

</div>

</body></html>">

AKV 在服务基准测试中的速度有多快?

服务测试在 80 个长上下文 SWE-bench Verified 任务上运行了 GPT-OSS-120B。在每种方法的峰值设置下,AKV 的输出吞吐量达到 1.18 倍,输入吞吐量达到 1.53 倍。P95 请求延迟快 1.51 倍。

在并发数为 16 时,Standard 的 P95 延迟达到 229.90 秒,而 AKV 为 30.63 秒。KV 压力迫使 Standard 反复重新预填充。每个解码步骤中,全注意力时间从 7.082 ms 降至 2.849 ms。

在 GPU 预算下对 100 个 SWE-bench Verified 任务,AKV 达到了约 47% 的通过率。Standard 达到 40.7%,Text Engineering 为 32.3%。

智能体能自行调整其缓存策略吗?

MiniMax-M2.7 在 20 个 BrowseComp-Plus 任务上优化了策略,随后运行了 100 个留出任务。第 6 次迭代的策略在基线准确率下将成本较 Standard 降低了 17.8%。摘要报告称,相比专家设计的策略还额外节省了 7.1%。

将缓存控制作为工具暴露出来也有助于提升准确率。GPT-OSS-120B 在 100 个任务的子集上从 52.1 提升到 61.0。不过 MiniMax-M2.7 的成本从 5.4 美分上升到 5.9 美分。

AKV 与其他 KV 缓存方法对比

指标AKV阈值摘要SGLang RadixAttentionStreamingLLMSnapKV作用对象KV 缓存,由智能体主导文本历史KV 缓存,前缀复用KV 缓存,固定窗口提示 KV 缓存丢弃内容由策略或模型工具调用选择超过 token 阈值的历史无,共享前缀被复用中间 token;保留 sinks 和近期 token低注意力的提示位置缩减后是否重新预填充否是,保留后缀不适用无需缓存刷新不适用目标工作负载多轮工具调用智能体智能体框架通用与智能体服务流式对话长提示报告的核心指标-27.7% 成本,+1.7 分AKV 论文中的基线最高 6.4 倍吞吐量相比滑动窗口重算最高 22.2 倍在 16K 时生成快 3.6 倍模型Qwen、GPT-OSS、MiniMax-M2任意广泛Llama-2、MPT、Falcon、PythiaLlama、Mistral、Mixtral是否需要微调否否否否否许可证Apache-2.0取决于框架Apache-2.0MITApache-2.0

主要数字来自各项目自己的论文,且使用不同的设置。它们不能直接比较。

关键要点

AKV 让智能体能够丢弃并重新定位 KV 缓存,而不是重写历史。

在 3 个模型上,平均成本下降 27.7%,得分提升 1.7 分。

Repos 将 GPT-OSS-120B 在 BrowseComp-Plus 上的成绩从 55% 提升到 62%。

在并发数为 16 时,P95 延迟从 229.90 秒降至 30.63 秒。

目前仅支持 Qwen、GPT-OSS 和 MiniMax-M2 文本模型。

查看论文、GitHub 仓库和项目页面。也欢迎在 Twitter 上关注我们,别忘了加入我们 15 万+ 的 ML SubReddit 并订阅我们的新闻通讯。等等!你在用 Telegram 吗?现在你也可以在 Telegram 上加入我们了。

需要与我们合作推广你的 GitHub 仓库、Hugging Face 页面、产品发布或网络研讨会等?请联系我们

文章《Tsinghua AI Open-Sources AKV, a Cache Engineering Server for LLM Agents on SGLang》首发于 MarkTechPost。