Procedural Graphs:让 Agent 的执行结构自演化
论文将“下一步该做什么”从模型参数和长对话日志中剥离出来,表示成可查询、可解释、可编辑的过程图;在线提供局部情境指导,离线依据成败轨迹修改图结构。
结论先行:这项工作的真正价值
可以直接带走的三点
- 长轨迹问题的关键不只是“记住更多”,而是明确当前处于哪个过程节点。
- 图的价值来自连通关系与局部上下文,不是把全部规则原样塞进 Prompt。
- 图的生成不能只看训练轨迹;结构校验、独立验证门控与回滚缺一不可。
最适合的任务
- 工具调用顺序、前置条件、禁止动作清晰。
- 任务跨多轮、反馈延迟、容易陷入重复查询。
- 过程规则会随经验变化,且需要审计和版本化。
问题定义:长轨迹 Agent 为什么会失控
典型 ReAct Agent 把用户请求、历史 Thought、Action 和 Observation 顺序追加到上下文,由 LLM 每一步重新推断目标、剩余步骤和动作依赖。轨迹越长,这种“从扁平日志重建过程”的成本越高。
模型被最近观察牵引,逐步偏离原始任务或遗漏尚未完成的子目标。
跳过检查、验证或准备步骤,过早调用提交类、状态推进类工具。
反复查询同一状态、重复失败调用,进一步污染上下文并增加成本。
现有方案各自缺了一块
| 方案 | 保存什么 | 主要优点 | 主要缺口 |
|---|---|---|---|
| 轨迹 / 摘要记忆 | 历史经验或完整轨迹 | 保留真实执行证据 | Solver 仍要自行重建步骤依赖 |
| 状态条件指南 | “状态 X 时做 Y”规则 | 比全文记忆更聚焦 | 相邻步骤之间缺少显式连接 |
| 线性 Workflow | 固定动作序列 | 顺序明确、易执行 | 分支、回退与动态条件表达较弱 |
| 硬状态机 | 允许的状态转移 | 约束强、行为可控 | 依赖人工设计,可能压缩模型推理空间 |
| Procedural Graph | 带属性的过程转移图 | 结构可查、局部引导、可演化 | 每步增加指导调用,仍需可靠定位和验证 |
what is:(entity, relation, entity);过程图回答 what to do next:(procedure, relation, procedure)。形式化表示:节点、边、关系与属性
E ⊆ V × R × V,边 e = (u, r, v) 表示:在关系 r 下,过程 v 可以接在过程 u 之后。
Φ(e) = { condition, guidance, pitfalls }
V(节点)可抽象工具函数、技能、内部推理步骤或任务状态;R(关系词表)在实验中包含 LEADS_TO、TRIGGERS、PROVIDES_INPUT_FOR、CONVERGES_TO;Φ(边属性)说明何时转移、怎样执行、要避免什么。
图为什么比规则列表更有信息量
单独检索“提交答案”相关规则,可能遗漏前置的“检查答案”;局部连通子图同时暴露动作、前置条件和后续可能路径。过程知识的最小有用单元因此不是一条孤立规则,而是处于拓扑上下文中的转移。
论文中的图规模并不大
数字格式为“节点数 / 三元组数”。BFCL 的 131 个节点主要对应较大的函数目录。
在线阶段:Locate → Extract → Generate → Act
用上一步过程 / 工具调用精确匹配节点 uₜ;首步固定为 Start。
匹配成功取 h=2 的有向出边邻域;失败则回退到整张图。
指导模型结合子图、用户问题和最近 w=3 步轨迹,生成情境建议。
Solver 将建议加入 Prompt,自主输出下一步 Thought 与 Action。
Gₜ = Nₕ(uₜ),若匹配失败则 Gₜ = G
gₜ = Ψ(Gₜ, q, Tₜ₋w:ₜ)
aₜ ~ P_solver( · | q, Tₜ, gₜ )
为什么称为“生成式指导”
图中存的是静态条件与建议,指导模型 Ψ 会根据当前任务和最近失败,将其翻译成当下可执行的提醒,例如“先验证结果,再调用输出工具;不要重复搜索已经确认的实体”。Solver 没有被强制锁死在一条边上,所以 PG 是软控制面,不是硬执行引擎。
带来的能力
- 根据当前进度选择相关规则,而非全量注入。
- 同时看见下一步与两跳内的后续依赖。
- 允许 Solver 基于新观察偏离图中建议。
关键脆弱点
- 论文默认“最近过程与节点 ID 精确匹配”,命名漂移会触发全图回退。
- 每一个 Solver 步骤前多一次 LLM 指导调用。
- 错误图不会直接阻止动作,但会系统性偏置 Solver。
在线执行伪代码
active = START
while not done:
active = exactMatch(lastProcedure, graph.nodes)
contextGraph = active != null
? graph.outgoingNeighborhood(active, hops = 2)
: graph.fullGraph()
recent = trajectory.tail(3)
guidance = guidanceLLM.generate(contextGraph, query, recent)
action = solver.nextAction(query, trajectory, guidance)
observation = environment.execute(action)
trajectory.append(action, observation)
离线阶段:用执行反馈演化图,而不更新模型权重
图在单个任务执行期间冻结。每一轮只在批量 Rollout 结束后改图,避免在线执行中的结构漂移。候选图必须先通过结构检查,再通过独立验证集门控。
用当前保留图在训练批次上执行,收集查询、完整轨迹与最终任务得分,并对比高分和低分轨迹。
Refiner 输出结构化 ΔG:增加缺失验证节点 / 边,删除诱发失败或阻碍前进的节点 / 边;属性更新通过“删旧边 + 加新边”完成。
检查类型、端点、终点可达性与循环策略;候选图只有在验证均值不低于当前缓存分数时才提交。
失败候选、对应变更、训练轨迹与验证结果写入拒绝记忆,作为下一轮 Refiner 的负证据。
S_val(G) = mean score over D_val
若 S_val(Gₖᶜᵃⁿᵈ) ≥ S_val(Gₖ₋₁),提交;否则回滚并记入 H_rejected。
候选图的结构检查
论文实际执行的硬检查
- 编辑 JSON 可解析,节点与关系类型有效。
- 每条边的源节点和目标节点都存在。
- 每个节点都能到达某个出度为 0 的终止节点。
- 禁环任务中移除形成环路的边,并检查无环。
需要特别注意
- 终止节点不要求一定名为
End。 - Action 节点必须属于工具目录只写在 Refiner Prompt 中,通用验证器没有硬校验。
- 验证接受相同分数的候选,噪声环境中可能产生无收益漂移。
离线演化伪代码
bestGraph = initialGraph
bestScore = evaluate(bestGraph, validationSet)
rejections = []
for round in 1..K:
traces = rollout(bestGraph, nextTrainingBatch())
tailContext = keepLastTokens(concat(traces), L_max)
delta = refiner.propose(bestGraph, tailContext, rejections)
candidate, diagnostics = prepareCandidate(bestGraph, delta, cyclePolicy)
if diagnostics.notEmpty():
rejections.add(delta, traces, diagnostics)
continue
candidateScore = evaluate(candidate, validationSet)
if candidateScore >= bestScore:
bestGraph, bestScore = candidate, candidateScore
else:
rejections.add(delta, traces, candidateScore)
return bestGraph
五种构建模式:从专家先验到空白自演化
| 模式 | 初始图 | 训练方式 | 验证门控 | 适用判断 |
|---|---|---|---|---|
| 1 · Expert | 人工完整图 | 不训练 | 无 | 规则成熟、变化少 |
| 2 · Expert + One-time | 人工完整图 | 全训练集一次更新 | 无 | 低成本试验,但风险较高 |
| 3 · Expert + Evolution | 人工完整图 | 分批增量更新 | 有 | 已有流程,需要持续纠偏 |
| 4 · Scratch + One-time | Start → End | 全训练集一次构建 | 无 | 快速原型,不宜直接生产 |
| 5 · Scratch + Evolution | Start → End | 分批增量演化 | 有 | 缺少专家图、轨迹充足 |
| 构建模式 | HotpotQA F1 | MultiChallenge 成功率 | 观察 |
|---|---|---|---|
| 无 PG | 71.21 | 87.50% | 参照基线 |
| Mode 1 | 76.61 | 58.93% | 专家图跨任务不稳定 |
| Mode 2 | 77.16 | 53.57% | 无门控更新可能恶化 |
| Mode 3 | 76.34 | 92.86% | 可修复错误专家先验 |
| Mode 4 | 69.49 | 89.29% | 一次构建仍会不稳 |
| Mode 5 | 78.79 | 91.07% | 从最小骨架学习出有效图 |
实验设计:如何判断结果是否可信
实验覆盖七类任务,其中六类进入主结果表,EnterpriseArena 单独用于长周期决策。所有方法共享同一个 ReAct Solver、工具接口和解码设置;学习型基线与 PG 使用相同训练轨迹,主要变量是“过程经验如何保存和在推理时使用”。
| Benchmark | 能力 | Train / Test | 主要指标 |
|---|---|---|---|
| HotpotQA | 多跳检索问答 | 1,000 / 1,000 | LLM 判定准确率;构建实验另报 EM / F1 |
| MultiChallenge | 多轮约束保持 | 100 / 166 | Gemini 3.1 Pro Judge 的总体成功率 |
| GDPval | 专业交付物 | 88 / 44 | 任务 Rubric 均分 |
| ALFWorld | 具身动作顺序 | 238 / 134 | 成功率 |
| τ-bench | 政策约束工具调用 | 500 / 115 | Pass@1 |
| BFCL v3 | 多轮函数调用 | 100 / 100 | 官方多轮准确率 |
| EnterpriseArena | 延迟反馈财务决策 | 50 / 50 | 132 月存活率、寿命、企业分数、融资额 |
四个 Solver
- Claude Sonnet 4.6
- Gemini 3.1 Pro
- Gemini 3.5 Flash
- Grok 4.1 Fast
指导模型与离线 Refiner 始终使用与 Solver 相同的底层 LLM;温度为 0。
七个对比基线
Vanilla ReAct、MemoryBank、RAP、ExpeL、AutoGuide、AWM、KnowAgent,依次覆盖无记忆、摘要记忆、轨迹检索、经验洞察、状态指南、线性工作流和文本转移规则。
这让对比更聚焦于过程知识的“表示与使用方式”,但不等于完全消除了实现细节差异。
核心结果:性能提升来自“什么时候做什么”
主结果
PG 在 GDPval 与 BFCL v3 的四个模型上都超过全部基线,在 MultiChallenge 的四个模型上均为第一或并列第一。HotpotQA 的优势较小:相对最强基线的差值在 -0.90 到 +1.30 个百分点之间,说明结构化过程指导并非对所有任务同等有效。
长周期财务决策:四个模型的基线与 PG
| 模型 | 完整存活率 | 平均寿命(月) | Tools / 月 | 收到融资 |
|---|---|---|---|---|
| Claude 4.6 | 44% → 58% | 89.80 → 98.58 | 0.13 → 0.36 | $152.12M → $130.44M |
| Gemini 3.1 Pro | 6% → 34% | 50.28 → 79.22 | 0.89 → 3.18 | $21.82M → $38.20M |
| Gemini 3.5 Flash | 0% → 0% | 33.58 → 40.62 | 18.94 → 12.53 | $0.00M → $9.39M |
| Grok 4.1 Fast | 26% → 40% | 63.76 → 75.14 | 0.47 → 0.40 | $27.24M → $30.11M |
十轮自演化发生了什么
消融实验:局部子图是关键,不是“有图就行”
| 图使用方式 | MultiChallenge | GDPval | ALFWorld | 主要代价 |
|---|---|---|---|---|
| 无图基线 | 80.27 | 54.80 | 72.58 | 无额外指导调用 |
| 完整图 · 原始注入 | 86.60 | 57.17 | 70.34 | 上下文变长 |
| 完整图 · 生成式指导 | 87.35 | 56.75 | 54.48 | Token 最高,ALFWorld 明显下降 |
| 局部子图 · 生成式指导 | 89.31 | 63.99 | 81.53 | 仍高于无图 Token 成本 |
相对完整图生成式指导
- ALFWorld Token 减少 70.9%
- GDPval Token 减少 18.1%
- MultiChallenge Token 减少 14.8%
相对无图基线
- GDPval 总 Token 仍高 33.4%
- ALFWorld 总 Token 仍高 55.4%
- MultiChallenge 的局部指导平均步骤略增:3.87 → 4.22
这组实验揭示了 PG 的有效单元:不是把整张图“喂给模型”,而是定位后只暴露局部连通结构,再做情境翻译。完整图生成式指导在 ALFWorld 同时更贵、更差,说明不相关过程会稀释指导质量。
局限与边界:哪些结论不能过度外推
论文证据直接支持
- 在所测模型与任务中,PG 通常优于多种记忆基线。
- 局部生成式指导明显优于完整图生成式指导。
- 带验证门控的迭代演化能从空白构建图,也能修复错误先验。
- 结构指导可减少无效步骤,但不保证降低总 Token。
仍未充分证明
- 学习到的图能否跨 Solver、跨工具命名、跨 API 版本直接迁移。
- 在更大图、更开放动作空间中的定位准确率和延迟。
- 不同 LLM 分别担任 Solver、Guide、Refiner 是否更优。
- 长时间反复访问同一验证集是否会产生验证集过拟合。
| 风险 | 论文机制 | 生产环境建议 |
|---|---|---|
| 节点定位脆弱 | 最近过程与节点 ID 精确匹配;失败回退全图 | 优先强制规范化 Tool ID;再用置信度受控的语义匹配,低置信度停止而非全图泛化 |
| 验证噪声 | 候选分数 ≥ 当前分数即接受 | 要求提升超过 ε;多 seed 重复;用置信区间或序贯检验 |
| 工具越权 | 工具目录约束主要依赖 Prompt | 结构验证器硬校验 Action allowlist、参数 Schema 与权限 |
| 成本膨胀 | 每步调用 Guidance LLM | 缓存相同节点 + 状态摘要;只在分支点、失败或高风险动作前生成 |
| 单指标优化 | 按平均验证任务分数门控 | 加入成本、延迟、失败严重度、合规性等多目标约束 |
| 错误先验 | 依靠后续演化修复 | 新图先影子运行;保留版本、可解释 Diff 与一键回滚 |
Java Agent 工程落地:最小可行架构
如果要接入现有自研 Java Agent,不需要先改造 Solver。最稳妥的做法是把 PG 作为 Solver 前方的独立“过程指导层”,先实现只读运行,再逐步加入离线演化。
建议的数据契约
{
"version": "pg-cfo-2026-09-10.3",
"cyclePolicy": "ALLOW_DECLARED_ONLY",
"nodes": [
{"id": "cash_flow_forecast", "type": "ACTION",
"description": "Forecast cash runway"}
],
"edges": [
{"source": "cash_flow_forecast", "target": "fund_raising_request",
"relation": "LEADS_TO",
"condition": "Projected runway is below the safety buffer",
"guidance": "Request capital before the expected delivery delay",
"pitfalls": "Do not submit while another request is pending"}
]
}
上面是与论文表示一致的工程化示例。生产环境还应附加租户、工具版本、创建来源、评测摘要与签名字段。
Java 侧的核心接口
interface NodeMatcher {
MatchResult locate(ToolCall lastCall, ProceduralGraph graph);
}
interface GuidanceGenerator {
Guidance generate(GraphContext graph,
UserQuery query,
List<TraceStep> recentSteps);
}
interface GraphValidator {
ValidationReport validate(GraphDelta delta,
ToolCatalog allowlist,
CyclePolicy cyclePolicy);
}
interface EvaluationGate {
GateDecision compare(GraphVersion current,
GraphVersion candidate,
ValidationSuite suite);
}
请求链路
ToolCall 先映射到稳定 Tool ID,隔离模型输出别名和 API 版本差异。
从 activeNode 做 2-hop BFS,按 hop 和边属性序列化。
生成短 Guidance,作为独立 Prompt 段传给现有 Solver。
记录图版本、命中节点、子图、指导、动作、结果与成本。
实施路线:从验证思想到可演化系统
固定 Solver、Prompt、工具接口、温度和评测集;记录成功率、步骤、Token、延迟、格式失败与危险动作。
选择高频失败流程,只建 7–15 个节点;验证 activeNode 命中率与 2-hop 子图质量。
离线展示图 Diff、对应失败轨迹与预期修复点,由人工批准后进入验证。
设置收益阈值 ε、成本上限、合规零容忍项和多 seed 重复;只有全门槛通过才创建候选版本。
线上先只记录建议不影响动作,再灰度启用;异常按图版本一键回退。
推荐优先选择的第一个场景
适合先做
- 部署发布 / 故障排查 Agent
- 采购审批 / 支付对账 Agent
- 多步搜索与证据核验 Agent
- 有严格顺序的工具调用 Agent
暂时不适合
- 单轮、一步即可完成的任务
- 动作空间完全开放且难以评分
- 没有稳定回放环境和验证集
- 错误成本极高但没有人工批准链
验收清单:判断 PG 是否真的有效
在线质量
- activeNode 精确命中率与回退率可观测。
- 子图不包含无关分支,关键前置步骤不丢失。
- Guidance 明确、短、可行动,不泄露最终答案。
- 危险工具在执行层仍有独立权限校验。
- 图版本与每次 Agent 轨迹完整关联。
离线演化
- Train / Validation / Test 严格隔离。
- 所有 ΔG 均有结构化 Diff 与失败证据。
- 结构验证硬检查工具白名单和参数 Schema。
- 验收同时覆盖质量、成本、延迟与合规。
- 拒绝候选可去重,保留原因且不污染当前图。
最小实验矩阵
| 配置 | 目的 | 必须记录 |
|---|---|---|
| A · 无图 Solver | 建立真实基线 | 质量、步骤、Token、延迟、失败类型 |
| B · 完整图原始注入 | 验证“仅增加规则文本”是否有效 | 上下文长度、规则冲突、注意力稀释 |
| C · 局部图原始注入 | 隔离局部检索贡献 | 定位准确率、子图覆盖率 |
| D · 局部图生成式指导 | 验证论文完整在线机制 | 指导成本、动作改善、错误放大 |
| E · D + 演化 | 验证自动改图的净收益 | 接受率、回滚率、验证差异、版本稳定性 |
术语、学习顺序与资料
| 术语 | 准确理解 |
|---|---|
| Procedural Knowledge | 关于“如何做、先做什么、在什么条件下做”的过程知识。 |
| Procedural Graph | 以过程为节点、以可允许转移为边,并为边附加条件、指导和陷阱的有向图。 |
| Generative Guidance | 由 LLM 把局部静态图转换成当前步骤的动态建议。 |
| Localization | 根据最近过程确定 Agent 当前位于哪个图节点。 |
| Validation Gating | 候选图只有不降低独立验证集分数时才成为新保留图。 |
| Rejection Memory | 记录失败变更与其证据,抑制 Refiner 重复提出无效候选。 |
建议阅读顺序
- 先读第 3.1–3.3 节,掌握图表示、在线指导和离线演化。
- 再读表 3 的消融实验,理解为什么必须局部化。
- 读附录 B.5–B.6,查看 Prompt 模板、编辑 JSON 与完整算法。
- 读附录 E.2–E.3,观察候选回滚和图拓扑如何逐轮变化。
- 最后读附录 C.3 的同一 Seed 轨迹对比,把指标与具体行为连起来。
来源
- arXiv 摘要页:2609.09153
- 论文 PDF:Procedural Graphs: Self-Evolving Execution Structures for LLM Agents
- 作者:Yuxing Lu、Yicheng Chen、Shanchan Wu、Sercan Ö. Arık;arXiv v1,2026-09-08。