导读:如果基础节点是"乐高积木",那迭代和循环就是"流水线"。有了它们,智能体才能批量处理数据、重复执行任务。本文带你深入了解这些让智能体变得更强大的高级能力。

在这里插入图片描述

一、为什么需要高级特性?

1.1 基础节点的局限

假设你是一个电商客服,用户让你帮忙查询 100 个订单的状态:

用户需求

查询100个订单

用基础节点怎么做

手动添加100个查询节点

不可能完成

问题

  • 基础节点一次只能处理一个任务
  • 无法批量处理
  • 无法重复执行

1.2 高级特性来解决

用户需求

查询100个订单

用迭代节点

一个迭代节点搞定

自动遍历所有订单

高级特性的价值

特性 解决的问题 典型场景
迭代节点 批量处理 批量查询、批量分析
循环节点 重复执行 等待任务、重试机制
嵌套结构 复杂逻辑 多层处理流程

二、迭代节点:批量处理神器

2.1 什么是迭代?

生活场景:想象你在整理一叠文件,每份文件都要盖章。你不会一份一份单独处理,而是:

  1. 拿起第一份 → 盖章 → 放一边
  2. 拿起第二份 → 盖章 → 放一边
  3. 拿起第三份 → 盖章 → 放一边
  4. … 直到全部盖完

迭代节点就是这个"盖章流程":对数组中的每个元素,执行相同的操作。

2.2 迭代节点的工作原理

输入数组

迭代节点

第1次: 处理元素1

第2次: 处理元素2

第3次: 处理元素3

...继续...

第N次: 处理元素N

收集所有结果

输出结果数组

2.3 迭代节点的结构

迭代节点容器

内部区域

IterationItem: 当前元素

子节点1: 处理逻辑

子节点2: 其他处理

节点头部: 显示迭代信息

输出: 结果数组

输入数组

给下游节点使用

IterationItem 是什么?

它是迭代节点内部的"临时变量",每次迭代都会更新:

变量 含义 示例值
item 当前处理的元素 第1个订单、第2个订单…
index 当前索引 0, 1, 2, 3…

2.4 一个完整的迭代流程

假设要批量查询 3 个订单的状态:

结果收集 查询节点 IterationItem 迭代节点 用户 结果收集 查询节点 IterationItem 迭代节点 用户 订单列表: 订单1 订单2 订单3 第1次 item是订单1 index是0 查询订单1 结果1 已发货 第2次 item是订单2 index是1 查询订单2 结果2 配送中 第3次 item是订单3 index是2 查询订单3 结果3 待发货 返回所有结果

2.5 迭代节点的配置

迭代节点配置

输入设置

输入数组来源

分隔符设置

迭代变量名

内部处理

添加子节点

定义处理逻辑

输出设置

输出变量名

输出项定义

执行选项

是否并行

最大并行数


三、循环节点:重复执行利器

3.1 什么是循环?

生活场景:你在等快递,每隔 10 分钟查一次物流,直到显示"已签收"。

  • 你不知道要查多少次
  • 但知道什么时候该停(已签收)
  • 没停就一直查下去

循环节点就是这个"等待过程":重复执行某段流程,直到满足终止条件。

3.2 循环节点的工作原理

条件满足

条件不满足

开始循环

初始化循环变量

检查终止条件

退出循环

执行子节点流程

更新循环变量

达到最大次数吗

输出最终结果

3.3 循环节点的结构

循环节点容器

内部区域

LoopItem: 循环变量

子节点1: 检查状态

子节点2: 更新变量

循环变量

变量1: counter等于0

变量2: status等于pending

节点头部: 显示循环信息

终止条件

输出: 最终结果

LoopItem 是什么?

它提供循环过程中的所有变量,子节点可以读取和修改:

循环变量:
- counter: 当前循环次数
- status: 当前状态
- result: 累积结果

3.4 一个完整的循环流程

假设要等待一个任务完成,最多等 10 次,每次间隔 5 秒:

判断节点 查询节点 LoopItem 循环节点 用户 判断节点 查询节点 LoopItem 循环节点 用户 初始化变量 等待5秒 alt [已完成] [未完成] loop [最多10次循环] 启动等待流程 counter是0 status是pending 查询任务状态 更新status 检查是否完成 status是completed吗 退出循环 返回结果 counter加1

3.5 循环节点的配置

循环节点配置

循环变量

变量名

变量类型

初始值

终止条件

最大循环次数

终止条件表达式

逻辑关系

内部处理

添加子节点

定义处理逻辑

执行选项

每次间隔时间

输出变量设置

3.6 退出循环节点

有时候需要在循环中途退出,而不是等到终止条件:

无条件

有条件

循环执行中

到达ExitLoop节点

有条件吗

立即退出

条件满足吗

继续执行后续节点

输出当前变量

使用场景

  • 找到目标就立即退出
  • 出现错误就立即退出
  • 不需要等到终止条件

四、嵌套结构:复杂的组合拳

4.1 什么是嵌套?

生活场景:俄罗斯套娃,大娃娃里面有小娃娃,小娃娃里面还有更小的娃娃。

嵌套就是:迭代里有循环,循环里有迭代,层层嵌套。

4.2 嵌套示例:批量处理 + 等待完成

迭代节点: 处理多个文件

循环节点: 等待每个文件处理完成

检查处理状态

文件列表

更新状态

收集处理结果

流程说明

  1. 迭代节点遍历每个文件
  2. 对每个文件,循环等待处理完成
  3. 全部完成后输出结果

4.3 多层嵌套的数据流

