Contextual Memory Virtualisation: DAG-Based State Management and Structurally Lossless Trimming for LLM Agents

agent 2602.22402
context-managementsession-branchingprompt-trimmingdag-state-modelllm-agent-tooling

CMV: DAG State Management and Structurally Lossless Trimming for LLM Agents #

Cosmo Santoni | 2026-02 | arXiv 2602.22402 Category: agent | Tags: context-management, session-branching, prompt-trimming, dag-state-model, llm-agent-tooling Read: 2026-05-25

§1 TL;DR #

CMV 将 LLM agent 会话历史建模为 DAG(快照为节点、分支为边),配合三遍流式裁剪算法(保留用户/助手消息、删除 tool 输出/base64/元数据),实现均值 20%、峰值 86% 的 token 缩减,并在 prompt caching 场景下 10 轮内收回缓存失效惩罚。

§2 Q1 / Q2 / Q3 #

Q1 痛点:会话状态不可复用,autocompaction 摧毁累积理解 #

LLM coding agent 在长会话中积累架构理解、设计决策、代码库惯例等高价值上下文。当 context window 接近上限时,原生 autocompaction(如 Claude Code /compact)将 132k token 压缩到 2.3k——损失率 98%。新会话必须从零重建,导致 10–20 轮、15–30 分钟、输入成本二次增长的重复劳动。

现有方案各有缺陷:RAG 不保存对话状态;MemGPT 仅单会话 + 模型自管理内存;prompt 压缩(LongLLMLingua / RECOMP / In-Context AE)在 embedding 层操作、与 CMV 正交;原生 /rewind / --fork 缺少命名状态和谱系追踪。

Figure 1: autocompaction 前后对比

Paper Figure 1: 左侧 132k token(76% 容量),右侧 2.3k token(12% 容量)。Autocompaction 将 98% 积累的会话状态压缩为寥寥数句。

Figure 1 直观展示了问题的严重性:左右两幅截图来自同一个 Claude Code 会话,一次 autocompaction 即抹去了几乎全部上下文。这不是 edge case——paper 的 76 个会话平均 84k token,说明大量会话在 compact 后都会遭遇类似损失。

Q2 方法:OS 虚拟内存类比 → DAG 版本控制 + 三遍裁剪 #

类比:如同 OS virtual memory 将物理 RAM 抽象为连续地址空间、通过 paging 实现透明换入换出,CMV 将 LLM context window 抽象为可持久化、可分支的虚拟状态空间——用户可将"84k token 的理解"作为稳定根节点,衍生多条独立工作流,无需重建。

DAG 状态模型:会话历史 $G = (V, E)$,其中节点 $v \in V$ 是不可变快照(JSONL 对话日志 + 元数据),边 $(v_i, v_j) \in E$ 表示从 $v_i$ fork 出独立工作会话后生成 $v_j$。四个原语:Snapshot(捕获)、Branch(fork + 可选 trim)、Trim(Snapshot + Branch 复合)、Tree(ASCII 可视化谱系图)。

三遍裁剪算法

保留保证:每条 user message、assistant response、tool invocation 元数据(file_path, command, description 等)原样保留——只剥离机械性输出。

核心技术壁垒:孤儿 tool result 处理。原生 compaction 的边界可能切割 tool_use/tool_result 配对——tool_use 在边界前被丢弃,但对应的 tool_result 留在边界后。LLM API 严格校验配对关系,缺少 tool_use 的 tool_result 直接触发 validation error。CMV 通过两遍前置扫描(Pass 1 + 2)预收集将成为孤儿的 ID,在 Pass 3 静默丢弃,保证 API 正确性——这是三遍架构存在的根本原因。

Q3 结果 #

§3 架构 / 方法图 #

stateDiagram-v2 state "Session s₀ (active)" as S0 state "Snapshot v₀ (immutable)" as V0 state "Branch s₁ (auth work)" as S1 state "Branch s₂ (API refactor)" as S2 state "Branch s₃ (perf tuning)" as S3 state "Three-Pass Trimmer" as TRIM S0 --> V0: Snapshot(s₀) V0 --> TRIM: Branch(v₀, trim=true) TRIM --> S1: fork + orientation msg TRIM --> S2: fork + orientation msg TRIM --> S3: fork + orientation msg state TRIM { state "Pass 1: Boundary Detection" as P1 state "Pass 2: Orphan ID Collection" as P2 state "Pass 3: Streaming Filter" as P3 P1 --> P2 P2 --> P3 }

CMV 工作流:用户在 session s₀ 中积累 context 后执行 Snapshot 生成不可变节点 v₀;随后可多次 Branch 并经过三遍 Trimmer 产出独立子会话。DAG 的 tree 命令可渲染完整谱系图。

Pass 3 的七条裁剪规则按优先级:pre-compaction skip → metadata removal → base64 stripping → tool_result stub → tool_input stub → thinking block removal → orphan stripping。白名单字段(file_path, command, url 等)在 stub 时永远保留,确保模型仍知道"读过哪些文件、跑过哪些命令"。

§4 作者证明 #

无形式化作者证明 — 仅实证。

