← 返回文章列表

流程编排族:迭代 / 循环 / 定时触发 / 子工作流 / 人工输入——复杂流程组织五件套

基于 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 模式)、文件类型白名单的双路径陷阱。

这些 AI 应用能力,如何交付到真实业务场景?看看方案与服务 →

联系我

邮箱contact@fishsun.cn

点击邮箱直接写信 · 扫码加微信沟通

微信

微信二维码

扫码加微信 · 备注「门户」更快通过