26年3月来自瑞士和德国马普软件系统研究所的论文"ClawVM: Harness-Managed Virtual Memory for Stateful Tool-Using LLM Agents"。
使用状态工具的 LLM智体将上下文窗口视为工作内存,但目前的智体驾驭(agent harness)对驻留时间和持久性的管理方式是尽力而为,导致反复出现故障:压缩后状态丢失、重置时刷新被绕过以及破坏性写回。本文提出 ClawVM,一个虚拟内存层,它将状态管理为具有最小保真度不变性的类型化页,在token预算下实现多分辨率表示,并在每个生命周期边界进行验证性写回(writeback)。由于驾驭已经组装提示、协调工具并观察生命周期事件,因此它是天然的执行点;将合约放在这里可以使驻留时间和持久性确定且可审计。在合成工作负载、12 个真实会话跟踪和对抗性压力测试中,只要最小保真度集符合token预算(由离线预言机确认),ClawVM 就能消除所有策略可控的故障,并且每次迭代增加的策略引擎开销中位数(median)小于 50 微秒。
使用大语言模型 (LLM) 的通用工具智体,即管理电子邮件、日历、智能家居设备、消息传递、Web 自动化以及数十种其他服务的持久助手,现在可以运行数小时甚至数天,在数百次工具调用和多个会话中积累状态。OpenClaw [27] 及其衍生版本(NanoClaw [33]、Pico-Claw [36]、ZeroClaw [46])是最突出的例子;编码智体,例如 Claude Code、Codex CLI 和 Cursor,代表一个范围更窄但同样要求更高的子类。这些使用有状态工具的智体在会话之间保持持久状态,并在跨越多个上下文窗口的长时间内运行。
对于这些智体来说,模型上下文窗口是稀缺的工作内存:它必须保存约束、活动规划、最近的对话以及执行正确操作所需的工具输出,而记录和工件则驻留在持久的后备存储中。正确操作取决于在正确的时间以正确的精度驻留所需的状态。当所需状态缺失或正确状态被静默丢弃时,智体会重复工作、违反用户偏好,并在规划进行到一半时丢失进度。这些并非罕见的极端情况:公开的问题跟踪系统和实践者报告记录上下文摘要后丢失的常见规则和约束[9, 21, 23, 39]、会话重置时静默丢弃的状态[1, 14, 22, 24]以及覆盖而非合并的持久化操作[7]。
诸如 OpenClaw 之类的现代智体驾驭(agent harness)提供构建模块:修剪、检索、压缩、预压缩内存刷新和外部内存插件[4, 20, 25, 27, 28]。这些模块提高召回质量,但没有一个模块能够提供关于驻留、持久性或可审计性的可强制执行契约。实践者们通过配置调整和附加层来应对这些问题[4, 8, 16, 20, 26],但刷新操作仍然可以被绕过,写回操作仍然可能造成破坏,而且没有任何机制能够保证关键状态在生命周期转换后仍然有效。操作系统早在几十年前就吸取了这一教训:当运行时需要管理一个快速但稀缺的内存层和一个缓慢但持久的存储层时,解决方案是虚拟内存,而不是尽力而为的启发式方法。先前的工作借鉴了分页机制[13, 30],但目前还没有任何生产环境强制执行分页机制。
ClawVM,一个由驾驭管理的虚拟内存层,旨在弥补这一不足(如图1 所示)。ClawVM将智体状态管理为类型化的页面,这些页面可以保持完整细节,也可以被压缩、简化为结构化字段,或者在token预算压力下缩小为指针。每个页面都包含一个最小保真度不变式(即在回收空间之前页面可以退化的程度),并且该驾驭通过分阶段、经过验证的写回操作,在每个生命周期边界强制执行这些不变式。当不变式被违反或状态丢失时,系统会引发可观察的故障,从而使故障可诊断和可重放。

