S-Bus:面向多智能体 LLM 状态协调的自动读集重建 S-Bus: Automatic Read-Set Reconstruction for Multi-Agent LLM State Coordination
用服务端 HTTP GET 日志自动重建读集,为并发 LLM 智能体实现乐观并发控制。
前置知识
结构化竞态 (Structural Race Condition, SRC)
两个智能体都读取分片 $s$ 的版本 $v$,各自生成增量 $\delta_i, \delta_j$,并在没有重新读取的情况下同时提交、期望版本仍为 $v$。在 Adya 依赖图中表现为一条写-写边 (ww) 叠加重合的读事件,但缺少来自跨分片验证的顺序约束。这是历史记录的纯语法性质,可仅凭 HTTP 可见事件轨迹判定,不依赖增量的语义内容。
这是整篇论文要预防的核心故障——理解 SRC 才能理解 S-Bus 防的是什么、为什么不依赖语义评判。
乐观并发控制 (Optimistic Concurrency Control, OCC)
一种并发控制策略:不提前加锁,而是允许事务先读取修改,在提交时再验证读到的数据是否已被他人改动,若被改则中止并重试。S-Bus 的 ACP 在提交时遍历 DeliveryLog 中记录的所有 $(k', v')$,校验注册表当前 $k'$ 版本是否仍等于 $v'$,不等即返回 HTTP 409 拒绝提交。
S-Bus 的核心机制就是 OCC;理解'提交时验证读集'这一范式是读懂 Algorithm 1 与所有安全实验的前提。
读集与隐藏读 ($R_{obs}$ / $R_{hidden}$)
智能体在某步推理中实际依赖的所有分片构成其读集 $R_\alpha = R_{obs} \cup R_{hidden}$。$R_{obs}$ 是通过 HTTP GET 显式获取的可观测读;$R_{hidden}$ 是智能体从对话历史中引用、但本步未发起 GET 的分片键引用。论文在 SWE-bench 多智能体负载上测得 $p_{hidden} = |R_{hidden}|/|R_\alpha| = 0.739$,即 73.9% 的读对 HTTP 层不可见。
ORI 只在 $R_{obs}$ 投影上提供形式保证;隐藏读是无法被 HTTP 层捕获的部分,这是论文最关键的范围限制与诚实声明。
因果一致性与投影一致性
若操作 $o_1 \xrightarrow{hb} o_2$(Lamport happens-before),则观察到 $o_2$ 的进程必已观察到 $o_1$。论文定义 $\pi$-causal 一致性:投影 $\pi(H)$ 内满足因果序。ORI 是 $\pi = R_{obs}$ 的实例,严格弱于完全因果一致性,且在 Adya 隔离格中按投影读取:$RC \prec_{R_{obs}} \text{ORI} \prec_{R_{obs}} SI$。
ORI 在隔离级别格中的精确定位、与 SI/RC 的反例对比,都依赖因果一致性与投影概念。
TLA+ / TLAPS / TLC / Dafny 形式化工具链
TLA+ 是 Lamport 提出的形式规约语言;TLAPS 是其定理证明器(逐义务机械证明);TLC 是模型检查器(穷举有限状态空间);Dafny 是支持演绎验证的程序验证语言。论文用 TLAPS 证明任意 $N$ 的安全性(687 个义务、0 失败),用 TLC 穷举 $N\le4$(N=3 达 2080 万状态、深度 28),用 Dafny 证明 9 个归纳引理(19 个义务)。
三层机械化证据是贡献 C1 的核心;不熟悉这些工具就无法评估其证明强度与保留公理的含义。
HTTP 条件请求 (ETag / RFC 7232)
HTTP/1.1 的 If-Match 配合 ETag 机制自 1999 年起提供基于资源版本的乐观并发控制:客户端在 PUT 时携带之前 GET 到的 ETag,若服务端版本已变则返回 412 Precondition Failed。S-Bus 的 ACP 是该模式的两点扩展——(i) 通过 DeliveryLog 自动重建读集(RFC 7232 把读集追踪留给客户端),(ii) 跨分片校验(提交键 $k$ 时校验曾读兄弟键 $k'$ 的版本)。
作者明确承认'读作 ETags + DeliveryLog 是正确的';理解 ETag 才能看清 S-Bus 的增量创新与'为什么不用 ETag 直接做'的回答。
研究动机
现有主流多智能体框架(LangGraph、CrewAI、AutoGen、MetaGPT 等)都将共享状态路由到工作流图、消息通道或智能体本地内存,但都不提供对可变共享自然语言状态的写所有权语义——冲突要么靠智能体自报告事后检测,要么干脆不检测。Cemri 等人对 200 条生产轨迹的统计显示,一致性错误占 LangGraph 失败的 23%–31%。论文在受控微基准上复现了这一点:当 $N=4$ 个并发智能体写同一共享键时,后写者赢 (LWW) 策略下 20/20 次试验都发生静默覆盖——两个智能体读取同一版本 $v$、各自生成有效增量,其中一个悄悄覆盖另一个,没有任何报错。典型场景如 Django bug #11019:四个智能体共享只读的 db_schema 分片,$\alpha_1$ 把它从 PostgreSQL 改成 SQLite(升到 $v=4$),而 $\alpha_2$、$\alpha_3$ 仍基于陈旧的 $v=3$ 提交,输出内部自洽却描述了错误的数据库,陈旧 schema 静默毒化了两个分片。
本文的目标是本文要为'专用分片拓扑'(每个智能体拥有不同写键、从共享引用分片读取)提供一个零代码改动的结构化冲突防护机制:在不要求智能体声明读写集、不写协调代码的前提下,在提交时检测并拒绝跨分片的陈旧读。形式上要给出一个明确、可定位的隔离性质(ORI),并用形式化验证三层证据(TLAPS/TLC/Dafny)支撑其安全性;再用生产级 OCC 后端(PostgreSQL 17 SERIALIZABLE、Redis 7 WATCH/MULTI)验证安全等价性;最后精确刻画该机制在何种拓扑下有益、何种拓扑下有害,给出可操作的部署决策指南(Box 2)。
与已有工作不同的是,区别于 Cherry-Garcia、COPS、Spanner、CockroachDB 等系统,它们都要求客户端在事务开始时显式声明读集,或用向量时钟/TrueTime/HLC 协调时间戳;而 LLM 智能体是异构黑盒,访问模式在运行时从自然语言 prompt 涌现,无法静态类型检查其发出的 GET。S-Bus 的独特切入点是:既然智能体都用 HTTP 通信,就在服务器端被动观察 HTTP GET 流量来重建读集,把'读集声明'这个负担从智能体转移到中间件。这使得无需每智能体事务作用域、无需 SDK 改动,就能对自然语言共享状态施加 OCC——这是让 LLM 智能体用例可行的关键性质。
核心方法
直觉上,S-Bus 把每个 HTTP GET 看作一次'读取事件'并记录其版本,到提交时把这些记录当作智能体的读集来校验——本质上是把 1999 年就有的 ETag 机制推广到'跨分片',且读集由服务端自动重建而非客户端声明。技术路线是:S-Bus 作为 HTTP 中间件,为每个智能体 $\alpha$ 维护一个 append-only 的 DeliveryLog$_\alpha$,每当 $\alpha$ 发 GET 请求取分片 $k$ 并返回版本 $v$ 时,就在同一互斥锁保护下原子写入 $(k, v)$(满足假设 A1 的完整性)。提交(POST /commit/v2)时执行 Algorithm 1 的 ACP:构建有效读集 $\hat{R}$,加写锁,对每个跨分片条目 $(k', v') \in \hat{R}$ 校验注册表当前 $k'$ 版本是否等于 $v'$,不等则返回 HTTP 409 CROSSSHARDSTALE;再校验本键版本、注册所有权令牌、写 WAL、自增版本。被拒的智能体重新 GET、重生成增量、再提交。
核心创新不在于 OCC 机制本身($R_{obs}$ 式读集追踪是已知技术,ETag 自 1999 年就有),而在于'智能体什么都不声明、不写一行协调代码'——DeliveryLog 从可观测的 HTTP GET 流量被动重建读集,使无 SDK 改动下对 NL 智能体状态施加 OCC 成为可能。作者明确指出 DeliveryLog 本质是一个作用域受限的 COPS 式因果日志:用标量 $(k, v)$ 对而非向量时钟,只跟踪 per-session 的 HTTP GET,经验上仅覆盖 26.1% 的读,却足以做 OCC 校验。与显式声明读集的 RAMP、Cherry-Garcia、SI 快照读的本质区别在于:声明负担的消失,这恰好匹配 LLM 智能体黑盒、运行时涌现访问模式的特征。
方法步骤详情
完整步骤如下。①读阶段:智能体 $\alpha$ 发 GET /shard/:key?agent_id=X,服务端在持同一 Mutex 的情况下写入 DeliveryLog 条目 $(k, \text{reg}[k].v)$ 再返回响应(A1 完整性)。②提交阶段:智能体发 POST /commit/v2 携带 $(k, v_e, \delta, \alpha)$;ACP 第 1 行调用 DeliveryLog.buildEffRS 构建有效读集 $\hat{R} = R_{explicit} \cup \text{session-deliveries}$(显式条目优先;可选 ARSI 模式声明全集);第 2 行加 RwLock 写锁;第 3–6 行遍历 $\hat{R}$ 中所有 $k' \neq k$,若 $\text{reg}[k'].v \neq v'$ 返回 CROSSSHARDSTALE;第 7 行校验本键版本 $\text{sk}.v = v_e$,不等返回 VERSIONMISMATCH;第 9 行在 token Mutex 下插入所有权令牌;第 10 行写入内容 $\text{sk}.c \leftarrow \delta$、自增版本、追加 WAL;RAII 释放写锁返回新版本。③冲突恢复:被拒智能体重新 GET、重生成增量、再提交。分布式部署下所有变更经 Raft leader 串行化(满足 A3),follower 按日志顺序 apply,保证跨节点提交顺序一致。
技术新颖性
技术新颖性有三层。其一,DeliveryLog 把分布式数据库里的 COPS 因果日志'裁剪'到多智能体 LLM 场景:只跟踪 per-session 的标量 HTTP GET,不做系统级向量时钟,却足以做 OCC 校验。其二,ORI 作为投影一致性性质的精确定位:通过反例历史证明,在 $R_{obs}$ 投影上 ORI 严格介于 Read-Committed 与 Snapshot Isolation 之间——阻止 G2-item(RC 不能阻止)、却允许 $R_{hidden}$ 上的 write-skew(SI 不允许)。其三,三层机械化证据的组合(TLAPS 任意 $N$ 的 687 个义务 + TLC 穷举 $N\le4$ 共 2080 万状态 + Dafny 9 个归纳引理)是短于 IronFleet 全精化但超出工业常规(TiDB/CockroachDB/etcd 仅发 TLA+ 规约不做精化)的验证深度。作者诚实地把实现到 Rust 源码的精化标注为'经验性而非机械化',并保留一个基础类型公理 FUNTYPINGRECONSTRUCTION 未消解。
实验结果
核心发现按五条叙事弧组织。A1 结构冲突防护:Exp. SR 200/200、Exp. CSV 9304 次注入零误报(Rule-of-Three 上界 0.032%),而 OCC-off 基线损坏率 56%–62%,证明防护经验上必要;Exp. ORI-ISOLATION 在 $N=4$ 共享分片下 959 次配对试验,ORI-ON 保住 40/40 贡献、ORI-OFF(LWW)仅 10/40 = 1/N。A2 覆盖缝隙:Exp. PH-2 测得 $p_{hidden} = 0.739$(CI 0.736–0.741,128,622 总读),单步 $R_{obs}$ 仅 26.1%,域间范围 0.511–0.836;Exp. PROXY-PH2 把残余分解为 HTTP-本步 0.443、DL 累积 0.555、proxy 边际 0.0018,合计 $f^{total}_{obs} = 0.998$,说明会话级 DeliveryLog 累积是主导覆盖机制;自报告过度声称率 32%(LLM 判官)/49%(人类标注),故真因果读覆盖上界 $\le70\%$。A3 安全等价:Exp. PG-COMPARISON 三后端(S-Bus、PG-SER、Redis-WATCH)200,880 次提交零 Type-I 损坏(Rule-of-Three 上界 $1.49\times10^{-5}$);Exp. PG-CONTENTION 在 472,750 次提交、427,308 次活动 409 冲突下仍零损坏,SCR 一致性在 $N\ge8$ 落在 1pp 内。A4 跨骨干:Haiku-4.5 与 Gemini-2.5-Flash 配对复制(各 $n=2400$)确认 0/26,400 损坏、$f^{total}_{obs}\in[0.997,0.999]$。A5 拓扑条件:Exp. DEDICATED-SHARD($n=600$)ORI 语义中性(100% 连贯、零冗余);Exp. SHARED-STATE($n=180$)ORI 语义有害(0% 一致 / 100% 矛盾 vs ORI-OFF 4.4% / 85.6%),因为保留所有贡献等于保留它们的相互矛盾。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| 结构冲突防护(Type-I 损坏,活跃冲突下) | 损坏数 / 总提交 | 0 / 427,308(PG-CONTENTION 活跃 HTTP-409 冲突) | OCC-off 基线损坏率 56%–62%(Exp. E/SR) | Rule-of-Three 95% 上界 $7.0\times10^{-6}$;全扫 884,110 次提交零损坏 |
| 三后端 OCC 安全等价($N\le64$) | Type-I 损坏 / 墙钟时延 | S-BUS 0/200,880,$N=64$ 时 1208 ms | PG-SER 0/200,880(18731 ms);Redis-WATCH 0/200,880(2323 ms) | S-BUS 比 PG-SER 快 13×–15.5×、比 Redis 快 1.8×–1.95×;安全等价 |
| 非代码负载视图分歧(WORKLOAD-B,8 域数据管道规划) | 分歧提交 / 检查提交 | ORI-ON 0/638 = 0.00% | ORI-OFF 590/639 = 92.33% | $\chi^2 = 1094.98$, $p < 10^{-240}$;各域 $\chi^2\in[55,60]$, $p<10^{-13}$ |
| 并行 vs 顺序墙钟加速(SEQUENTIAL,10 任务 ×3 重复) | 加速比 | $N=16$: 17.92×(并行 5.53 s vs 顺序 99.09 s) | 顺序执行 | 近线性 $\Theta(S\cdot t_{step})$;所有 $p<0.0001$(Wilcoxon) |
| 读集可观测覆盖(PH-2 多智能体) | $p_{hidden}$ / $f^{total}_{obs}$ | $p_{hidden}=0.739$(CI 0.736–0.741) | — | DL 累积把 $f^{total}_{obs}$ 推到 0.998(HTTP-本步 0.443 + DL 累积 0.555) |
| P1 会话复制容错(DR-9,3 节点 Raft) | leader 故障后 ORI 保持率 | 30/30 (100%) ORI 保持(HTTP 409) | — | Wilson 95% CI [0.886, 1.000];选举中位 1981 ms |
局限与改进
作者坦诚列出三大类限制。结构上:①$R_{hidden}$ 结构覆盖——ORI 只形式保证 26.1% 的 $R_{obs}$,残余 $p_{hidden}=0.739$ 单步内不可观测,DL 累积虽补到 $f^{total}_{obs}=0.998$ 但分子分母含自报告过度声称;②拓扑受限——单分片协作写时 ORI 语义有害(SHARED-STATE 100% 矛盾),需自适应路由(A-BUS,仍在开发);③HTTP/2 多路复用破坏 A1 的 FIFO 假设,需反代固定或 ARSI 模式。证据上:⑤语义质量用 LLM-as-judge 未对人类做 IAA 验证(SJ-v4/Dedicated/Shared 三 rubric 是最大证据缝隙);⑥冲突邻近假设仅在 SWE-bench 结构化任务上验证(100% GET→COMMIT 共址是 harness 副产品);⑪P1 会话复制有约 5 ms 并发故障转移窗口未覆盖;⑭PH-3 真值是 worker 自报告,过度声称 32%–49%。机械化上:⑰TLAPS 保留一个基础类型公理 FUNTYPINGRECONSTRUCTION 未消解;⑱Raft 分布式正确性未 TLAPS 机械化(仅 TLC 抽象 24.7 万状态);⑲无 Rust 实现精化证明。我自己补充的观察:语义质量评估高度依赖单一 LLM 判官 rubric,跨模型家族 κ 仅 0.46,且 SJ-v4 出现反直觉结果(fresh 比 stale 更易损坏,40.6% vs 29.1%),说明拓扑效应远未刻画清楚。
独立分析的弱点
独立分析弱点与改进方向:①负载泛化窄——主评测全在 SWE-bench 派生的 Python 协调任务(10 域),WORKLOAD-B 虽补了数据管道规划(8 域)但每域分歧率高度均匀(91%–94%),更像 harness 形状而非领域语义,文档撰写、RAG 编排、智能体规划等类别未覆盖;改进方向是构建 typed-shard 基准(作者已列入 §11.4)。②语义质量评判脆弱——依赖单一 GPT-4o-mini 判官,跨家族 κ=0.46,SJ-v4 语义 rubric 仍未对人类做 IAA,且出现反直觉的 fresh>stale 损坏;改进方向是 100 项人类 IAA 研究并测试位置/长度偏置。③$R_{hidden}$ 闭环不完整——PH-3 的 analyst-LLM 语义抽取(0.59 召回)只在 $p_{hidden}=0.074$ 单智能体负载上验证,未迁移到 $p_{hidden}=0.739$ 多智能体;改进方向是把 analyst-LLM 嵌入 LLM-API 代理(Limitation 16)。④并发故障转移窗口——约 5 ms 的 fire-and-forget 复制窗口未覆盖,虽有量级估计 $\lesssim5\times10^{-3}$ 期望违规/agent-day,但安全攸关场景不应容忍任何窗口;改进方向是同步复制或 Raft-TLAPS 精化。⑤默认 $K=5$ 重试预算在高 $N$ 共享分片下不足($N=16$ 需 $K\ge19$,$N=32$ 需 $K\ge28$), practitioner 必须手动调参,缺少自适应。⑥自报告真值污染——所有召回数都是对自报告的上界,真因果读覆盖 $\le70\%$ 的口径需要在摘要里更显眼。
未来方向
作者明确四向。①A-BUS 自适应路由:针对单分片协作写(ORI 有害拓扑),设计 additive_hint 布尔声明 + 分类器(DEDICATED / CONTENDED_COMMUTATIVE / CONTENDED_NON-COMMUTATIVE)+ 三策略合并引擎(结构按区替换、追加拼接、LLM 语义合并兜底),preliminary 实现已开源(github.com/sajjadanwar0/abus)。②Raft-TLAPS 机械化:把 TLC 抽象(24.7 万状态)升级为 IronFleet 式精化,估计 6–12 人月,是期刊扩展版的主攻方向。③PH-2 语义抽取迁移:把 analyst-LLM 挂到多智能体负载,工程量 + 约 $50 API 花费每格。④typed-shard 基准重建,消除 8.5% 的跨分片交叉标注。基于成果可延伸的方向:把 ORI 投影一致性框架推广到更多隔离级别(用代理语义抽取逐步把 $R_{hidden}$ 纳入投影 $\pi$);探索与 CRDT(Automerge、Loro、Yjs)的混合部署——加性分片用 CRDT、互斥分片用 OCC;把 DeliveryLog 被动读集重建思路迁移到非 LLM 的微服务协调;与 Temporal/Golem 等持久化执行引擎的 Update API 对比,量化 ORI 跨分片读集推断的额外价值。
复现评估
复现评估较高。代码已开源(https://github.com/sajjadanhar0/sbus 及 sbus-formals、sbus-experiments 仓库),ACP 核心约 950 行安全 Rust,含 Raft 的完整系统 1,679 行、零 unsafe 块,依赖 openraft 0.8.4 + sled 持久化 + Tokio 1.44 + Axum 0.8.4。形式化工件齐全:SBus_TLAPS_v16.tla、SBus_ori.tla、SBus_Distributed.tla、sbus_lemmas_v4.dfy 均释出。实验脚本(pg_bench_full.py、pg_comparison.py、exp_proxy_ph2*.py、exp_adversarial_rhidden_v2.py、run_llm_judges.py、score_annotations.py)及标注 CSV(first.csv、second_human_annotator.csv)可审计。硬件门槛低:主实验在单台 AWS Lightsail 2 vCPU/8 GB 上即可跑。复现难点:①依赖 OpenAI/Anthropic/Google API 花费与随机性(worker temperature 0.3);②三后端对比需额外起 PostgreSQL 17、Redis 7;③人类标注(Zahid Hussain)不可完全复制,但 400 对样本 CSV 可审计、κ=0.93 可复核;④TLAPS 证明需特定 tlapm 1.5 环境,保留公理需读者自行判断。总体可复现性在系统论文中属上游,形式化与实验双工件齐备。
论文图表
原子提交伪代码:输入 $(k, v_e, \delta, \alpha, R)$,第 1 行用 DeliveryLog.buildEffRS 构建有效读集 $\hat{R}$;第 2 行加 RwLock 写锁;第 3–6 行遍历 $\hat{R}$ 中所有 $k'\neq k$,若 $\text{reg}[k'].v \neq v'$ 返回 CROSSSHARDSTALE;第 7 行校验本键版本;第 9 行在 token Mutex 下插入所有权令牌;第 10 行写内容、自增版本、追加 WAL;RAII 释放写锁返回新版本。
这是 S-Bus 的心脏——整个 ORI 安全性都依赖这 10 行的跨分片校验与锁序,理解它才能理解所有 Type-I 零损坏实验的机制来源。