# 工作流

# 基本概念

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

工作流分为两种类型:

  • 对话流(Chatflow):面向对话类情景,包括问答服务、语义搜索、以及其他需要在构建响应时进行多步逻辑的对话式应用程序。
  • 工作流(Workflow):面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。

为解决自然语言输入中用户意图识别的复杂性,Chatflow 提供了问题理解类节点。相对于 Workflow 增加了 Chatbot 特性的支持,如:对话历史(Memory)、标注回复、Answer 节点等。

为解决自动化和批处理情景中复杂业务逻辑,工作流提供了丰富的逻辑节点,如代码节点、IF/ELSE 节点、模板转换、迭代节点等,除此之外也将提供定时和事件触发的能力,方便构建自动化流程。

# 常见案例

  • 客户服务

通过将 LLM 集成到你的客户服务系统中,你可以自动化回答常见问题,减轻支持团队的工作负担。 LLM 可以理解客户查询的上下文和意图,并实时生成有帮助且准确的回答。

  • 内容生成

无论你需要创建博客文章、产品描述还是营销材料,LLM 都可以通过生成高质量内容来帮助你。只需提供一个大纲或主题,LLM将利用其广泛的知识库来制作引人入胜、信息丰富且结构良好的内容。

  • 任务自动化

可以与各种任务管理系统集成,如 Trello、Slack、Lark、以自动化项目和任务管理。通过使用自然语言处理,LLM 可以理解和解释用户输入,创建任务,更新状态和分配优先级,无需手动干预。

  • 数据分析和报告

可以用于分析大型知识库并生成报告或摘要。通过提供相关信息给 LLM,它可以识别趋势、模式和洞察力,将原始数据转化为可操作的智能。对于希望做出数据驱动决策的企业来说,这尤其有价值。

  • 邮件自动化处理

LLM 可以用于起草电子邮件、社交媒体更新和其他形式的沟通。通过提供简要的大纲或关键要点,LLM 可以生成一个结构良好、连贯且与上下文相关的信息。这样可以节省大量时间,并确保你的回复清晰和专业。

# 如何开始

  • 从一个空白的工作流开始构建或者使用系统模板帮助你开始;
  • 熟悉基础操作,包括在画布上创建节点、连接和配置节点、调试工作流、查看运行历史等;
  • 保存并发布一个工作流;
  • 在已发布应用中运行或者通过 API 调用工作流;

# 关键概念

# 节点

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

工作流的核心节点请参考工具章节


# 变量

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


# 对话流(Chatflow)

适用场景:

面向对话类情景,包括客户服务、语义搜索、以及其他需要在构建响应时进行多步逻辑的对话式应用程序。该类型应用的特点在于支持对生成的结果进行多轮对话交互,调整生成的结果。

常见的交互路径:给出指令 → 生成内容 → 就内容进行多次讨论 → 重新生成结果 → 结束

Chatflow 入口

# 工作流(Workflow)

适用场景:

面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。该类型应用无法对生成的结果进行多轮对话交互。

常见的交互路径:给出指令 → 生成内容 → 结束

Workflow 入口

应用类型差异

  1. End 节点属于 Workflow 的结束节点,仅可在流程结束时选择。
  2. Answer 节点属于 Chatflow ,用于流式输出文本内容,并支持在流程中间步骤输出。
  3. Chatflow 内置聊天记忆(Memory),用于存储和传递多轮对话的历史消息,可在LLM 、问题分类等节点内开启,Workflow 无 Memory 相关配置,无法开启。
  4. Chatflow 的开始节点内置变量包括:sys.querysys.filessys.conversation_idsys.user_id。Workflow 的开始节点内置变量包括:sys.filessys.user_id ,详见变量。

# 变量

Workflow 和 Chatflow 类型应用由独立节点相构成。大部分节点设有输入和输出项,但每个节点的输入信息不一致,各个节点所输出的答复也不尽相同。

如何用一种固定的符号指代动态变化的内容? 变量作为一种动态数据容器,能够存储和传递不固定的内容,在不同的节点内被相互引用,实现信息在节点间的灵活通信。

# 变量类型

# 系统变量

系统变量指的是在 Chatflow / Workflow 应用内预设的系统级参数,可以被其它节点全局读取。系统级变量均以 sys 开头。

Workflow

Workflow 类型应用提供以下系统变量:

变量名称 数据类型 说明 备注

sys.files

[LEGACY]

