公众号:dify实验室

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify工作流案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

定义

对数组中的元素依次执行相同的操作步骤,直至输出所有结果,可以理解为任务批处理器。迭代节点通常配合数组变量使用。

例如在长文翻译迭代节点内,如果将所有内容输入至 LLM 节点,有可能会达到单次对话限制。上游节点可以先将长文拆分为了多个片段,配合迭代节点对各个片段执行批量翻译,以避免达到 LLM 单次对话的消息限制。


功能简介

使用迭代的条件是确保输入值已格式化为列表对象;迭代节点将依次处理迭代开始节点数组变量内的所有元素,每个元素遵循相同的处理步骤,每轮处理被称为一个迭代,最终输出处理结果。

迭代节点的结构通常包含输入变量迭代工作流输出变量三个功能单元。

输入变量: 仅接受 Array 数组变量类型数据。如果你不了解什么是数组变量,请阅读 扩展阅读:数组。

迭代工作流: 你可以在迭代节点中使用多个工作流节点,编排不同的任务步骤。

输出变量: 仅支持输出数组变量 Array[List]。如果你想要输出其它变量格式,请阅读 扩展阅读:如何将数组转换为文本。

图片

迭代节点原理图

场景

示例1:长文章迭代生成器

图片

长故事生成器

  1. 在 开始节点 内添加输入故事标题、大纲变量,提示用户手动输入初始信息

  2. 使用 LLM 节点 基于用户输入的故事标题和大纲,让 LLM 开始编写内容

  3. 使用 参数提取节点 将 LLM 输出的完整内容转换成数组格式

  4. 通过 迭代节点 包裹的 LLM 节点 循环多次生成各章节内容

  5. 将 直接回复 节点添加在迭代节点内部,实现在每轮迭代生成之后流式输出

具体配置步骤

在 开始节点 配置故事标题(title)和大纲(outline);

图片

开始节点配置

选择 LLM 节点 基于用户输入的故事标题和大纲,让 LLM 开始编写文本;

图片

模板节点

  1. 选择 参数提取节点,将故事文本转换成为数组(Array)结构。提取参数为 sections ,参数类型为 Array[Object]

图片

参数提取

参数提取效果受模型推理能力和指令影响,使用推理能力更强的模型,在指令内增加示例可以提高参数提取的效果。

  1. 将数组格式的故事大纲作为迭代节点的输入,在迭代节点内部使用 LLM 节点 进行处理

图片

配置迭代节点

在 LLM 节点内配置输入变量 GenerateOverallOutline/output 和 Iteration/item

图片

配置 LLM 节点

迭代的内置变量:items[object] 和 index[number]

items[object] 代表以每轮迭代的输入条目;

index[number] 代表当前迭代的轮次;

  1. 在迭代节点内部配置 直接回复节点 ,可以实现在每轮迭代生成之后流式输出。

图片

配置 Answer 节点

  1. 完整调试和预览

图片

按故事章节多轮迭代生成

示例 2:长文章迭代生成器(另一种编排方式)

图片

  • 在 开始节点 内输入故事标题和大纲

  • 使用 LLM 节点 生成文章小标题,以及小标题对应的内容

  • 使用 代码节点 将完整内容转换成数组格式

  • 通过 迭代节点 包裹的 LLM 节点 循环多次生成各章节内容

  • 使用 模板转换 节点将迭代节点输出的字符串数组转换为字符串

  • 在最后添加 直接回复节点 将转换后的字符串直接输出


高级功能

并行模式

迭代节点支持并行模式,开启后将有效提升迭代节点的整体运行效率。

图片

下图是迭代节点开启或关闭并行模式的运行效果对比。

图片

顺序与并行执行原理图

并行模式下的最高并行轮数为 10,这意味着单位时间内最多可以同时运行 10 个任务。如果需要处理超过 10 个任务,前 10 个元素将率先同时运行,前排任务处理完成后将继续处理剩余任务。

开启并行模式后,不再建议在迭代节点内放置直接回答、变量赋值和工具节点。此举可能会造成异常情况。

  • 错误响应方法

迭代节点通常需要处理大量任务,有时会在处理某个元素时发生错误。为了避免某个元素异常而中断所有任务,你可以在错误响应方法中设置异常的应对方法:

  • 错误时终止。如果发现异常输出,终止迭代节点,输出错误信息。

  • 忽略错误并继续。忽略异常信息,继续处理剩余元素。输出的信息中包含正确信息,异常信息为空值。

  • 移除错误输出。忽略异常信息,继续处理剩余元素。输出的信息中仅包含正确信息。

迭代节点的输入变量与输出变量相对应。例如输入变量为 [1,2,3] ,则输出变量同样为 [result-1, result-2, result-3]。

如果选择了忽略错误并继续, 异常情况的输出值为 null 值,例如 [result-1, null, result-3];

如果选择了移除错误输出, 将不会输出异常变量,例如 [result-1, result-3]。

扩展阅读

什么是数组变量?


如何生成数组变量?

你可以通过以下节点生成数组变量,用以充当迭代节点的输入变量:

code 节点输出 array 参数提取节点输出 array

  • 代码节点

    图片

  • 参数提取

    图片

  • 知识库检索

  • 迭代

  • 工具

  • HTTP 请求


如何将数组转换为文本

迭代节点的输出变量为数组格式,无法直接输出 String 字符串内容。你可以使用一个简单的步骤将数组转换回文本。

使用代码节点转换

图片

代码节点转换

代码示例:


def main(articleSections: list):    data = articleSections    return {        "result": "\n".join(data)    }

使用模板节点转换

图片

模板节点转换

代码示例:

{{ articleSections | join("\n") }}

dify实验室

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify工作流案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

18篇原创内容

公众号

原文链接:https://docs.dify.ai/zh-hans/guides/workflow/node/iteration

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