TokenPilot: 面向 LLM Agent 的缓存高效上下文管理
随着 LLM agent 被部署在长周期会话中,上下文累积导致推理成本飙升。现有方法通过文本剪枝或动态内存驱逐来最小化 token 足迹,但其无约束的序列突变会改变布局,引入前缀不匹配和缓存失效。这揭示了文本稀疏性与 prompt cache 连续性之间的关键权衡。 为此,我们提出 TokenPilot,一种双向粒度上下文管理框架。全局层面,Ingestion-Aware Compaction 作为框架约束,稳定 prompt 前缀并在入口处消除开放世界环境噪声。局部层面,Lifecycle-Aware Eviction 监控上下文段的持续残效,执行保守的批处理轮次调度,仅在任务相关性过期时卸载内容段。 在 PinchBench 和 Claw-Eval 上的实验(包括隔离模式和连续模式)表明:TokenPilot 在隔离模式下分别降低 61% 和 56% 的成本,在连续模式下降低 61% 和 87%,同时与先前系统相比保持有竞争力的性能。TokenPilot 已集成到 LightMem2 中(https://github.com/zjunlp/LightMem2)。
论文精读
TL;DR TokenPilot 通过全局前缀稳定与局部保守淘汰,在不破坏 KV 缓存连续性的前提下削减 token 开销,使 LLM agent 长会话推理成本大幅降低且性能无损。
问题
上下文膨胀与缓存失效:LLM Agent 的 Token 开销困境
随着 LLM Agent 在长会话(long-horizon sessions)中执行多步推理与工具调用,上下文窗口不断累积历史交互,导致推理成本线性攀升。业界普遍关注如何在保持任务性能的前提下,削减 token 足迹,以降低 API 费用和延迟。
现有方法的局限:传统上下文压缩方案通常采用文本剪枝或动态记忆驱逐,例如通过 LLMLingua 进行提示压缩,或使用 MemGPT 的逐轮记忆管理。这些操作直接删除或重排上下文片段,打破序列布局,引发 prefix mismatch。由于多数 LLM 推理服务(如 vLLM、SGLang)依赖前缀缓存(prefix caching) 加速,任何序列突变都会导致缓存失效,迫使重新计算键值对(KV cache),反而推高延迟与成本。这暴露了一个根本矛盾:文本稀疏化与缓存连续性不可兼得——减少 token 数量却以缓存未命中为代价。
为什么这个问题既难又重要:
- 技术挑战:缓存命中的前提是前缀严格连续,而上下文管理需要动态插入或删减内容。两者在序列层面冲突,难以同时优化。
- 工程价值:在千万级用户的大规模部署中,缓存命中率每下降 1% 都意味着显著的 GPU 计算浪费。对于按 token 计费的服务(如 OpenAI API),
prompt_tokens的减少若被缓存丢失抵消,有效成本节约才是关键。 - 行业关注:从 Memory 增强的 agent 框架(如 LangGraph、AutoGen)到边缘推理,上下文管理已成为系统性能的瓶颈,在 ICML、NeurIPS 等行业会议上持续被讨论。
行业类比:就像视频流媒体的自适应比特率传输,既要压缩数据量以节省带宽,又需精细控制码率切换避免缓冲停顿——上下文管理也必须同时平衡 token 削减与计算图的缓存友好性,否则省了带宽却卡了播放。
核心洞察
- TokenPilot 首次明确揭示了 LLM agent 长会话中文本稀疏性与提示缓存连续性之间的关键权衡,并设计了双粒度上下文管理框架来系统化解耦这一矛盾。与以往只追求 token 压缩率而忽略缓存失效的静态剪枝或动态淘汰方法不同,TokenPilot 通过全局 Ingestion-Aware Compaction 稳定 prompt 前缀,以及局部 Lifecycle-Aware Eviction 保守调度片段删除,在保持高缓存命中率的同时显著降低推理成本,为工程部署提供了可复现的 cache-efficient 范式。
- Ingestion-Aware Compaction 在数据摄入阶段实施观察缩减(Observation Reduction),从源头过滤环境噪声,而非依赖事后文本修剪。这一策略区别于传统方法在上下文已膨胀后再试图压缩的做法,避免了因序列突变导致的 layout 破坏与 prefix mismatch,从而在维持 prompt 结构完整性的前提下实现 token 缩减,并天然保护了 KV-cache 的连续性。
方法
整体框架:双粒度上下文管理
TokenPilot 面向长周期 LLM Agent 会话中的上下文膨胀问题,采用 全局–局部双粒度管理 架构,在保持提示缓存连续性的同时削减 token 足迹。
输入:Agent 与环境交互产生的多轮会话历史,包括系统指令、工具调用、观察反馈等开放世界噪声混合的上下文片段。
全局模块:摄入感知压缩 (Ingestion-Aware Compaction)
- 作为框架级“门控”,在每次新上下文被注入时,对提示前缀进行稳定化处理,确保前缀布局不变,从而最大化 KV 缓存的复用率,避免前缀错位导致的缓存失效。
- 执行观察减量,识别并剔除环境返回的冗余、重复或无信息量的观测内容,仅保留任务关键信号,从源头压缩 token 体量。
局部模块:生命周期感知淘汰 (Lifecycle-Aware Eviction)
- 为每个已摄入的上下文段维护一个残留效用 (residual utility) 估计,实时评估其对未来推理的价值。
- 采用保守的批量轮次触发机制,不在每一步都做出激进淘汰决策,而是累积到一段轮次后才批量卸载那些效用降至阈值以下的内容段。
- 该机制相当于为每个段引入了“生命周期”,只有当任务相关性明确过期后才真正移除,防止过早遗忘导致的性能退化。
输出:经过全局压缩和局部淘汰后形成的紧凑上下文序列,可直接输入底层 LLM 进行推理。整个流程对 Agent 策略透明,不改变 Agent 的决策逻辑。
与同类工作的关键差异:此前方法(如文本剪枝、动态记忆淘汰)常无约束地改变序列顺序,破坏前缀一致性并引发缓存错乱;TokenPilot 首次将前缀稳定性与缓存连续性作为显式目标,通过分阶段、双粒度的协同机制解耦了“压缩稀疏度”与“缓存连续性”的权衡,在降本的同时保障了推理性能与缓存命中率。
实验
实验设计
评估在 PinchBench 和 Claw-Eval 两个基准上进行,覆盖 isolated(单次任务)与 continuous(长会话)两种模式。对比方法包括传统文本剪枝、动态内存驱逐等上下文管理方案。核心指标为推理成本(token消耗)与任务性能,成本建模包含缓存命中/失效的计算开销。
关键发现
- 成本大幅下降:在两种模式和两个基准上,TokenPilot 分别降低推理成本 61%、56%、61%、87%,且 不牺牲任务表现。
- 前缀稳定是缓存高效的核心:全局 Ingestion-Aware Compaction 固定前缀结构,避免因序列变异导致的缓存失效,使连续请求间可复用 KV 缓存,实现"热启动"。
- 保守驱逐防止性能退化:局部 Lifecycle-Aware Eviction 通过残差效用门控和批次触发调度,仅在任务相关性过期后卸载内容,避免过度剪枝破坏上下文完整性。
与基线对比的深度解读
现有方法(如文本修剪、动态内存驱逐)专注于减少 token 数量,但随意修改上下文布局会破坏 前缀一致性,导致缓存频繁失效——实际节省的 token 被重计算成本抵消。TokenPilot 的双粒度设计解决了这一矛盾:
- 对比纯剪枝方法:通过 Ingestion-Aware Compaction 在摄入阶段降噪并稳定前缀,维持了高缓存命中率,带来更实际的成本节省。
- 对比普通内存驱逐:Lifecycle-Aware Eviction 的批次触发策略更保守,只在确认内容失去当前价值后才卸载,克服了激进驱逐引发的任务失败或重复推理。
最终,TokenPilot 在长期运行代理场景下,实现了比同类方法更优的成本-性能平衡,验证了 "缓存连续性优先于文本稀疏性" 的设计原则。
行业影响
落地场景
TokenPilot 可服务于任何依赖 LLM Agent 进行长对话或长任务的场景,例如:
- 智能客服:处理持续数十分钟的复杂售后、保险理赔咨询,需保留关键上下文但丢弃冗余交互。
- 代码助手:在 IDE 中长 session 编程,Agent 需记住文件结构与修改历史,同时避免 prompt 膨胀。
- 游戏 NPC 与数字人:长时间多轮对话中维持角色一致性与任务记忆。
商业价值
核心价值在于显著降低推理成本,同时保持任务质量。实验显示,在 PinchBench 和 Claw-Eval 连续模式下,成本分别降低 61% 和 87%。这一成果直击 LLM 服务运营的关键痛点:
- 降本:减少 token 消耗,提升 GPU 吞吐,直接降低 API 或自建集群的账单。
- 体验提升:通过保持 prompt cache 连续性,避免因随意裁剪造成的前缀不匹配,从而降低延迟,提高响应速度。
- 长会话能力:支持更长的历史记忆而不必频繁重置,提高 Agent 完成复杂任务的成功率。
与现有产品/工作流的接口
TokenPilot 作为 LightMem2 库提供,可轻量集成到现有 LLM Agent 框架(如 LangChain、AutoGen、CrewAI)中:
- 以中间件形式介入 prompt 构建流程,在 Agent 与外界的每次交互前,先执行 Ingestion-Aware Compaction(过滤环境噪声并稳定前缀)和 Lifecycle-Aware Eviction(按需卸载过期片段)。
- 可与 vLLM 的 automatic prefix caching 或 SGLang 的 RadixAttention 无缝协作,最大化缓存命中率。
- 集成方式无需修改模型本身,仅需在智体层添加上下文管理逻辑,迁移成本低。
具体落地 Use Case
- 电商智能导购:用户在长浏览过程中反复咨询商品对比、优惠查询、尺码推荐,Agent 需保留商品列表与偏好,但丢弃无关的页面噪声。TokenPilot 可过滤冗余的页面描述,并只保留与当前决策相关的子话题,使单次互动 token 量稳定在低位,降低搜索推理成本。
- 办公 SaaS 写作助手:企业员工使用智能文档助手撰写长篇报告,助手需记住已写内容与引用资料。利用 Lifecycle-Aware Eviction,仅在资料被实际引用或修改时更新相关片段,非活跃部分自动卸载,既保证写作连贯性,又避免 prompt 无限增长导致 API 成本失控。
局限
- **任务建模依赖性强**:TokenPilot 的 **Lifecycle-Aware Eviction** 依赖于对上下文段剩余效用的准确估计,这要求任务具有可预测的结构(如分步推理或工具调用)。在开放式对话或非结构化任务中,效用估计模型(State Estimator)可能失效,导致过早驱逐有用信息,或保留冗余内容。此外,估计器本身会增加额外的 LLM 调用开销,在低算力环境下可能抵消部分缓存收益。
- **评估基准与泛化性有限**:实验仅在 **PinchBench** 和 **Claw-Eval** 两个相对小规模的 Agent 基准上进行,且 **GitHub** 星数仅 15,尚未经过大规模、跨领域的长期部署验证。在实际复杂 Agent 场景(如多工具混用、长链推理、多模态输入)中,`Ingestion-Aware Compaction` 的噪声过滤效果和 `batch-turn schedule` 的延迟影响尚未得到充分测试,方法的泛化稳健性存疑。
- **缓存策略的灵活性折衷**:前缀稳定虽然保证了 **prompt cache** 的连续性,但限制了上下文重排或动态插入的可能性。当任务需要根据新观察重新组织历史信息(例如记忆检索的重排序)时,强制前缀固定可能导致信息布局次优,反而降低模型理解效率。同时,保守的批量驱逐调度可能在缓存空间紧张时造成内存峰值,不适用于低延迟、高并发的实时服务场景。