从角色协同到可运行图:Graph Engineer 与多智能体编排

#mermaid-svg-q9bhjscCeQF83z8c{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-q9bhjscCeQF83z8c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-q9bhjscCeQF83z8c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-q9bhjscCeQF83z8c .error-icon{fill:#552222;}#mermaid-svg-q9bhjscCeQF83z8c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q9bhjscCeQF83z8c .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-q9bhjscCeQF83z8c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q9bhjscCeQF83z8c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q9bhjscCeQF83z8c .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-q9bhjscCeQF83z8c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q9bhjscCeQF83z8c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q9bhjscCeQF83z8c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q9bhjscCeQF83z8c .marker.cross{stroke:#333333;}#mermaid-svg-q9bhjscCeQF83z8c svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q9bhjscCeQF83z8c p{margin:0;}#mermaid-svg-q9bhjscCeQF83z8c .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-q9bhjscCeQF83z8c .cluster-label text{fill:#333;}#mermaid-svg-q9bhjscCeQF83z8c .cluster-label span{color:#333;}#mermaid-svg-q9bhjscCeQF83z8c .cluster-label span p{background-color:transparent;}#mermaid-svg-q9bhjscCeQF83z8c .label text,#mermaid-svg-q9bhjscCeQF83z8c span{fill:#333;color:#333;}#mermaid-svg-q9bhjscCeQF83z8c .node rect,#mermaid-svg-q9bhjscCeQF83z8c .node circle,#mermaid-svg-q9bhjscCeQF83z8c .node ellipse,#mermaid-svg-q9bhjscCeQF83z8c .node polygon,#mermaid-svg-q9bhjscCeQF83z8c .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-q9bhjscCeQF83z8c .rough-node .label text,#mermaid-svg-q9bhjscCeQF83z8c .node .label text,#mermaid-svg-q9bhjscCeQF83z8c .image-shape .label,#mermaid-svg-q9bhjscCeQF83z8c .icon-shape .label{text-anchor:middle;}#mermaid-svg-q9bhjscCeQF83z8c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-q9bhjscCeQF83z8c .rough-node .label,#mermaid-svg-q9bhjscCeQF83z8c .node .label,#mermaid-svg-q9bhjscCeQF83z8c .image-shape .label,#mermaid-svg-q9bhjscCeQF83z8c .icon-shape .label{text-align:center;}#mermaid-svg-q9bhjscCeQF83z8c .node.clickable{cursor:pointer;}#mermaid-svg-q9bhjscCeQF83z8c .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-q9bhjscCeQF83z8c .arrowheadPath{fill:#333333;}#mermaid-svg-q9bhjscCeQF83z8c .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-q9bhjscCeQF83z8c .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-q9bhjscCeQF83z8c .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-q9bhjscCeQF83z8c .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-q9bhjscCeQF83z8c .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-q9bhjscCeQF83z8c .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-q9bhjscCeQF83z8c .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-q9bhjscCeQF83z8c .cluster text{fill:#333;}#mermaid-svg-q9bhjscCeQF83z8c .cluster span{color:#333;}#mermaid-svg-q9bhjscCeQF83z8c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-q9bhjscCeQF83z8c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-q9bhjscCeQF83z8c rect.text{fill:none;stroke-width:0;}#mermaid-svg-q9bhjscCeQF83z8c .icon-shape,#mermaid-svg-q9bhjscCeQF83z8c .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-q9bhjscCeQF83z8c .icon-shape p,#mermaid-svg-q9bhjscCeQF83z8c .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-q9bhjscCeQF83z8c .icon-shape .label rect,#mermaid-svg-q9bhjscCeQF83z8c .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-q9bhjscCeQF83z8c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-q9bhjscCeQF83z8c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-q9bhjscCeQF83z8c :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 多智能体系统工程化框架
流程编排层

理解意图与边界
图工程层

编译与执行保障
专业岗位层

独立交付结果
冲突与评测层

暴露不确定性
输入:任务目标与约束
输出:可审计、可恢复、可评测的结果
工程约束
版本化管理

图1:多智能体系统的分层工程框架

多智能体系统的难点,通常不在于"再增加一个会回答问题的 Agent",而在于如何把一组专业角色组织成一个可运行、可恢复、可审计、可评测的系统。

当角色从两个增加到十个,简单的"主 Agent 把任务依次转发给子 Agent"会很快遇到四类问题:

  • 彼此独立的任务没有并发,整体时延不断累积;
  • 专业角色被当作通用聊天窗口,输入输出边界不清;
  • 上下文被整段复制,成本、隐私风险与相互污染同时上升;
  • 多个结论不一致时,只能依靠某个模型"拍板",无法解释或复盘。

Graph Engineer 的价值正是在这里出现:它不替代专业岗位产出结论,而是把任务目标、岗位契约、依赖关系、上下文策略、冲突策略和评测要求编译成一张可执行图。

本文的核心观点

流程编排 Agent 负责理解目标、选择能力并设置人工边界;Graph Engineer 负责把这个意图转化为可校验的执行图;专业 Agent 只对自己的专业产出负责。三者分层,才能让多智能体系统从"对话接力"变成工程化协作。

1. 先区分三个职责:意图、图与专业结论

最常见的设计误区,是让一个"总控 Agent"既负责理解任务、又编排执行、又进行专业判断、还要决定冲突。这会造成提示词膨胀,且任何问题都难以定位。

更稳妥的分层是:

层级 回答的问题 主要产物
流程编排 Agent 为什么做、要什么结果、哪些角色应参与 服务意图、任务拆解、约束、人工闸门
Graph Engineer / Runtime 任务怎样成图、怎样并发、怎样恢复、怎样交接 Graph Spec、执行计划、状态、Trace
专业 Agent 在授权范围内,专业结论是什么、证据是什么 结构化 Result Envelope
人工 是否采纳、是否对外、是否允许例外 确认、修改、拒绝、升级决定

