问题定义
本节分析现有 KV Cache 处理方案的局限性,深入探讨 Cross-Attention 的重要性,并明确 CacheBlend 要解决的核心问题。
2.1 现有方案概述#
目前存在三种主要的 KV Cache 处理方案:
graph TB
subgraph solutions["方案对比"]
subgraph sol_a["A - Full KV Recompute"]
A1["Chunk 1"] --> A2["Chunk 2"]
A2 --> A3["Chunk 3"]
A3 --> A4["KV Cache of 1,2,3"]
A4 --> AO["速度 - 最慢 / 质量 - 最好"]
end
subgraph sol_b["B - Prefix Caching"]
B1["KV Cache 1 前缀"] --> B2["Chunk 2"]
B2 --> B3["Chunk 3"]
B3 --> B4["KV Cache of 1,2,3"]
B4 --> BO["速度 - 略快 / 质量 - 好"]
end
subgraph sol_c["C - Full KV Reuse"]
C1["KV Cache 1"]
C2["KV Cache 2"]
C3["KV Cache 3"]
C1 --> C4["直接拼接"]
C2 --> C4
C3 --> C4
C4 --> CO["速度 - 最快 / 质量 - 差"]
end
subgraph sol_d["D - CacheBlend"]
D1["KV Cache 1"]
D2["KV Cache 2"]
D3["KV Cache 3"]
D1 --> D4["选择性重计算"]
D2 --> D4
D3 --> D4
D4 --> DO["速度 - 快 / 质量 - 好"]
end
end
style AO fill:#ff9999
style BO fill:#ffcc99
style CO fill:#ff9999
style DO fill:#99ff99
2.2 Full KV Recompute(完全 KV 重计算)#
工作原理:
- 将原始文本作为输入直接输入 LLM
- LLM 在 Prefill 期间计算所有 token 的 KV Cache
优点:
缺点:
- 速度最慢,尤其是长输入时
- Prefill 延迟和计算量与输入长度超线性增长
2.3 Prefix Caching(前缀缓存)#
工作原理:
- 预计算并存储可复用文本块的 KV Cache
- 如果文本块位于 LLM 输入的前缀位置,则可直接复用预计算的 KV Cache
- 代表系统:vLLM、SGLang、RAGCache
优点:
- 前缀的 KV Cache 不受后续文本影响,生成结果与完全重计算完全相同
- 对于单一前缀场景效果很好
缺点:
- 只能复用第一个文本块的 KV Cache
- 当输入包含多个文本块时,除第一个块外,其他块的 KV Cache 都无法复用
- 在 RAG 场景中,加速效果有限
graph LR
subgraph prefix_limit["Prefix Caching 的局限"]
C1["Chunk 1 / 可复用"] --> C2["Chunk 2 / 需重计算"]
C2 --> C3["Chunk 3 / 需重计算"]
C3 --> Q["Query"]
end
style C1 fill:#90EE90
style C2 fill:#ff9999
style C3 fill:#ff9999
2.4 Full KV Reuse(完全 KV 复用)#
工作原理:
- 独立预计算每个文本块的 KV Cache
- 当复用的文本不在输入前缀位置时,通过调整位置编码来复用 KV Cache
- 代表系统:PromptCache
优点:
缺点:
- 忽略了跨块注意力(Cross-Attention)
- 由于预计算时不知道前面的文本块,无法计算跨块的注意力信息
- 对于需要综合多个文本块信息的查询,会导致错误答案
2.5 Cross-Attention(跨块注意力)的重要性#
让我们通过一个具体例子来说明跨块注意力为何重要:
场景设置:
- Chunk 1: “Lionel Messi scored 13 goals at FIFA World Cups.”
- Chunk 2: “Cristiano Ronaldo scored 8 goals at FIFA World Cups.”
- Query: “Who scored more goals at FIFA World Cups, Messi or Ronaldo?”
graph TB
subgraph full_recompute["Full KV Recompute - 正确答案"]
A1["Chunk 1 - Messi 13球"] --> A2["Chunk 2 - Ronaldo 8球"]
A2 --> AQ["Query - 谁进球更多?"]
AQ --> AA["Messi 进球比 Ronaldo 多"]
A1 -.->|"Cross-Attention 建立关联"| A2
end
subgraph full_reuse["Full KV Reuse - 错误答案"]
B1["KV - Messi 13球"]
B2["KV - Ronaldo 8球"]
BQ["Query - 谁进球更多?"]
B1 --> BC["直接拼接"]
B2 --> BC
BQ --> BC
BC --> BA["无法正确比较 答非所问"]
B1 -.x|"无 Cross-Attention"| B2
end
style AA fill:#90EE90
style BA fill:#ff9999
Attention Matrix(注意力矩阵)对比:
Full KV Recompute 的注意力矩阵包含完整的 Cross-Attention 区域,而 Full KV Reuse 的注意力矩阵在 Cross-Attention 区域为零(从未计算)。
Full KV Recompute: Full KV Reuse:
┌─────────────────┐ ┌─────────────────┐
│ █████ │ │ █████ │
│ █████ │ │ █████ │
│ █████████████ │ vs │ █████ 00000 │ <- Cross-Attention
│ █████████████ │ │ █████ 00000 │ 区域缺失
│ ███████████████ │ │ █████ █████████ │
└─────────────────┘ └─────────────────┘
Chunk1 Chunk2 Chunk1 Chunk2
2.6 实验验证:Cross-Attention 的影响#
论文通过实验验证了 Cross-Attention 的重要性。在 Musique 和 2WikiMQA 两个多跳问答数据集上,随着检索的相关文本块数量增加:
- Full KV Recompute(包含 Cross-Attention)的 F1 分数持续提升
- Full KV Reuse(无 Cross-Attention)的 F1 分数明显低于前者
- 差距随文本块数量增加而扩大
graph LR
subgraph f1_compare["F1 分数对比 - Musique 数据集"]
direction TB
X["5个块"] --> Y["15个块"] --> Z["25个块"] --> W["35个块"]
A["Full Recompute: 0.22 -> 0.30 -> 0.32 -> 0.33"]
B["Full Reuse: 0.18 -> 0.20 -> 0.21 -> 0.20"]
end
2.7 CacheBlend 的目标#
CacheBlend 旨在解决一个核心挑战:
当 LLM 输入包含多个文本块时,如何快速组合它们各自预计算的 KV Cache,以达到与昂贵的 Full KV Recompute 相同的生成质量?
换句话说,CacheBlend 追求同时获得:
- Full KV Reuse 的速度
- Full KV Recompute 的质量
graph TB
subgraph target_space["CacheBlend 目标空间"]
A["Full KV Recompute / 慢 + 高质量"]
B["Full KV Reuse / 快 + 低质量"]
C["CacheBlend / 快 + 高质量"]
A -.->|"保持质量"| C
B -.->|"保持速度"| C
end
style C fill:#90EE90,stroke:#333,stroke-width:3px
下一步#
了解了问题背景后,接下来我们将深入探讨 CacheBlend 的核心理论,包括选择性 KV 重计算的数学基础和关键洞察: