Dify工作流(Workflow)高级编排:实现复杂业务逻辑自动化
在简单的问答机器人之外,真实的业务场景往往需要更复杂的逻辑判断。例如,客户咨询可能需要先区分是“售后问题”还是“售前咨询”,再根据紧急程度分配不同的处理策略,最后生成结构化的报告。Dify 的工作流(Workflow)模式正是为此设计,它允许你像搭积木一样,将大模型、代码执行、条件判断等组件串联起来,实现非线性的自动化处理。
本教程将带你从零构建一个“智能工单处理助手”。该工作流能接收用户输入,自动识别意图,对紧急问题进行标记,并格式化输出给客服人员。通过这个过程,你将掌握条件分支的路由逻辑、代码节点的数据清洗能力以及变量传递的核心技巧。

Dify 工作流编辑界面,显示开始节点和空白画布
1. 创建工作流并定义输入变量
首先,登录 Dify 平台,点击【创建应用】,选择【工作流】类型。进入画布后,第一步是明确这个自动化流程的“入口”需要什么数据。
点击画布左侧的【开始】节点。在右侧配置面板中,我们需要定义两个输入变量:
- 添加一个文本类型变量,命名为
user_input,描述为“用户原始咨询内容”,这是后续所有处理的基础。 - 添加一个下拉选项变量,命名为
priority_level,选项设置为“低”、“中”、“高”,描述为“用户自选紧急程度”。这模拟了前端表单可能传来的结构化数据。
设置完成后,点击【保存】。此时,工作流的起点已经具备了接收结构化数据的能力。
2. 使用 LLM 节点进行意图识别
接下来,我们需要让 AI 理解用户到底想干什么。从左侧组件栏拖拽一个【LLM】节点到画布,并将其与【开始】节点连接。
选中该 LLM 节点,在【提示词】区域输入以下指令:
你是一个智能客服分类助手。请分析用户的输入内容,判断其意图属于以下哪一类:
1. technical_issue(技术问题)
2. billing_question(账单问题)
3. general_inquiry(一般咨询)
用户输入:{{#start.user_input#}}
请只输出分类标签,不要输出其他解释性文字。
注意这里使用了 {{#start.user_input#}} 引用了开始节点的变量。在【输出】设置中,确保输出类型为“文本”。这一步的关键在于让 LLM 输出机器可读的标准化标签,而不是自然语言段落,以便后续节点进行逻辑判断。

LLM 节点配置面板,显示意图分类提示词
3. 配置条件分支实现逻辑路由
现在,工作流需要根据上一步 LLM 输出的标签,走向不同的处理路径。从组件栏拖拽【条件分支】节点,连接到 LLM 节点之后。
在条件分支的配置面板中,我们需要设置三个分支来对应三种意图:
- 分支一:点击【添加条件】,选择变量为
llm.text(即上一步 LLM 的输出),操作符选择“等于”,值填写technical_issue。将此分支重命名为“技术组”。 - 分支二:同样添加条件,变量为
llm.text,操作符“等于”,值填写billing_question。重命名为“财务组”。 - 分支三:点击【否则】,这将捕获所有未匹配上述条件的情况(即
general_inquiry或其他)。重命名为“通用组”。
这种路由机制确保了不同性质的问题能进入专门的处理链路,避免了用同一套提示词处理所有问题的低效。

3. 配置条件分支实现逻辑路由
4. 利用代码节点清洗与增强数据
假设在“技术组”分支中,我们需要提取用户输入中的关键错误代码,并加上时间戳。这时,通用的 LLM 可能不够精确或成本过高,【代码】节点就派上了用场。
在“技术组”分支后连接一个【代码】节点,语言选择 Python。在代码编辑区输入:
def main(user_input: str, priority: str) -> dict:
import datetime
# 简单模拟提取数字作为错误码,实际场景可用正则
error_code = ''.join(filter(str.isdigit, user_input)) or "NO_CODE"
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
return {
"processed_content": f"[紧急度:{priority}] [时间:{timestamp}] [错误码:{error_code}] {user_input}",
"status": "flagged"
}
在下方【输入参数】中,将 user_input 映射为 {{#start.user_input#}},将 priority 映射为 {{#start.priority_level#}}。代码节点的输出将是一个包含处理后字符串和状态的对象。这一步展示了如何将非结构化文本转化为带有业务元数据的结构化信息。

条件分支节点分出三条路径,其中一条连接至代码节点
5. 合并分支并格式化最终输出
无论走哪个分支,最终都需要汇聚到一个统一的输出格式,以便前端展示或存入数据库。拖拽一个【模板转换】节点(或使用另一个 LLM 节点进行总结),将所有分支的末端连接到此节点。
由于 Dify 目前的工作流合并逻辑要求所有上游路径都连接到同一节点,你需要将“财务组”和“通用组”也连接到这个最终的【LLM】或【结束】节点。如果某些分支不需要特殊处理,可以直接连接。
在这里,我们使用一个【LLM】节点作为最终汇总器。提示词如下:
请根据以下信息生成一份简洁的工单摘要:
原始问题:{{#start.user_input#}}
紧急程度:{{#start.priority_level#}}
分类结果:{{#llm.text#}}
处理详情:{{#code.result#}} (如果是技术组则有值,否则为空)
请用Markdown格式输出,包含:
- **工单类型**
- **建议回复话术**
- **内部备注**
注意:如果某些分支没有经过代码节点,变量引用可能会为空。在实际高阶用法中,可以使用【参数提取】或更复杂的条件判断来处理空值,但在本示例中,LLM 通常能很好地处理缺失上下文。
最后,连接【结束】节点,将上述 LLM 的输出设置为工作流的最终输出变量。
6. 运行测试与验证
点击右上角的【运行】按钮。在弹出的测试窗口中:
- 在
user_input中输入:“我的服务器报错 502,无法访问后台。” - 在
priority_level中选择:“高”。 - 点击【运行】。
观察右侧的执行日志。你应该能看到:
- LLM 节点输出了
technical_issue。 - 条件分支进入了“技术组”路径。
- 代码节点成功提取了 “502” 并加上了时间戳。
- 最终输出了一份包含错误码和高紧急度标记的结构化工单。
尝试更换输入为“我想了解一下企业版的价格”,并选择“低”优先级。此时流程应走向“财务组”或“通用组”,最终输出侧重于销售引导的话术,且没有技术错误码。

运行测试面板显示成功的执行日志和最终输出
通过这个工作流,你不仅实现了一个简单的问答,而是构建了一个具备判断、数据处理和路由能力的微型业务系统。你可以将此工作流发布为 API,集成到你的 CRM 或客服系统中,实现真正的前后端自动化联动。记得定期保存版本,以便在逻辑调整时能够回溯。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









