突破 LLM 上下文瓶颈:上下文内存虚拟化 CMV 的设计与实践
背景与挑战
大语言模型在代码编写、复杂推理等长时工作会话中,会逐步积累大量核心状态——比如代码库的架构映射、技术选型的权衡决策、项目的编码规范等。这些内容构成了 LLM 对任务的完整心智模型,但构建这一模型需要消耗大量的时间和令牌成本。
当会话积累的内容触达 LLM 的上下文窗口上限时,平台的原生压缩功能会对已有内容做大幅精简。例如 Claude Code 的 /compact 指令曾将 132k 令牌的会话内容压缩至 2.3k 令牌,直接丢弃了 98% 的细节信息,让 LM 失去了耗时构建的精细理解。而新的会话只能从头重建上下文,这造成了根本性的效率浪费。
现有解决方案均存在明显短板:检索增强生成(RAG)仅能补充文档,无法保留会话状态;MemGPT 仅支持单会话的内存分页,不能跨会话复用;记忆插件只保存摘要,丢失对话细节;而 LongLLMLingua 等提示压缩技术,仅在模型/嵌入层修改上下文表示,未处理原始对话日志的结构冗余。
简单来说,当前 LLM 的上下文管理就像没有保存功能的记事本,写满了只能删掉重来,而开发者亟需一种能'保存进度、复用内容、精简冗余'的上下文管理方案。
CMV 核心设计
本研究提出的上下文内存虚拟化(CMV) 技术,借鉴操作系统虚拟内存理念,抽象掉 LLM 上下文窗口的物理令牌限制,支持按需加载保存的状态。其核心在于两大模块:基于 DAG 的状态模型与三阶段结构无损修剪算法。
基于 DAG 的状态模型
将会话历史建模为有向无环图 $G=(V, E)$:
- 节点 (v):代表不可变快照,是某一时刻会话 JSONL 日志的完整副本,附带名称、时间戳、令牌数等元数据。
- 有向边 ((v_i, v_j)):代表分支,从快照 $v_i$ 派生的独立工作会话,最终生成新快照 $v_j$,分支会继承原快照的所有上下文理解。
为此设计了四大核心原语操作,实现类似 Git 的版本管理能力:
- Snapshot:将当前会话生成不可变快照,原会话不做任何修改。
- Branch:从指定快照创建新会话,默认启用修剪,可添加定向任务消息。
- Trim:一键完成'快照 + 分支 + 修剪',直接生成精简后的新会话。
- Tree:可视化 DAG 结构,实现类似
git log --graph的上下文谱系展示。
这种设计实现了Git 式的 LLM 上下文工作流。用户可将耗时构建的上下文(如 80k 令牌的架构理解)生成为根快照,基于此派生多个并行分支完成不同任务,无需重复构建上下文。
三阶段结构无损修剪算法
这是 CMV 的核心技术,旨在解决令牌冗余问题,同时保证 API 调用正确性。算法处理 JSONL 格式的对话日志,分三个顺序阶段,前两阶段为轻量扫描,第三阶段完成实际过滤。核心可配置参数为存根阈值 τ(默认 500 字符,最小 50)。
- 阶段 1:压缩边界检测 定位最后一次原生压缩的边界,避免重复处理已精简内容。
- 阶段 2:预边界工具 ID 收集 收集压缩边界前的所有工具使用 ID,为处理孤儿工具结果做准备。
- 阶段 3:流式过滤修剪 按规则处理日志,仅将处理后的内容写入新日志。
关键修剪规则包括:跳过预压缩内容、移除文件历史/队列操作元数据、删除 Base64 图片块、移除非可移植的思考块、对超阈值的工具结果/写入工具输入生成存根、剥离孤儿工具结果、删除 API 使用元数据。
这里有个关键点:孤儿工具结果处理。原生压缩可能导致工具调用与结果分离,直接使用会触发 API 验证错误。算法通过阶段 2 收集 ID、阶段 3 剥离对应结果,无需用户干预即可保证 API 正确性。这也是三阶段设计的核心原因,既保证了修剪效果,又避免了全量 JSON 解析的高额成本。