Array[File] 文件参数,存储用户初始使用应用时上传的图片 图片上传功能需在应用编排页右上角的 "功能" 处开启
sys.user_id String 用户 ID,每个用户在使用工作流应用时,系统会自动向用户分配唯一标识符,用以区分不同的对话用户
sys.app_id String 应用 ID,系统会向每个 Workflow 应用分配一个唯一的标识符,用以区分不同的应用,并通过此参数记录当前应用的基本信息 面向具备开发能力的用户,通过此参数区分并定位不同的 Workflow 应用
sys.workflow_id String Workflow ID,用于记录当前 Workflow 应用内所包含的所有节点信息 面向具备开发能力的用户,可以通过此参数追踪并记录 Workflow 内的包含节点信息
sys.workflow_run_id String Workflow 应用运行 ID,用于记录 Workflow 应用中的运行情况 面向具备开发能力的用户,可以通过此参数追踪应用的历次运行情况

Chatflow

Chatflow 类型应用提供以下系统变量:

变量名称 数据类型 说明 备注
sys.query String 用户在对话框中初始输入的内容
sys.files Array[File] 用户在对话框内上传的图片 图片上传功能需在应用编排页右上角的 "功能" 处开启
sys.dialogue_count Number

用户在与 Chatflow 类型应用交互时的对话轮数。每轮对话后自动计数增加 1,可以和 if-else 节点搭配出丰富的分支逻辑。

例如到第 X 轮对话时,回顾历史对话并给出分析

sys.conversation_id String 对话框交互会话的唯一标识符,将所有相关的消息分组到同一个对话中,确保 LLM 针对同一个主题和上下文持续对话
sys.user_id String 分配给每个应用用户的唯一标识符,用以区分不同的对话用户

注意:Service API 不共享 WebApp 创建的对话。这意味着具有相同 ID 的用户在 API 和 WebApp 界面之间会有独立的对话历史。
sys.app_id String 应用 ID,系统会向每个 Workflow 应用分配一个唯一的标识符,用以区分不同的应用,并通过此参数记录当前应用的基本信息 面向具备开发能力的用户,通过此参数区分并定位不同的 Workflow 应用
sys.workflow_id String Workflow ID,用于记录当前 Workflow 应用内所包含的所有节点信息 面向具备开发能力的用户,可以通过此参数追踪并记录 Workflow 内的包含节点信息
sys.workflow_run_id String Workflow 应用运行 ID,用于记录 Workflow 应用中的运行情况 面向具备开发能力的用户,可以通过此参数追踪应用的历次运行情况

Chatflow 类型应用系统变量

# 环境变量

环境变量用于保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的 API 密钥、数据库密码等。它们被存储在工作流程中,而不是代码中,以便在不同环境中共享。

支持以下三种数据类型:

  • String 字符串
  • Number 数字
  • Secret 密钥

环境变量拥有以下特性:

  • 环境变量可在大部分节点内全局引用;
  • 环境变量命名不可重复;
  • 环境变量为只读变量,不可写入;

# 会话变量

会话变量面向多轮对话场景,而 Workflow 类型应用的交互是线性而独立的,不存在多次对话交互的情况,因此会话变量仅适用于 Chatflow 类型应用。

会话变量允许应用开发者在同一个 Chatflow 会话内,指定需要被临时存储的特定信息,并确保在当前工作流内的多轮对话内都能够引用该信息,如上下文、上传至对话框的文件(即将上线)、 用户在对话过程中所输入的偏好信息等。好比为 LLM 提供一个可以被随时查看的"备忘录",避免因 LLM 记忆出错而导致的信息偏差。

例如你可以将用户在首轮对话时输入的语言偏好存储至会话变量中,LLM 在回答时将参考会话变量中的信息,并在后续的对话中使用指定的语言回复用户。

会话变量支持以下六种数据类型:

  • String 字符串
  • Number 数值
  • Object 对象
  • Array[string] 字符串数组
  • Array[number] 数值数组
  • Array[object] 对象数组

会话变量具有以下特性:

  • 会话变量可在大部分节点内全局引用;
  • 会话变量的写入需要使用变量赋值节点;
  • 会话变量为可读写变量;

关于如何将会话变量与变量赋值节点配合使用,请参考变量赋值节点说明。

# 注意事项

  • 为避免变量名重复,节点命名不可重复。

# 快捷键

Chatflow / Workflow 应用编排页支持以下快捷键,帮助你提升编排节点的效率。

