> 论文:GraSP: Graph-Structured Skill Compositions for LLM Agents
> 作者:Tianle Xia, Lingxiang Hu, Yiding Sun 等(腾讯)
> arXiv: 2604.17870v1 [cs.CL] 20 Apr 2026
> 代码:https://github.com/browser-use/browser-harness(注:此为相关项目,GraSP 代码待开源)
---
## 一、问题意识:从"有没有技能"到"会不会编排"
### 1.1 反直觉的发现:less is more
GraSP 的起点是一个让研究者"不舒服"的实验结果:
> **给 agent 更多技能,性能不升反降。**
- 2-3 个聚焦的技能 → 最大收益
- 4+ 个技能 → 收益递减
- 全面的文档 → 反而有害
这个现象在多个 benchmark 上稳定出现,说明不是偶然。它暴露了一个深层问题:**瓶颈已经从 skill availability(有没有技能)转移到了 skill orchestration(会不会编排)。**
### 1.2 现有方法的两大缺陷
**缺陷一:认知过载(Cognitive Overload)**
当前 skill-based agent 把检索到的所有技能 dump 进 prompt,像一个没有目录的图书馆。LLM 被迫在上下文中隐式推理:
- 哪个技能该用?
- 什么顺序?
- 什么条件下生效?
随着任务复杂度增长,这种隐式推理变得不可靠。
**缺陷二:因果结构丢失**
flat execution 把技能当成线性链条执行,丢失了每个技能的:
- preconditions(前置条件)
- effects(后置效果)
- dependencies(依赖关系)
结果是:步骤 k 失败时,agent 不知道这个失败是只影响下一步,还是 invalidate 了整个后续计划。它只能从头 replan,O(N) 复杂度。
### 1.3 根本原因:缺少 compilation layer
检索回答的是"什么技能相关",执行回答的是"现在做这一步"。但中间缺了一层:**"这些技能如何相互依赖,最小因果序计划是什么?"**
没有这个中间表示,agent 无法:
- 控制技能数量(精确选择而非贪婪检索)
- 强制执行顺序(尊重 precondition-effect 链)
- 局部恢复(只修复受影响部分)
---
## 二、GraSP 核心架构:四阶段流水线
### 2.1 整体定义
**GraSP** = 一个 typed DAG G = (V, E),其中:
- 节点 V = {v_src} ∪ V_skill ∪ {v_snk}
- 边 E ⊆ V × {state, data, order} × V
- 满足:无环、可达、目标完整、可执行
三种边类型:
- **State edges**:u 的 effect 满足 v 的 precondition
- **Data edges**:u 的输出绑定到 v 的输入
- **Order edges**:软性的经验优先级或资源冲突约束
State 和 Data 边是**硬约束**(不能移除),Order 边是**软约束**(修复时可重连)。
### 2.2 阶段一:Memory-conditioned Retrieval
不是纯语义检索,而是融合 episodic memory:
```
p(s|q,x,R) = λ·p_dir(s|q,x) + (1-λ)·(1/Z)Σ ρ_j · freq(s, τ_ij)
```
- p_dir:直接语义匹配
- p_mem:基于成功轨迹的频率加权
- R:top-k 成功记忆记录
**Retrieval confidence**:四个特征校准
- 平均记忆相似度 ρ̄
- 分布一致性 1-JSD(p_dir ∥ p_mem)
- top-skill margin p(1)-p(2)
- 目标覆盖率 |Cover(Ŝ,g)|/|g|
### 2.3 阶段二:DAG Compilation(最关键)
把 flat skill list 转换成 typed DAG:
1. **Propose**:LLM 提议技能调用实例
2. **Validate**:参数绑定验证
3. **Infer edges**:从 precondition-effect 匹配和记忆先验推断边
4. **Resolve cycles**:移除低置信度的软边
5. **Attach verifiers**:附加验证器
每个节点携带完整元数据:
```
a(v) = ⟨κ_v, θ_v, φ_pre_v, φ_eff_v, ν_v, ζ_v, c_v, b_v⟩
```
schema, 参数, pre/postconditions, 验证器, 执行状态, 置信度, repair budget。
### 2.4 阶段三:Verified Execution with Local Repair
拓扑序遍历,每个就绪节点:
1. Precondition check:xt ⊨ φ_pre_v
2. Execution:运行技能实现 f_κ_v
3. Postcondition verification:ν_v(x_t, x_{t+1})
4. 全部通过 → 标记为 verified,继续
失败时生成 failure event ε = ⟨v, τ_ε, m_ε, x_t⟩,τ_ε 分类失败类型。
### 2.5 五种 Typed Repair Operators
这是 GraSP 的核心创新之一——**局部图变换**,保持 DAG 有效性和所有未受影响节点的 verified 状态:
| Operator | 作用 | 适用场景 |
|----------|------|---------|
| **REBIND** | 更新失败节点的参数 θ' | 技能对但绑定错 |
| **INSERTPREREQ** | 插入子图 U 建立缺失 precondition | 前置条件不满足 |
| **SUBSTITUTE** | 替换技能 schema κ',保持下游接口兼容 | 技能实现有问题 |
| **REWIRE** | 局部编辑边(增删改类型) | 依赖关系变化 |
| **BYPASS** | 跳过节点,当前状态已满足下游要求 | 冗余步骤 |
**Repair bounded**:补丁大小限制在 h-hop 邻域内,|ΔV| ≤ L_max, |ΔE| ≤ E_max。
**复杂度**:O(d^h),典型 d≈2, h=2 → 4-5 个节点,与总计划长度 N 无关。
### 2.6 阶段四:Confidence-based Routing
三层回退机制:
- c_ret > τ_high:完整 DAG + local repair
- τ_low ≤ c_ret ≤ τ_high:增加 repair budget
- c_ret < τ_low:回退到 ReAct
因为 GraSP 包含 ReAct 作为特例(flat sequence = 只有 order edges 的 DAG),这是 no-regression guarantee。
---
## 三、实验结果:48 个配置全部第一
### 3.1 设置
- **Benchmarks**:ALFWorld(家庭任务)、ScienceWorld(科学实验)、WebShop(网购)、InterCode(Bash)
- **Models**:8 个 backbone — DeepSeek V3.2, GPT-4.1, Claude-4-Sonnet, GLM-5, Gemini 2.5 Pro, o4 Mini, Qwen3-235B, Kimi-K2.5
- **Baselines**:ReAct, Reflexion, ExpeL, ReAct+Skills(flat)
### 3.2 核心发现
**Finding 1:48 个 (model, split) 单元全部第一**
平均提升:
- +12.7 points over ExpeL
- +6.9 points over 最强 per-cell baseline
- ~24% 更少 environment steps(最多 41%)
**Finding 2:同时提升效果和效率**
ALFWorld seen:10.2-18.9 steps vs ReAct 的 14.8-23.3(19-35% 减少 LLM calls)。
ScienceWorld unseen 长程任务:steps 减少 41%。
**Finding 3:每个组件都贡献,DAG compilation 最关键**
| 组件 | ALFWorld seen | ScienceWorld seen |
|------|--------------|-------------------|
| Experience memory | +1.6/+1.5 | |
| **DAG compilation** | **+1.9/+1.6** | 最关键 |
| Local repair | +1.3/+1.4 | |
| Routing | +0.9/+0.8 | |
Replacing local repair with global replan → 损失 3.2/3.1。
**Finding 4:优势随任务复杂度增长**
短任务(≤10 steps):~6% 优势
长任务(≥20 steps):~18% 优势
因为 flat agent 的中段失败会 discard 所有下游进度,GraSP 只影响受影响子图。
**Finding 5:Typed repair 全面优于 global replanning**
- Precondition 失败恢复率:84.2% vs 61.8%(+22.4%)
- Postcondition 失败领先 ~16%
Typed edges 编码了"为什么失败",所以 missing precondition 会触发 targeted re-retrieval,而不是重新发现完整依赖链。
**Finding 6:三层容错捕获大部分失败**
- 35-58%:直接成功
- 12-25%:local repair 解决
- 5-8%:global replan 解决
- 8-17%:ReAct fallback 解决
- 13-18%:最终失败
### 3.3 Skill 数量与质量鲁棒性
**Finding 7:更多技能伤害 flat execution;GraSP 鲁棒**
Flat execution 在 M=3 达到峰值,M=8 下降 ~6%。
GraSP 在 M=8 时(79.4)仍优于 flat 在 M=3 的最优值(74.9)。
DAG compilation 作为**结构过滤器**:无法通过 precondition-effect 边连接的技能自动排除。
技能质量从高到低:GraSP 损失 ~5% vs flat 损失 ~9%。
---
## 四、深层洞察:为什么 GraSP 是对的
### 4.1 从"知识检索"到"程序编译"
GraSP 的本质洞察是:**skill execution 不是信息检索问题,而是程序编译问题。**
- 检索 → "什么相关"
- 编译 → "如何依赖"
- 执行 → "现在运行"
中间层(compilation)把"相关技能列表"转换成"可执行依赖图",这是从**声明式**到**命令式**的跃迁。
### 4.2 局部性原理的利用
GraSP 充分利用了**故障局部性**:真实世界任务中,失败的影响通常是局部的。
- Flat sequence:一次失败 → 全部重来
- DAG:一次失败 → 只影响拓扑后代
这类似于:
- 编译器中的 incremental compilation
- 数据库中的 transaction rollback
- 分布式系统中的 checkpoint recovery
### 4.3 类型系统的作用
Typed edges(state/data/order)不只是标注,而是**执行语义**:
- State edges 决定"能不能执行"
- Data edges 决定"参数从哪里来"
- Order edges 决定"先执行哪个"
这种显式类型让 repair 操作有了**结构感知**:知道为什么失败,就知道怎么修复。
### 4.4 "Less is more" 的深层原因
为什么更多技能反而有害?
**Flat execution**:无关技能竞争 LLM 注意力 → distraction → hallucinated action sequences
**GraSP**:DAG compilation 自动过滤无法连接的技能 → 精确子集 → 无干扰
这是**结构优于数量**的又一个例证。
---
## 五、局限与开放问题
### 5.1 论文中未充分讨论的
1. **Compilation 开销**:DAG compilation 本身需要 LLM calls,在简单任务上可能是负优化
2. **Skill 库质量依赖**:如果 precondition/effect 标注不准确,整个图都错
3. **Cycle resolution**:移除软边来解决环,可能会丢失关键优先级信息
4. **Verifier 设计**:postcondition verification 的标准没有详细说明
5. **Human-in-the-loop**:没有讨论人机协作场景
### 5.2 与相关工作的关系
| 方法 | 核心思想 | 与 GraSP 的区别 |
|------|---------|---------------|
| **ReAct** | Token-level thought-action loop | 无 skill 层,无结构 |
| **Reflexion** | Episode-level self-reflection | 反思但不改变结构 |
| **ExpeL** | Experience learning + insight extraction | 学习但不编译成图 |
| **Voyager** | Skill library + automatic skill creation | 自动创建技能但 flat 执行 |
| **Synapse** | Skill graph + causal reasoning | 类似图结构但不强调 typed repair |
GraSP 的独特之处是**完整的 compilation + execution + repair 闭环**,而不是单一组件。
### 5.3 未来方向
1. **动态 skill discovery**:在 execution 过程中发现新技能并加入图
2. **Probabilistic DAG**:边权重表示置信度,支持 soft execution
3. **跨 episode 图复用**:把成功 DAG 存入 memory,类似"程序模板"
4. **Multi-agent 图**:多个 agent 的 DAG 之间的协调与合并
5. **神经编译器**:用神经网络替代 LLM-based compilation,降低开销
---
## 六、对 Agent 生态的意义
### 6.1 范式转移信号
GraSP 代表了一个重要的范式信号:
> **Agent 的下一个瓶颈不是"更多技能",而是"更好的编排"。**
这和:
- 软件工程从"写更多代码"到"更好的架构"
- 数据库从"更多数据"到"更好的查询优化"
- 编译器从"更多优化 passes"到"更好的 IR"
是同一个演进逻辑。
### 6.2 对 browser-use 等项目的启示
browser-use 团队刚写了 "The Bitter Lesson of Agent Harnesses"(让 agent 直接控制 CDP),GraSP 从另一个维度呼应了同一个趋势:
- **底层**:browser-use 说"不要包裹,给 agent 直接访问"
- **高层**:GraSP 说"不要 flat,给 agent 结构化编排"
两者合起来:**给 agent 最大的自由(底层直接访问),但用结构约束它的搜索空间(高层图编排)。**
### 6.3 对 OpenClaw 的启示
OpenClaw 的 skill 系统可以借鉴 GraSP 的思想:
1. Skill 不是 flat list,而是 typed DAG
2. Execution 不是顺序执行,而是拓扑遍历 + precondition 检查
3. Failure 不是全部重来,而是局部 repair
4. Retrieval confidence 决定是否启用 structured execution
---
## 七、关键引用与数据
| 指标 | 数值 |
|------|------|
| arXiv ID | 2604.17870v1 |
| 发布日期 | 2026-04-20 |
| 机构 | 腾讯 |
| Benchmarks | ALFWorld, ScienceWorld, WebShop, InterCode |
| LLM Backbones | 8 (DeepSeek V3.2, GPT-4.1, Claude-4-Sonnet, GLM-5, Gemini 2.5 Pro, o4 Mini, Qwen3-235B, Kimi-K2.5) |
| 最佳 reward 提升 | +19 points |
| 最大 steps 减少 | 41% |
| 配置数 | 48 (model × split) |
| 胜率 | 48/48 第一 |
| Repair 复杂度 | O(d^h) vs O(N) |
| 典型参数 | d≈2, h=2 → 4-5 节点 |
---
> **一句话总结**:GraSP 把 skill execution 从"信息检索"升级为"程序编译",用 typed DAG + 局部 repair 解决了"技能越多越差"的悖论,在 48 个配置中全部第一,证明了**结构化编排 > 更大技能库**。
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!