MAF快速入门(1)工作流的状态共享



在当今复杂多变的任务环境中,传统的单Agent系统往往难以应对多维度、高复杂度的需求。通过协调多个专用Agent,我们可以构建更可靠、灵活且高效的系统。MAF(Multi-Agent Framework)作为新兴的智能体协作框架,通过工作流编排和状态共享机制,实现了任务执行的智能化和自动化。本文将深入探讨MAF中工作流状态共享的核心概念、实现方法及实际应用。


一、工作流状态共享的核心概念


1.1 工作流模型与状态共享的关系


工作流模型是对业务过程的抽象描述,包含执行过程所需的所有信息,如活动定义、转换条件和参与者角色。状态共享则是工作流模型的核心特性之一,它允许不同Agent在执行过程中访问和更新任务状态,确保协作的一致性和连贯性。 在MAF中,工作流模型通过结构化定义(如JSON或XML)描述任务流程,而状态共享则通过工作流相关数据(Workflow-related Data)实现,这些数据由工作流管理系统控制,用于决定过程实例的状态转换和活动执行顺序。


1.2 状态共享的三大数据类别


MAF的工作流状态共享基于三类数据:






工作流控制数据:由工作流执行服务(Workflow Engine)管理,用于标识过程实例的状态(如“进行中”或“已完成”)。这些数据通过内部机制传递,确保任务状态的准确性和一致性。




工作流相关数据:决定状态转换的条件,例如当需求分析Agent完成时,触发文案写作Agent的启动。这类数据由应用程序访问和修改,支持动态任务调度。




工作流应用数据:由外部应用程序操作,如用户输入或生成的内容。MAF通过事件机制(如OnMessageReceived)监听这些数据,实现与Agent的实时交互。


1.3 状态共享的应用场景


状态共享在MAF中广泛应用于多Agent协作场景。例如,在营销项目中,需求分析Agent生成的需求文档(工作流相关数据)可被文案写作Agent直接访问,避免重复输入;在客服系统中,用户查询历史(工作流应用数据)可在多个Agent间共享,提升响应效率。 这种机制显著降低了系统复杂度,同时增强了任务执行的灵活性和适应性。


二、MAF工作流状态共享的实现方法


2.1 环境搭建与配置


2.1.1 项目初始化


MAF支持多种开发环境,本文以.NET控制台应用程序为例:






创建项目:在Visual Studio中新建控制台应用,目标框架为.NET 8.0。




安装NuGet包:通过包管理器控制台执行以下命令:


Install-Package Microsoft.Agents.AI.OpenAI

Install-Package Microsoft.Agents.AI.Workflows

Install-Package Microsoft.Extensions.AI.OpenAI



这些包提供了MAF的核心功能,包括Agent定义、工作流编排和状态管理。


2.1.2 配置LLM API


MAF支持与多种LLM(大语言模型)集成,本文以OpenAI为例:






添加配置文件:在项目根目录创建appsettings.json,添加以下内容:


{

  "OpenAI": {

    "EndPoint": "https://api.siliconflow.cn",

    "ApiKey": "your-api-key",

    "ModelId": "Qwen/Qwen2.5-32B-Instruct"

  }

}



EndPoint和ApiKey需替换为实际值,ModelId指定了使用的LLM模型。




读取配置:在Program.cs中添加以下代码:


var builder = WebApplication.CreateBuilder(args);

var configuration = builder.Configuration;

var openAIProvider = configuration.GetSection("OpenAI").Get<OpenAIProvider>();



这将从配置文件中提取LLM API信息,供后续Agent使用。


2.2 定义工作流状态共享机制


2.2.1 创建状态管理类


在MAF中,工作流状态通常通过WorkflowState类管理:


public class WorkflowState

{

    public string CurrentTask { get; set; } = "未开始";

    public Dictionary<string, object> Data { get; set; } = new();

    public List<string> CompletedTasks { get; set; } = new();

}







CurrentTask:标识当前执行的任务。




Data:存储工作流相关数据,如需求文档或用户输入。




CompletedTasks:记录已完成的任务,避免重复执行。


2.2.2 实现状态共享逻辑


在FunctionAgent中,通过OnMessageReceived方法处理状态共享:


public override async Task<Message> OnMessageReceived(Message message)

{

    var workflowState = message.Data["WorkflowState"] as WorkflowState;

    if (workflowState.CurrentTask == "需求分析")

    {

        // 执行需求分析任务

        workflowState.Data["需求文档"] = "分析结果";

        workflowState.CurrentTask = "文案写作";

        workflowState.CompletedTasks.Add("需求分析");

    }

    return new Message { Content = "任务已更新" };

}







当CurrentTask为“需求分析”时,Agent执行任务并将结果存入Data。




更新CurrentTask和CompletedTasks,确保状态一致性。


2.3 集成多个Agent实现状态共享


2.3.1 创建Agent工厂


在Program.cs中,定义FunctionAgentFactory以创建多个Agent:


var agentFactory = new FunctionAgentFactory()

    .AddAgent<需求分析Agent>("需求分析")

    .AddAgent<文案写作Agent>("文案写作")

    .AddAgent<编辑Agent>("编辑");







每个Agent对应一个任务类型,如“需求分析”或“文案写作”。




通过AddAgent方法注册Agent,实现任务分工。


2.3.2 启动工作流并共享状态


在Main方法中,启动工作流并传递状态:


var workflowState = new WorkflowState { CurrentTask = "需求分析" };

var message = new Message { Content = "开始工作流", Data = { ["WorkflowState"] = workflowState } };

await agentFactory.CreateAgent("需求分析").SendMessage(message);







初始化WorkflowState并设置CurrentTask为“需求分析”。




通过SendMessage方法将状态传递给Agent,触发任务执行。


2.4 监控与调试状态共享


2.4.1 使用事件机制监控状态


MAF提供了事件机制(如OnWorkflowStateChanged)以监控状态变化:


public override async Task OnWorkflowStateChanged(WorkflowState oldState, WorkflowState newState)

{

    Console.WriteLine($"状态从 {oldState.CurrentTask} 变为 {newState.CurrentTask}");

}







当CurrentTask更新时,OnWorkflowStateChanged方法被触发,输出状态变更日志。


2.4.2 调试技巧






日志记录:在OnMessageReceived中添加日志,记录Data和CurrentTask的变化。




断点调试:在VS中设置断点,逐步执行FunctionAgent的方法,观察状态更新逻辑。




单元测试:为WorkflowState和FunctionAgent编写测试用例,验证状态共享的正确性。


三、MAF工作流状态共享的实际应用


3.1 案例1:营销项目中的状态共享


3.1.1 需求分析Agent


public override async Task<Message> OnMessageReceived(Message message)

{

    var workflowState = message.Data["WorkflowState"] as WorkflowState;

    if (workflowState.CurrentTask == "需求分析")

    {

        // 模拟需求分析

        workflowState.Data["需求文档"] = "目标用户:年轻人;产品特点:创新设计";

        workflowState.CurrentTask = "文案写作";

        workflowState.CompletedTasks.Add("需求分析");

    }

    return new Message { Content = "需求分析完成" };

}







当CurrentTask为“需求分析”时,Agent生成需求文档并更新状态。


3.1.2 文案写作Agent


public override async Task<Message> OnMessageReceived(Message message)

{

    var workflowState = message.Data["WorkflowState"] as WorkflowState;

    if (workflowState.CurrentTask == "文案写作")

    {

        // 模拟文案写作

        var 需求文档 = workflowState.Data["需求文档"] as string;

        workflowState.Data["广告文案"] = $"针对{需求文档}的广告文案:创新设计,吸引年轻用户!";

        workflowState.CurrentTask = "编辑";

        workflowState.CompletedTasks.Add("文案写作");

    }

    return new Message { Content = "文案写作完成" };

}







访问需求文档(工作流相关数据),生成广告文案并更新状态。


3.1.3 编辑Agent


public override async Task<Message> OnMessageReceived(Message message)

{

    var workflowState = message.Data["WorkflowState"] as WorkflowState;

    if (workflowState.CurrentTask == "编辑")

    {

        // 模拟编辑

        var 广告文案 = workflowState.Data["广告文案"] as string;

        workflowState.Data["最终文案"] = $"编辑后的文案:{广告文案}";

        workflowState.CurrentTask = "已完成";

        workflowState.CompletedTasks.Add("编辑");

    }

    return new Message { Content = "编辑完成" };

}







访问广告文案(工作流相关数据),生成最终文案并标记任务完成。


3.2 案例2:客服系统中的状态共享


在客服系统中,状态共享可实现用户查询的自动分发:






用户输入:用户发送“历史事件查询”。




需求分析Agent:识别查询类型,更新CurrentTask为“历史辅导”。




历史辅导Agent:访问历史知识库,生成回答并存入Data。




状态更新:标记任务完成,避免重复处理。


四、总结与展望


MAF通过工作流状态共享机制,实现了多Agent系统的高效协作。本文从核心概念、实现方法到实际应用,全面阐述了状态共享在MAF中的重要性。未来,随着LLM技术的进步,MAF将支持更复杂的任务编排和实时状态同步,成为企业自动化和智能化的关键工具。 (