尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Google 程序图 Procedural Graphs 拆解:给 Agent 一张会自我修订的流程图,验证门与拒绝记忆如何把坏 SOP 从 58.93% 修回 92.86%

Google 程序图 Procedural Graphs 拆解:给 Agent 一张会自我修订的流程图,验证门与拒绝记忆如何把坏 SOP 从 58.93% 修回 92.86% 先把那组反常的数字摆出来Google 团队 9 月 8 日挂上 arXiv 的 Procedural Graphs开篇给的是一组不太好看的对照数字。同一批任务、同一个模型人类专家手写的流程图把成功率从 87.50% 拉到 58.93%。而被验证门拒掉之后反复迭代的离线循环又把它修回 92.86%净回收 33.93 个百分点。论文要回答的问题很具体Agent 的「先做什么、按什么顺序、什么条件下不能做」究竟该存在哪里。它给的答案也很直接不要把流程知识留给上下文而是把它做成一张可编辑、可回滚的有向属性图。病灶流程知识被压在上下文里现在的长程 Agent 大多靠「在越来越长的历史记录上做无约束生成」来选下一步动作。这种做法的隐含假设是模型能从历史里自己读出流程。轨迹一长这个假设就开始漏。论文把典型失效归成三类丢掉目标、工具调用顺序错乱、重复无效动作。它们不是能力不够而是流程知识始终是隐式的。知识图谱把事实拆成实体关系实体三元组用来回答「是什么」。程序图把这套做法搬到流程上用程序关系程序三元组回答「接下来做什么」。图上的每个节点可以是一个工具函数、一项技能、一个内部推理步骤或一个任务状态。边是带属性的有向转移属性里至少写清三件事触发条件、怎么做、有什么坑。关键在于这张图存在模型权重之外可以被检查、被检索、被直接改不需要重训。在线推理定位、取两跳邻域、生成情境指导任务求解期间图是冻结的只有一个轻量的指导模型在读它。每一步先做定位把 Agent 最近一次动作匹配到图中的某个节点。匹配成功就抽取该节点的两跳邻域也就是向前看两步的转移集合。然后把邻域、原始任务和最近几步轨迹一起交给指导模型生成一小段情境建议。这段建议被追加进求解器的提示词只做偏置不规定具体动作。论文用的类比是导航告诉你下一个路口怎么拐但不替你开车。如果定位失败退化策略是让 Agent 看到整张图。把这三步写成代码并不长下面这段是可以直接运行的最小实现。import re from collections import deque def match_node(last_action, graph): text (last_action or ).strip().lower() for name in graph: if name.lower() text: return name return None def neighborhood(graph, node, hops2): seen, queue {node}, deque([(node, 0)]) while queue: cur, depth queue.popleft() if depth hops: continue for edge in graph.get(cur, []): nxt edge[to] if nxt not in seen: seen.add(nxt) queue.append((nxt, depth 1)) return seen def render_subgraph(graph, node, hops2): lines [] for name in sorted(neighborhood(graph, node, hops)): for edge in graph.get(name, []): lines.append( [ name - edge[relation] - edge[to] ] 条件: edge[condition] 做法: edge[guidance] 坑: edge[pitfalls] ) return \n.join(lines) def build_guidance_prompt(query, trace, graph, hops2): node match_node(trace[-1][0] if trace else Start, graph) or Start sub render_subgraph(graph, node, hops) if node in graph else render_subgraph(graph, Start, 9) window \n.join(a o for a, o in trace[-3:]) return ( 你是流程导航器只给下一步的情境提示不要替执行者决定动作。\n 任务 query \n 当前节点 node \n 最近轨迹\n window \n 可用转移\n sub \n 请输出两句以内的下一步建议。 )注意最后一步的措辞提示词明确要求只给情境提示不替执行者决定动作。这行约束是软集成能否成立的关键一旦写成硬指定就退化回硬编码工作流了。为什么只喂局部子图整图注入看起来更保险论文的消融却给出了相反结论。下表是 ALFWorld 具身任务上的四组对照token 一列是相对纯轨迹基线的变化。指导方式ALFWorld 成功率token 相对基线不给图只给轨迹72.58%基线整图原文注入70.34%更高整图生成式指导54.48%最高两跳邻域生成式指导81.53%降低 70.9%把原始整图塞进上下文成功率反而从 72.58% 掉到 70.34%。让模型对整图做生成式指导直接崩到 54.48%同时烧掉更多 token。局部邻域在所有设置里都赢MultiChallenge 89.31、GDPval 63.99、ALFWorld 81.53。并且它把 token 分别省下 14.8%、18.1% 和 70.9%。一句话上下文里塞太多结构本身就是一种失效模式。离线自进化四步闭环图不是人画完就定稿的每一轮训练批次之后一个离线 refiner 会改它。第一步是诊断 rollout用当前图在一批训练任务上跑记录轨迹和得分。refiner 把高分轨迹和低分轨迹放在一起对比而不是只看失败。第二步是反馈驱动的变异只开放两种拓扑编辑加节点或加边、删节点或删边。属性改写的接口一样先把边删掉再用新的条件、指导、坑字段加回来。第三步是验证门这是整篇论文里最值得抄的一处设计。候选图先过结构校验比如环修复然后在独立留出集上重新评测。只有验证分数不低于当前保留图候选才被提交否则原图一动不动。第四步是拒绝记忆被拒的候选连同它的编辑一起存档作为下一轮的负样本。这一步治的是自纠正循环最常见的病反复提出同一个坏改动。四步骨架写出来大致是这样。import copy def has_cycle(graph): state {} def walk(node): state[node] 1 for edge in graph.get(node, []): nxt edge[to] if state.get(nxt) 1: return True if nxt not in state and walk(nxt): return True state[node] 2 return False return any(n not in state and walk(n) for n in list(graph)) def apply_edits(graph, edits): cand copy.deepcopy(graph) for edit in edits: src, dst edit[from], edit[to] edges cand.setdefault(src, []) if edit[op] add: if not any(e[to] dst for e in edges): edges.append({ to: dst, relation: edit.get(relation, LEADS_TO), condition: edit.get(condition, ), guidance: edit.get(guidance, ), pitfalls: edit.get(pitfalls, ), }) elif edit[op] delete: cand[src] [e for e in edges if e[to] ! dst] for node in list(cand): if not cand[node]: del cand[node] return None if has_cycle(cand) else cand def evolve(graph, train_batch, val_batch, refiner, solver, score, rounds10): retained, rejected, best graph, [], score(graph, val_batch) for _ in range(rounds): traces [(q, solver(q, retained)) for q in train_batch] edits refiner(graphretained, tracestraces, rejectedrejected) cand apply_edits(retained, edits) if cand is None: continue got score(cand, val_batch) if got best: retained, best cand, got else: rejected.append({graph: cand, edits: edits, score: got}) return retained, rejected整段循环里没有一处碰模型权重改的始终是外部那张图。这也是它和微调路线的根本区别流程知识的更新粒度是边不是参数。一次真实的进化轨迹从 0% 到 85%论文在 EnterpriseArena 上把十轮进化完整记了下来。这个环境里 Agent 要当 132 个月的企业财务决策者中途有三场不提前告知的宏观危机。资金申请后 1 到 6 个月才到账所以活下来的前提是在现金见底前提前融资。第 1 轮refiner 就找到了主干顺序先审现金、再测跑道然后才谈融资决策。验证存活率当轮从 0% 跳到 45%。第 2 轮它加了一个 recall_notes 节点复用之前存下的笔记。存活率升到 80%同时每月工具调用从 17.23 次降到 3.08 次。第 3 到第 6 轮一次都没提交其中一个候选连结构校验都没过。第 7 轮剪掉一条反复导致失败的支路第 8 轮把验证存活率推到 90%。第 10 轮被验证门驳回循环结束。最终返回的图在测试集上存活率 85%基线是 0%。论文给的 Fisher 精确检验 p 值是 0.000000026。更值得注意的是工具调用次数的变化方向并不统一。Gemini 3.5 Flash 原本在原地打转每月查现金和市场状态 18.94 次被压到 12.53 次。Claude Sonnet 4.6 和 Gemini 3.1 Pro 的调用次数却是上升的从 0.13 到 0.36、从 0.89 到 3.18。前者要治的是空转后者要治的是该做的功课没做同一张图在纠两种相反的病。胜率盘点以及哪些场景买不到收益论文在七个基准、四个模型上共 24 个设置里做了对比。程序图拿下 19 个第一、2 个并列第一只输掉 3 个。符号检验 p 值是 0.00043下面是几处幅度最大的增益。基准与设置最强基线程序图增益BFCL v3 函数调用58.00%67.00%9.00GDPval 专业工作任务71.37%78.78%7.41tau-bench 客服工具调用73.04%80.00%6.96EnterpriseArena 存活率6.0%34.0%28.0MultiChallenge 专家先验修复58.93%92.86%33.93增益集中在流程真正起作用的地方工具调用、顺序约束、长程任务。反过来HotpotQA 这类多跳检索上的差距在 -0.90 到 1.30 之间基本等于没有。论文自己也承认没有哪个基线能稳定排在第二这个领域的可比性还很差。它和 ReAct、编排器、提示词优化不是一回事ReAct 让模型在推理和行动之间循环但不会自动沉淀出一套稳定流程。工作流编排器的节点和边由人维护灵活性换来的是持续的人工成本。自动提示词优化改的是输入文本改不动先做什么、是否并行、什么时候回退。程序图更像压在两者之上的一层流程演化层。它可以调用 ReAct 节点也可以把稳定子图封装成可复用的片段。和记忆类基线比差别在抽象层级。工作流记忆记的是上次那盘麻婆豆腐我怎么做程序图记的是这类菜的一般火候顺序。真要落地先把四个不变量钉死论文对企业侧的第一条启示就有点扎心。你手写的专家流程只是一个假设在执行数据验证它之前不算资产。从 87.50% 掉到 58.93% 的那个专家先验就是被自己的流程图拖垮的。第二条是验证门必须独立于训练批次否则整个循环只是在过拟合自己出的题。第三条是拒绝记忆要当正式资产存不然 refiner 每一轮都会重提同一个坏主意。第四条最容易被忽略先定义哪些东西绝对不能改。模型可以调整任务分解和工具顺序但不能扩大权限、不能删掉人工审批、不能关日志。换句话说可变部分和系统不变量必须在图结构上就分开。流程图的每次修改都要版本化能回滚能被审计。日志至少要留五样原任务、图版本、节点输入输出摘要、工具调用与失败原因、评估结果。少了这些出事时你只能看到 Agent 做错了分不清责任在模型、记忆、工具还是评估器。三个需要长期盯住的坑第一评测指标变好不等于系统变好。自我演化会沿着你给的评估函数爬权限扩大、验证节点被删这类退化不会出现在成功率里。安全评估必须跟着每一次图变更重跑而不是上线前测一次就完事。第二图会膨胀。论文里的基准图大多只有 7 到 17 个节点、7 到 27 条三元组是一张紧凑的流程地图。一旦放开无限制加节点推理成本和可审计性会一起被吃掉。第三跨模型迁移是有限度的。论文观察到一部分模型上进化出的图能迁移到别的模型说明它捕捉的是任务结构。但这不等于通用换环境、换工具集之后仍然要重新过验证门。把这三条放在一起看程序图的定位其实很清楚。它不是让模型自动变聪明的药而是 Agent 的持续交付系统。它解决的只是流程如何积累、验证和演化事实幻觉、奖励投机、权限越界一个都不管。
返回列表