#mermaid-svg-Hrv8c6jR4U3PEc23{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Hrv8c6jR4U3PEc23 .error-icon{fill:#552222;}#mermaid-svg-Hrv8c6jR4U3PEc23 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hrv8c6jR4U3PEc23 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .marker.cross{stroke:#333333;}#mermaid-svg-Hrv8c6jR4U3PEc23 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Hrv8c6jR4U3PEc23 p{margin:0;}#mermaid-svg-Hrv8c6jR4U3PEc23 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster-label text{fill:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster-label span{color:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster-label span p{background-color:transparent;}#mermaid-svg-Hrv8c6jR4U3PEc23 .label text,#mermaid-svg-Hrv8c6jR4U3PEc23 span{fill:#333;color:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .node rect,#mermaid-svg-Hrv8c6jR4U3PEc23 .node circle,#mermaid-svg-Hrv8c6jR4U3PEc23 .node ellipse,#mermaid-svg-Hrv8c6jR4U3PEc23 .node polygon,#mermaid-svg-Hrv8c6jR4U3PEc23 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .rough-node .label text,#mermaid-svg-Hrv8c6jR4U3PEc23 .node .label text,#mermaid-svg-Hrv8c6jR4U3PEc23 .image-shape .label,#mermaid-svg-Hrv8c6jR4U3PEc23 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Hrv8c6jR4U3PEc23 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .rough-node .label,#mermaid-svg-Hrv8c6jR4U3PEc23 .node .label,#mermaid-svg-Hrv8c6jR4U3PEc23 .image-shape .label,#mermaid-svg-Hrv8c6jR4U3PEc23 .icon-shape .label{text-align:center;}#mermaid-svg-Hrv8c6jR4U3PEc23 .node.clickable{cursor:pointer;}#mermaid-svg-Hrv8c6jR4U3PEc23 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .arrowheadPath{fill:#333333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hrv8c6jR4U3PEc23 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Hrv8c6jR4U3PEc23 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hrv8c6jR4U3PEc23 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster text{fill:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 .cluster span{color:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hrv8c6jR4U3PEc23 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Hrv8c6jR4U3PEc23 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Hrv8c6jR4U3PEc23 .icon-shape,#mermaid-svg-Hrv8c6jR4U3PEc23 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Hrv8c6jR4U3PEc23 .icon-shape p,#mermaid-svg-Hrv8c6jR4U3PEc23 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Hrv8c6jR4U3PEc23 .icon-shape .label rect,#mermaid-svg-Hrv8c6jR4U3PEc23 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Hrv8c6jR4U3PEc23 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Hrv8c6jR4U3PEc23 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Hrv8c6jR4U3PEc23 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 状态、Trace、Evals
任务目标与约束
流程编排 Agent
Graph Engineer
专业 Agent A
专业 Agent B
专业 Agent C
Evidence Join / 冲突处理
人工闸门或下游执行
Graph Runtime

Graph Engineer 既可以指一个工程岗位,也可以指一组运行时能力。无论实现形式如何,它至少要覆盖 Graph Planner、Graph Compiler、Scheduler、Context Router、State Store、Conflict Resolver 与 Eval Observer。
#mermaid-svg-pSLIEZYhkkY71exz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pSLIEZYhkkY71exz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pSLIEZYhkkY71exz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pSLIEZYhkkY71exz .error-icon{fill:#552222;}#mermaid-svg-pSLIEZYhkkY71exz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pSLIEZYhkkY71exz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pSLIEZYhkkY71exz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pSLIEZYhkkY71exz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pSLIEZYhkkY71exz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pSLIEZYhkkY71exz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pSLIEZYhkkY71exz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pSLIEZYhkkY71exz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pSLIEZYhkkY71exz .marker.cross{stroke:#333333;}#mermaid-svg-pSLIEZYhkkY71exz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pSLIEZYhkkY71exz p{margin:0;}#mermaid-svg-pSLIEZYhkkY71exz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pSLIEZYhkkY71exz .cluster-label text{fill:#333;}#mermaid-svg-pSLIEZYhkkY71exz .cluster-label span{color:#333;}#mermaid-svg-pSLIEZYhkkY71exz .cluster-label span p{background-color:transparent;}#mermaid-svg-pSLIEZYhkkY71exz .label text,#mermaid-svg-pSLIEZYhkkY71exz span{fill:#333;color:#333;}#mermaid-svg-pSLIEZYhkkY71exz .node rect,#mermaid-svg-pSLIEZYhkkY71exz .node circle,#mermaid-svg-pSLIEZYhkkY71exz .node ellipse,#mermaid-svg-pSLIEZYhkkY71exz .node polygon,#mermaid-svg-pSLIEZYhkkY71exz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pSLIEZYhkkY71exz .rough-node .label text,#mermaid-svg-pSLIEZYhkkY71exz .node .label text,#mermaid-svg-pSLIEZYhkkY71exz .image-shape .label,#mermaid-svg-pSLIEZYhkkY71exz .icon-shape .label{text-anchor:middle;}#mermaid-svg-pSLIEZYhkkY71exz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pSLIEZYhkkY71exz .rough-node .label,#mermaid-svg-pSLIEZYhkkY71exz .node .label,#mermaid-svg-pSLIEZYhkkY71exz .image-shape .label,#mermaid-svg-pSLIEZYhkkY71exz .icon-shape .label{text-align:center;}#mermaid-svg-pSLIEZYhkkY71exz .node.clickable{cursor:pointer;}#mermaid-svg-pSLIEZYhkkY71exz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pSLIEZYhkkY71exz .arrowheadPath{fill:#333333;}#mermaid-svg-pSLIEZYhkkY71exz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pSLIEZYhkkY71exz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pSLIEZYhkkY71exz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pSLIEZYhkkY71exz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pSLIEZYhkkY71exz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pSLIEZYhkkY71exz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pSLIEZYhkkY71exz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pSLIEZYhkkY71exz .cluster text{fill:#333;}#mermaid-svg-pSLIEZYhkkY71exz .cluster span{color:#333;}#mermaid-svg-pSLIEZYhkkY71exz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pSLIEZYhkkY71exz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pSLIEZYhkkY71exz rect.text{fill:none;stroke-width:0;}#mermaid-svg-pSLIEZYhkkY71exz .icon-shape,#mermaid-svg-pSLIEZYhkkY71exz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pSLIEZYhkkY71exz .icon-shape p,#mermaid-svg-pSLIEZYhkkY71exz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pSLIEZYhkkY71exz .icon-shape .label rect,#mermaid-svg-pSLIEZYhkkY71exz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pSLIEZYhkkY71exz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pSLIEZYhkkY71exz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pSLIEZYhkkY71exz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 服务意图
执行图
结构化结果
专业岗位层 (Role Layer)
Research Agent
Analysis Agent
Review Agent
Approval Agent
图工程层 (Graph Layer)
Graph Planner
Graph Compiler
Scheduler
Context Router
State Store
Conflict Resolver
Eval Observer
流程编排层 (Intent Layer)
理解任务目标
拆解子任务
设置约束与闸门
选择参与角色

