Skip to content

AI 工作流应用开发



工作流 Workflow

工作流程是为了实现目标而按特定顺序完成的一系列结构化任务或步骤。它概述了从开始到结束的流程,有助于确保效率和清晰度。工作流程可简可繁,并且可用于各种环境,包括商业、IT 甚至个人组织。


工作流的核心要素

  • 开始 结束
  • 状态与变量
  • 条件分支 循环迭代
  • 内部工具 外部工具 工作流工具


Dify 工作流

\

工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了 LLM 应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。


Dify 工作流的核心要素

  • 基本工作流节点:开始 结束 对话回复
  • 工具节点:类似于函数,提供输入输出与执行步骤,调用封装工具
  • 变量:提供多种类型的变量,传递数据
  • 逻辑编排节点:条件 迭代 循环

工作流节点

节点是工作流的关键构成,通过连接不同功能的节点,执行工作流的一系列操作。


变量

变量用于串联工作流内前后节点的输入与输出,实现流程中的复杂处理逻辑,包含系统变量、环境变量和会话变量。详细说明请参考 变量。


变量类型

  • 系统变量 sys.files sys.user_id sys.workflow_run_id sys.conversation_id
  • 环境变量 环境变量用于保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的 API 密钥、数据库密码等。它们被存储在工作流程中,而不是代码中,以便在不同环境中共享。
  • 会话变量 会话变量允许应用开发者在同一个 Chatflow 会话内,指定需要被临时存储的特定信息,并确保在当前工作流内的多轮对话内都能够引用该信息

开始节点

“开始” 节点是每个工作流应用(Chatflow / Workflow)必备的预设节点,为后续工作流节点以及应用的正常流转提供必要的初始信息,例如应用使用者所输入的内容、以及上传的文件等。


工作流中间节点

  • 所有变量的引用
  • 节点配置
  • 面向下游的输出变量


大模型节点

调用大语言模型的能力,处理用户在上游节点中输入的信息(自然语言、上传的文件或图片),给出有效的回应信息。


知识检索节点

从知识库中检索与用户问题相关的文本内容,可作为下游 LLM 节点的上下文来使用。


智能体节点

Agent 节点是 Dify Chatflow/Workflow 中用于实现自主工具调用的组件。它通过集成不同的 Agent 推理策略,使大语言模型能够在运行时动态选择并执行工具,从而实现多步推理。


工具节点


HTTP 请求节点

允许通过 HTTP 协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部服务的互联互通。


代码节点

代码节点支持运行 Python / NodeJS 代码以在工作流程中执行数据转换。它可以简化你的工作流程,适用于 Arithmetic、JSON transform、文本处理等情景。 该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的 Python 或 Javascript 脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码:


逻辑控制节点

  • 条件 if else if elif else
  • 迭代 简单的循环 for
  • 循环 复杂的循环 while

条件控制节点


迭代控制节点

\

  • 被迭代变量 for item in items
  • 迭代变量 for item in items

循环节点


结束节点

定义一个工作流程结束的最终输出内容。每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果。结束节点为流程终止节点,后面无法再添加其他节点,工作流应用中只有运行到结束节点才会输出执行结果。若流程中出现条件分叉,则需要定义多个结束节点。结束节点需要声明一个或多个输出变量,声明时可以引用任意上游节点的输出变量。


异常控制节点

\

异常处理机制提供多样化的节点错误处理策略,能够在发生局部节点错误时抛出故障信息而不中断主流程。你可以设置出现异常时重新执行节点,或通过备用路径继续任务。为关键节点添加异常处理机制将极大地增强应用整体的灵活性与稳健性。


工作流工具

  • 非对话的工作流可以发布为工具
  • 其他工作流可以工具节点的方式调用工作流


工作流实战


测试用例批量生成工作流


流程编排

  • 基础流程编排
    • 用户输入需求
    • 利用大模型拆解功能点与测试点
    • 迭代功能点,针对每个功能点生成测试用例
    • 合并测试用例
  • 高级流程编排-递归
    • 用户输入需求
    • 分层迭代功能点
      • 利用大模型拆解功能点与测试点
      • 分层迭代功能点
    • 针对每个功能点生成测试用例
    • 合并测试用例

{
  "model": "qwen3",
  "stream": false,
  "format": {
    "type": "object",
    "properties": {
      "testcases": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "package": {
              "type": "string",
              "description": "父级别模块"
            },
            "module": {
              "type": "string",
              "description": "当前模块"
            },
            "testcase": {
              "type": "string",
              "description": "当前测试点"
            }
          },
          "required": ["module", "testcase"],
          "additionalProperties": false
        }
      }
    },
    "required": ["testcases"],
    "additionalProperties": false
  },
  "options": {
    "temperature": 0.7
  },
  "messages": [
    {
      "role": "system",
      "content": "你是一名软件测试工程师,你擅长测试用例设计。你可以分析用户提供的需求,并拆分模块与对应的测试点。\n\n/no_think"
    },
    {
      "role": "user",
      "content": "百度搜索测试"
    },
    {
      "role": "assistant",
      "content": "{\n\n  \"testcases\": [\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"输入关键词进行搜索\",\n      \"package\": \"搜索结果是否正确显示\"\n    },\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"输入空值进行搜索\",\n      \"package\": \"系统是否提示错误信息\"\n    },\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"输入特殊字符进行搜索\",\n      \"package\": \"系统是否能处理特殊字符\"\n    },\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"搜索结果排序\",\n      \"package\": \"结果是否按照相关性排序\"\n    },\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"搜索结果分页\",\n      \"package\": \"分页是否正常工作,是否可以跳转到其他页\"\n    },\n    {\n      \"module\": \"搜索功能\",\n      \"testcase\": \"搜索结果加载速度\",\n      \"package\": \"搜索结果是否在合理时间内加载完成\"\n    }\n  ]\n}\n"
    },
    {
      "role": "user",
      "content": "上下文是{'module': '搜索功能', 'testcase': '输入空值进行搜索', 'package': '系统是否提示错误信息'}\n\n针对当前的模块,补充更多测试点"
    }
  ]
}

每个迭代的响应

{
  "model": "qwen3",
  "created_at": "2025-05-25T13:02:28.510102Z",
  "message": {
    "role": "assistant",
    "content": "{\"testcases\": [{\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"系统是否提示错误信息\"}, {\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"错误信息是否友好易懂\"}, {\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"错误提示是否包含解决方案建议\"}, {\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"错误提示是否包含错误代码\"}, {\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"错误提示是否可关闭或隐藏\"}, {\"module\": \"搜索功能\", \"testcase\": \"输入空值进行搜索\", \"package\": \"错误提示是否影响其他功能使用\"}]}\n\n"
  },
  "done_reason": "stop",
  "done": true,
  "total_duration": 12831881208,
  "load_duration": 31461125,
  "prompt_eval_count": 324,
  "prompt_eval_duration": 139621083,
  "eval_count": 182,
  "eval_duration": 12656601167
}