当前位置: 首页 > news >正文

Agent Framework 中使用 Loop 构建循环工作流

目录

示例场景

核心代码实现

指定入口节点

建立第一次执行路径

建立反馈回路

指定最终输出

GuessNumberExecutor 的作用

JudgeExecutor 的作用

Loop Workflow 的终止条件

Loop 与普通 Workflow 的区别

小结


在前面的文章中,我们介绍了顺序执行、条件边、Switch、Fan-Out 等 Workflow 编排方式。 这些示例都有一个共同特点:Workflow 会沿着预先定义好的路径不断向前执行,直到结束。 但在实际业务场景中,有些任务并不是一次执行就能完成的。

例如搜索系统可能需要不断迭代查询结果;规划系统可能需要根据执行结果调整下一步计划; AI Agent 也可能需要经过多轮推理才能得到最终答案。

对于这类场景,Workflow 需要具备循环执行的能力。

本篇文章通过一个简单的猜数字游戏,介绍 Agent Framework 中如何构建 Loop Workflow。

示例场景

在前面的示例中,Workflow 通常沿着预先定义好的路径向前执行。每个节点只会执行一次,流程执行完成后 Workflow 也随之结束。

但有些任务并不能一次完成,而是需要根据执行结果不断调整下一步动作。

例如搜索问题时,需要根据结果重新调整查询条件;规划任务时,需要根据执行结果不断修正计划;而在本示例中,系统需要不断调整猜测范围,直到找到正确答案。

为了演示这种场景,我们使用一个简单的猜数字游戏作为示例。

假设目标数字为:

42

系统并不知道正确答案,而是通过二分查找算法不断缩小猜测范围。

当猜测结果过大时,缩小上界;

当猜测结果过小时,提高下界;

然后重新计算下一次猜测值。

整个过程如下图所示:

从图中可以看到,左侧展示的是二分查找不断缩小搜索范围的过程,而右侧展示的是对应的 Workflow 结构。

当 GuessNumberExecutor 产生猜测值后,会交给 JudgeExecutor 进行判断。

如果数字过大,则返回 Above;

如果数字过小,则返回 Below;

然后再次回到 GuessNumberExecutor,根据新的范围计算下一次猜测值。

这个过程会不断重复,直到猜中目标数字。

因此,这类场景已经不适合使用传统的线性 Workflow,而需要 Workflow 具备循环执行能力。

两个 Executor 会不断交替执行:

GuessNumberExecutor ↓ JudgeExecutor ↓ GuessNumberExecutor

直到满足结束条件,Workflow 才会结束。

这也是本示例要介绍的核心能力:

Workflow 不再是一条固定向前推进的流水线,而是能够根据执行结果回到之前的节点,从而形成一个循环工作流(Loop Workflow)。

核心代码实现

整个 Workflow 的定义非常简单:

var workflow = new WorkflowBuilder(guessNumberExecutor) .AddEdge(guessNumberExecutor,judgeExecutor) .AddEdge(judgeExecutor,guessNumberExecutor) .WithOutputFrom(judgeExecutor) .Build();

虽然代码只有几行,但它完整构建了一个循环工作流。

指定入口节点

首先创建入口节点:

var workflow = new WorkflowBuilder( guessNumberExecutor)

这里的GuessNumberExecutor是整个 Workflow 的起点。

它负责根据当前已知范围计算下一次猜测结果。

Workflow 启动后,首先进入这个节点。

建立第一次执行路径

接下来:

.AddEdge( guessNumberExecutor, judgeExecutor)

当系统产生一个猜测数字后,交给JudgeExecutor判断结果。

建立反馈回路

然后是整个示例最关键的一行:

.AddEdge( judgeExecutor, guessNumberExecutor)

这条边把:

JudgeExecutor

重新连接回:

GuessNumberExecutor

形成一个闭环:

GuessNumberExecutor ↓ JudgeExecutor ↓ GuessNumberExecutor ↓ JudgeExecutor

这也是 Loop Workflow 的核心。

Workflow 不再是一条直线,而是形成了一个反馈回路。

只要没有满足结束条件,流程就会持续运行。

指定最终输出

最后:

.WithOutputFrom(judgeExecutor)

指定 Workflow 的最终输出来自:

JudgeExecutor

只有当数字被成功猜中时:

await context.YieldOutputAsync(...)

才会产生最终结果。

Workflow 也会随之结束。

GuessNumberExecutor 的作用

GuessNumberExecutor负责产生猜测数字。

为了提高效率,它没有随机猜测,而是采用二分查找算法。

内部维护两个状态:

public int LowerBound { get; private set; } public int UpperBound { get; private set; }

表示当前可能的数字范围。

例如:

1 ~ 100

第一次猜测:

50

如果收到:

Above

说明数字更小。

于是:

1 ~ 49

再次取中间值:

25

如果收到:

Below

说明数字更大。

于是:

26 ~ 49

如此循环。

核心计算逻辑如下:

private int NextGuess => (this.LowerBound + this.UpperBound) / 2;

每次都取当前范围的中间值。

因此猜测次数会快速收敛。

JudgeExecutor 的作用

JudgeExecutor负责判断当前猜测是否正确。

核心逻辑如下:

