---
title: "自动编排、图微调与自由编排"
---



Graph 与 Agent 结合有三种主要模式。选择模式前，应先判断“拓扑由协作协议决定，还是由业务规则决定”。

### 1、三种模式

| 模式 | 典型写法 | 适用场景 |
|---|---|---|
| 协议自动编排 | `protocol(...).agentAdd(...)` | 团队协作模式稳定，可由预置协议表达 |
| 协议图微调 | 预置协议 + `graphAdjuster` | 保留协议能力，同时插入校验或业务节点 |
| 自由编排 | `NONE + graphAdjuster` | 拓扑完全由业务约束决定 |

本系列优先使用 `NONE` 展示可见、可控的 Agent Graph，但这只是教程主线，并非 TeamAgent 的框架默认值。未调用 `.protocol(...)` 时，TeamAgent 默认使用 `HIERARCHICAL`。

### 2、协议自动编排

例如顺序协作：

```java
TeamAgent team = TeamAgent.of(null)
        .name("review_team")
        .protocol(TeamProtocols.SEQUENTIAL)
        .feedbackMode(false)
        .agentAdd(analyst, reviewer)
        .build();
```

协议负责构建 Graph，也负责相应的 Prompt 和协作语义。适合：

- 固定顺序协作；
- 主管动态派发；
- Agent 主动接力；
- 已有协议能够覆盖的团队形态。

这时不必为展示 Graph 而手写一遍相同拓扑。

### 3、协议图微调

`TeamAgent` 构建时会先让协议执行 `buildGraph(spec)`，然后再应用 `graphAdjuster`。因此使用非 `NONE` 协议时，`graphAdjuster` 修改的是 **协议已经生成的图**。

典型用途：

- 在输出前插入合规校验；
- 在高风险路径加入人工审核；
- 调整已有节点连接；
- 加入确定性数据准备节点。

示意：

```java
TeamAgent team = TeamAgent.of(supervisor)
        .name("delivery_team")
        .protocol(TeamProtocols.HIERARCHICAL)
        .agentAdd(coder, tester)
        .graphAdjuster(spec -> {
            // 先读取协议生成的节点，再有针对性地调整连接。
            spec.getNode("some_node").linkClear();
            spec.getNode("some_node").linkAdd("compliance_check");

            spec.addActivity("compliance_check")
                    .task((ctx, node) -> validate(ctx))
                    .linkAdd(Agent.ID_END);
        })
        .build();
```

具体节点 ID 取决于协议定义。调整前应先导出 `team.getGraph().toYaml()` 或阅读协议源码，不要猜测节点名称。

同 ID 的节点可能被替换；调整已有节点时应特别检查旧连接是否仍然保留。

### 4、自由编排

`TeamProtocols.NONE` 不预建任何节点：

```java
TeamAgent team = TeamAgent.of(null)
        .name("order_risk_graph")
        .protocol(TeamProtocols.NONE)
        .agentAdd(classifier, reviewer)
        .graphAdjuster(spec -> {
            spec.addStart(Agent.ID_START).linkAdd(classifier.name());
            spec.addActivity(classifier).linkAdd("risk_route");
            // 自行添加网关、分支、汇聚和 End
        })
        .build();
```

自由编排适合：

- 金额、权限、状态机决定路径；
- 需要 Exclusive、Inclusive、Parallel 或循环；
- Agent 与数据库查询、审批、通知等业务节点混排；
- 恢复位置和副作用边界需要精确设计。

`NONE` 只表示不预建拓扑，不表示没有 TeamAgent 运行时。它仍然创建 TeamTrace、使用 AgentSession，并执行团队结果收敛。

### 5、独立业务 Graph

如果系统本体是业务流程，AI 只是其中少量节点，不必把整个业务流程包装成 TeamAgent：

```text
独立 Graph
  -> 数据校验
  -> Agent 适配节点
  -> 人工任务
  -> 数据落库
```

这种模式由外层 `FlowEngine` 执行，并在 Agent Activity 中显式组装 Prompt。它与 TeamAgent 内部 Graph 的区别：

| 维度 | TeamAgent 内部 Graph | 独立业务 Graph |
|---|---|---|
| Prompt | TeamProtocol 参与准备 | Activity 显式准备 |
| Agent 记录 | 自动进入 TeamTrace | 默认没有 TeamTrace |
| 最终答案 | TeamAgent 收敛 | 业务节点自行写 Context |
| FlowEngine | TeamAgent 内部持有 | 应用自行创建和配置 |
| Executor | 由 TeamAgent 当前实现决定 | 应用可配置 Driver/Executor |

### 6、选型建议

```text
只是固定团队协作？
  -> 优先预置 TeamProtocol

保留协议但增加业务控制？
  -> 协议 + graphAdjuster

多 Agent 拓扑完全由业务规则决定？
  -> NONE + graphAdjuster

普通业务流程只嵌入少量 Agent？
  -> 独立 Graph + 显式 Agent 适配节点
```

不要为了“更智能”把确定性规则交给 LLM；也不要为了“更可控”把所有文本理解任务写成大量脆弱规则。Graph 和 Agent 各自承担擅长的部分，才是本系列的设计边界。