Skip to content

6.3 产品实战:4 Agent 流水线架构

背景与问题

我的自动化产品有 100+ 种工作流节点——20+ 基础节点、80+ CLI 内置节点。用户可以在画布上拖拽编排工作流。

但操作太繁琐了。用户需要:

  1. 在节点库里搜索合适的节点
  2. 逐个拖到画布上
  3. 手动连接节点
  4. 逐个配置参数
  5. 检查有没有配错
  6. 运行测试

一个"下载视频 → 转格式 → 上传 FTP"的简单工作流,要操作 20 多次。

目标:让用户用自然语言描述需求,自动完成工作流的规划、创建、检查、执行。

为什么需要 4 个 Agent

最直觉的做法:一个 Agent 搞定所有事。用户说需求,Agent 直接创建工作流并执行。

但实际做下来,一个问题都解决不好:

问题 1:LLM 边想边做,错误率高

一个 Agent 同时负责"想清楚要做什么"和"动手去做",结果是想不清楚、做不对。就像让一个人同时当架构师和程序员——他一边设计一边写代码,设计没想好就写了,写完发现设计有问题又要改。

问题 2:自己检查自己,等于没检查

创建完工作流后,同一个 Agent 检查自己的工作——它倾向于认为自己做的没错。这是 LLM 的固有缺陷:会迎合、会自我合理化。

问题 3:不经过检查就执行,风险大

创建完直接执行,万一工作流有错(参数没配、节点连错了),执行就会失败,甚至可能造成损失(删了不该删的文件、上传了错误的数据)。

这三个问题的答案,就是 4 Agent 流水线的架构设计。

4 Agent 流水线架构:规划→创建→检查→执行

4 Agent 分工

用户: "帮我把一个视频转成mp4,加字幕,上传到FTP"


┌─────────────────────┐
│  ① 规划 Agent       │  ← 脑力活:分析需求、选节点、定拓扑
│  (WorkflowPlanner)   │
└────────┬────────────┘
         │ 规划结果: {nodes: [...], connections: [...], params: {...}}

┌─────────────────────┐
│  ② 创建 Agent       │  ← 体力活:调API把规划变成工作流
│  (WorkflowCreator)   │
└────────┬────────────┘
         │ 创建完成: workflowId

┌─────────────────────┐
│  ③ 检查 Agent       │  ← 质检:验证工作流是否正确
│  (WorkflowChecker)   │
└────────┬────────────┘
         │ 检查报告: passed | issues[...]

┌─────────────────────┐
│  ④ 执行 Agent       │  ← 验收:执行工作流、看结果
│  (WorkflowExecutor)  │
└────────┬────────────┘
         │ 执行结果: success/fail, output

      用户得到最终结果

每个 Agent 的定位

Agent类比输入输出是否修改系统状态
规划 Agent架构师用户自然语言需求工作流规划方案
创建 Agent工程师规划方案工作流 ID(建表)
检查 AgentQA工作流 ID校验报告
执行 Agent运维工作流 ID执行结果(运行)

四个关键原则

原则 1:规划与创建分离

先思考再行动。规划 Agent 只负责"想清楚要做什么",不执行任何写操作。创建 Agent 只负责"按方案去做",不做规划决策。

这个分离解决了一个核心问题:LLM 边想边做导致的错误。 分开之后,规划可以反复修改(用户确认后再创建),创建严格按方案执行(不擅自改动)。

原则 2:检查独立

创建者不应检查自己的工作。检查 Agent 是独立的质检视角——它不知道规划方案是什么,它只看工作流本身是否符合规则。

这就像代码 review——写代码的人不应该自己 review 自己的代码,需要另一个人用独立视角检查。

原则 3:执行是验收

不经过检查的工作流不应执行。执行 Agent 拿到的工作流,一定是已经通过检查 Agent 验证的。如果检查没通过,执行 Agent 不会启动。

原则 4:每步可逆

发现错误可以回退到上一步修正:

  • 检查发现问题 → 回退到创建(修复)或规划(重规划)
  • 执行失败 → 回退到检查(分析问题)或创建(修改参数)

每一步的输出都是结构化的,可以传递给上一步作为修正依据。

数据流转

4 个 Agent 之间的数据流转是严格定义的:

用户需求(自然语言)


┌─────────────────────────────────────────────────────┐
│ 规划 Agent 输出:WorkflowPlan                          │
│ {                                                      │
│   nodes: [                                            │
│     { id: "node_1", type: "Entry", title: "开始" },   │
│     { id: "node_2", type: "HttpDownload", ... },      │
│     { id: "node_3", type: "VideoFormatConversion",    │
│       params: { format: "mp4" } },                    │
│     { id: "node_4", type: "FtpUpload", ... },         │
│     { id: "node_5", type: "Exit", title: "结束" }     │
│   ],                                                   │
│   connections: [                                       │
│     { from: "node_1", to: "node_2" }, ...              │
│   ],                                                   │
│   userQuestions: [                                     │
│     { nodeId: "node_2", question: "请提供视频下载地址" }│
│   ]                                                    │
│ }                                                      │
└─────────────────────────────────────────────────────┘
    │ 用户确认规划

┌─────────────────────────────────────────────────────┐
│ 创建 Agent 通过 API 逐条执行:                         │
│ 1. workflow_create("视频处理") → id="wf_001"          │
│ 2. workflow_add_node(wf_001, "Entry")                │
│ 3. workflow_add_node(wf_001, "HttpDownload")          │
│ 4. workflow_set_param(wf_001, "node_2", "url", ...)    │
│ 5. workflow_connect(wf_001, "node_1", "node_2")       │
│ ...                                                  │
│ 最终返回 workflowId = "wf_001"                        │
└─────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│ 检查 Agent 输出:ValidationReport                      │
│ { passed: true/false,                                │
│   issues: [                                          │
│     { severity: "error", nodeId: "node_2",           │
│       message: "URL参数未填写",                       │
│       suggestion: "请设置 downloadUrl" }              │
│   ] }                                                │
└─────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│ 执行 Agent 输出:ExecutionResult                       │
│ { success: true/false,                               │
│   output: { ... },                                   │
│   duration: "00:03:25" }                             │
└─────────────────────────────────────────────────────┘

Harness 概念在产品中的映射

对照 6.2 的设计清单,看产品是怎么落地的:

Harness 维度产品实现
知识每个 Agent 加载不同的 Skill 文档(节点使用模式、校验规则等)
规范规划 Agent 的约束规则(必须有 Entry/Exit、参数区分必填和可推断)
能力每个 Agent 有不同的 Tool 集(Planner 只读、Creator 读写、Executor 执行)
校验检查 Agent 本身就是 EvalCheck 的具象化
监控执行 Agent 实时监控执行状态、分析失败原因
边界通过 Tool 权限控制 Agent 边界(Planner 不能创建工作流)

这个映射关系,就是 Harness 工程从"设计清单"到"产品实现"的落地过程。