流程编排族:迭代 / 循环 / 定时触发 / 子工作流 / 人工输入——复杂流程组织五件套
基于 Dify 1.16.1 与 Hermes Agent 实战实测(2026-08/09):实验 E(Loop 运行语义 6 坑)+ 实验 G(Human Input 全实测)+ 定时触发三坑 + 拼装式交付实测
📖 摘要:复杂流程组织五件套:迭代(遍历数组)、循环(条件循环)、定时触发(到点自动跑)、子工作流(复用拼装)、人工输入(人机审批)。本文先给选型决策表(Iteration vs Loop 怎么选、五件套各干什么),再给实测坑:循环体链尾加回边容器静默不执行、break 条件必须 Unicode、loop 初始值必须数字字面量、定时触发不支持 24 小时制(时区默认 UTC)、人工输入的恢复竞态(实测 3 次 2 成 1 败)。
📌 本文要解决的核心痛点
- 迭代和循环到底什么区别?什么场景用哪个?
- 循环跑起来只有 1-2 步就结束了,循环体根本没执行——为什么?
- 定时任务到点了没跑,日志里也查不到——哪里出问题了?
- 「AI 起草 + 人工审批」的流程,人工填表后流程为什么有时不继续?
- 本文给五件套的选型表 + 每个的实测坑(含静默失败排查)。
一、五件套是干什么的(先选型)
| 工具 | 干什么 | 什么时候用 |
|---|---|---|
| 迭代(Iteration) | 遍历数组逐条处理(for-each) | 已知数组、每条都要处理(批量清洗/逐条检索) |
| 循环(Loop) | 条件循环(while) | 「跑到条件满足」:重试/收敛/累加/分页直到没有下一页 |
| 定时触发 | 到点自动跑工作流 | 日报/巡检/看板/定时通知 |
| 子工作流 | 一段流程发布成工具复用 | 拼装式交付(主工作流骨架 + 子工作流业务块) |
| 人工输入 | 工作流暂停,人工填表/审批后继续 | 「AI 起草 + 人工审批」、人工补料、带附件审批 |
⚠️ Iteration vs Loop 决策(实测定案):
| Iteration 迭代 | Loop 循环 | |
|---|---|---|
| 语义 | 遍历数组(for-each) | 条件循环(while) |
| 输出 | 每次迭代结果数组 | 循环变量最终状态 |
| 终止 | 数组遍历完 | break 条件满足 或 loop_count 硬上限 |
| 场景 | 已知数组逐条处理 | 重试直到成功/累加/收敛/分页 |
| 结论 | 不替代,语义不同——选错就掉进「跑了但结果不是你要的」 |
二、设计模式
迭代(Iteration)
| 契约 | 要点 |
|---|---|
| 三件套 | 容器 + 开始标记(custom-iteration-start)+ 内部节点(parentId 归属) |
| 出边 | 容器出边 sourceHandle: output |
| 内部引用 | [iter节点id, item] /
[iter节点id, index] |
循环(Loop)
| 契约 | 要点 |
|---|---|
| 容器 | break_conditions(Unicode 运算符)+ loop_count(硬上限防死循环)+ loop_variables(跨迭代状态) |
| 开始标记 | custom-loop-start(parentId 归属) |
| 出边 | 容器出边 sourceHandle: source(与 iteration 的
output 不同) |
| 状态 | loop_variables 跨迭代保留(累加器/计数器)——初始值用数字字面量 |
定时触发
| 契约 | 要点 |
|---|---|
| 时间格式 | HH:MM AM/PM("2:30 PM"
正常;"14:30" 报错——不支持 24 小时制) |
| 时区 | 默认 UTC(不是北京时间)——要显式配时区 |
| 触发 | 发布后事件双表机制(plan + trigger) |
子工作流(拼装)
| 契约 | 要点 |
|---|---|
| 形态 | 子工作流发布为工具(Workflow as Tool)→ 主工作流 tool 节点调用 |
| 失败契约 | 子工作流 end 输出
{error_code, error_message, retryable} + 主工作流按
error_code 分流 |
| 增量集成 | 每轮加一个工具节点:draft + publish + 整体冒烟 |
人工输入(HITL)
| 契约 | 要点 |
|---|---|
| 节点 | type: human-input(连字符!写 human_input 报错) |
| 表单 | inputs 字段(paragraph/select/file/file-list)+ user_actions 按钮 |
| delivery_methods 必配 | 不配 = 没有收件人 = 无法提交 |
| 恢复 | 提交后沿按钮边继续;超时边 __timeout__ |
三、实测踩坑(六个高频坑)
坑 1:循环体链尾加回边 → 容器静默不执行
现象:运行 succeeded 但只有 1-2 步,循环相关节点全没执行(无报错)。
根因:循环体链尾加了「回容器」边——容器静默不执行(steps=1、无报错)。循环体链尾不需要回容器边(容器自动维护循环状态)。
排查特征:运行 succeeded 但容器节点没跑——先查链尾有没有多余的边。
坑 2:break 条件运算符 ASCII → 循环不退出/不生效
现象:break 条件写
>=,循环行为异常。
根因:break_conditions 的运算符必须
Unicode(≥ 非 >=——与 if-else 同规则)。
坑 3:loop_variables 初始值用字符串 → 报错
现象:value: '0' 报
Invalid input value。
根治:loop_variables
初始值用数字字面量(value: 0)。
坑 4:定时触发时间格式/时区
现象:"14:30" 报 ValueError「Expected
HH:MM AM/PM」;定时任务按 UTC 跑(比北京时间晚 8 小时)。
根治:时间写 "2:30 PM" 格式 +
显式时区。
坑 5:定时失败静默无记录
现象:定时任务到点没跑,Console 接口不显示定时 run,日志里也查不到。
根因:定时失败仅 worker 日志有记录(静默)。排查要看 worker 日志,Console 看不到。
坑 6:人工输入提交后恢复竞态
现象:API 触发的人工输入,填表提交后流程概率性不继续。
实测:实验 G——恢复执行竞态「Client response stream closed」,3 次 2 成 1 败。1.16.1 平台行为:API 一次性触发恢复不可靠。
对策:交付用 UI/长连接场景(大概率正常);API 触发场景标注风险 + 设计重试/补偿。
四、节点级验证清单
| 验证点 | 怎么验 | 取证 |
|---|---|---|
| 循环执行 | 循环体加「执行标记」(code 计数)确认真的跑了 | 容器内节点执行记录 |
| 硬上限 | 永不满足 break 的场景跑满 loop_count 自动退出 | 输出 loop_count 值 |
| 定时触发 | 配每分钟触发,等 2-3 个 run 确认 | workflow_runs 记录 |
| 子工作流契约 | 失败场景走降级分支 | error_code 分流用例 |
| HITL | 填表提交 → 沿按钮边恢复 | 表单提交 + 下游节点输出 |
五、案例:日报定时生成 + AI 起草人工审批
| 环节 | 工具 | 做法 |
|---|---|---|
| 定时 | 定时触发 | 每天 17:30(PM 格式 + 北京时间时区)触发 |
| 取数 | HTTP/代码 | 拉数据 + 清洗 |
| 起草 | LLM | 生成日报草稿 |
| 人工审批 | 人工输入 | 表单(批准/驳回按钮)→ 沿按钮边走不同分支 |
| 输出 | 答案/通知 | 批准 → 发正式日报;驳回 → 带修改意见重跑 |
核心结论:流程编排五件套的坑集中在「选型」(Iteration vs Loop)和「静默失败」(回边/定时无日志/恢复竞态)——静默失败比报错危险,验证时先确认「流程真的按设计的路径跑了」。
下一篇预告:《输入处理族:参数提取 + 文档提取器》——非结构化输入结构化的两种方式。PE 的防幻觉 instruction("null" vs "" 实测)、文件链路的可靠路径(workflow 模式)、文件类型白名单的双路径陷阱。
- Dify 节点全景图:20 个节点、7 个功能族、3 个通用设计问题
- 内容生成族:LLM 节点怎么设计才稳定——六类 17 条自查清单 + 4 条进阶经验
- 知识接入族:知识检索节点——RAG 质量的三道闸门(分段 / 检索配置 / 清洗)
- 决策路由族:问题分类 + 条件分支——工作流的骨架是分流,分流只能在分类节点出边完成
- 数据操作族:模板转换 / 代码执行 / 变量聚合 / 变量赋值 / 列表操作——数据五件套的选型与契约
- 外部交互族:HTTP / 工具 / Agent 节点 / 外部数据源——与外部世界打交道的四种方式
- 流程编排族:迭代 / 循环 / 定时触发 / 子工作流 / 人工输入——复杂流程组织五件套
- 输入处理族:参数提取 + 文档提取器——非结构化输入结构化的两种方式
- 节点级验证方法论:每个节点怎么验——三层排查 + 验证清单总表