一句话简介
本文将教你构建自定义Executor,不仅能管理 Agent 的对话生命周期,还能集成结构化输出、路由分发和自定义事件,打造真正的智能业务单元。
🎯 为什么需要自定义 Agent Executor?
虽然WorkflowBuilder可以直接添加AIAgent,但在复杂的业务场景下,我们往往需要更多控制权。
需求场景 | 直接使用 Agent | 自定义 Agent Executor |
|---|---|---|
| 对话历史 | ❌ 单次调用无记忆 | ✅ 管理 |
| 多重输入 | ❌ 仅支持单一文本 | ✅ 通过路由处理多种消息类型 |
| 输出控制 | ❌ 自由文本 | ✅ 强制 JSON 结构化输出 |
| 业务逻辑 | ❌ 纯 LLM 生成 | ✅ 嵌入评分、循环、熔断逻辑 |
核心理念:将 Agent 封装在 Executor 内部,让 LLM 的智能与代码的确定性完美融合。
💻 核心实现三部曲
1. 结构化输出与状态管理
首先,定义强类型的数据模型,并在 Executor 中持有 Agent 和对话线程。
// 定义数据模型 publicclassSloganResult { publicstring Slogan { get; set; } } // 自定义 Executor publicclassWriterExecutor : Executor { privatereadonly AIAgent _agent; privatereadonly AgentThread _thread; // ✅ 保持对话记忆 public WriterExecutor(AIAgent agent) : base("Writer") { _agent = agent; _thread = new AgentThread(); // 每个实例拥有独立线程 } }2. 配置多路路由 (RouteBuilder)
一个智能节点往往需要处理多种类型的输入。例如:初次生成任务(string)和后续修改意见(Feedback)。
protected override RouteBuilder ConfigureRoutes(RouteBuilder builder) => builder // 处理初始需求 .AddHandler<string, SloganResult>(HandleInitialTaskAsync) // 处理反馈意见 .AddHandler<FeedbackResult, SloganResult>(HandleFeedbackAsync);3. 实现业务逻辑 Handlers
在 Handler 中调用 Agent,利用结构化输出能力,并将结果转化为强类型对象。
private async ValueTask<SloganResult> HandleInitialTaskAsync( string task, IWorkflowContext context, CancellationToken ct) { // 1. 添加用户消息到线程 await _thread.AddUserMessageAsync($"任务:{task}"); // 2. 调用 Agent 并强制 JSON 输出 var response = await _agent.RunAsync(_thread, new AgentOptions { ResponseFormat = typeof(SloganResult) }, ct); // 3. 反序列化 var result = JsonSerializer.Deserialize<SloganResult>(response.Content); // 4.发布业务事件 await context.AddEventAsync(new SloganGeneratedEvent(result), ct); return result; }🏢 典型场景:循环优化工作流
利用自定义 Executor,我们可以实现经典的Generator-Critic(生成-评价)循环模式。
关键点:
CriticExecutor:负责打分并提出修改意见。
循环机制:
FeedbackResult被路由回WriterExecutor。记忆增强:Writer 的
_thread保存了之前的尝试,能理解“请根据这个意见修改”的指令。
🎯 总结
自定义 Agent Executor 是构建高级 Agentic Workflow 的基石。
✅封装性:将 Prompt、配置和逻辑封装在一个类中。
✅记忆力:通过
AgentThread实现多轮对话状态管理。✅灵活性:多路由机制让节点能响应不同的“刺激”。
下一步,掌握了这些积木,你就可以搭建能够自主迭代、自我修正的复杂 AI 系统了。