只有智体驾驭负责模型与其状态之间的协调。从结构上看,它就像智体状态的操作系统内核:它控制哪些数据驻留以及状态何时变为持久状态。将内存契约放在这里,使得驻留和持久性变得明确、确定且可重放,而无需重新训练模型或替换检索后端。多分辨率表示避免压缩操作的非此即彼:页面会优雅地退化,保留足够的信息以供重建。经过验证的写回操作避免当前自由格式刷新提示中常见的破坏性覆盖。多分辨率表示、验证回写和可观察故障共同弥补检索质量、压缩调优和外部存储器无法弥补的三个差距:关键状态必须在销毁后仍然存在,脏状态必须在丢失之前提交,并且召回失败必须是可诊断的。
本文提出一个带有驾驭集成层的 ClawVM 原型,并在基于 OpenClaw 的确定性回放工作负载上评估策略和故障模型,并与仅检索和实践者配置的压缩+检索基线进行比较 [25, 26, 28]。其还在实时框架中验证钩子集成,测试涵盖生命周期回归、确定性回放套件以及来自真实编码智体会话的跟踪回放,并遵循近期内存基准测试的评估方法 [3, 35]。
在四个基于 OpenClaw 的工作负载系列和六个token预算级别下,ClawVM 将所有策略可控故障(重新获取、重复工具、压缩后引导和刷新未命中)从每个工作负载预算配置(检索基线)的平均 67.8 个故障和 1.5 个故障(实践者配置的压缩+检索)消除至零,并将分页不稳定性分别降低了 77.4% 和 11.4%。一个具有未来需求信息的离线预言机确认剩余余量为零:在线策略已经达到了最佳故障计数。这些结果在所有token预算、12 个不同的真实会话跟踪和 30 个任务级回放中均成立(成功率为 100%,而实践者配置的基线在最紧预算下的成功率为 76.7%),同时每回合策略引擎开销中位数(median)小于 50 微秒。
使用有状态工具的智体在一个长期运行的控制平面(即智体驾驭)下运行。该驾驭负责路由会话、从对话上下文和持久状态中组装每个模型调用、协调工具调用,并发出诸如压缩、修剪和重置等生命周期事件[27, 29]。由于该驾驭(harness)管理着两个层级,因此每个提示组装决策(包含哪些内容、以何种保真度保留、删除哪些内容)都是一个页面替换决策:上下文窗口是物理内存,持久存储是磁盘。
像 OpenClaw 这样的驾驭提供实用的构建模块:修剪低价值跨度、通过 BM25(词频排序)和向量搜索进行检索、压缩接近模型极限的脚本,以及插入一个预压缩刷新回合,该回合要求模型外部化持久注释[25, 27, 28]。外部层(Mem0、Cognee、QMD)增加自动捕获、混合召回和基于图的检索功能[4, 16, 20]。这些机制提高召回率,但对驻留和持久性采取尽力而为的态度:没有强制规定哪些数据必须驻留,状态何时变为持久状态,以及如何审计分页决策。
其后果显而易见。假设一个智体 40 执行一项晨间例行任务,负责协调电子邮件分类、日历冲突和智能家居配置,并加载偏好设置(会议优先级、照明时间表、通知路由)、多步骤规划以及十几个工具调用的结果。此时触发压缩机制:摘要保留高级目标,但丢弃了规划的当前步骤、路由规则以及冲突已解决的证据。智体程序会重新查询已检查过的日历(重复的工具调用),将通知路由到优先级较低的通道(引导丢失),并从已完成到第 5 步规划的第 1 步重新开始。重置后,累积的 40 轮决策将消失;运行时会清除脏状态而不将其写回,并且重新加载不提供任何保证。
这些故障并非孤立发生。现场报告记录生命周期边缘的三类常见故障:驻留故障(压缩操作丢弃指令和工具输出 [9, 21, 23, 39, 40])、持久性故障(重置时跳过刷新操作,破坏性覆盖 [1, 7, 14, 18, 22, 24])和可观测性故障(无原因代码的空召回 [6, 37])。实践者将这些故障追溯到三个根本原因:捕获是可选的、召回是可选的以及压缩操作具有破坏性 [28, 34, 45]。
现有的缓解措施(例如调整配置、外部存储层 [4, 8, 16, 20, 26])无法创建可执行的契约:驾驭(harness)控制提示汇编、工具调解和生命周期事件,但却在没有可执行契约的情况下行使这些控制权。
基于这些观察,本文得出六项要求,这些要求与模型选择或检索后端无关:
• 不变式在销毁后仍然存在。驾驭必须在压缩和重置后确定性地重新存储指令和约束。
• 捕获和调用是策略,而非自主决定。对于指定状态,驾驭驱动捕获和调用,而不是依赖模型进行刷新或搜索。
• 持久性贯穿整个生命周期。驾驭必须在运行时会销毁唯一副本的每个边界处提交脏状态。
• 写回经过验证且非破坏性。更新必须通过确定性检查并使用追加/合并语义;破坏性覆盖必须是可拒绝的。
• 调用是可观察的。运行时必须通过原因码区分"无匹配"、"拒绝"和"后端错误"。
• 驱逐操作需考虑成本。驱逐决策必须考虑重新运行工具调用的成本。
ClawVM 是一个由驾驭管理的虚拟内存层,满足这六项要求。
ClawVM 通过在驾驭层面强制执行的三个选择来满足六项要求。
将智体运行时建模为会话上的事件流。每个事件都可能触发工具执行、内存查找和模型调用。在为输出、系统提示、工具模式和安全裕度预留token后,剩余容量即为分页状态的token预算。在每次调用时,内存管理器会选择满足此预算内最小保真度不变性的驻留集,并在生命周期边界提交脏状态。ClawVM 明确且强制执行了三个选择:(i)驻留单位是类型化页面;(ii)在预算压力下允许的降级是多分辨率表示;(iii)状态变为持久状态的生命周期点使用验证的写回。这些共同实现确定性的提示汇编、受控的降级(而非有损的摘要)、可观察的故障以及生命周期完整的持久性。
页面作为驻留单元。ClawVM 将所有与助手相关的状态视为类型化的页面。页面是一个类型化的记录,具有稳定的标识符、作用域、来源和最低保真度不变式。页面是选择、驱逐和写回的单元,将尽力而为的提示转化为可强制执行的行为。作用域(会话私有与项目共享)和来源(原始工具调用或转录跨度)是重要的元数据,是可观察性和安全写回所必需的。表 1 列出涵盖易出错状态的六种页面类型,每种类型都有一个最低表示级别(以下定义四个级别):引导/策略(系统指令和程序指令,丢失会导致"忘记其协议"故障)、约束(硬绑定,永远不会降级到结构化以下)、规划(活动期间的目标和当前步骤)、偏好(作用域限定,可能降级为指针)、证据(具有确定性可解析指针的工具输出)和会话片段(跨度标识符和时间戳范围)。

