OpenRath:让Agent系统像PyTorch一样——用Session替代群聊,用运行时状态替代日志拼接
论文:OpenRath: Session-Centered Runtime State for Agent Systems (arXiv:2606.19409)
核心洞察:Agent集群不是群聊,而是建立在持久Session状态之上的运行时控制平面
一句话:Session不是聊天记录,它是运行时唯一的一等公民
多Agent系统的"碎片化噩梦"
想象一个复杂Agent工作流:一个Agent做计划,另一个Agent fork出去测试方案A,第三个Agent调用工具修改文件,第四个Agent从记忆库recall历史经验,第五个Agent压缩上下文后返回最终答案。
结束后你想审计:哪个分支产出了最终结果?哪个工具改了哪个文件?哪些记忆被召回、哪些被写入?压缩过程中丢弃了哪些证据?
答案往往是:不知道。
现代Agent系统的运行时状态散落在六个互不相通的"渠道"里:
- 对话记录(transcript)——只保留了模型的输入输出,没有分支、没有工具证据
- 工具日志——藏在某个controller里,和对话上下文脱节
- 内存事件——recall/commit变成了"隐藏的prompt text",看不到痕迹
- 沙箱放置(workspace placement)——文件被改了,但改了哪里的记录可能不在Session里
- 分支谱系(branch provenance)——fork和merge的决策过程被埋在controller代码中
- 重放证据——被压缩器直接丢弃了
OpenRath的团队(Fukang Wen, Zhijie Wang, Ruilin Xu)把这个问题称为 hidden-runtime-state problem——隐藏运行时状态问题。这不是一个具体框架的bug,而是整个多Agent生态的结构性缺陷。
PyTorch教给Agent系统的三件事
OpenRath最聪明的一步,不是发明了一个新概念,而是把深度学习开发者最熟悉的那套抽象,整套搬到了Agent系统上。
PyTorch为什么好用?三个设计原则:
| PyTorch | OpenRath | 为什么重要 |
|---|---|---|
| Tensor → 流动的数据 | Session → 流动的运行时状态 | 所有信息附着在同一个值上,可传递、可分支、可重放 |
| Module/Layer → 可组合的变换 | Agent/Workflow → 可组合的变换 | 统一的 forward(session) -> session 接口,任意堆叠嵌套 |
| Device → 明确放置 | Sandbox/Backend → 明确放置 | 同一份代码,换后端不换逻辑 |
核心映射:
Tensor → Session
Module/Linear → Workflow/Agent
device → Sandbox / Backend
Parameter → Memory
Function → Tool
控制流 → Selector
这里有一个关键区别:OpenRath不是在蹭PyTorch的名字。它借的是架构接口,不是张量数学。论文明确说:"The analogy is architectural rather than literal." 这不是说Agent系统就是神经网络,而是说Agent运行时需要一个稳定的流动值、可复用的变换、明确的放置和可检查的证据。
Session:什么是一等公民运行时状态?
在传统Agent框架中,对话记录(message list)是"一等公民",其他一切都是围绕它的旁路(side channel)。OpenRath把这个关系颠倒了:
Session 是运行时唯一的一等公民,对话记录只是Session的一部分。
一个Session承载的内容:
- 对话片段(conversation chunks)——不是完整的message list,而是有上下文的证据块
- 沙箱放置元数据(sandbox placement)——文件改了哪里、在哪个后端执行的
- 谱系记录(lineage metadata)——谁fork了谁、谁merge了谁、决策路径是什么
- token用量(token usage)——每次调用的开销,可审计
- 待办工作(pending work)——还没完成的子任务
- 工具证据(tool evidence)——工具调用的参数、结果、副作用
- 内存边界记录(memory boundary records)——recall和commit作为可见的运行时事件
关键特性:
- 可分支(branchable) — fork操作复制Session同时保留父子关系
- 可检查(inspectable) — 所有运行时决策都附着在同一个值上
- 可重放(replayable) — Session包含足够的证据来重新执行
- 后端感知(backend-aware) — 知道自己在哪个sandbox/backend上运行
- 可组合(composable) — 可以merge、可以detach、可以持久化
四象限:你处于哪个阶段?
OpenRath提出了一个非常有用的框架,按 Agent数量 × Session数量 将系统分为四个象限:
| 单Agent | 多Agent | |
|---|---|---|
| 单Session | ChatGPT式聊天 | 子代理协作(如AutoGen) |
| 多Session | OpenClaw式分支扇出 | MAMS(Multi-Agent Multi-Session) ← OpenRath |
MAMS 是OpenRath面向的方向。它的判断很干脆:真正需要被fork、merge、复用、追踪的,是整条Session数据流——而非某个Agent内部各自维护的消息列表。
"大多数框架攒的是一屋子聪明的工人,OpenRath先把工位、工单和流水线建好。"
Agent是工人,Session才是工作本身。
Agent不是助手,是变换层
这是OpenRath对Agent定义最颠覆性的地方。
传统框架把Agent当作"有角色、有记忆、有工具的全能助手"。OpenRath说:Agent只是Session上的一层变换。
# OpenRath的Agent核心接口
class Agent:
def forward(self, session: Session) -> Session:
... # 进来一个Session,出去一个Session
这意味着同一个 forward(session) -> session 接口可以装下完全不同的东西:
- 工具调用Agent — 调工具、改文件、把执行结果写回Session
- 压缩器 — 把跑了几十轮的长会话压缩成一条精简消息
- 记忆管理Agent — 跑之前recall,跑之后commit,相当于给会话做索引归档
- 验证器 — 只做校验、只做摘要、只做改写
关键:它们都不持有状态。 就像PyTorch的 nn.Linear 不持有Tensor,OpenRath的Agent不持有Session。状态是Session,Agent只是变换它。
这带来一个巨大的好处:同一个Agent既可以在单Agent场景里简单运行,又可以原封不动地被塞进更大的Workflow,不用改一行代码。
Workflow:像搭神经网络一样搭Agent集群
Workflow在OpenRath中对应PyTorch的 nn.Module:
class MyWorkflow(Workflow):
def forward(self, session: Session) -> Session:
# 可以串联多个Agent
session = agent1(session)
# 可以fork Session做并行探索
branch_a = session.fork()
branch_b = session.fork()
# 可以merge分支
session = Session.merge(branch_a, branch_b)
# 可以压缩上下文
session = compressor(session)
return session
因为每一层进出都是Session,Workflow能像 nn.Module 一样层层嵌套。每层不必重新发明一套状态格式。
Selector 负责动态路由控制流。不是硬编码下一步该跑哪个Agent,而是读取当前Session的状态,运行时决定下一步路由到哪。这让分支和循环成为可检查的运行时决策(decision记录进Session),而不是消失在controller代码中。
Sandbox与Memory:可插拔后端
PyTorch把"算在哪"(device)从"算什么"(model)里剥了出来。OpenRath做了同样的事:
- Sandbox/Backend — 决定代码在哪执行。同一份Agent代码,
.to("local")就本地跑,.to("opensandbox")就远程沙箱跑。计算逻辑一行不用动。 - Memory — 不是隐藏的prompt text,而是Agent级别的持久化状态平面。recall和commit是可见的运行时事件,记录在Session里。
- Tool — 双层抽象:
FlowToolCall是给模型看的(name/description/JSON schema),BackendTool*是沙箱后端真正执行的。MCP工具可以直接适配进同一个循环。
与其他框架的对比
| 框架 | 核心对象 | 与OpenRath的区别 |
|---|---|---|
| AutoGen | 多Agent对话 | Agent持有自己的对话状态,没有统一的Session边界 |
| LangGraph | 图状态检查点 | 检查点用于调度器恢复,不是程序本身传递的值 |
| OpenAI Agents SDK | Trace/Span | 追踪是事后观察用的,不是运行时流动的值 |
| MCP | 工具协议 | 只标准化工具调用,不解决运行时状态碎片化 |
OpenRath的定位是连接层(connective layer):它不取代图调度器、追踪系统、MCP服务器或沙箱,而是问——这些层产生的效应,如何变成一个可分支、可检查、可重放的运行时对象?
"A graph runtime can schedule work, a tracing system can observe spans, MCP can expose tools, and a sandbox can run commands; OpenRath asks how those effects become one branchable, inspectable, replayable state object."
审计优先的发布协议
OpenRath的发布策略非常克制。论文没有声称在SWE-bench或GAIA上击败了谁,而是提出了一个audit-first release protocol:
- 谱系导出(lineage export)— 完整的fork/merge/branch历史
- 本地沙箱执行 — 可复现的工具调用环境
- 工作流转录 — 完整的Session轨迹
- 聚焦测试 — 对核心属性的单元测试
- 视觉QA — 交互式验证
- 声明账本(claim ledger)— 每个声明对应哪些证据
- 内存源审计 — memory recall/commit的可见性
"Broad benchmark superiority, human preference results, and cross-system leaderboard claims are reserved for follow-on quantitative evaluation."
这种克制本身就是一种学术诚信。先把运行时状态的边界和可审计性定义清楚,再去比性能。
局限与未解问题
-
没有量化对比 — 论文明确说不对标AutoGen、LangGraph等框架的benchmark性能,这是后续工作。
-
内存质量未评估 — "What this report does not claim is retrieval quality." 召回和commit策略的有效性取决于具体实现,不是框架本身保证的。
-
后端可用性 — OpenSandbox是可选的,MCP工具后端也是可选的。论文只定义了接口,没有承诺所有后端都已实现。
-
分布式扩展 — 当前主要是本地后端验证,分布式跨节点Session传递是后续方向。
-
生产部署经验 — 作为研究原型,尚未经过大规模生产环境验证。
一句话总结
OpenRath的洞察是:多Agent系统的核心问题不是"怎么让Agent更聪明",而是"怎么让运行时状态不碎片化"。它把PyTorch的架构智慧——一个流动值、统一接口、可组合变换——搬到了Agent世界,让Session成为运行时唯一的一等公民。Agent不是助手,是变换层。Session不是聊天记录,是工作本身。
当Agent从demo走向长流程、多分支、可审计的生产环境时,"状态管理"比"提示工程"更重要。OpenRath在这个方向上迈出了关键一步。
参考
- 论文:OpenRath: Session-Centered Runtime State for Agent Systems (arXiv:2606.19409)
- 作者:Fukang Wen*, Zhijie Wang*, Ruilin Xu†(清华团队)
- 核心概念:Session(一等运行时值)、MAMS(Multi-Agent Multi-Session)、PyTorch-like编程模型
- 关键词:多智能体系统、运行时状态、可审计性、Agent框架、状态管理
#多智能体 #Agent框架 #运行时状态 #Session管理 #PyTorch #可审计性 #清华 #OpenRath
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。