外层迭代: 遍历文件列表

文件1

文件2

文件3

内层循环: 等待处理

内层循环: 等待处理

内层循环: 等待处理

处理结果1

处理结果2

处理结果3

汇总所有结果


五、变量作用域:谁能看到谁

5.1 作用域层级

全局作用域

智能体作用域

容器作用域

局部作用域

系统变量: sys.query sys.user_id

开始节点输出

迭代变量: item index

当前节点输出

5.2 变量引用规则

内层节点

可以引用

外层所有变量

同层其他节点变量

自己的输出变量

外层节点

不能直接引用

内层局部变量

需要通过输出传递

5.3 作用域示例

迭代节点

循环节点

IterationItem: item index

LoopItem: counter status

AI节点

可以引用什么

sys.query 全局变量

begin节点输出 智能体级

iteration的item 外层容器

loop的counter 本层容器

自己的输出


六、实际应用案例

6.1 案例一:批量文档分析

需求:分析 100 份文档,提取关键信息

开始

检索节点: 获取文档列表

迭代节点: 遍历每份文档

IterationItem: 当前文档

AI节点: 分析文档内容

提取节点: 提取关键信息

结果收集

汇总节点: 生成分析报告

输出节点: 输出报告

配置说明

  • 输入:文档列表(100份)
  • 迭代内:AI分析 + 信息提取
  • 输出:汇总的分析报告

6.2 案例二:等待任务完成

需求:提交异步任务后,等待其完成

开始

工具节点: 提交任务

循环节点: 等待完成

LoopItem: status是pending

工具节点: 查询任务状态

更新status

status是completed吗

ExitLoop: 退出循环

等待5秒

AI节点: 处理结果

输出节点: 输出最终结果

配置说明

  • 循环变量:status(初始值 pending)
  • 终止条件:status == completed 或超过 10 次
  • 每次间隔:5 秒

6.3 案例三:失败重试

需求:调用 API,失败后自动重试

成功

失败

开始

循环节点: 重试逻辑

LoopItem: retry_count是0

工具节点: 调用API

调用成功吗

ExitLoop: 退出

retry_count加1

retry_count大于3吗

抛出异常

等待1秒

输出结果

输出错误信息

配置说明

  • 循环变量:retry_count(初始值 0)
  • 终止条件:成功 或 重试超过 3 次
  • 每次间隔:1 秒

七、性能与限制

7.1 性能考虑

性能优化

迭代节点

并行执行

批量处理

缓存结果

循环节点

最大次数限制

适当的间隔

避免无限循环

嵌套层级

控制层级深度

简化逻辑

减少跨层引用

7.2 使用限制

特性 限制项 建议值
迭代节点 输入数组最大长度 ≤ 1000
迭代节点 单次迭代超时 ≤ 60秒
迭代节点 并行数 ≤ 10
循环节点 最大循环次数 ≤ 100
循环节点 单次执行超时 ≤ 30秒
循环节点 循环间隔 ≥ 0.1秒
嵌套层级 最大嵌套深度 ≤ 3层

7.3 常见问题与解决

常见问题

无限循环

内存溢出

执行超时

解决: 必须设置最大次数

解决: 限制数组长度和变量大小

解决: 设置合理的超时时间


八、最佳实践

8.1 迭代节点最佳实践

迭代最佳实践

数据量控制

数组长度不超过1000

大数据分批处理

并行策略

独立任务可并行

有依赖的任务串行

错误处理

单个失败不影响整体

记录失败项

输出管理

只输出必要的结果

避免输出过大

8.2 循环节点最佳实践

循环最佳实践

必须有退出条件

设置最大次数

设置终止条件

考虑ExitLoop

间隔时间

避免过于频繁

根据实际情况调整

变量管理

初始值要合理

更新逻辑要清晰

避免死循环

错误处理

设置超时

异常情况处理

8.3 嵌套结构最佳实践

嵌套最佳实践

层级控制

不超过3层

能简化就简化

变量命名

不同层级用不同前缀

避免命名冲突

数据传递

明确输入输出

减少跨层引用

可读性

添加注释说明

逻辑清晰


九、总结

9.1 高级特性对比

嵌套结构

组合使用

复杂逻辑

多层数据流

循环节点

重复执行

等待条件

不知道要执行多少次

迭代节点

遍历数组

批量处理

知道要处理多少次

9.2 什么时候用哪个?

场景 使用什么 说明
批量处理数据 迭代节点 知道要处理多少个
等待某个条件 循环节点 不知道要等多久
失败重试 循环节点 最多重试 N 次
批量+等待 迭代+循环嵌套 每个都要等待
复杂数据处理 多层嵌套 根据需要组合

9.3 一句话总结

迭代处理"一群",循环处理"一阵",嵌套处理"复杂",选对工具事半功倍。


系列文章导航

  1. 架构篇 - 整体设计和技术选型
  2. DSL 设计篇 - 数据结构与序列化
  3. 画布实现篇 - VueFlow 集成与交互
  4. 节点系统篇 - 18 种节点的实现细节
  5. 表单系统篇 - 动态表单与变量引用
  6. 状态管理篇 - Pinia Store 设计
  7. 高级特性篇 - 迭代/循环/嵌套(本文)
  8. 📝 实战篇 - 从零构建一个完整智能体

作者注:本文基于 agent-flow 项目的实际代码分析编写,力求还原真实的架构设计过程。欢迎在评论区讨论或提问!

下一篇从零开始设计一个智能体编排系统 - 实战篇(敬请期待)

Logo

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

更多推荐