Skip to content

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 暴露为服务。

学而不思则罔,思而不学则殆