找回密码
 立即注册
首页 业界区 业界 MAF快速入门(7)工作流的状态共享

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

兼罔 12 小时前
大家好,我是Edison。
最近我一直在跟着圣杰的《.NET+AI智能体开发进阶》课程学习MAF的开发技巧,我强烈推荐你也上车跟我一起出发!
上一篇,我们学习了MAF中进行了Agent和Executor的混合编排,相信你一定有了更多地理解。本篇,我们来通过一个经典的例子了解下MAF中工作流如何实现状态的共享。
状态共享的应用场景

在实际业务场景中,一个AI工作流的多个步骤之间往往需要共享上下文数据,例如用户原始输入、模型的输出缓存等。在MAF中,提供了一个 WorkflowContext 的模型,它原生提供了工作流上下文的状态共享能力
举个例子,在下面这个聚合统计流程中,创建了一个FileContentState的共享内容通过WorkflowContext进行传递共享给后续的两个统计Executor使用,进而进行聚合输出结果。
1.png

WorkflowContext API一览

在WorkflowContext API中,它提供了以下一些状态读取和设置的接口,作为字典我们可以了解一下:
2.png

这里我们用的比较多的是:QueueStateUpdateAsync 和 ReadStateAsync 两个方法。
实验案例

今天来实践一个文档统计的工作流案例,和上面的例子相似:
3.png

这是一个典型的扇入扇出(Fan-In & Fan-Out)工作流:
首先,用户输入一个文件名,FileReadExecutor会读取该文件的内容并将文件内容传入工作流上下文中共享,同时将文件ID号传递给后续流程。
然后,单词统计Executor 和 段落统计Executor 会分别统计该文件内容的 单词数 和 段落数。
最后,聚合统计Executor会将收集到的 单词数 和 段落数 交由LLM进行友好信息的输出,最初反馈给用户。
这个案例展示了一次写入,多处读取的经典场景,它也是并发协作的基础。
准备工作

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

  • Microsoft.Agents.AI.OpenAI
  • Microsoft.Agents.AI.Workflows
  • Microsoft.Extensions.AI.OpenAI
我们的配置文件中定义了LLM API的信息:
  1. {
  2.   "OpenAI": {
  3.     "EndPoint": "https://api.siliconflow.cn",
  4.     "ApiKey": "******************************",
  5.     "ModelId": "Qwen/Qwen3-30B-A3B-Instruct-2507"
  6.   }
  7. }
复制代码
这里我们使用 SiliconCloud 提供的 Qwen/Qwen3-30B-A3B-Instruct-2507 模型,之前的 Qwen2.5 模型在这个案例中不适用。你可以通过这个URL注册账号:https://cloud.siliconflow.cn/i/DomqCefW 获取大量免费的Token来进行本次实验。
然后,我们将配置文件中的API信息读取出来:
  1. var config = new ConfigurationBuilder()
  2.     .AddJsonFile($"appsettings.json", optional: false, reloadOnChange: true)
  3.     .Build();
  4. var openAIProvider = config.GetSection("OpenAI").Get<OpenAIProvider>();
复制代码
定义数据传输模型

首先,我们定义一下在这个工作流中需要生成传递的数据模型:
(1)FileStats :统计结果DTO
  1. internal sealed class FileStats
  2. {
  3.     public int WordCount { get; init; }
  4.     public int ParagraphCount { get; init; }
  5. }
复制代码
(2)FileContentStateConstants :常量,类似于Cache Key的作用
  1. internal static class FileContentStateConstants
  2. {
  3.     public const string ScopeName = "FileContentState";
  4. }
复制代码
定义示例数据集

这里我们Mock了一个文档数据集,用于模拟读取的文件内容。
  1. internal static class SharedStateSampleData
  2. {
  3.     private static readonly IReadOnlyDictionary<string, string> Documents = new Dictionary<string, string>
  4.     {
  5.         ["ProductBrief"] = "MAF Workflow 让 .NET 团队可以像积木一样组合 Agent、Executor 与工具, 支持流式事件、并发节点和可观测性。\n\n它强调企业级能力, 包括状态管理、依赖注入、权限控制, 适合搭建端到端 AI 业务流程。",
  6.         ["WeeklyReport"] = "本周平台完成了 Shared State 功能的代码走查, 已经覆盖 Fan-out/Fan-in, Loop, Human-in-the-Loop 三种场景。\n\n下周计划: 1) 集成多模型投票; 2) 增加异常回滚; 3) 落地监控指标。"
  7.     };
  8.     public static string GetDocument(string name)
  9.         => Documents.TryGetValue(name, out var content)
  10.             ? content
  11.             : throw new ArgumentException($"未找到文档: {name}");
  12. }
复制代码
文件读取Executor

MAF中定义了一个Executor的基类,所有自定义Exectuor都需要继承于它。
[code]internal sealed class FileReadExecutor() : Executor("FileReadExecutor"){    public override async ValueTask HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)    {        var content = SharedStateSampleData.GetDocument(message);        var fileId = Guid.NewGuid().ToString("N");        await context.QueueStateUpdateAsync(fileId, content,             FileContentStateConstants.ScopeName, cancellationToken);        Console.WriteLine($"
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册