图2:三层职责的详细分解与交互关系

2. 专业岗位不是"提示词集合",而是可编排契约

一个岗位能否被可靠调度,取决于它是否具备可检查的契约,而不是名字是否足够专业。建议每个 Agent 至少注册以下信息:

yaml 复制代码
role_id: research_agent
capabilities:
  - evidence_synthesis
  - market_interpretation
input_schema: ResearchTask.v2
output_schema: ResultEnvelope.v3
required_evidence:
  - source
  - as_of_time
governance:
  allowed_data_scopes: [public, authorized_internal]
  prohibited_outputs: [unsupported_certainty]
runtime:
  timeout: 60s
  retries: 1
  concurrency_limit: 8
eval_suite: research_node_v2

这份契约带来三个直接收益:

  1. 路由可解释:系统根据能力、权限、输入完整性和成本选择岗位,而不是按名称硬编码。
  2. 交接可验证 :下游只接受符合 output_schema 且证据完整的结果。
  3. 变更可控:替换模型、调整 Prompt 或新增工具时,可以绑定到特定评测集,而不是把风险扩散到整条链路。

#mermaid-svg-cLj5jMPOm1sSuKA7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cLj5jMPOm1sSuKA7 .error-icon{fill:#552222;}#mermaid-svg-cLj5jMPOm1sSuKA7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cLj5jMPOm1sSuKA7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .marker.cross{stroke:#333333;}#mermaid-svg-cLj5jMPOm1sSuKA7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cLj5jMPOm1sSuKA7 p{margin:0;}#mermaid-svg-cLj5jMPOm1sSuKA7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster-label text{fill:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster-label span{color:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster-label span p{background-color:transparent;}#mermaid-svg-cLj5jMPOm1sSuKA7 .label text,#mermaid-svg-cLj5jMPOm1sSuKA7 span{fill:#333;color:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .node rect,#mermaid-svg-cLj5jMPOm1sSuKA7 .node circle,#mermaid-svg-cLj5jMPOm1sSuKA7 .node ellipse,#mermaid-svg-cLj5jMPOm1sSuKA7 .node polygon,#mermaid-svg-cLj5jMPOm1sSuKA7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .rough-node .label text,#mermaid-svg-cLj5jMPOm1sSuKA7 .node .label text,#mermaid-svg-cLj5jMPOm1sSuKA7 .image-shape .label,#mermaid-svg-cLj5jMPOm1sSuKA7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-cLj5jMPOm1sSuKA7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .rough-node .label,#mermaid-svg-cLj5jMPOm1sSuKA7 .node .label,#mermaid-svg-cLj5jMPOm1sSuKA7 .image-shape .label,#mermaid-svg-cLj5jMPOm1sSuKA7 .icon-shape .label{text-align:center;}#mermaid-svg-cLj5jMPOm1sSuKA7 .node.clickable{cursor:pointer;}#mermaid-svg-cLj5jMPOm1sSuKA7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .arrowheadPath{fill:#333333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cLj5jMPOm1sSuKA7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cLj5jMPOm1sSuKA7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cLj5jMPOm1sSuKA7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster text{fill:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 .cluster span{color:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cLj5jMPOm1sSuKA7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cLj5jMPOm1sSuKA7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-cLj5jMPOm1sSuKA7 .icon-shape,#mermaid-svg-cLj5jMPOm1sSuKA7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cLj5jMPOm1sSuKA7 .icon-shape p,#mermaid-svg-cLj5jMPOm1sSuKA7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cLj5jMPOm1sSuKA7 .icon-shape .label rect,#mermaid-svg-cLj5jMPOm1sSuKA7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cLj5jMPOm1sSuKA7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cLj5jMPOm1sSuKA7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cLj5jMPOm1sSuKA7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 权限、数据、约束不满足
可用
通过
失败
任务节点
资格过滤
拒绝或转人工
能力匹配
按质量、时延、成本和负载排序
绑定 Schema、上下文策略和 SLA
结果校验
交给下游节点
重试、换岗或升级

3. 并发编排:先看依赖,再谈提速

并发不是"所有 Agent 同时跑"。正确顺序是先识别数据依赖、写入冲突和闸门要求,再选择图模式。

图模式 适用场景 Join 策略
Fork-Join 多项互不依赖的专业分析 全部有效结果到齐,或按超时策略降级
Fan-out / Fan-in 对多个对象使用同一分析方法 按对象键分片,汇总时去重并稳定排序
Map-Reduce 批量任务、大规模扫描 Map 节点不写共享状态,Reduce 节点统一聚合
Quorum 多来源或多模型交叉核验 达到 k-of-n 且关键证据一致才通过
条件分支 数据缺失、风险分级、权限差异 条件必须结构化、可回放,高风险分支不可绕过闸门
分层子图 不同专业域拥有内部工作流 父图只接收子图结果包,不读取临时过程
异步人机等待 需要补充信息、审批或人工确认 持久化检查点,释放计算资源,收到事件后恢复

