上下文作为环境:用于长周期代理的可编程上下文管理

arXiv cs.AI 论文

摘要

本文介绍了Scroll,这是一个针对长周期LLM代理的可编程上下文管理系统,它将各个会话视为具有持久状态的可执行环境,并在记忆和代理基准测试中取得了卓越的性能。

arXiv:2608.21690v1 Announce Type: new 摘要:LLM代理越来越多地承担长时间运行的任务,其历史记录远超单个模型上下文窗口的范围。现有方法通过压缩早期交互或将选定信息提取到固定的记忆表示中,在未来需求未知时就决定了保留内容。我们提出了Scroll,一个将每个代理会话视为可执行会话环境的上下文管理器。该环境由仅追加的事件日志和沙箱化的持久Python内核支持。内核在模型调用间维护一个类型化的命名空间,允许工具输出、检索到的历史记录和派生状态绑定到变量,而不是在每次调用时序列化到提示中。模型编写的代码通过exec搜索、实例化和转换会话状态;只有明确打印的投影才会进入模型的工作视图以供下次调用。因此,上下文管理成为一个编程任务,继承了LLM不断改进的编码能力,同时事件日志保留了无损的历史真相。当工作视图接近其预算时,过时的段会被驱逐但仍然可恢复:驱逐索引将紧凑的地标绑定到精确的事件日志地址,使代理直接导航到被驱逐的区域,而不是搜索整个日志。以Qwen3.8-Max为骨干,Scroll在LongMemEval_S上达到94.8%;在BEAM_10M上达到73.1%,超过已发表的最佳记忆系统5.1个百分点;并在LOCA_256K上达到86.7%,超过已发表的最佳长期代理37.4个百分点。
查看原文
查看缓存全文

缓存时间: 2026/08/25 04:22

# 作为环境的上下文:长时序智能体的程序化上下文管理
来源:https://arxiv.org/html/2608.21690
Yin Lin†yin\.lin@alibaba\-inc\.com阿里巴巴集团 Elaine Ang†§\{\}^\{\\dagger\\,\\lx@sectionsign\}ra3448@columbia\.edu哥伦比亚大学 Erkang Zhuerkang\.zhu@alibaba\-inc\.com阿里巴巴集团 Bolin Dingbolin\.ding@alibaba\-inc\.com阿里巴巴集团 Jingren Zhoujingren\.zhou@alibaba\-inc\.com阿里巴巴集团

###### 摘要

大型语言模型(LLM)智能体正越来越多地承担长时序任务,其历史记录增长远超单个模型的上下文窗口限制。现有方法通过压缩早期交互或将选定信息提取为固定记忆表征,在未来需求未知时就确定了要保留的内容。我们提出 *Scroll*,一个上下文管理器,它将每个智能体会话视为可执行的 *会话环境*。该环境由一个仅追加的事件日志和一个沙箱化的持久化Python内核支持。内核在跨模型调用中维护一个类型化的命名空间,允许工具输出、检索的历史和派生状态绑定到变量,而非在每次调用时序列化到提示词中。模型编写的代码通过 `exec` 搜索、实例化和转换会话状态;只有显式 `print` 的投影内容才会进入模型下一次调用的工作视图。因此,上下文管理成为一项编程任务,继承了LLM不断增强的编码能力,同时事件日志保留了无损的历史事实真相。当工作视图接近其预算时,过时的片段会被驱逐但仍然可恢复:一个驱逐索引将紧凑地标记与事件日志的精确地址绑定,使智能体能直接导航到被驱逐的区域,而非搜索整个日志。使用Qwen3.8-Max作为骨干模型,Scroll在LongMemEvalS上达到94.8%;在BEAM10M上达到73.1%,比已发布的最佳记忆系统高出5.1个百分点;在LOCA256K上达到86.7%,比已发布的最佳长时序智能体高出37.4个百分点。

††脚注文本:†同等贡献。††脚注文本:§工作在阿里巴巴集团实习期间完成。
## 1 引言