论文的数学内容限于经济可行性的 cost model(§4.1),不涉及收敛或正确性的形式证明。

Cost model 符号表

符号含义
$T$token count
$h$cache hit rate
$P_\text{read}$cache read price / M tokens
$P_\text{write}$cache write price / M tokens
$T_\text{pre}$, $T_\text{post}$trim 前后 token count
$n^*$break-even turn

Cost model 方程

稳态每轮成本:$C(T, h) = \frac{T}{10^6}(h \cdot P_\text{read} + (1-h) \cdot P_\text{write})$

Cold-cache 惩罚轮成本:$C_\text{cold}(T) = \frac{T}{10^6} \cdot P_\text{write}$

一次性惩罚:$\Delta_\text{penalty} = C_\text{cold}(T_\text{post}) - C(T_\text{pre}, h)$

每轮节约:$\Delta_\text{savings} = C(T_\text{pre}, h) - C(T_\text{post}, h)$

Break-even 轮数:$n^* = \lceil \Delta_\text{penalty} / \Delta_\text{savings} \rceil + 1$

物理意义:trim 后的首轮丢失缓存前缀(写价格),后续轮因更小 prefix 而在 cache hit 下节省。$n^*$ 就是累积节约追平一次性惩罚所需的轮数。

6 checks

  1. 量纲一致性:$C(T,h)$ 输出 $,$T / 10^6 \times \$ / M$ = $ ✓
  2. 边界条件 $h=1$:$C = T \cdot P_\text{read} / 10^6$(全缓存命中),符合直觉 ✓
  3. 边界条件 $h=0$:$C = T \cdot P_\text{write} / 10^6 = C_\text{cold}(T)$(无缓存 = 冷启动),退化正确 ✓
  4. $T_\text{post} = T_\text{pre}$ 时:$\Delta_\text{savings} = 0$,$n^* \to \infty$(无缩减 = 永远不回本),正确 ✓
  5. $T_\text{post} = 0$ 时:$\Delta_\text{penalty}$ 为负(trimmed 首轮更便宜),$n^* = 1$,符合"极端缩减即时回本" ✓
  6. 实际数值验证:Table 1 下 Opus 4.6 $P_\text{write} = \$6.25$, $P_\text{read} = \$0.50$, $h=0.9$。84k token session: $C(84000, 0.9) = 0.084 \times (0.9 \times 0.50 + 0.1 \times 6.25) = \$0.0903$。若 $T_\text{post} = 67200$(20% 缩减),$\Delta_\text{savings} = \$0.018 / \text{turn}$, $\Delta_\text{penalty} \approx \$0.33$, $n^* \approx 19$。与 Table 2 中位数 38 的偏差可归因于实际分布——确认 cost model 量级正确 ✓
  7. 可形式化但未做:trimming 的 "structurally lossless" 可以形式定义为投影函数 $\pi: M \to M'$ 使得 $\forall m \in M_{\text{user}} \cup M_{\text{assistant}}: m \in M'$,即 user/assistant 消息集合不变。论文以自然语言声明但未用集合论证明。

    §5 实验与数据 #

    数据来源与方法 #

    单用户 Claude Code(Opus 4.6)三个月的实际编码会话,排除子代理会话和 <10 messages / <5k token 的会话后保留 76 个。以 chars/4 估算 token(对 text-dominated 会话准确、对 image-heavy 会话高估)。假设 $h = 0.9$ 缓存命中率。

    核心结果 #

    Figure 2: Token 缩减分布

    Paper Figure 2: 76 个会话的 token reduction 分布,按 bloat profile 着色。中位 12%,均值 20.4%,长尾可达 86%。

    分布呈右偏长尾:29 个会话缩减 <5%(几乎纯对话),但 12 个 mixed 会话平均 39%。这意味着 CMV trimming 对 tool-heavy 会话有显著价值,对纯对话会话接近无效——适用性取决于 workflow 类型。

    Figure 3: Break-even 与 reduction 关系

    Paper Figure 3: 散点图。>30% 缩减的会话在 15 轮内 break-even("worth it" 区域),<10% 缩减的会话聚集在 60 轮 cap("trimming is unnecessary" 区域)。

    Figure 3 是论文经济论证的关键图:它将 reduction 和 break-even 的非线性关系可视化——30% 是实用分界线,低于此值 trimming 在 API 定价下可能是净负面的。两条注释线(<15 turns = worth it, <5 turns = easy win)帮助实践者快速判断。

    Figure 4: 累积成本对比

    Paper Figure 4: 累积输入成本。高亮会话(46% 缩减)在 turn 6 回本,此后持续节省。淡线显示其他会话的分布。

    高亮线清晰展示了 trim-then-cache 策略的典型行为:首轮 cold miss 造成跳跃,但更小的 prefix 使后续每轮斜率降低,curve 持续发散。

    Figure 5: 会话上下文组成

    Paper Figure 5: 各会话 JSONL 字节组成。绿色 = 对话内容(保留),其他颜色 = 可裁剪开销(tool results, thinking/sigs, file history 等)。

    Figure 5 解释了 bimodal 分布的根源:有些会话(如左侧几个)tool result + file history 占比超 40%,给 trimmer 留出大量空间;右侧会话几乎全是对话,trimmer 无处可削。

    分段结果(Table 3) #

    Bloat ProfileSessionsMean Red.Med. Red.Mean Break-evenMean Context
    Mixed (≥15%)1239%33%10 turns97k
    Conversational (<15%)6417%10%40 turns82k
    All7620%12%35 turns84k

    Mixed 会话虽仅占 16%,但平均上下文更大(97k vs 82k),break-even 更快(10 vs 40),是 trimming 的主要受益群体。

    未量化的主要收益 #

    论文明确承认:branching 带来的 context rebuilding 避免是 "primary value proposition",但仅以定性论述支撑。一次 branch load 成本 $0.53(cache-write, 84k token),缓存命中后降至 $0.04——远低于从零重建同等理解的 10–20 轮累积成本。

    §6 论证链 #

    Step论点证据逻辑类型
    1Autocompaction 在 context window 满时造成 98% 的会话状态损失Fig. 1: 132k → 2.3k 观测实例观察归纳(n=1 实例)
    2现有方案(RAG, MemGPT, prompt compression)不能保留完整对话状态§1 功能对比表:RAG 无状态、MemGPT 单会话、压缩操作在 embedding 层分类排除
    3DAG 版本控制模型 + 四原语可实现跨会话 context 复用§2 形式定义 $G=(V,E)$ + Snapshot/Branch/Trim/Tree 语义构造性设计
    4三遍裁剪算法在 structural level 无损压缩 conversation logAlgorithm 1 + 七条规则 + 孤儿处理保证 API 正确性算法规约
    5Trimming 在 mixed 会话中经济可行(39% 缩减, 10 轮 break-even)Table 3, Fig. 2–4: 76 session 实测经验验证
    6Context rebuilding 避免是主要价值但未定量测量§4.4: 定性论述 "10–20 turns / 15–30 min"未验证声明

    论证链从问题观察(step 1)经由排除现有方案(step 2)到设计方案(step 3–4),再经实验验证(step 5),最后以未验证声明(step 6)结束。注意 step 1 的 98% 数字来自单例观测,step 6 完全无量化支撑。

    §7 实现 cross-reference #

    开源参考实现:github.com/CosmoNaught/claude-code-cmv

    核心技术壁垒:孤儿 tool result 检测 #

    三遍架构存在的唯一原因是 LLM API 的 tool_use / tool_result 严格配对约束。如果 API 允许未配对的 tool_result(或自动忽略),Pass 2 可以被消除,算法退化为单遍流式过滤。CMV 在 userland 解决了一个本质上属于 API schema 设计的问题——未来 API 松绑此约束将使此壁垒消失。

    关键实现细节 #

    1. Pass 1 的 String.includes() 优化:对每行原始文本做字符串匹配检测 compaction marker,只解析命中行的 JSON。对大文件(>100k 行 JSONL)这比逐行 JSON.parse 快一个数量级。
    2. Stub 阈值 $\tau = 500$ 字符的合理性:保留足够短的 tool 输出(error messages、short file reads)原样传递,仅 stub 长输出。最小值设为 50 字符防止过度裁剪。白名单字段(file_path, command 等)永远不被 stub,确保 model 保留 "做了什么" 的元知识。
    3. Agent-specific 补充 #

      § Agent scope: 本文的 agent 是 coding agent(Claude Code),属闭环(single-user 持续交互、tool-use dominated),交互模式为多轮、人在环路。CMV 不改变 agent 本身的推理能力,而是管理其 context window 生命周期。

      § Planning & reasoning: CMV 不涉及 agent 的 planning / reasoning 机制——它在 agent 下层运行,管理会话日志。用户手动决定何时 snapshot / branch / trim。无 backtracking(快照不可变),但可通过创建新 branch 实现功能等价的 "回到旧状态"。

      § Tool & environment interface: CMV 自身的 "tools" 是四个 CLI 命令(snapshot, branch, trim, tree),操作对象是文件系统上的 JSONL 文件。Side effects: snapshot 为只读复制;branch 创建新会话目录;trim 在 branch 基础上修改 JSONL。Environment 假定:文件系统确定性、Claude Code JSONL 格式稳定。

      § LLM backbone requirements: 无最小模型要求——CMV 操作的是 conversation log 而非 model weights。论文评估仅用 Opus 4.6,但方法对任何遵循 tool_use / tool_result schema 的 API 通用。

      § Evaluation: 无标准 benchmark。76 个真实 session 的 case study,single-user(n=1 user)。Metric: token reduction %, break-even turns, cumulative $ cost。无 pass@k / success rate / reasoning accuracy 测量。无与其他工具的 A/B 对照。

      § Production readiness: 参考实现是 CLI wrapper over filesystem + JSONL 操作。无沙箱(直接操作 Claude Code session 文件)。无 auth / secrets 管理。无并发控制(手动单用户操作)。Observability: Tree 命令提供谱系可视化。成本控制:break-even 分析作为事前决策工具。

      [实现已公开] — https://github.com/CosmoNaught/claude-code-cmv