#mermaid-svg-sGiZ2OacOdJsDXdI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sGiZ2OacOdJsDXdI .error-icon{fill:#552222;}#mermaid-svg-sGiZ2OacOdJsDXdI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sGiZ2OacOdJsDXdI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sGiZ2OacOdJsDXdI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sGiZ2OacOdJsDXdI .marker.cross{stroke:#333333;}#mermaid-svg-sGiZ2OacOdJsDXdI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sGiZ2OacOdJsDXdI p{margin:0;}#mermaid-svg-sGiZ2OacOdJsDXdI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster-label text{fill:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster-label span{color:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster-label span p{background-color:transparent;}#mermaid-svg-sGiZ2OacOdJsDXdI .label text,#mermaid-svg-sGiZ2OacOdJsDXdI span{fill:#333;color:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI .node rect,#mermaid-svg-sGiZ2OacOdJsDXdI .node circle,#mermaid-svg-sGiZ2OacOdJsDXdI .node ellipse,#mermaid-svg-sGiZ2OacOdJsDXdI .node polygon,#mermaid-svg-sGiZ2OacOdJsDXdI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sGiZ2OacOdJsDXdI .rough-node .label text,#mermaid-svg-sGiZ2OacOdJsDXdI .node .label text,#mermaid-svg-sGiZ2OacOdJsDXdI .image-shape .label,#mermaid-svg-sGiZ2OacOdJsDXdI .icon-shape .label{text-anchor:middle;}#mermaid-svg-sGiZ2OacOdJsDXdI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sGiZ2OacOdJsDXdI .rough-node .label,#mermaid-svg-sGiZ2OacOdJsDXdI .node .label,#mermaid-svg-sGiZ2OacOdJsDXdI .image-shape .label,#mermaid-svg-sGiZ2OacOdJsDXdI .icon-shape .label{text-align:center;}#mermaid-svg-sGiZ2OacOdJsDXdI .node.clickable{cursor:pointer;}#mermaid-svg-sGiZ2OacOdJsDXdI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sGiZ2OacOdJsDXdI .arrowheadPath{fill:#333333;}#mermaid-svg-sGiZ2OacOdJsDXdI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sGiZ2OacOdJsDXdI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sGiZ2OacOdJsDXdI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sGiZ2OacOdJsDXdI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sGiZ2OacOdJsDXdI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sGiZ2OacOdJsDXdI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster text{fill:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI .cluster span{color:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sGiZ2OacOdJsDXdI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sGiZ2OacOdJsDXdI rect.text{fill:none;stroke-width:0;}#mermaid-svg-sGiZ2OacOdJsDXdI .icon-shape,#mermaid-svg-sGiZ2OacOdJsDXdI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sGiZ2OacOdJsDXdI .icon-shape p,#mermaid-svg-sGiZ2OacOdJsDXdI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sGiZ2OacOdJsDXdI .icon-shape .label rect,#mermaid-svg-sGiZ2OacOdJsDXdI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sGiZ2OacOdJsDXdI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sGiZ2OacOdJsDXdI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sGiZ2OacOdJsDXdI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全部有效
部分超时
证据矛盾
输入快照
Graph Planner
节点 A
节点 B
节点 C
Join
合成结果
按降级策略继续
Conflict Resolver

并发的四条工程约束

  1. 单写者原则:并发节点只能写自己的结果区;共享状态只能由提交节点串行更新。
  2. 幂等原则 :使用 case_id + node_id + input_version 作为幂等键,重复事件不能造成重复执行。
  3. 稳定汇总原则:不能按"谁先完成"决定最终顺序;Join 必须按确定性键排序。
  4. 超时非失败原则:超时后可等待、接受部分有效结果、读取缓存、切换备用岗位或转人工;策略必须写在图里。

4. 为什么上下文要"路由",而不是"广播"

#mermaid-svg-xa1CbQ6csMcHvmJY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xa1CbQ6csMcHvmJY .error-icon{fill:#552222;}#mermaid-svg-xa1CbQ6csMcHvmJY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xa1CbQ6csMcHvmJY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xa1CbQ6csMcHvmJY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xa1CbQ6csMcHvmJY .marker.cross{stroke:#333333;}#mermaid-svg-xa1CbQ6csMcHvmJY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xa1CbQ6csMcHvmJY p{margin:0;}#mermaid-svg-xa1CbQ6csMcHvmJY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster-label text{fill:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster-label span{color:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster-label span p{background-color:transparent;}#mermaid-svg-xa1CbQ6csMcHvmJY .label text,#mermaid-svg-xa1CbQ6csMcHvmJY span{fill:#333;color:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY .node rect,#mermaid-svg-xa1CbQ6csMcHvmJY .node circle,#mermaid-svg-xa1CbQ6csMcHvmJY .node ellipse,#mermaid-svg-xa1CbQ6csMcHvmJY .node polygon,#mermaid-svg-xa1CbQ6csMcHvmJY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xa1CbQ6csMcHvmJY .rough-node .label text,#mermaid-svg-xa1CbQ6csMcHvmJY .node .label text,#mermaid-svg-xa1CbQ6csMcHvmJY .image-shape .label,#mermaid-svg-xa1CbQ6csMcHvmJY .icon-shape .label{text-anchor:middle;}#mermaid-svg-xa1CbQ6csMcHvmJY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xa1CbQ6csMcHvmJY .rough-node .label,#mermaid-svg-xa1CbQ6csMcHvmJY .node .label,#mermaid-svg-xa1CbQ6csMcHvmJY .image-shape .label,#mermaid-svg-xa1CbQ6csMcHvmJY .icon-shape .label{text-align:center;}#mermaid-svg-xa1CbQ6csMcHvmJY .node.clickable{cursor:pointer;}#mermaid-svg-xa1CbQ6csMcHvmJY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xa1CbQ6csMcHvmJY .arrowheadPath{fill:#333333;}#mermaid-svg-xa1CbQ6csMcHvmJY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xa1CbQ6csMcHvmJY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xa1CbQ6csMcHvmJY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xa1CbQ6csMcHvmJY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xa1CbQ6csMcHvmJY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xa1CbQ6csMcHvmJY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster text{fill:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY .cluster span{color:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xa1CbQ6csMcHvmJY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xa1CbQ6csMcHvmJY rect.text{fill:none;stroke-width:0;}#mermaid-svg-xa1CbQ6csMcHvmJY .icon-shape,#mermaid-svg-xa1CbQ6csMcHvmJY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xa1CbQ6csMcHvmJY .icon-shape p,#mermaid-svg-xa1CbQ6csMcHvmJY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xa1CbQ6csMcHvmJY .icon-shape .label rect,#mermaid-svg-xa1CbQ6csMcHvmJY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xa1CbQ6csMcHvmJY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xa1CbQ6csMcHvmJY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xa1CbQ6csMcHvmJY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 读取需求
生成
字段完整