if (message == this._targetNumber) { await context.YieldOutputAsync(...); } else if (message < this._targetNumber) { await context.SendMessageAsync( NumberSignal.Below); } else { await context.SendMessageAsync( NumberSignal.Above); }

如果猜中:

Workflow 输出结果 Workflow 结束

如果数字偏小:

发送 Below

如果数字偏大:

发送 Above

然后 Workflow 继续回到:

GuessNumberExecutor

进行下一轮猜测。

Loop Workflow 的终止条件

很多开发者第一次看到循环工作流时都会有一个问题:

Workflow 会不会无限循环?

答案取决于是否存在终止条件。

在当前示例中:

message == _targetNumber

就是终止条件。

一旦满足:

await context.YieldOutputAsync(...)

Workflow 就会产生最终输出。

后续不再发送新的消息。

循环自然结束。

因此:

GuessNumberExecutor ↔ JudgeExecutor

虽然形成了环路,但并不会无限执行。

Loop 与普通 Workflow 的区别

普通 Workflow 更像是一条固定流水线,而 Loop Workflow 则允许 Workflow 根据执行结果重新回到前面的节点:

直到满足终止条件。

这种模式特别适合:

  • 搜索与迭代优化

  • 自动规划与修正

  • 多轮推理

  • Agent 自我反思

  • Human-in-the-Loop 交互

很多复杂 Agent 系统本质上都建立在 Loop Workflow 之上。

小结

本示例介绍了 Agent Framework 中的 Loop Workflow。

通过两条普通的 Edge,Workflow 在GuessNumberExecutorJudgeExecutor之间形成了一个反馈回路,从而实现循环执行。

与顺序执行相比,Loop Workflow 的核心特点在于:Workflow 可以根据执行结果重新回到之前的节点,而不是始终沿着固定路径向前推进。

在实际项目中,Loop 往往是实现多轮推理、自动规划以及复杂 Agent 行为的重要基础能力。

源代码地址

https://github.com/bingbing-gui/dotnet-agent-playbook/tree/master/src/ai-agent/Agent-Framework/43-Loop

引入地址

http://www.jsqmd.com/news/1230117/

相关文章:

  • 微信网页版终于能用了!3分钟安装开源插件,告别“无法登录“的烦恼 [特殊字符]
  • 打破格式壁垒:20+文档格式一键智能转换的AI助手
  • 如何扩展Ionic Angular Cordova Seed:添加自定义服务和API集成
  • Runway企业级协作陷阱盘点:87%团队踩坑的权限/版本/缓存三大雷区,今天必须修复
  • 广州高端企业纪实视频制作专业机构推荐 - 广州影画邦
  • 鸿蒙Flutter 依赖注入模式:使用Provider管理服务类
  • 【小程序毕业设计】基于小程序的老年人居家生活服务管理系统 社区养老服务预约与健康监护小程序设计与实现(源码+文档+远程调试,全bao定制等)
  • i-book.in_Archive项目深度解析:如何快速搭建个人电子书搜索引擎
  • windows安全设置禁用defender和自动更新等
  • 企业大脑到底是什么跟知识库有什么本质区别
  • 高通8295芯片车机性能与零跑A10系统优化解析
  • 【小程序毕业设计】基于 SpringBoot + 微信小程序的高校研究生备考咨询与信息管理小程序 考研资讯答疑与经验分享服务小程序设计(源码+文档+远程调试,全bao定制等)
  • SpringBoot高可用架构实战:从核心痛点到生产避坑
  • 剪映和在线音频提取工具哪个音质好?2026两种方案音质对比实测 - 工具测试专家
  • Hermes并不难,难的是知道什么时候不该用
  • 鸿蒙Flutter Provider异步数据处理:加载状态与错误处理
  • 在线音频提取工具有安全风险吗?2026安全提取工具实测 - 工具测试专家
  • 计算机毕业设计之响应式教育平台
  • Windows系统下VeighNa量化交易框架的终极安装指南:从零到一的完整解决方案
  • ComfyUI视频合成完整指南:5个步骤彻底解决VHS_VideoCombine节点缺失问题
  • Qt C++ 封装 QAxObject 实现高效 Excel 读写:原理、避坑与工程实践
  • TonWeb NFT开发全攻略:从创建集合到实现市场交易功能
  • 行业研究正在失效?——2024 Q2全球头部机构AI搜索采纳率激增68%,你还在用关键词爬虫?
  • 【小程序毕业设计】基于 SpringBoot 的校园图书馆座位智能管理系统 图书馆座位预约、释放与防占座小程序设计(源码+文档+远程调试,全bao定制等)
  • 音乐歌词获取终极指南:3步掌握163MusicLyrics的完整使用方案
  • 2026武汉奢侈品回收避坑指南|实测各类回收渠道,包包手表黄金变现全攻略 - 奢品屋武汉奢侈品回收
  • 2026年可穿戴健康预警设备榜单出炉,哪些产品值得关注?
  • Java微服务框架设计:高效RPC与消息处理实践
  • Agent Framework 中构建Human-in-the-Loop工作流
  • 亨得利修表怎么样?全面维修保养服务解析权威公示(2026年7月最新) - 亨得利官方