LLM智能体正被越来越多地用于长时序任务,例如仓库级软件工程(11 (https://arxiv.org/html/2608.21690#bib.bib21); 32 (https://arxiv.org/html/2608.21690#bib.bib14))和开放网络上的深度研究(40 (https://arxiv.org/html/2608.21690#bib.bib22); 30 (https://arxiv.org/html/2608.21690#bib.bib23))。与单轮生成不同,这些任务在模型调用、工具执行、观察、失败和修订的扩展轨迹上展开。随着轨迹的增长,*智能体运行时*的核心挑战是上下文管理:会话历史持续累积,而每次模型调用都在一个有限的上下文窗口上进行。此外,模型能够可靠利用的有效上下文远小于其标称窗口,因为长输入检索和推理能力会随输入长度增加而下降(21 (https://arxiv.org/html/2608.21690#bib.bib8); 35 (https://arxiv.org/html/2608.21690#bib.bib1))。

当前系统主要通过*上下文压缩*或*外部记忆*来解决这个问题。压缩是实践中的主流方法:现有方法会截断过时片段、丢弃工具输出,或用摘要替换早期的轨迹部分(12 (https://arxiv.org/html/2608.21690#bib.bib2); 34 (https://arxiv.org/html/2608.21690#bib.bib10)),而Claude Code、Codex CLI和Cursor等生产环境中的智能体据报道也采用了类似的压缩机制,以防上下文窗口达到极限。外部记忆系统则将选定的事实或情景提取到单独的存储中,之后通过语义或结构化接口进行检索(23 (https://arxiv.org/html/2608.21690#bib.bib9); 31 (https://arxiv.org/html/2608.21690#bib.bib7); cao2026remember)。两者在本质上都是有损的,方式相同:智能体只能通过摘要或记忆存储看到历史,因此它们未能保留的任何细节都将无法触及——即使原始日志仍然存在于磁盘上。然而,长时序任务可能需要精确的历史证据或对过去事件的非平凡计算,例如比较轨迹中相隔甚远的工具输出。相关信息和所需操作都无法提前预知,因此在观察时生成的任何摘要都无法保证保留日后所需的信息。

我们提出 *Scroll*,它将智能体的历史记录保持在模型上下文之外(38 (https://arxiv.org/html/2608.21690#bib.bib4)),并将其表示为可执行的 *会话环境*。一个仅追加的事件日志以稳定地址和溯源方式保存交互轨迹,而一个沙箱化的持久化Python内核跨越模型调用存活,并维护一个类型化的驻留变量命名空间。因此,任何此状态都可以被实例化为Python对象,并在推理步骤中重用,无需序列化到提示词中。

这将上下文管理转变为*编写程序*——这是当前模型已经非常擅长的事情。模型发出 `exec` 动作来搜索和扩展事件日志、访问允许的资源、调用工具(3 (https://arxiv.org/html/2608.21690#bib.bib33)),并对驻留变量进行计算。检索的记录、工具输出和中间计算都保留在内核中,除非通过 `print` 显式输出,运行时会将这些输出作为观察插入下一个模型上下文。因此,`exec` 决定了如何访问和转换环境,而 `print` 决定了哪些投影内容进入模型对会话环境的*工作视图*。

当工作视图接近其预算时,运行时会驱逐过时的片段。与压缩不同,驱逐只改变视图,从不改变底层记录:被驱逐的事件以其稳定地址逐字保留在事件日志中,模型的程序可以按需搜索和实例化它们。Scroll还在视图中保留一个*驱逐索引*:一个关于已离开视图内容的紧凑映射。搜索只能恢复智能体想到要查询的内容,而索引让智能体意识到它无法再看到的历史;每个条目锚定被驱逐事件的精确地址,以便按需实例化原始内容。

我们的贡献有三方面:

- •我们将长时序上下文管理形式化为在每一步选择持久化会话环境上的工作视图。现有方法在未来需求未知时固定此选择;Scroll将其推迟到查询时,作为模型编写的程序执行。
- •我们实现了一个可执行的上下文基底,结合了仅追加的事件日志、持久化存储和一个沙箱化的持久化Python内核。模型通过 `exec` 操作环境;在其中,只有显式的 `print` 输出才会进入模型可见的上下文。
- •我们引入了一种算法,在不丢失历史的情况下保持工作视图在预算内:被驱逐的片段在事件日志中保持完整,由智能体可以导航的、基于地址锚定的紧凑条目索引。

## 2 Scroll 上下文管理器

参见图片标题 图1:Scroll 概述。Scroll 将完整会话保存在持久的、可执行的会话环境中;模型编写的代码通过 `exec` 在其上检索和计算,而 `print` 选择暴露给下一个模型调用的工作视图。
我们介绍Scroll,一个用于长时序LLM智能体的上下文管理器。关键洞察是智能体累积的历史不应序列化到模型的提示词中,而应被视为*模型通过编程方式与之交互的环境*。然后提示词只携带一个工作视图,而会话则存在于上下文窗口之外且不丢失。我们首先形式化此设计解决的问题(§2.1 (https://arxiv.org/html/2608.21690#S2.SS1)),然后描述会话环境(§2.2 (https://arxiv.org/html/2023.12345#S2.SS2)),模型用于构建自身上下文的程序化接口(§2.3 (https://arxiv.org/html/2023.12345#S2.SS3)),以及在保持可恢复性的同时限制工作视图的驱逐机制(§2.4 (https://arxiv.org/html/2023.12345#S2.SS4))。

### 2.1 问题形式化

#### 会话状态与工作视图。
智能体会话产生一个不断增长的*事件*序列 e1,e2,...e\_\{1\},e\_\{2\},\\ldots(用户消息、模型响应、工具调用、工具结果),每个事件都有一个关联的*负载*(其原始内容,例如完整的工具输出)。我们将 t 个智能体步骤后的会话状态写为
St=\(Lt,Pt,Vt\), S\_\{t\}=\(L\_\{t\},\\;P\_\{t\},\\;V\_\{t\}\), (1)其中 Lt L\_\{t\} 是带有每事件元数据的事件序列,Pt P\_\{t\} 是 Lt L\_\{t\} 引用的负载,Vt V\_\{t\} 是辅助派生状态(在Scroll中是一个变量命名空间;在其他系统中,是记忆存储或摘要缓冲区)。然而,每次模型调用都消耗一个*工作视图* ct c\_\{t\},其大小 \|ct\| ≤ C \|c\_\{t\}\| ≤ C 个token,其中 C C 是模型的标称上下文窗口。*上下文管理问题*是在每一步选择下一个视图:映射 St ↦ ct+1 S\_\{t\} \\mapsto c\_\{t+1\}。

#### 选择何时做出。
现有方法在未知未来需求时固定映射 St ↦ ct+1 S\_\{t\} \\mapsto c\_\{t+1\}:压缩在轨迹增长时应用一个有损算子 φ \\phi,ct+1=φ⁡\(ct,et\) c\_\{t+1\}=\\phi\(c\_\{t\},\\,e\_\{t\}),决定每个片段被压缩时哪些信息存活;外部记忆在摄取时应用一个提取算子 ψ \\psi,Vt=ψ⁡\(Vt−1,et\) V\_\{t\}=\\psi\(V\_\{t-1\},e\_\{t\}),固定了存储的内容及其后续检索方式。无论哪种方式,简化后的表示都替换了它所总结的历史,因此它遗漏的任何内容都无法恢复。

Scroll则将选择推迟到查询时。完整状态 St S\_\{t\} 无损地持久保存在上下文之外,而映射 St ↦ ct+1 S\_\{t\} \\mapsto c\_\{t+1\} 是一个*程序* πt \\pi\_\{t\},由模型在步骤 t 编写:该程序在 St S\_\{t\} 上执行,更新 Vt V\_\{t\},并为下一次调用发出一个有界观察。模型决定回忆、计算和暴露什么;运行时通过持久化存储、稳定寻址和沙箱执行使这些决策安全。由于策略以代码形式表达,它继承了程序的全部通用性,并随着骨干模型编码能力的提升而改进,无需更改运行时。

表1:面向模型的接口将上下文构建分解为定位、实例化、计算和暴露。

### 2.2 持久化会话环境

Scroll将 St S\_\{t\} 实现为一个*会话环境*(图1 (https://arxiv.org/html/2608.21690#S2.F1),右),包含三个对应 Lt L\_\{t\}、Pt P\_\{t\} 和 Vt V\_\{t\} 的组件。

#### 仅追加的事件日志(Lt L\_\{t\})。
事件日志是智能体会话的持久化、事实真相记录:一个跨越会话边界的单一仅追加日志。每次交互都追加一个类型化的事件,携带未来查询所需的元数据——角色、会话和智能体标识符、时间戳和工具状态——并获得其不可变、单调递增的 seq。我们的实现将事件存储在SQLite中。搜索默认使用BM25而非嵌入:它是确定性的,且无需索引时的模型调用。

#### 持久化存储(Pt P\_\{t\})。
负载是交互产生的原始内容,例如完整的工具结果或生成的制品。日志记录了交互的发生,但无需在事件行中存储其每个字节:小负载保留在SQLite内联,而大负载则移至文件系统上的JSON或制品存储中,行保留一个有界的预览和一个恢复指针。外部化的负载通过惰性句柄(ToolResultRef, ArtifactRef)访问。

#### 持久化运行时和驻留命名空间(Vt V\_\{t\})。
一个沙箱化的Python内核在会话期间跨模型调用持久化;其命名空间持有*环境对象*:驻留的Python值和惰性句柄,每个都携带类型、大小和溯源元数据,标识其源自的事件。通过程序化工具接口发出的工具调用(3 (https://arxiv.org/html/2608.21690#bib.bib33))返回Python对象,供后续程序操作。运行时在每次调用前添加一个*命名空间摘要*:一个简短的列表,列出每个驻留变量的名称、类型和形状,小的标量值内联显示。模型编写的代码在失败关闭的沙箱中运行:内核中的事件日志是只读的,数据库、文件系统、网络和工具访问仅限于运行时显式声明的能力。

图2:程序化上下文构建。三次 `exec` 调用在内核中的驻留状态上计算;只有 `print` 输出进入下一个模型上下文/工作视图。

### 2.3 程序化上下文构建

Scroll使用CodeAct风格的接口(29 (https://arxiv.org/html/2608.21690#bib.bib36))进行任务执行和上下文构建。一个受控的能力对象 ms 构成面向模型的*记忆表面*,覆盖持久化历史,在四个操作(表1 (https://arxiv.org/html/2608.21690#S2.T1))之后抽象了物理后端。

图2 (https://arxiv.org/html/2608.21690#S2.F2) 追踪了图1 (https://arxiv.org/html/2608.21690#S2.F1) 中旅行规划任务通过三个 `exec` 单元格的过程。单元格1将完整的工具结果绑定到Python内核中的驻留变量 `flights` 和 `routes`,只打印了几行。单元格2搜索事件日志中的陈述偏好;匹配的预览和 seq 地址进入工作视图,揭示了用户对经济舱和免通行费路线的偏好。单元格3展开这两个事件的逐字记录,相应地过滤和排序驻留变量,并打印两个偏好轮次以及最便宜的经济舱航班和最快的免通行费路线。大量的工具结果从未进入工作视图;每次调用都以其完整结果追加到事件日志中,可通过 seq 寻址。

### 2.4 驱逐与上下文外导航

随着会话增长,工作视图必须保持有界。Scroll通过一个驱逐过程(算法1 (https://arxiv.org/html/2608.21690#alg1))限制它,当工作视图超过预算 ρ C \\rho C 时触发。该过程首先将任何活跃轮次持久化到事件日志,并保护活动轮次、最近的尾部和最新的工具结果。其余部分按恢复成本递增顺序被驱逐:首先折叠已完成的工具负载,因为单个 seq 指针足以恢复它们;仅当视图仍然超出预算时,才移除整个片段。离开视图的内容并未丢失:它逐字保留在事件日志中,该过程的一个不变性是它移除的所有内容都保持可寻址。

算法 1 可恢复上下文驱逐
1: 工作视图 c, 事件日志 L\mathcal{L}, 驱逐索引 I\mathcal{I}, 预算 ρ C \rho C, 层宽 k
2: 有界的 c 和更新的 I\mathcal{I};被移除的片段从 L\mathcal{L} 保持可恢复
3: 如果 \|c\| > ρ C \|c\| > ρ C 则
4:    L ← Persist(c, L) \mathcal{L} \\leftarrow \\textsc{Persist}(c, \\mathcal{L}) ▷ 活跃轮次变为持久化
5:    R ← Protected(c) R \\leftarrow \\textsc{Protected}(c) ▷ 活动轮次、最近尾部、最新工具结果
6:    c ← R ∪ FoldPayloads(c ∖ R) c \\leftarrow R \\, \\cup \\, \\textsc{FoldPayloads}(c \\setminus R) ▷ 负载 → seq 指针
7:    E ← SelectSpan(c ∖ R, \|c\| − ρ C) E \\leftarrow \\textsc{SelectSpan}(c \\setminus R, \\; \|c\| - \\rho C) ▷ 超出预算的最旧已完成片段
8:    c, I ← EvictToIndex(c, E, H⁡[E]) c, \\ \\mathcal{I} \\leftarrow \\textsc{EvictToIndex}(c, \\; E, \\; \\mathcal{H}[E]) ▷ E 离开视图;其标题进入 I\mathcal{I},原位显示
9:    I ← RollUp(I, k) \mathcal{I} \\leftarrow \\textsc{RollUp}(\\mathcal{I}, \\, k)
10: 结束如果
11: 返回

相似文章

面向长周期任务的智能体兼容上下文管理

arXiv cs.AI

介绍AdaCoM,一种基于外部LLM的上下文管理器,适用于冻结的智能体。通过保留任务约束和修剪过时内容,利用强化学习提升长周期任务性能,并在网络搜索和深度研究基准上进行了实验。

超越压缩:面向长周期智能体的结构化上下文驱逐

arXiv cs.CL

介绍了上下文窗口生命周期(CWL),这是一种面向长周期LLM智能体的结构化上下文驱逐方案,通过基于依赖图驱逐内容来维持有效无界的工作视野,避免了基于摘要的压缩和最近截断的局限性。