证据可读

版本兼容
Role Reference (方法规范)
方法模板
规范版本
最佳实践
Evidence Handles (受控引用)
原始数据引用
权限控制
版本标识
Task Packet (当前节点)
节点目标
必填字段
验收标准
Case Brief (全图可见)
目标与硬约束
风险等级
当前阶段
稳定事实
Context Router
字段白名单

权限检查

时效预算
context_manifest
当前 Agent
Task Scratch

私有临时计算
Result Envelope

标准交接物
下游节点

图3:上下文路由的多层架构与数据流向

把完整历史对话、全部材料和其他岗位草稿一次性塞给每个 Agent,看似方便,实际会带来:信息泄露面扩大、模型注意力稀释、结论被上游草稿锚定,以及成本随节点数近似线性放大。

更可控的方式是把上下文拆成不同生命周期:

上下文层 用途 共享规则
Case Brief 目标、硬约束、风险等级、当前阶段 全图可见,但只保留稳定事实
Task Packet 当前节点的目标、必填字段、验收标准 只给当前岗位,任务结束后归档为摘要
Evidence Handles 对原始证据的受控引用 按权限和需要读取,不复制大段原文
Role Reference 该岗位的方法、规范、模板 按版本引用,不随每次任务重复写入状态
Task Scratch 节点内部临时计算与草稿 私有、短 TTL,不进入共享上下文
Result Envelope 结论、证据、假设、不确定项、错误状态 是唯一标准交接物

#mermaid-svg-5u0r8atah8EpcRWM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5u0r8atah8EpcRWM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5u0r8atah8EpcRWM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5u0r8atah8EpcRWM .error-icon{fill:#552222;}#mermaid-svg-5u0r8atah8EpcRWM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5u0r8atah8EpcRWM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5u0r8atah8EpcRWM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5u0r8atah8EpcRWM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5u0r8atah8EpcRWM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5u0r8atah8EpcRWM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5u0r8atah8EpcRWM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5u0r8atah8EpcRWM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5u0r8atah8EpcRWM .marker.cross{stroke:#333333;}#mermaid-svg-5u0r8atah8EpcRWM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5u0r8atah8EpcRWM p{margin:0;}#mermaid-svg-5u0r8atah8EpcRWM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5u0r8atah8EpcRWM .cluster-label text{fill:#333;}#mermaid-svg-5u0r8atah8EpcRWM .cluster-label span{color:#333;}#mermaid-svg-5u0r8atah8EpcRWM .cluster-label span p{background-color:transparent;}#mermaid-svg-5u0r8atah8EpcRWM .label text,#mermaid-svg-5u0r8atah8EpcRWM span{fill:#333;color:#333;}#mermaid-svg-5u0r8atah8EpcRWM .node rect,#mermaid-svg-5u0r8atah8EpcRWM .node circle,#mermaid-svg-5u0r8atah8EpcRWM .node ellipse,#mermaid-svg-5u0r8atah8EpcRWM .node polygon,#mermaid-svg-5u0r8atah8EpcRWM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5u0r8atah8EpcRWM .rough-node .label text,#mermaid-svg-5u0r8atah8EpcRWM .node .label text,#mermaid-svg-5u0r8atah8EpcRWM .image-shape .label,#mermaid-svg-5u0r8atah8EpcRWM .icon-shape .label{text-anchor:middle;}#mermaid-svg-5u0r8atah8EpcRWM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5u0r8atah8EpcRWM .rough-node .label,#mermaid-svg-5u0r8atah8EpcRWM .node .label,#mermaid-svg-5u0r8atah8EpcRWM .image-shape .label,#mermaid-svg-5u0r8atah8EpcRWM .icon-shape .label{text-align:center;}#mermaid-svg-5u0r8atah8EpcRWM .node.clickable{cursor:pointer;}#mermaid-svg-5u0r8atah8EpcRWM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5u0r8atah8EpcRWM .arrowheadPath{fill:#333333;}#mermaid-svg-5u0r8atah8EpcRWM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5u0r8atah8EpcRWM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5u0r8atah8EpcRWM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5u0r8atah8EpcRWM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5u0r8atah8EpcRWM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5u0r8atah8EpcRWM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5u0r8atah8EpcRWM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5u0r8atah8EpcRWM .cluster text{fill:#333;}#mermaid-svg-5u0r8atah8EpcRWM .cluster span{color:#333;}#mermaid-svg-5u0r8atah8EpcRWM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5u0r8atah8EpcRWM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5u0r8atah8EpcRWM rect.text{fill:none;stroke-width:0;}#mermaid-svg-5u0r8atah8EpcRWM .icon-shape,#mermaid-svg-5u0r8atah8EpcRWM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5u0r8atah8EpcRWM .icon-shape p,#mermaid-svg-5u0r8atah8EpcRWM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5u0r8atah8EpcRWM .icon-shape .label rect,#mermaid-svg-5u0r8atah8EpcRWM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5u0r8atah8EpcRWM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5u0r8atah8EpcRWM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5u0r8atah8EpcRWM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Case Brief

稳定事实与硬约束
Context Router
Task Packet

本节点目标
Evidence Handles

受控引用
Role Reference

方法与规范版本
当前 Agent
Task Scratch

私有、短 TTL
Result Envelope

可交接结果
下游节点

一个好的 Result Envelope 不需要暴露内部推理过程,但必须让下游能够判断它能不能被使用:

yaml 复制代码
case_id: "..."
task_id: "..."
role_id: research_agent
input_version: "..."
conclusion: "可验证的结论摘要"
evidence_refs:
  - "evidence://source/123"
confidence: 0.78
assumptions:
  - "样本覆盖范围有限"
unresolved:
  - "缺少最新数据点"
constraints_hit: []
output_schema_version: ResultEnvelope.v3
eval_tags: [evidence_required, freshness_checked]

