1. MAF工作流架构设计理念
MAF(Microsoft Agents Framework)的工作流系统采用了一种模块化设计思想,将复杂业务流程拆分为可组合的单元。这种架构特别适合处理具有明确阶段划分和条件分支的业务场景。主工作流+子工作流的组合模式,本质上是一种责任链模式(Chain of Responsibility)与策略模式(Strategy)的混合实现。
在实际业务中,我们经常会遇到这样的场景:一个完整业务流程包含多个阶段,某些阶段又需要根据上下文选择不同的处理策略。以客服工单系统为例,主流程负责工单的接收和分类,而具体的处理逻辑则根据工单类型(如产品质量问题、物流问题等)分发到不同的子流程执行。
提示:MAF的工作流设计允许子工作流独立开发和测试,这种解耦使得系统更易于维护和扩展。当新增工单类型时,只需开发对应的子工作流并在主工作流中添加路由规则即可。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 子工作流的核心实现机制
2.1 子工作流的定义与绑定
在MAF中,子工作流通过WorkflowBuilder构建后,需要转换为可执行的Executor实例。这个过程通过BindAsExecutor方法完成:
csharp复制var productQualitySubWorkflow = new WorkflowBuilder(productEvalExecutor)
.AddEdge(productEvalExecutor, returnPolicyExecutor)
.AddEdge(returnPolicyExecutor, aiResponseExecutor)
.WithOutputFrom(aiResponseExecutor)
.Build();
var productQualitySubExecutor =
productQualitySubWorkflow.BindAsExecutor("ProductQualitySubWorkflow");
关键点在于:
- 每个子工作流有自己的输入输出类型,必须与主工作流的数据模型兼容
BindAsExecutor方法为子工作流分配唯一标识符,用于在主工作流中引用- 子工作流内部可以包含任意复杂的处理逻辑,但对主工作流而言只是一个黑盒
2.2 子工作流的执行上下文
子工作流执行时会继承主工作流的上下文信息,包括:
- 共享状态对象(如案例中的
ComplaintProcessingRecord) - 取消令牌(CancellationToken)
- 日志追踪上下文
这种上下文传递机制确保了:
- 子工作流可以访问和修改共享状态
- 主工作流可以监控子工作流的执行进度
- 整个流程可以统一取消
3. 主工作流的编排策略
3.1 条件路由的实现
主工作流通过AddEdge方法的重载实现条件路由:
csharp复制.AddEdge<ComplaintProcessingRecord>(
classifierExecutor,
productQualitySubExecutor,
condition: record => record.Category == "产品质量")
这种设计实现了:
- 类型安全的条件判断(泛型参数确保只能访问正确的数据类型)
- 延迟执行的条件计算(只有当数据到达该节点时才评估条件)
- 清晰的可读性(Lambda表达式直观展示路由逻辑)
3.2 工作流的合并与同步
在客服工单案例中,两个子工作流最终都汇合到合规审核环节:
csharp复制.AddEdge(productQualitySubExecutor, complianceExecutor)
.AddEdge(logisticsSubExecutor, complianceExecutor)
这种模式称为"扇入"(Fan-in),需要注意:
- 确保不同子工作流的输出类型兼容下游处理
- 考虑并发执行时的线程安全问题
- 设计合理的错误处理机制
4. 完整案例实现详解
4.1 环境准备与依赖配置
创建一个.NET控制台应用,添加以下NuGet包:
xml复制<PackageReference Include="Microsoft.Agents.AI.OpenAI" Version="1.0.0" />
<PackageReference Include="Microsoft.Agents.AI.Workflows" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensio
