MAF快速入门(4)多Agent工作流编排

大家好,我是Edison。

上一篇,我们学习了MAF中如何持久化聊天记录到关系型数据库。这一篇,我们来学习一下工作流编排。不知大家是否记得,我们在之前用Semantic Kernel学习过多Agent编排的一些知识,例如顺序,并发,移交等模式仍然历历在目。那么,今天,我们用MAF的工作流编排来实现一下,看看有什么不一样。

多Agent编排

传统的单代理系统在处理复杂多面任务的能力方面受到限制。 通过协调多个代理,每个代理都有专门的技能或角色,我们可以创建更可靠、更自适应且能够协作解决实际问题的系统。

目前,MAF支持以下编排模式,和SK几乎一致:

image

今天,我们用MAF来实践一下顺序编排 和 移交编排 两个最常用的模式。

顺序编排的典型案例如下图所示:

image

移交编排的典型案例如下图所示:

image

 

准备工作

在今天的这个案例中,我们创建了一个.NET控制台应用程序,安装了以下NuGet包:

  • Microsoft.Agents.AI.OpenAI
  • Microsoft.Agents.AI.Workflows
  • Microsoft.Extensions.AI.OpenAI

我们的配置文件中定义了LLM API的信息:

{"OpenAI": {"EndPoint": "https://api.siliconflow.cn","ApiKey": "******************************","ModelId": "Qwen/Qwen2.5-32B-Instruct"}
}

这里我们使用 SiliconCloud 提供 Qwen2.5-32B-Instruct 模型,你可以通过这个URL注册账号:https://cloud.siliconflow.cn/i/DomqCefW 获取大量免费的Token来进行本次实验。

然后,我们将配置文件中的API信息读取出来:

var config = new ConfigurationBuilder().AddJsonFile($"appsettings.json", optional: false, reloadOnChange: true).Build();
var openAIProvider = config.GetSection("OpenAI").Get<OpenAIProvider>();

实现移交编排

首先,我们创建一个ChatClient供后续使用:

// Step1. Create one ChatClient
var chatClient = new OpenAIClient(new ApiKeyCredential(openAIProvider.ApiKey),new OpenAIClientOptions { Endpoint = new Uri(openAIProvider.Endpoint) }).GetChatClient(openAIProvider.ModelId);

然后,我们定义一个FunctionAgentFactory,封装我们需要编排的几个Agent:

public class FunctionAgentFactory
{public static ChatClientAgent CreateTriageAgent(ChatClient client){return client.CreateAIAgent("You determine which agent to use based on the user's homework question. ALWAYS handoff to another agent.","triage_agent","Routes messages to the appropriate specialist agent");}public static ChatClientAgent CreateHistoryTutorAgent(ChatClient client){return client.CreateAIAgent("You provide assistance with historical queries. Explain important events and context clearly. Please only respond about history.","history_tutor","Specialist agent for historical questions");}public static ChatClientAgent CreateMathTutorAgent(ChatClient client){return client.CreateAIAgent("You provide help with math problems. Explain your reasoning at each step and include examples. Please only respond about math.","math_tutor","Specialist agent for mathematical questions");}
}

基于AgentFactory依次创建编排Agent,历史Agent 和 数学Agent:

var triageAgent = FunctionAgentFactory.CreateTriageAgent(chatClient);
var historyTutor = FunctionAgentFactory.CreateHistoryTutorAgent(chatClient);
var mathTutor = FunctionAgentFactory.CreateMathTutorAgent(chatClient);

基于上面的3个Agent可以快速创建一个移交编排Workflow:

var workflow = AgentWorkflowBuilder.CreateHandoffBuilderWith(triageAgent).WithHandoffs(triageAgent, [mathTutor, historyTutor]) // Triage can route to either specialist.WithHandoffs([mathTutor, historyTutor], triageAgent) // Math or History tutor can return to triage.Build();

怎么样,是不是很简单?

下面,我们进行一个多轮对话测试:

List<ChatMessage> messages = new();
while (true)
{Console.Write("User: ");string userInput = Console.ReadLine()!;messages.Add(new(ChatRole.User, userInput));// Execute workflow and process eventsvar response = await workflow.AsAgent().RunAsync(messages);Console.WriteLine($"Agent: {response}\n");// Add new messages to conversation history
    messages.AddRange(response.Messages);
}

这里我们使用了Workflow as Agent的方式,即将工作流转换为一个独立的Agent来调用。

测试结果如下图所示:

image

可以看到,编排Agent根据用户的输入将请求转给了对应的数学话题Agent 和 历史话题Agent,进而使用户获得正确的回答。

实现顺序编排

首先,创建一个ChatClient,同上。

然后,封装一个AgentFactory来定义我们用到的3个Agent:

  • Analyst 需求分析

  • Writer 文案写手

  • Editor 文案审稿人/编辑

public class FunctionAgentFactory
{public static ChatClientAgent CreateAnalystAgent(ChatClient client){return client.CreateAIAgent("""
                You are a marketing analyst. Given a product description, identify:- Key features- Target audience- Unique selling points""","Analyst","An agent that extracts key concepts from a product description.");}public static ChatClientAgent CreatWriterAgent(ChatClient client){return client.CreateAIAgent("""
                You are a marketing copywriter. Given a block of text describing features, audience, and USPs,compose a compelling marketing copy (like a newsletter section) that highlights these points.Output should be short (around 150 words), output just the copy as a single text block.""","CopyWriter","An agent that writes a marketing copy based on the extracted concepts.");}public static ChatClientAgent CreateEditorAgent(ChatClient client){return client.CreateAIAgent("""
                You are an editor. Given the draft copy, correct grammar, improve clarity, ensure consistent tone,give format and make it polished. Output the final improved copy as a single text block.""","Editor","An agent that formats and proofreads the marketing copy.");}
}

基于这几个Agent我们快速定一个顺序工作流:

var analyst = FunctionAgentFactory.CreateAnalystAgent(chatClient);
var writer = FunctionAgentFactory.CreatWriterAgent(chatClient);
var editor = FunctionAgentFactory.CreateEditorAgent(chatClient);
// Workflow: Analyst -> Writer -> Editor
var workflow = AgentWorkflowBuilder.BuildSequential("content-team-workflow", [analyst, writer, editor]);

快速运行,直接得到答案:

var userMessage = "Please help to introduce our new product: An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours.";
Console.Write($"User: {userMessage}\n");
// Execute the workflow via RunAsync
var response = await workflow.AsAgent().RunAsync(userMessage);
Console.WriteLine($"Agent: {response}");

这里用户给的任务是:"Please help to introduce our new product: An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours."

假设客户公司有一个新产品:一个环保的不锈钢水瓶,可以让饮料保持24小时的低温,需要帮忙创作一个广告文案。

我们仍然将其转换为Agent来执行,获取结果下图所示:

image

可以看到,它将最后审核校对的最终版内容输出给了我们。

借助事件机制监控

假设我们想要获取每个步骤对应Agent的输出内容,进而实现一定程度的监控。那么,同步执行就不合适了,这时我们就需要用到工作流的事件机制 结合 流式执行获取事件流 来实现。

MAF的工作流事件机制内置了一些系统事件,例如:

  • AgentRunUpdatedEvent 

  • ExecutorCompletedEvent 执行器完成事件,例如Workflow中的某个Agent完成了任务,准备转到下个Agent执行。

  • WorkflowOutputEvent 整个工作流已完成任务处理准备进行最终输出。

这里我们使用MAF中的StreamAsync 和 WatchStreamAsync,其主要流程如下图所示:

image

下面我们直接看代码:

await using (StreamingRun run = await InProcessExecution.StreamAsync(workflow, userMessage))
{await run.TrySendMessageAsync(new TurnToken(emitEvents: true)); // Enable event emittingConsole.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");Console.WriteLine("Process Tracking");Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");Console.WriteLine();var result = new List<ChatMessage>();var stageOutput = new StringBuilder();int stepNumber = 1;await foreach (WorkflowEvent evt in run.WatchStreamAsync()){if (evt is AgentRunUpdateEvent updatedEvent){stageOutput.Append($"{updatedEvent.Data} ");}else if (evt is ExecutorCompletedEvent completedEvent){if (stageOutput.Length > 0){Console.WriteLine($"Step {stepNumber}: {completedEvent.ExecutorId}");Console.WriteLine($"Output: {stageOutput.ToString()}\n");stepNumber++;stageOutput.Clear();}}else if (evt is WorkflowOutputEvent endEvent){result = (List<ChatMessage>)endEvent.Data!;break;}}// Display final result and skip user messageforeach (var message in result.Skip(1))Console.WriteLine($"Agent: {message.Text}");
}
Console.WriteLine("\nTask Finished!");

最终,输出的结果如下所示:

Step1: Analyst

image

Step2 ~3: Writer & Editor

image

最终输出的内容

image

由上图可以看出,如果我们需要对于Workflow进行进度监控,使用流式执行 并 监听内置事件 完全可以实现这个目的。

其他更多的内置工作流事件如下代码示例所示:

// 执行工作流并监听所有事件
Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
Console.WriteLine("🚀 开始执行工作流 (流式模式)");
Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
var input = "Hello Workflow Events!";
Console.WriteLine($"📥 输入: \"{input}\"\n");
// 启动流式执行
StreamingRun run = await InProcessExecution.StreamAsync(simpleWorkflow, input);
Console.WriteLine("📡 开始监听事件流...\n");
Console.WriteLine(new string('', 60));
int eventCount = 0;
// 订阅事件流
await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{eventCount++;// 显示事件的完整信息Console.WriteLine($"\n🔔 事件 #{eventCount}");Console.WriteLine($"   类型: {evt.GetType().Name}");// 根据事件类型显示详细信息// switch (evt)// {//     case WorkflowStartedEvent://         Console.WriteLine($"   说明: 工作流开始执行");//         break;//     case ExecutorInvokedEvent invokedEvent://         Console.WriteLine($"   Executor: {invokedEvent.ExecutorId}");//         Console.WriteLine($"   说明: Executor 开始执行");//         Console.WriteLine($"   输入: {invokedEvent.Data}");//         break;//     case ExecutorCompletedEvent completedEvent://         Console.WriteLine($"   Executor: {completedEvent.ExecutorId}");//         Console.WriteLine($"   说明: Executor 执行完成");//         Console.WriteLine($"   输出: {completedEvent.Data}");//         break;//     case SuperStepCompletedEvent stepEvent://         Console.WriteLine($"   SuperStep: #{stepEvent.StepNumber}");//         Console.WriteLine($"   说明: 执行步骤完成");//         break;//     case WorkflowOutputEvent outputEvent://         Console.WriteLine($"   来源: {outputEvent.SourceId}");//         Console.WriteLine($"   说明: 工作流产生输出");//         Console.WriteLine($"   结果: {outputEvent.Data}");//         break;//     default://         Console.WriteLine($"   数据: {evt.Data}");//         break;// }Console.WriteLine(new string('', 60));
}
Console.WriteLine($"\n✅ 工作流执行完成,共产生 {eventCount} 个事件");
Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

小结

本文介绍了如何使用MAF框架完成基本的多Agent工作流编排,并给出了两个常用的编排案例:移交编排 和 顺序编排,最后介绍了如何借助结合流式执行 和 内置事件 完成工作流的进度监控。

下一篇,我们将继续MAF的学习。

示例源码

GitHub: https://github.com/EdisonTalk/MAFD

参考资料

Microsoft Learn,《Agent Framework Tutorials》

推荐学习

圣杰,《.NET + AI 智能体开发进阶》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/984676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之数据分析 Pandas:第一章 简介和安装

人工智能之数据分析 Pandas:第一章 简介和安装人工智能之数据分析 Matplotlib 第一章 简介和安装@目录人工智能之数据分析 Matplotlib前言📌 Pandas 的核心数据结构🛠️ 安装 Pandas使用 pip(推荐用于大多数 Py…

Dbeaver - 一些好用的设置

1 允许多语句查询 allowMutiQueries 这个在连接设置里2 去掉 limit 默认值生成快速SQL执行脚本(不卡顿)自定义[内容辅助]

内存管理-54-slub-1-文档翻译等 - Hello

内存管理-54-slub-1-文档翻译等一、slub.rst 翻译 注: 翻译自 msm-5.4/Documentation/vm/slub.rst 1. SLUB 简明用户指南 SLUB 的基本理念与 SLAB 截然不同。SLAB 需要重新编译内核才能激活所有 slab 缓存的调试选项。…

MYSQL - 数据库优化:慢查询

一、数据库优化步骤二、Sys Schema 监控 索引相关 #1. 查询冗余索引 SELECT * FROM sys.schema_redundant_indexes;#2. 查询未使用过的索引 SELECT * FROM sys.schema_unused_indexes;#3. 查询索引的使用情况 SELECT i…

完整教程:AI代码开发宝库系列:PDF文档解析MinerU

完整教程:AI代码开发宝库系列:PDF文档解析MinerU2025-12-02 18:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

2025年烤兰打包带厂家口碑排行,这十家备受推崇,打包带钢/光伏支架打包带/电镀锌打包带/铜棒打包带/镀锌打包扣烤兰打包带销售厂家推荐排行榜

在工业包装与物流运输领域,烤兰打包带作为一种关键的紧固与防护材料,其质量直接关系到货物运输的安全与效率。随着制造业与物流业的持续发展,市场对高品质、高可靠性打包带的需求日益增长,也催生了一批在技术、服务…

实用指南:海外短剧系统开发:应对高并发访问的数据库优化与缓存策略

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年12月AI SEO优化公司推荐:解锁智能搜索流量新密码

2025年,AI技术与搜索引擎优化深度融合,生成式引擎优化成为企业抢占流量的核心抓手,78%的企业级组织已将AI技术纳入SEO核心策略。在这一趋势下,专业的AI SEO优化公司能帮助企业精准适配多平台算法,实现流量与转化的…

易路:连锁餐饮人力资源数智化转型升级新引擎

引言:连锁餐饮业的“人”力挑战与数智化机遇 连锁餐饮业作为典型的劳动密集型行业,其管理分散、顾客接触密切、人员流动率高等业务特性,使得人力资源管理面临着独特的复杂挑战[1]。从快速扩张带来的组织架构调整压力…

尘埃粒子计数器生产厂家联系电话,大流量尘埃粒子计数器/粒子计数器/尘埃粒子计数器/悬浮粒子计数器/尘埃粒子计数器厂家排名

在生物医药、半导体、精密制造等高端产业中,洁净室环境的稳定与可靠是产品质量的生命线。尘埃粒子计数器作为洁净度监测的核心设备,其性能与供应商的技术实力直接挂钩。面对市场上众多的生产厂家,如何快速锁定技术可…

尘埃粒子计数器供应商推荐榜,台式粒子计数器/尘埃粒子计数器在线监测系统/大流量尘埃粒子计数器/尘埃粒子计数器公司电话

行业洞察:精准监测需求驱动,技术实力成厂商分水岭 随着半导体、生物医药、精密电子等高端制造业对生产环境洁净度要求日益严苛,尘埃粒子计数器作为洁净环境监测的核心设备,其市场需求持续增长。市场不仅关注基础计…

2025年AI教育培训供应商推荐榜:聚焦企业AI培训,精选优质机构供参考

引言 当前AI教育培训机构同质化严重,许多企业在选择AI培训时面临诸多困扰。如何筛选真正优质的AI培训供应商成为企业决策者的一大难题。本榜单通过从技术实力、课程体系、师资团队、服务保障及实战案例等多维度严格筛…

python笔记-循环

1、while循环循环的作用就是让指定的代码 重复的执行 while循环最常用的应用场景就是让执行的代码 按照指定的次数 重复执行 完整语法初始条件设置 ---通常是重复执行的计数器 while 条件(判断 计数器 是否达到目标次…

2025年12月ChatGPT优化排名公司推荐

2025年,生成式AI技术持续爆发,ChatGPT等平台成为企业流量争夺的核心阵地,而专业的优化服务能帮助品牌在AI对话场景中精准触达目标用户。经过对技术实力、服务效果、客户口碑等多维度评估,以下为大家推荐5家值得信赖…

2025年12月西安旧房翻新公司TOP5推荐:装修/家装/室内设计领衔企业

据陕西省建筑装饰协会2025年三季度报告显示,西安存量房装修需求持续攀升,其中房龄10年以上的旧房翻新咨询量占比突破62%,墙体开裂、水电老化、空间布局不合理成为业主核心痛点。不少业主在选择服务时,常陷入“低价…

2025年12月深圳艺考生文化课培训推荐:聚焦分层教学与艺考政策适配力!

对于艺考生而言,专业能力是叩响理想之门的钥匙,而文化课水平则是稳固升学根基的关键。在专业集训占据大量时间的背景下,如何高效弥补文化课短板,选择一家适配自身需求的专业培训机构至关重要。本文聚焦深圳地区艺考…

2025 美本留学机构十大推荐:全维服务护航,头部机构引领申请路

近年来,2025 年美本申请进入 “精准规划 + 全链赋能” 新阶段,从 Digital SAT 适配到文书个性化挖掘,从背景提升到海外就业衔接,优质机构成为申请成功的关键推手。基于顾问实力、录取数据、用户口碑等维度,以下十…

2025年AI教育培训课程推荐榜:覆盖AI培训全场景指南

引言 当前AI教育市场同质化严重,80%机构存在课程滞后、师资参差、实战脱节等问题,企业与个人面临"如何筛选真正适配需求的优质课程"的核心痛点。本榜单从技术适配性、课程更新频率、实战案例覆盖、师资行业…

2025污染源监测设备厂家有哪些,废气监测设备厂家有哪些测评

2025污染源监测设备厂家有哪些,废气监测设备厂家有哪些测评!在挑选污染源监测设备厂家时,建议从多个维度综合考量。首先,可以关注企业的技术研发能力,包括是否拥有自主研发团队、核心技术专利以及与科研机构的合作情…

2025年12月通道闸机、速通门品牌厂家TOP10榜单发布,选购指南同步更新

随着智慧城市建设的纵深推进,通道闸机、速通门作为出入口控制的核心设备,已广泛应用于工地、景区、写字楼、交通枢纽等多元场景。2025年,市场对设备的稳定性、智能化与场景适配性提出更高要求,人脸识别、无感通行等…