!tip Context Router 的工作顺序

先读取节点所需字段与白名单;再注入稳定事实和必要的上游结果;大对象只传证据句柄;按 token、敏感字段与时效预算裁剪;最后生成 context_manifest,记录字段来源、版本、时间点与裁剪原因。

5. 冲突处理不是投票,而是一条显式工作流

多岗位得出不同结论并不一定是错误。冲突可能来自数据版本不同、指标口径不同、适用边界不同,或者真实的不确定性。把结论简单平均,往往会掩盖真正的问题。

建议把冲突分成六类:

冲突类型 优先动作
数据版本冲突 统一权威数据源与 as_of_time,局部重跑受影响节点
指标口径冲突 绑定统一 Reference;不能统一时并列展示口径和影响
专业判断冲突 补充证据、保留区间,必要时调用独立仲裁岗位
约束冲突 硬约束优先;无法满足时说明原因并进入人工确认
资源与优先级冲突 按风险、时效、影响、SLA 与人工优先级排队
合规冲突 硬规则否决,不得以投票或平均值覆盖

一个可审计的冲突流程通常是:

检测 → 归一 → 定向补证 → 局部重跑 → 裁决 → 人工升级 → 留痕

裁决优先级可以写成明确规则:

合规硬规则 > 明确硬约束 > 权威数据与统一时间点 > 已批准的方法 > 证据质量与新鲜度 > 受限仲裁模型 > 人工确认

其中,"受限仲裁模型"只适合处理语言表达或证据关联等软问题,不能单独批准高风险结果。
#mermaid-svg-lElTPRowtzyISQlo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lElTPRowtzyISQlo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lElTPRowtzyISQlo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lElTPRowtzyISQlo .error-icon{fill:#552222;}#mermaid-svg-lElTPRowtzyISQlo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lElTPRowtzyISQlo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lElTPRowtzyISQlo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lElTPRowtzyISQlo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lElTPRowtzyISQlo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lElTPRowtzyISQlo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lElTPRowtzyISQlo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lElTPRowtzyISQlo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lElTPRowtzyISQlo .marker.cross{stroke:#333333;}#mermaid-svg-lElTPRowtzyISQlo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lElTPRowtzyISQlo p{margin:0;}#mermaid-svg-lElTPRowtzyISQlo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lElTPRowtzyISQlo .cluster-label text{fill:#333;}#mermaid-svg-lElTPRowtzyISQlo .cluster-label span{color:#333;}#mermaid-svg-lElTPRowtzyISQlo .cluster-label span p{background-color:transparent;}#mermaid-svg-lElTPRowtzyISQlo .label text,#mermaid-svg-lElTPRowtzyISQlo span{fill:#333;color:#333;}#mermaid-svg-lElTPRowtzyISQlo .node rect,#mermaid-svg-lElTPRowtzyISQlo .node circle,#mermaid-svg-lElTPRowtzyISQlo .node ellipse,#mermaid-svg-lElTPRowtzyISQlo .node polygon,#mermaid-svg-lElTPRowtzyISQlo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lElTPRowtzyISQlo .rough-node .label text,#mermaid-svg-lElTPRowtzyISQlo .node .label text,#mermaid-svg-lElTPRowtzyISQlo .image-shape .label,#mermaid-svg-lElTPRowtzyISQlo .icon-shape .label{text-anchor:middle;}#mermaid-svg-lElTPRowtzyISQlo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lElTPRowtzyISQlo .rough-node .label,#mermaid-svg-lElTPRowtzyISQlo .node .label,#mermaid-svg-lElTPRowtzyISQlo .image-shape .label,#mermaid-svg-lElTPRowtzyISQlo .icon-shape .label{text-align:center;}#mermaid-svg-lElTPRowtzyISQlo .node.clickable{cursor:pointer;}#mermaid-svg-lElTPRowtzyISQlo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lElTPRowtzyISQlo .arrowheadPath{fill:#333333;}#mermaid-svg-lElTPRowtzyISQlo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lElTPRowtzyISQlo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lElTPRowtzyISQlo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lElTPRowtzyISQlo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lElTPRowtzyISQlo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lElTPRowtzyISQlo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lElTPRowtzyISQlo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lElTPRowtzyISQlo .cluster text{fill:#333;}#mermaid-svg-lElTPRowtzyISQlo .cluster span{color:#333;}#mermaid-svg-lElTPRowtzyISQlo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lElTPRowtzyISQlo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lElTPRowtzyISQlo rect.text{fill:none;stroke-width:0;}#mermaid-svg-lElTPRowtzyISQlo .icon-shape,#mermaid-svg-lElTPRowtzyISQlo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lElTPRowtzyISQlo .icon-shape p,#mermaid-svg-lElTPRowtzyISQlo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lElTPRowtzyISQlo .icon-shape .label rect,#mermaid-svg-lElTPRowtzyISQlo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lElTPRowtzyISQlo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lElTPRowtzyISQlo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lElTPRowtzyISQlo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否



检测:字段、口径、时间点、约束或结论不一致
分类冲突
归一:统一数据、版本和可比口径
证据是否足够
向相关节点定向补证
局部重跑受影响节点
按优先级裁决
高风险或仍无法收敛
人工升级与确认
输出结论或候选区间
记录决策与责任
写入 Trace 与回归评测集

6. Harness Evals:评测对象不只是一段回答

如果多智能体系统只评测最终输出,很容易漏掉"结果看似正确、路径其实不安全"的问题。例如:绕过人工闸门、把敏感字段传给了不该读取的岗位、并发节点覆盖共享状态,或者某个版本升级后时延与成本突然失控。

因此,Harness 中的 Evals 建议分为六层:

层级 评测对象 主要检查
静态图 Eval Graph Spec 与配置 无环/受控循环、可达性、权限最小化、闸门覆盖、并发写冲突
节点 Eval 单一岗位 Schema、证据覆盖、专业质量、边界、时延与成本
交接 Eval 上下游 Result Envelope 字段完整、证据可读、版本兼容、敏感字段不过界
路径 Eval 一次运行轨迹 分支选择、超时恢复、重试合理、状态正确、人工闸门
整图 Eval 端到端服务图 目标完成、结果一致、冲突处理、可回放、总时延与总成本
业务/治理 Eval 真实使用后的系统效果 采纳、修改、放弃、风险拦截、人工负担与知识版本效果

