一句话定义
RadixAttention 是一种用基数树(radix tree,也叫压缩前缀树)来组织 KV 缓存(KV cache)的技术:让多个请求共享内容相同的那段前缀的中间计算结果,避免把同一段文字反复算一遍。
为什么需要它
大模型生成每个 token 时,每一层都会留下一对 Key、Value 向量,合称 KV 缓存。你可以把它理解为模型对"已经读过的内容"做的笔记——后面接着写时不用回头看原文,直接翻笔记。
问题在于,这份笔记过去基本是"一个请求一份"。多轮对话里,第 5 轮请求会把前 4 轮历史原封不动再发一遍;上百个请求都用同一段很长的系统提示,这段提示就被重新算了上百遍。前面那段明明一模一样,算力却付了上百次。
打个比方:KV 缓存像读书笔记。十个人读同一本书,前 300 页完全相同,笔记自然也一模一样。老做法是每人抄一份再各自往下写;RadixAttention 是把这些笔记按"读到第几页"挂到同一棵树的不同位置上,重合的部分只存一份。
前缀树是怎么起作用的
把 token 序列看成一条路径,从根节点出发走。两个请求的前 N 个 token 完全一致,就会走到同一个节点,共用这条路径上的 KV;从第一个不同的 token 开始分叉,各自长出新分支。为了省空间,只有一条子节点的连续节点会被压成一条边,这就是"压缩"的含义。
请求结束后,缓存不会立刻扔掉,而是留在树上等后续请求来命中;显存紧张时,按 LRU(Least Recently Used,最近最少使用)之类的策略淘汰最久没被碰过的分支。
和相邻概念的区别
| 概念 | 负责什么 | 共享的粒度 |
|---|---|---|
| 普通 KV 缓存 | 单个请求内部不重复计算 | 不跨请求共享 |
| 分块前缀缓存(prefix caching) | 跨请求共享相同前缀 | 按固定块哈希匹配 |
| AI 词典:PagedAttention">PagedAttention | 把 KV 切块,减少显存碎片 | 内存管理方式,本身不负责共享 |
| RadixAttention | 用前缀树索引并复用 KV | 逐 token 前缀匹配,天然支持分叉 |
前三者解决的是"显存怎么摆、块能不能复用";RadixAttention 更进一步,用树结构把复用做到极致,尤其适合请求集合本身长得像一棵树的场景。
对实际工作的意义
如果你的系统提示很长、few-shot 示例固定,或者做多轮客服对话,又或者让模型一次采样多条候选答案、做束搜索(beam search)这类"同一开头、后面分叉"的任务,命中率会很高。省下的是 prefill 阶段的重复计算,收益体现在首 token 延迟和整体吞吐上。
反过来,如果每个请求的前缀都各不相同,这套机制带来的收益很有限。另外缓存本身要占显存,会和正在跑的请求抢空间,淘汰策略因此很关键。
还要注意区分:RadixAttention 是推理引擎内部的调度与内存机制;而 API 层面常说的"提示缓存",是计费和产品层面的功能。两者不是一回事,具体行为以各家官方页面为准。
