编码智能体压缩上下文不必改写历史:ObsDrop只释放过期KV,16个并发智能体下吞吐最高5.37倍
核心概要
编码智能体每轮只往历史末尾追加内容,不压缩时前缀缓存复用率可达98%至99%,但文本级上下文压缩一旦改写早先的token,后面的KV就要全部重算。ObsDrop把压缩从提示词移到KV缓存:逻辑token前缀保持不变,只释放过期工具观测占用的KV并从注意力中排除,已在SGLang与Sparse-vLLM中实现。在16个并发智能体下,相对不压缩,FlashInfer后端吞吐提升2.45至2.85倍,Triton后端峰值5.37倍,任务质量接近不压缩。
深度剖析
编码智能体的上下文压缩可以不再改写提示词,而是只回收过期工具观测在KV缓存中占用的条目,让下一次请求仍能匹配完整前缀。 此前的截断、逐轮观测掩码和摘要都在文本层改写历史,一旦改动早先token,前缀匹配就在第一个改动处中断,后面的后缀必须重新预填充。 在不压缩的智能体轨迹上,连续请求的前缀缓存命中率为98%至99%,说明可复用的前缀本来几乎完整,改写历史正是代价来源。
做法是让逻辑历史与物理KV驻留分开:提示词和token位置原样保留,只把过期观测对应的KV槽位标记为死槽并归还分配器,注意力调用前再把这些位置从KV索引列表中就地剔除。 实现依赖SGLang的RadixAttention缓存,它用基数树把逻辑token序列映射到物理KV槽位,因此驻留可以变化而匹配的token不变;vLLM按块哈希组织缓存,无法在保留前缀可匹配的同时释放其中条目。 在SGLang与Sparse-vLLM两套引擎、FlashInfer与Triton两种注意力后端上评测,模型为Qwen3-Coder-30B-A3B与Devstral-Small-2-24B,基准为SWE-bench Verified与SWE-bench Multilingual。
并发越高、KV压力越大,收益越明显,因为更小的物理占用让更多智能体前缀留在缓存中,避免逐出后整段重预填充的循环。 不压缩时完整上下文会占满KV缓存,服务器一旦逐出,智能体就要重算整个上下文,尾延迟随之抬升;文本级策略则在每次改写时丢掉复用。 在16个并发智能体下,SGLang的Qwen-Multilingual负载保留89%前缀复用、p90首token时间约6秒,不压缩则降到32%复用、约80秒;相对不压缩的吞吐在FlashInfer上为2.45至2.85倍,Triton后端峰值为5.37倍。
启示与展望
评测限定在编码智能体场景:Qwen3-Coder-30B-A3B与Devstral-Small-2-24B两个模型,SWE-bench Verified与SWE-bench Multilingual两个基准,SGLang与Sparse-vLLM两套引擎,以及FlashInfer与Triton两种注意力后端;文本层实验在Aurora上运行,KV层实验在Polaris上运行。
批处理掩码的间隔固定取k′ = 2k,这是实用选择,最优间隔可能随轨迹与负载变化;服务成本用按API价格加权的归一化模型衡量,价格与缓存/未缓存token的比值可能变化,但压缩与前缀复用的权衡仍在。把ObsDrop移植到vLLM需要把块身份与KV驻留解耦,被列为后续工作。
