跳转至

第七章:工作流

工作流是 Dify 最强大的功能,通过可视化编排实现复杂业务逻辑。本章详细介绍工作流的使用。

工作流基础

什么是工作流?

工作流是一系列处理节点的有序组合,每个节点完成特定任务:

输入 → 处理1 → 处理2 → 处理3 → 输出

工作流类型

类型 说明
Chatflow 支持多轮对话,有对话历史
Workflow 单次执行,无对话历史

创建工作流

  1. 点击 创建应用 → 工作流
  2. 选择类型(Chatflow 或 Workflow)
  3. 进入可视化编辑器

节点详解

开始节点

定义工作流的输入变量:

变量配置:
  - 变量名: question
    类型: 文本
    标签: 用户问题
    必填: 

  - 变量名: user_id
    类型: 文本
    标签: 用户ID
    必填: 

LLM 节点

调用大语言模型:

配置:
  模型: GPT-3.5-turbo
  系统提示词: |
    你是一个专业的客服助手。
  用户消息: {{question}}
  输出变量: llm_response

高级设置:

温度: 0.7
Top P: 1
最大 Token: 2000
上下文: 可选择保留对话历史

知识检索节点

从知识库检索相关内容:

配置:
  知识库: [产品手册, FAQ]
  查询内容: {{question}}
  返回数量: 3
  输出变量: knowledge_result

条件分支节点

根据条件走不同路径:

条件配置:
  - 条件: {{intent}} == "产品咨询"
    分支: 产品咨询分支
  - 条件: {{intent}} == "售后问题"
    分支: 售后分支
  - 默认: 通用回答分支

支持的条件运算:

运算符 说明
== 等于
!= 不等于
contains 包含
not contains 不包含
is empty 为空
is not empty 不为空
>, <, >=, <= 数值比较

代码执行节点

执行 Python 或 JavaScript 代码:

Python 示例

def main(args):
    # 获取输入变量
    text = args["text"]

    # 处理逻辑
    words = text.split()
    word_count = len(words)

    # 返回结果
    return {
        "word_count": word_count,
        "words": words
    }

JavaScript 示例

function main(args) {
    const text = args.text;
    const words = text.split(' ');

    return {
        word_count: words.length,
        words: words
    };
}

HTTP 请求节点

调用外部 API:

配置:
  方法: POST
  URL: https://api.example.com/v1/chat
  Headers:
    Content-Type: application/json
    Authorization: Bearer {{api_key}}
  Body:
    {
      "message": "{{question}}",
      "user_id": "{{user_id}}"
    }
  输出变量: api_response

参数提取节点

从文本中提取结构化数据:

配置:
  输入文本: {{llm_response}}
  提取字段:
    - 字段名: name
      类型: string
      描述: 用户姓名
    - 字段名: phone
      类型: string
      描述: 电话号码

变量聚合节点

合并多个分支的变量:

配置:
  输入变量:
    - 分支1.output
    - 分支2.output
  聚合方式: 合并为数组
  输出变量: merged_result

迭代节点

循环处理数组:

配置:
  输入数组: {{items}}
  迭代变量: item
  子流程: [处理每个item]
  输出变量: iteration_result

工具节点

使用内置工具:

工具 功能
网页搜索 搜索互联网信息
天气查询 获取天气信息
当前时间 获取系统时间
Wikipedia 查询维基百科
计算器 数学计算

结束节点

输出工作流结果:

配置:
  输出变量:
    - 变量名: answer
      : {{llm_response}}
    - 变量名: sources
      : {{knowledge_result}}

实战案例

案例1:智能客服

开始(question)
[意图识别 LLM]
[条件分支]
    ├── 产品咨询 → [知识检索] → [生成回答 LLM]
    ├── 售后问题 → [创建工单 HTTP] → [回复用户 LLM]
    └── 其他 → [通用回答 LLM]
结束(answer)

意图识别提示词

请分析用户问题的意图,返回以下之一:
- 产品咨询
- 售后问题
- 其他

用户问题:{{question}}

只返回意图类型,不要添加其他内容。

案例2:内容生成工作流

开始(topic, style, length)
[生成大纲 LLM]
[生成内容 LLM]
[内容审核 LLM]
[条件分支]
    ├── 通过 → [格式化输出]
    └── 不通过 → [修改建议] → 返回[生成内容]
结束(content)

案例3:数据分析工作流

开始(data_url)
[获取数据 HTTP]
[数据预处理 代码]
[数据分析 LLM]
[生成报告 LLM]
结束(report)

数据预处理代码

import json

def main(args):
    data = args["data"]

    # 统计分析
    total = len(data)
    avg_value = sum(d["value"] for d in data) / total

    # 异常检测
    anomalies = [d for d in data if d["value"] > avg_value * 2]

    return {
        "total": total,
        "average": avg_value,
        "anomalies": anomalies,
        "anomaly_count": len(anomalies)
    }

调试与测试

运行测试

  1. 点击右上角「运行」按钮
  2. 输入测试变量
  3. 查看每个节点的执行结果
  4. 检查最终输出

查看日志

日志信息:
  - 执行时间
  - 每个节点的输入输出
  - 错误信息
  - Token 消耗

断点调试

在节点上设置断点,运行到该节点时暂停:

  1. 右键点击节点
  2. 选择「设置断点」
  3. 运行时会在该节点暂停
  4. 检查变量状态后继续

性能优化

1. 减少节点数量

合并相似功能,减少不必要的节点。

2. 并行执行

独立节点可以并行执行:

    ┌── [节点A] ──┐
开始 ├── [节点B] ──┼── 结束
    └── [节点C] ──┘

3. 缓存结果

对于重复计算,使用变量存储结果。

4. 优化提示词

简洁的提示词可以减少 Token 消耗和响应时间。

错误处理

错误重试

配置:
  重试次数: 3
  重试间隔: 1000ms
  重试条件: 网络错误、超时

错误分支

配置:
  错误处理: 跳转到错误处理分支
  错误分支:
    - 记录错误日志
    - 返回友好提示

超时设置

配置:
  节点超时: 30s
  工作流超时: 5min

小结

本章介绍了 Dify 工作流的完整功能。通过可视化编排,你可以构建复杂的 AI 应用逻辑。下一章,我们将学习如何通过 API 集成 Dify 应用。