MAF工作流状态共享如何实现功能?

摘要:在实际业务场景中,一个AI工作流的多个步骤之间往往需要共享上下文数据,例如用户原始输入、模型的输出缓存等。在MAF中,提供了一个 WorkflowContext 的模型,它原生提供了工作流上下文的状态共享能力。
大家好,我是Edison。 最近我一直在跟着圣杰的《.NET+AI智能体开发进阶》课程学习MAF的开发技巧,我强烈推荐你也上车跟我一起出发! 上一篇,我们学习了MAF中进行了Agent和Executor的混合编排,相信你一定有了更多地理解。本篇,我们来通过一个经典的例子了解下MAF中工作流如何实现状态的共享。 状态共享的应用场景 在实际业务场景中,一个AI工作流的多个步骤之间往往需要共享上下文数据,例如用户原始输入、模型的输出缓存等。在MAF中,提供了一个 WorkflowContext 的模型,它原生提供了工作流上下文的状态共享能力。 举个例子,在下面这个聚合统计流程中,创建了一个FileContentState的共享内容通过WorkflowContext进行传递共享给后续的两个统计Executor使用,进而进行聚合输出结果。 WorkflowContext API一览 在WorkflowContext API中,它提供了以下一些状态读取和设置的接口,作为字典我们可以了解一下: 这里我们用的比较多的是:QueueStateUpdateAsync 和 ReadStateAsync 两个方法。 实验案例 今天来实践一个文档统计的工作流案例,和上面的例子相似: 这是一个典型的扇入扇出(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的信息: { "OpenAI": { "EndPoint": "https://api.siliconflow.cn", "ApiKey": "******************************", "ModelId": "Qwen/Qwen3-30B-A3B-Instruct-2507" } } 这里我们使用 SiliconCloud 提供的Qwen/Qwen3-30B-A3B-Instruct-2507模型,之前的 Qwen2.5 模型在这个案例中不适用。你可以通过这个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>(); 定义数据传输模型 首先,我们定义一下在这个工作流中需要生成传递的数据模型: (1)FileStats :统计结果DTO internal sealed class FileStats { public int WordCount { get; init; } public int ParagraphCount { get; init; } } (2)FileContentStateConstants :常量,类似于Cache Key的作用 internal static class FileContentStateConstants { public const string ScopeName = "FileContentState"; } 定义示例数据集 这里我们Mock了一个文档数据集,用于模拟读取的文件内容。
阅读全文