Step 5:工作流编排
单个 Agent 的单个调用能做的事情有限。真实业务中的需求往往是多步骤的:
"帮我处理退款,订单号 ORD-2024-001"
背后可能是:查订单 → 验证退款资格 → 计算金额 → 执行退款 → 发通知 → 记入 CRM。
工作流核心概念
Microsoft Agent Framework 的工作流引擎包含:
- Executor — 处理单元(可以是 AI Agent,也可以是自定义逻辑)
- Edge — 连接 Executor 的路径
- WorkflowBuilder — 构建有向图
- InProcessExecution — 执行工作流
定义 Executor 步骤
Executor 是工作流的基本处理单元。有两种定义方式:
方式一:继承 Executor 基类
csharp
using Microsoft.Agents.AI.Workflows;
// 自定义 Executor:反转文本
class ReverseTextExecutor : Executor<string, string>
{
public ReverseTextExecutor() : base("ReverseText") { }
public override ValueTask<string> HandleAsync(
string message,
IWorkflowContext context,
CancellationToken cancellationToken = default)
{
return ValueTask.FromResult(
string.Concat(message.Reverse()));
}
}方式二:使用 BindAsExecutor 扩展方法
csharp
// 把普通方法转为 Executor
Func<string, string> uppercaseFunc = s => s.ToUpperInvariant();
var uppercase = uppercaseFunc.BindAsExecutor("UppercaseExecutor");构建和执行工作流
csharp
// 创建 Executor 实例
var uppercase = uppercaseFunc.BindAsExecutor("ToUpper");
ReverseTextExecutor reverse = new();
// 用 WorkflowBuilder 构建有向图
// 第一个参数是起始 Executor
WorkflowBuilder builder = new(uppercase);
// 添加边:uppercase → reverse
// WithOutputFrom 指定工作流的最终输出来自 reverse
builder.AddEdge(uppercase, reverse)
.WithOutputFrom(reverse);
// 构建工作流
var workflow = builder.Build();
// 执行工作流
// InProcessExecution.RunAsync 启动同步执行
await using Run run = await InProcessExecution.RunAsync(
workflow, "Hello, World!");
// 读取事件结果
foreach (WorkflowEvent evt in run.NewEvents)
{
if (evt is ExecutorCompletedEvent completed)
{
Console.WriteLine($"{completed.ExecutorId}: {completed.Data}");
}
}
// 输出:
// ToUpper: HELLO, WORLD!
// ReverseText: !DLROW ,OLLEH多 Agent 工作流
在实际场景中,你的 Executor 通常是 AI Agent 而不是简单的文本处理函数:
csharp
// 定义两个 Agent
AIAgent orderAgent = projectClient.AsAIAgent(
model: deploymentName,
instructions: "你是订单查询专家。根据订单号查询订单信息。",
tools: [AIFunctionFactory.Create(OrderTools.GetOrderInfo)]);
AIAgent refundAgent = projectClient.AsAIAgent(
model: deploymentName,
instructions: "你是退款处理专家。根据订单信息判断退款资格并执行退款。",
tools: [AIFunctionFactory.Create(RefundTools.ProcessRefund)]);
// 把 Agent 包装为 Executor(结合 Session 保持上下文)
var orderStep = new AgentExecutor("CheckOrder", orderAgent);
var refundStep = new AgentExecutor("ProcessRefund", refundAgent);
// 构建退款工作流
WorkflowBuilder builder = new(orderStep);
builder.AddEdge(orderStep, refundStep)
.WithOutputFrom(refundStep);
var workflow = builder.Build();
await using var run = await InProcessExecution.RunAsync(
workflow, "处理退款 ORD-2024-001");工作流 vs Agent 自主调用
用 Workflow 的场景:业务逻辑有确定的步骤顺序,比如退款处理必须先查订单再验资格最后执行退款,步骤不能跳过也不能调换顺序。
让 Agent 自主调用的场景:步骤顺序不确定,需要根据中间结果动态决策,比如"帮我处理服务器告警"——Agent 需要先检查、再诊断、再决定重启还是扩容。
Workflow 提供确定性,Agent 自主调用提供灵活性。
Workflows 的两种 API
| 特性 | 函数式 API | 图形 API (WorkflowBuilder) |
|---|---|---|
| 控制流 | 原生 C#(if/for/await) | Edges 和 Conditions |
| 适用场景 | 顺序流水线、自定义循环 | 固定图、扇出/扇入 |
| 并行 | Task.WhenAll | 并行边组 |
| 人机协同 | 直接代码实现 | RequestInfoExecutor |
下一步:Step 6:托管部署 — 通过 ASP.NET Core 将 Agent 暴露为服务。