多分辨率驻留。每个页面可以驻留在以下四个级别之一:完整(逐字摘录)、压缩(token-缩减文本,例如 LLMLingua-2 [31])、结构化(足以满足不变量的类型化字段)和指针(可解析句柄加上最小元数据)。在压力下,页面会沿着这条链退化,但会保留不变性:约束永远不会低于结构化状态,证据指针必须保持可解析性。表示是在页面创建时生成的,而不是在预算压力下按需生成:当页面首次被摄取或更新时,框架会提取结构化字段并计算缩减后的变体。然后,表示选择器会在预先存在的变体中进行选择,因此预算压力下的决策仅涉及表查找和token运算,而无需运行时 LLM 调用或压缩过程。这避免压缩要么全有要么全无的情况:结构化和指针表示保留了足够的信息,以便在需要时重建完整的页面。
故障模型。与核可以从磁盘透明地解决的操作系统页面错误不同,智体故障是静默的:如果没有检测,驾驭无法检测到丢失的状态,恢复意味着重新生成。 ClawVM 将可观察故障分为两类,分别对应驻留性故障、持久性故障和可观察性故障。工作集故障捕获状态缺失(驻留性故障):重取故障(工具结果在被驱逐后被重新获取)、重复工具故障(由于结果已被驱逐,等效的工具调用再次运行)、固定不变式缺失(提示汇编时缺少硬固定的页面)以及压缩后引导程序故障(压缩后缺少必需的引导程序/策略页面)。持久性故障捕获在生命周期边界丢失的状态(持久性和可观察性故障):静默召回故障(当后端实际拒绝访问或出错时,查找返回空值)以及刷新缺失故障(由于运行时在提交脏页之前销毁了上下文,导致脏页丢失)。这些故障可通过策略控制:正确的策略可以防止这些故障的发生。物理不足(token预算太小,无法容纳所有已固定的页面)和语义错误(模型产生事实上错误的更新)不受策略控制,需要单独评估。此外,当规范工具签名在已存在结果的情况下重复出现时,也会记录重复签名警报;这些是工作负载信号,而非策略失败。用抖动指数(thrash index)来量化不稳定性:即运行期间分页事件与命中次数的比率,该指数借鉴经典的抖动比率(thrashing ratio) [5];高值表示工作集/预算的不匹配。
选择策略。提示组装是一个具有硬约束的多选背包问题。ClawVM 采用确定性的两阶段策略:第一阶段安装所有硬绑定页面和最小所需表示(如果最小集合无法容纳,则显示不变压力);第二阶段根据每个token的边际效用应用贪婪升级(指针→结构化→压缩→完整),直到预算耗尽。效用结合了绑定状态、成员资格、最近使用时间、作用域和重新计算成本,并采用确定性的平局打破机制。下面清单 1 给出完整的算法:

