跳转至

多轮对话

工作负载画像:Prefix 复用度高(历史轮次)|上下文增长式|Decode 长度中等|Session 长寿命

特征

  • 单 session 长寿命:一次对话可能持续几小时,KV 总量随轮次线性累积
  • prefix 单调增长:每轮新消息到来时,前 N-1 轮是完整且确定的 prefix
  • 跨轮高度复用:第 N 轮的 prefill 理论命中率 = 前 N-1 轮 token 数 / 第 N 轮 prompt 总 token 数
  • 空闲期天然存在:用户思考期间 KV 占用 HBM 但无计算需求,是换出的自然窗口

关键 KV 问题

1. Session 级 KV 持久化

用户思考期间(数秒到数分钟),前 N-1 轮的 KV 放在哪里?

策略 TTFT 影响 HBM 占用 适用场景
保留在 HBM 无额外延迟 持续占用 活跃 session、空闲 < 5s
Swap 到 DRAM +100–500ms(PCIe) 释放 HBM 空闲 5s–5min
Swap 到 SSD +1–5s 释放 HBM 空闲 > 5min,非实时对话
Recompute 正比于历史 token 数 完全释放 历史极短或极低优先级

实践上,多轮对话通常采用分层策略:活跃 session 留在 HBM,短暂空闲 swap 到 DRAM,长期空闲 swap 到 SSD 或丢弃重算。

2. 路由亲和性(Session Affinity)

同一 session 的所有轮次必须路由到同一副本,否则 prefix cache 强制 miss,前 N-1 轮的 KV 完全浪费。

选项对比:

  • Hash-based routing:对 session ID 做一致性哈希,实现简单,但副本扩缩容时命中率波动
  • Cache-aware routing:调度器查询每个副本的 radix tree,选择已有最长共同 prefix 的副本——SGLang 的默认策略,命中率最优
  • Sticky routing + 心跳:负载均衡层记录 session→副本映射,副本故障时才迁移;额外引入状态存储

3. 历史压缩

当会话上下文超过 100K token 时,早期轮次的 KV 是否可以压缩?

  • StreamingLLM 风格:保留最近 K 个 block + attention sink token,丢弃中间历史;TTFT/吞吐提升明显,但远距离信息永久丢失。SCBench 研究表明此类 sub-O(n) 方法在多轮场景下系统性退化。
  • KV 量化:早期轮次降精度(FP16→INT8/INT4);接受少量精度损失换取容量,需评估多轮后的退化程度
  • 摘要式压缩(研究阶段):生成文本摘要后重新 prefill,从语义层压缩历史;与位置编码和 KV 语义的关系尚待探索

工程配置建议

配置项 推荐值 / 策略 原因
Prefix Cache 必开 第 N 轮 prefill 中前 N-1 轮完全命中
Block Size 16–32 多轮 prefix 增长均匀,大 block 命中率高
Session routing Cache-aware 优先,Hash 次选 跨轮命中率最大化
KV Offload 阈值 空闲 > 5s 触发 swap 到 DRAM 平衡命中率与 HBM 利用率
KV 量化 FP8 可接受 历史轮次精度需求低

关键指标

  • Per-turn Prefix Cache 命中率:稳定多轮对话应 > 80%(第 N 轮理论命中率 ≈ 前 N-1 轮 token 数 / 第 N 轮 prompt 总 token 数)
  • TTFT(P50 / P99):P99 受 swap-in 延迟影响,与 P50 分开监控;若两者差距大,说明换入频繁
  • Session HBM 占用时长:session 空闲期间的 HBM 占用率,是 offload 策略是否生效的直接指标

关联章节

版本历史

版本 日期 说明
v0.1 2026-05-14 从工作负载总览拆分,补充工程配置与指标细节