前缀缓存复用树
引擎层三强的地基(分页缓存、连续批处理)已经互相趋同,竞争上移到「缓存复用谁更聪明」:vLLM 靠默认开的前缀缓存,SGLang 靠看家本领 RadixAttention。下面把这道题演出来——每条请求沿缓存树逐块匹配,公共前缀命中复用、分叉后新算,看「每轮重发历史」的负载怎么几乎免费。
纯前端确定记账:请求 = 词块序列(示意 token,真实引擎按 KV block 切粒度,vLLM 常见 16 token/块),逐词块节点走树(RadixAttention 的路径压缩版不影响记账),命中/新算与节省比例全是真实计算;步进 = 截断序列重跑,与缓存树按到达顺序生长的时序性严格一致。场景锚点 Agent 多轮省 66%(33/50 块)、共享系统提示 50%(18/36)、并行分支 44%(12/27)、零命中 0%。文章引用口径(vLLM 零命中损失 <1%、SGLang 实测约三成)为实测数字,本页不做吞吐模拟。零 API、零随机。
请求账本(宽度 = 块数)
还没有请求进树——点「下一请求」开始。
词块 = 示意 token(真实引擎按 KV block 切粒度,vLLM 常见 16 token/块);段上的字是命中的前缀内容,悬停可看全文。
缓存树(RadixAttention 的「基数树」)
树是空的——每条请求的新路径都会插进来。
汇合的地方共享,分叉的地方各算——「Radix」(基数)说的就是这棵前缀树。演示按逐词块节点走;SGLang 真实实现带路径压缩,命中/新算的记账结果一致。
点「下一请求」逐条喂进缓存树:每条请求沿树逐块匹配——公共前缀命中(青,KV 复用免 prefill),分叉之后新算(灰,真金白银的 prefill),新路径随后插进树里给后来的请求用。
和 kv-cache / paged-attention 工具什么关系?那边管的是「KV 缓存放哪、放不放得下」(显存账、分页租借),这边管的是「已算好的 KV 怎么被下一条请求复用」(过程账)—— 三家引擎的地基(分页缓存、连续批处理)已互相趋同,竞争上移到这层复用的聪明度上(文章原文)。
文章引用口径:vLLM V1 前缀缓存默认开、零命中率吞吐损失不到 1%;SGLang 多轮 Agent 负载实测吞吐领先约三成(首 token 延迟偏高)。 本页只演命中/新算的记账过程,不做吞吐模拟——吞吐数是实测引用,不是公式。