重放预言机(Replay oracle)。为了将策略质量与预算不足区分开来,ClawVM 支持离线重放预言机分析:给定一个跟踪记录和相同的预算,具有有限未来知识的预言机可以选择能够最大限度减少故障的表示形式。预言机的视界 h 是可见的未来需求转换次数;h = ∞ 表示无限期前瞻。预言机差距(在线故障计数减去预言机故障计数)衡量了资源余量与不可避免的工作负载压力之间的关系。
验证回写协议。ClawVM 将持久化视为一个三阶段的生命周期感知事务:结构化暂存(框架仅在生命周期边界请求类型化的、追加/合并/设置版本更新)、确定性验证(检查每个暂存的更新的模式正确性、来源、范围、非破坏性语义和策略合规性)以及范围提交(通过确定性合并规则在已记录的提交点提交已验证的更新)。被拒绝的更新会保留在日志中,并带有原因代码。
用六个 Python 模块(约 1300 行无注释代码,零外部依赖)实现一个 ClawVM 原型,这些模块面向暴露会话元数据、转录日志、工具中介和生命周期钩子的框架 [29]。六个生命周期钩子映射到引擎操作;状态通过 JSON 快照在调用之间持久化。可插拔适配器将各种来源(工作区文件、转录索引、混合检索、QMD/Mem0/Cognee [4, 16, 20])规范化为 ClawVM 页面,从而保持契约检索与具体检索方式无关。这六个模块分别是:SessionPageTable、RepresentationSelector、WritebackJournal、FaultObserver、DecisionTrace(仅追加 JSON 行的审计日志)和 ClawVMEngine。
设置。所有实验均直接基于预生成的工作负载规范驱动 ClawVM 引擎,绕过框架钩子层以隔离选择和故障检测逻辑。每个工作负载定义页面(类型、引脚类别、token成本)、每回合需求、工具调用签名、脏页集和生命周期事件;引擎运行完整的每回合流水线并输出 JSON 行决策跟踪。token预算从 120 到 500 分为六个步长;所有运行均为确定性运行。除非另有说明,否则聚合结果取 4 个工作负载 × 6 个预算 = 24 种配置的平均值。每个需求 (RQ) 都对应于需求;故障类型和工作负载的选择确保每个需求都得到满足。
工作负载。四个合成家族模拟不同的压力模式:证据密集型(轮换工具签名,周期性压缩)、中断密集型(并行任务,压缩和重置)、生命周期酷刑(每 3 轮压缩一次,持久化脏页)以及多会话干扰(2 个并发会话,交错压缩)。六个生命周期回归场景作为通过/失败的门槛(表 3)。

基线。比较五种策略(表 2):检索(无缓存或回写)、检索+缓存(检索+缓存;添加工件缓存)、压缩混合(压缩时预取+回写但不重置,最近更新 [26])、ClawVM(完整的生命周期)以及具有水平 h = 3 的 Oracle(3 轮前瞻)。 Comp-Hybrid 代表实践者的最佳方案:其配置(预取、压缩回写、最近更新、指针解析)均提炼自 OpenClaw 文档、社区指南和问题跟踪器讨论 [8, 26, 34]。实际运维人员需要独立地发现并维护这些参数。即便如此,Comp-Hybrid 仍然存在一些结构性缺陷,无法通过任何配置来弥补:它缺少重置回写(在 /new 路径上的脏状态会丢失)、硬性自动锁定(引导页面未受保护)以及基于实用程序的升级(表 2)。所有策略均未进行超参搜索;所有策略均在相同的token预算下运行。