评测集要覆盖哪些样本

  • Golden Cases:输入、期望路径、必需证据、允许区间和禁止输出均已确认的标准样本。
  • Edge Cases:数据缺失、版本冲突、低置信度、超时、工具异常、权限不足与高风险情形。
  • Regression Cases:历史发生过错误、被人工大量修改或被规则拦截的样本。
  • Simulation Cases:并发、延迟、重复事件、节点失败、人工长时间等待等运行时模拟。
  • Online Samples:按场景、岗位、风险等级、图版本分层抽样,避免只看平均分。

Evals 如何接入发布流程

推荐采用渐进式发布,而不是一次性替换生产配置:

  1. 离线单测:检查技能、岗位和 Schema 的基本正确性。
  2. 图回放:以固定输入快照执行完整 Graph,验证状态、路径、冲突和闸门。
  3. 影子运行:新版本读取真实输入但不影响生产结果,与当前版本比对差异。
  4. 灰度发布:只在低风险范围启用,持续监控质量、时延与成本。
  5. 在线评测与回滚:规则实时拦截,模型 Judge 抽样,触发门槛时回滚 Graph、Agent、Skill、Reference 或 Policy 的对应版本。

#mermaid-svg-uUErVLTKkFi7AV8d{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uUErVLTKkFi7AV8d .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uUErVLTKkFi7AV8d .error-icon{fill:#552222;}#mermaid-svg-uUErVLTKkFi7AV8d .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uUErVLTKkFi7AV8d .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uUErVLTKkFi7AV8d .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uUErVLTKkFi7AV8d .marker.cross{stroke:#333333;}#mermaid-svg-uUErVLTKkFi7AV8d svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uUErVLTKkFi7AV8d p{margin:0;}#mermaid-svg-uUErVLTKkFi7AV8d .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uUErVLTKkFi7AV8d .cluster-label text{fill:#333;}#mermaid-svg-uUErVLTKkFi7AV8d .cluster-label span{color:#333;}#mermaid-svg-uUErVLTKkFi7AV8d .cluster-label span p{background-color:transparent;}#mermaid-svg-uUErVLTKkFi7AV8d .label text,#mermaid-svg-uUErVLTKkFi7AV8d span{fill:#333;color:#333;}#mermaid-svg-uUErVLTKkFi7AV8d .node rect,#mermaid-svg-uUErVLTKkFi7AV8d .node circle,#mermaid-svg-uUErVLTKkFi7AV8d .node ellipse,#mermaid-svg-uUErVLTKkFi7AV8d .node polygon,#mermaid-svg-uUErVLTKkFi7AV8d .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uUErVLTKkFi7AV8d .rough-node .label text,#mermaid-svg-uUErVLTKkFi7AV8d .node .label text,#mermaid-svg-uUErVLTKkFi7AV8d .image-shape .label,#mermaid-svg-uUErVLTKkFi7AV8d .icon-shape .label{text-anchor:middle;}#mermaid-svg-uUErVLTKkFi7AV8d .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uUErVLTKkFi7AV8d .rough-node .label,#mermaid-svg-uUErVLTKkFi7AV8d .node .label,#mermaid-svg-uUErVLTKkFi7AV8d .image-shape .label,#mermaid-svg-uUErVLTKkFi7AV8d .icon-shape .label{text-align:center;}#mermaid-svg-uUErVLTKkFi7AV8d .node.clickable{cursor:pointer;}#mermaid-svg-uUErVLTKkFi7AV8d .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uUErVLTKkFi7AV8d .arrowheadPath{fill:#333333;}#mermaid-svg-uUErVLTKkFi7AV8d .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uUErVLTKkFi7AV8d .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uUErVLTKkFi7AV8d .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uUErVLTKkFi7AV8d .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uUErVLTKkFi7AV8d .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uUErVLTKkFi7AV8d .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uUErVLTKkFi7AV8d .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uUErVLTKkFi7AV8d .cluster text{fill:#333;}#mermaid-svg-uUErVLTKkFi7AV8d .cluster span{color:#333;}#mermaid-svg-uUErVLTKkFi7AV8d div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uUErVLTKkFi7AV8d .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uUErVLTKkFi7AV8d rect.text{fill:none;stroke-width:0;}#mermaid-svg-uUErVLTKkFi7AV8d .icon-shape,#mermaid-svg-uUErVLTKkFi7AV8d .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uUErVLTKkFi7AV8d .icon-shape p,#mermaid-svg-uUErVLTKkFi7AV8d .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uUErVLTKkFi7AV8d .icon-shape .label rect,#mermaid-svg-uUErVLTKkFi7AV8d .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uUErVLTKkFi7AV8d .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uUErVLTKkFi7AV8d .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uUErVLTKkFi7AV8d :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 通过
触发门槛
变更:Graph / Agent / Skill / Policy
离线单测
固定快照回放
影子运行
灰度发布
在线监控与抽样评测
扩大范围
回滚到已批准版本
把失败样本沉淀为回归集

7. 图、岗位、知识与策略必须独立版本化

不要把所有变化混在一次"升级 Agent"的发布里。下面这些对象需要独立版本、独立评测和独立回滚:

资产 版本内容 发布前验证
Graph 节点、边、条件、Join、人工闸门 静态图 Eval、回放、失败恢复与权限覆盖
Agent Prompt、模型、权限、输出 Schema 节点 Eval、边界、安全、成本与时延
Skill 原子能力实现与工具参数 输入边界、错误处理、幂等与单测
Reference 方法、制度、模板、知识 来源、审批、时效、影响分析
Policy 上下文、冲突、重试、并发、降级 模拟、压测、冲突与异常场景
Eval Suite 数据集、指标、Judge 与阈值 专家校准、覆盖率、漂移与版本兼容