Windows macOS 说明
Ctrl + C Command + C 复制节点
Ctrl + V Command + V 粘贴节点
Ctrl + D Command + D 复制并新建节点
Ctrl + O Command + O 整理节点
Ctrl + Z Command + Z 撤销
Ctrl + Y Command + Y 重做
Ctrl + Shift + Z Command + Shift + Z 重做
Ctrl + 1 Command + 1 画布适合视图
Ctrl + (-) Command + (-) 画布缩小
Ctrl + (=) Command + (=) 画布放大
Shift + 1 Shift + 1 将画布视图重置为 100%
Shift + 5 Shift + 5 将画布缩放至 50%
H H 画布切换至手动模式
V V 画布切换至指针模式
Delete/Backspace Delete/Backspace 删除选定节点
Alt + R Option + R 工作流开始运行

# 编排节点

Chatflow 和 Workflow 类型应用内的节点均可以通过可视化拖拉拽的形式进行编排,支持串行并行两种编排设计模式。

上图为串行节点流、下图为并行节点流

# 串行设计

该结构要求节点按照预设顺序依次执行,每个节点需等待前一个节点完成并输出结果后才能开始工作,有助于确保任务按照逻辑顺序执行。

例如,在一个采用串行结构设计的"小说生成" AI 应用内,用户输入小说风格、节奏和角色后,LLM 按照顺序补全小说大纲、小说剧情和结尾;每个节点都基于前一个节点的输出结果展开工作,确保小说的风格一致性。

# 设计串行结构

点击两个节点中间连线的 + 号即可在中间添加一个串行节点;按照顺序将节点依次串线连接,最后将线收拢至 "结束"节点(Workflow)/ "直接回复"节点(Chatflow)完成设计。

串行结构

# 查看串行结构应用日志

串行结构应用内的日志将按照顺序展示各个节点的运行情况。点击对话框右上角的 「查看日志-追踪」,查看工作流完整运行过程各节点的输入 / 输出、Token 消耗、运行时长等。

串行结构应用日志

# 并行设计

该设计模式允许多个节点在同一时间内共同执行,前置节点可以同时触发位于并行结构内的多个节点。并行结构内的节点不存在依赖关系,能够同时执行任务,更好地提升节点的任务执行效率。

例如,在某个并行设计的翻译工作流应用内,用户输入源文本触发工作流后,位于并行结构内的节点将共同收到前置节点的流转指令,同时开展多语言的翻译任务,缩短任务的处理耗时。

并行设计

# 新建并行结构

你可以参考以下四种方式,通过新建节点或拖拽的方式创建并行结构。

方式 1

将鼠标 Hover 至某个节点,显示 + 按钮,支持新建多个节点,创建后自动形成并行结构。

新建并行结构方式1

方式 2

拖拽节点末尾的 + 按钮,拉出连线形成并行结构。

新建并行结构方式2

方式 3

如果画布存在多个节点,通过可视化拖拽的方式组成并行结构。

新建并行结构方式3

方式 4

除了在画布中通过直接添加并行节点或可视化拖拽方式组成并行结构,你也可以在节点右侧清单的"下一步"中添加并行节点,自动生成并行结构。

新建并行结构方式4

Tips:

  • 画布上的"线"可以被删除;
  • 并行结构的下游节点可以是任意节点;
  • 在 Workflow 类型应用内需确定唯一的 "end" 节点;
  • Chatflow 类型应用支持添加多个 "直接回复" 节点,该类型应用内的所有并行结构在末尾处均需要配置 "直接回复" 节点才能正常输出各个并行结构里的内容;
  • 所有的并行结构都会同时运行;并行结构内的节点处理完任务后即输出结果,输出结果时不存在顺序关系。并行结构越简单,输出结果的速度越快。

Chatflow 应用中的并行结构示例

# 设计并行结构应用

下文将展示四种常见的并行节点设计思路。

  1. 普通并行

普通并行指的是 开始 | 并行结构 | 结束 三层关系也是并行结构的最小单元。这种结构较为直观,用户输入内容后,工作流能同时执行多条任务。

并行分支的上限数为 10 个。

普通并行结构示例

  1. 嵌套并行

嵌套并行指的是 开始 | 多个并行结构 | 结束多层关系,它适用于内部较为复杂的工作流,例如需要在某个节点内请求外部 API,将返回的结果同时交给下游节点处理。

一个工作流内最多支持 3 层嵌套关系。

嵌套并行:2 层嵌套关系

  1. 条件分支 + 并行

并行结构也可以和条件分支共同使用。

条件分支 + 并行

  1. 迭代分支 + 并行

迭代分支内同样支持编排并行结构,加速迭代内各节点的执行效率。

迭代分支和并行结构结合示例

# 查看并行结构应用日志

包含并行结构的应用的运行日志支持以树状结构进行展示,你可以折叠并行节点组以更好地查看各个节点的运行日志。

并行结构应用日志界面