这样做的好处是:一次异常可以定位到"哪张图、哪个岗位、哪条规则、哪版知识"引起,而不是笼统地归因于"模型不稳定"。
#mermaid-svg-KRjZD5Ellu6uT3Io{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KRjZD5Ellu6uT3Io .error-icon{fill:#552222;}#mermaid-svg-KRjZD5Ellu6uT3Io .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KRjZD5Ellu6uT3Io .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KRjZD5Ellu6uT3Io .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KRjZD5Ellu6uT3Io .marker.cross{stroke:#333333;}#mermaid-svg-KRjZD5Ellu6uT3Io svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KRjZD5Ellu6uT3Io p{margin:0;}#mermaid-svg-KRjZD5Ellu6uT3Io .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster-label text{fill:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster-label span{color:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster-label span p{background-color:transparent;}#mermaid-svg-KRjZD5Ellu6uT3Io .label text,#mermaid-svg-KRjZD5Ellu6uT3Io span{fill:#333;color:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io .node rect,#mermaid-svg-KRjZD5Ellu6uT3Io .node circle,#mermaid-svg-KRjZD5Ellu6uT3Io .node ellipse,#mermaid-svg-KRjZD5Ellu6uT3Io .node polygon,#mermaid-svg-KRjZD5Ellu6uT3Io .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KRjZD5Ellu6uT3Io .rough-node .label text,#mermaid-svg-KRjZD5Ellu6uT3Io .node .label text,#mermaid-svg-KRjZD5Ellu6uT3Io .image-shape .label,#mermaid-svg-KRjZD5Ellu6uT3Io .icon-shape .label{text-anchor:middle;}#mermaid-svg-KRjZD5Ellu6uT3Io .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KRjZD5Ellu6uT3Io .rough-node .label,#mermaid-svg-KRjZD5Ellu6uT3Io .node .label,#mermaid-svg-KRjZD5Ellu6uT3Io .image-shape .label,#mermaid-svg-KRjZD5Ellu6uT3Io .icon-shape .label{text-align:center;}#mermaid-svg-KRjZD5Ellu6uT3Io .node.clickable{cursor:pointer;}#mermaid-svg-KRjZD5Ellu6uT3Io .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KRjZD5Ellu6uT3Io .arrowheadPath{fill:#333333;}#mermaid-svg-KRjZD5Ellu6uT3Io .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KRjZD5Ellu6uT3Io .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KRjZD5Ellu6uT3Io .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KRjZD5Ellu6uT3Io .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KRjZD5Ellu6uT3Io .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KRjZD5Ellu6uT3Io .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster text{fill:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io .cluster span{color:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KRjZD5Ellu6uT3Io .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KRjZD5Ellu6uT3Io rect.text{fill:none;stroke-width:0;}#mermaid-svg-KRjZD5Ellu6uT3Io .icon-shape,#mermaid-svg-KRjZD5Ellu6uT3Io .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KRjZD5Ellu6uT3Io .icon-shape p,#mermaid-svg-KRjZD5Ellu6uT3Io .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KRjZD5Ellu6uT3Io .icon-shape .label rect,#mermaid-svg-KRjZD5Ellu6uT3Io .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KRjZD5Ellu6uT3Io .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KRjZD5Ellu6uT3Io .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KRjZD5Ellu6uT3Io :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 独立版本化资产
依赖
使用
引用
应用
验证
验证
验证
验证
验证
Eval Suite
数据集
指标与阈值
Judge模型
覆盖率分析
Graph
节点与边
条件与Join
人工闸门
并发策略
Agent
Prompt与模型
权限配置
输出Schema
运行时参数
Skill
原子能力实现
工具参数
错误处理
幂等机制
Reference
方法与制度
模板库
知识版本
影响分析
Policy
上下文策略
冲突策略
重试策略
降级策略

图5:多智能体系统资产的版本化依赖关系与独立发布路径

结语:让协作具备工程约束

真正可靠的多智能体系统,不是一个记住所有步骤的超级 Agent,而是一个具备明确分工的协作网络:流程编排负责意图与边界,Graph Engineer 负责将意图编译为图并保障运行,专业岗位负责独立交付,冲突与评测机制负责把不确定性暴露出来并持续改进。

当并发有规则、上下文有边界、冲突有路径、发布有评测,Agent 才能从演示型能力真正走向可运营的软件系统。

参考文献与延伸阅读

  1. Wu, Q. et al. (2023). AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation . arXiv. https://arxiv.org/abs/2308.08155
  2. Liu, X. et al. (2023). AgentBench: Evaluating LLMs as Agents . arXiv. https://arxiv.org/abs/2308.03688
  3. LangChain. Multi-agent . 关于子 Agent、Router、Handoff、Skills 与自定义工作流的模式说明。 https://langchain-ai.github.io/langgraph/tutorials/multi_agent/multi-agent-collaboration/
  4. LangChain. Graph API overview . 关于以图、状态与 Reducer 组织 Agent 工作流的工程说明。 https://langchain-ai.github.io/langgraph/how-tos/state-reducers/
  5. OpenAI. A practical guide to building agents . 关于 Agent 编排、Guardrails 与建立 Evals 基线的实践指南。 https://openai.com/business/guides-and-resources/a-practical-guide-to-building-ai-agents/
相关推荐
MacroZheng1 小时前
几行代码给项目集成AI功能,Spring AI 2.0太香了!
java·人工智能·spring boot
zed_231 小时前
给接口加把锁:Bearer Token 鉴权(附冒烟验收)
人工智能
BigTopOne1 小时前
VS Code IntelliSense 配置(解决 #include 找不到的报红)
前端
愚公搬代码1 小时前
【愚公系列】《Web应用安全》005-Visual Studio Code编辑器的使用
前端·安全·编辑器
u0103055271 小时前
昇腾Model Agent模型适配指南
人工智能
Neptune231 小时前
Agent死循环6小时:从“相信LLM判断”到“焊死硬件条件止
人工智能
用户921080262861 小时前
2. 以 Bubble 为例,看 Ant Design X Vue 组件是怎么设计的
前端
用户548775431601 小时前
DeepSeek Harness 与 xAgent:两种 Agent Harness 架构路线怎么选
人工智能·deepseek
Liora_Yvonne1 小时前
Monorepo 里的 shared、services 和 ui 到底怎么划分?
前端