Spring AI 实战指南(十六):企业级 Agent Workflow 引擎源码实现(对标 LangGraph)

前言

系列:Spring AI 企业级开发实战

项目名称:EduAgentX Workflow Engine

技术栈:Java 21 + Spring Boot 3.5 + Spring AI + Redis + PostgreSQL + PGVector + MCP + Flowable

难度:⭐⭐⭐⭐⭐

阅读时间:90分钟+

关键词:Workflow Engine、DAG、Agent编排、任务调度、并行执行、Spring AI源码设计


前面的章节我们已经讲了:

  • Agent Framework设计
  • Memory、Tool、Prompt、Model Engine设计
  • Multi-Agent协作模式
  • AI OS架构

企业落地时,一个问题非常突出:

text 复制代码
单个Agent可以完成任务,但复杂任务无法拆分和调度

例如:

text 复制代码
生成学习报告

涉及:

text 复制代码
成绩查询 → 分析 → 推荐课程 → 生成计划 → 输出报告

如果没有 Workflow Engine ,你只能靠 硬编码超大Prompt 来实现,弊端:

  • 难维护
  • 扩展性差
  • 性能低下
  • Token成本高

因此,企业级 Agent 系统必须有 Workflow Engine


一、Workflow Engine 核心概念

企业级 Workflow Engine 核心思想:

text 复制代码
Workflow = DAG + Task + Node + Scheduler
  • DAG(Directed Acyclic Graph):有向无环图,确保任务顺序和依赖关系
  • Task:用户发起的工作流实例
  • Node:单个步骤或子任务,由特定Agent执行
  • Scheduler:调度器,管理节点执行、重试、并行、分支
  • Context:整个流程的上下文信息,包括用户信息、Memory、Prompt、数据结果

二、Workflow 数据模型设计

数据库设计(PostgreSQL示例):

sql 复制代码
CREATE TABLE workflow_definition (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    description TEXT,
    dag JSONB,
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE workflow_instance (
    id BIGINT PRIMARY KEY,
    definition_id BIGINT REFERENCES workflow_definition(id),
    status VARCHAR(20) DEFAULT 'PENDING',
    context JSONB,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE workflow_node_instance (
    id BIGINT PRIMARY KEY,
    instance_id BIGINT REFERENCES workflow_instance(id),
    node_id VARCHAR(100),
    status VARCHAR(20) DEFAULT 'PENDING',
    result JSONB,
    started_at TIMESTAMP,
    finished_at TIMESTAMP
);

三、Node设计

Node是Workflow的核心执行单元,每个Node对应:

  • 一个Agent
  • 一个Tool调用
  • 一段数据处理逻辑

Java接口设计:

java 复制代码
public interface Node {

    String getId();

    NodeResult execute(NodeContext context);

    List<String> getNextNodes();
}

NodeResult示例:

java 复制代码
public class NodeResult {
    private boolean success;
    private Object data;
    private String message;
}

四、Workflow DAG设计

DAG结构存储在数据库中,JSON示例:

json 复制代码
{
  "nodes": [
    {"id": "score", "type": "LearningAgent", "next": ["analysis"]},
    {"id": "analysis", "type": "LearningAgent", "next": ["recommend"]},
    {"id": "recommend", "type": "CourseAgent", "next": ["report"]},
    {"id": "report", "type": "ReportAgent", "next": []}
  ]
}
  • type:节点对应Agent
  • next:依赖节点

五、Workflow执行引擎设计

执行引擎核心职责:

  1. 解析DAG
  2. 创建Workflow实例
  3. 遍历节点,根据依赖关系调度执行
  4. 管理并行、条件分支
  5. 保存节点结果到数据库
  6. 错误重试与异常处理

Java核心类设计:

java 复制代码
public class WorkflowEngine {

    private AgentRegistry agentRegistry;
    private MemoryEngine memoryEngine;
    private ToolEngine toolEngine;

    public WorkflowInstance executeWorkflow(WorkflowDefinition def, Map<String, Object> input) {
        // 1. 创建Workflow实例
        // 2. 初始化上下文
        // 3. 执行节点(同步或异步)
        // 4. 保存节点结果
    }

    private void executeNode(Node node, NodeContext context) {
        // 执行Agent或Tool
        NodeResult result = agentRegistry.getAgent(node.getType())
                                        .execute(context);
        // 保存结果
        // 调度下一个节点
    }
}

六、支持并行执行

DAG中可存在多个节点没有依赖关系,可并行执行:

text 复制代码
score → analysis → report
recommend → report
  • scorerecommend 可以同时执行
  • report必须等待两者完成

实现方式:

java 复制代码
ExecutorService executor = Executors.newFixedThreadPool(10);

异步执行节点,并在完成后回调调度下一个节点。


七、条件分支设计

Node可以根据执行结果选择不同路径:

json 复制代码
{
  "nodes": [
    {"id": "score", "type": "LearningAgent", "next": [
        {"condition": "score>80", "node": "advanced_course"},
        {"condition": "score<=80", "node": "basic_course"}
    ]}
  ]
}
  • 条件解析器:解析NodeResult生成条件分支
  • 分支执行:选择符合条件的下一个Node执行

八、Checkpoint与重试机制

企业级任务常常失败:

  • 模型超时
  • Tool调用失败
  • 数据库异常

解决方案:

  1. Checkpoint

    • 每个节点完成后,将NodeResult保存到数据库
    • 恢复时可从失败节点继续执行
  2. 重试机制

    • 每个节点可配置重试次数
    • 支持指数退避策略
java 复制代码
public class RetryPolicy {
    private int maxRetries;
    private long delay; // ms
}

九、人机协作(HITL,Human In The Loop)

有些流程需要人工干预:

  • 报告审核
  • 面试评分确认
  • 高风险操作确认

设计方式:

  • 节点类型标记为 HITL
  • 引擎暂停执行,等待人工确认
  • 审核完成后继续执行
java 复制代码
public class HumanApprovalNode implements Node {
    private boolean approved;
}

十、Workflow监控与可视化

企业级需求:

  • 节点状态监控
  • 实时任务追踪
  • Token成本统计

实现方式:

  • 数据库持久化节点执行状态

  • Web端Dashboard展示:

    • 节点状态(Pending/Running/Success/Failed)
    • 执行时间
    • 消耗Token
    • 异常日志

十一、与LangGraph对标

功能 LangGraph EduAgentX Workflow
DAG执行
条件分支
并行执行
Checkpoint
HITL
Agent多租户 ×
Tool调用统一管理 ×
Memory整合 ×
Spring生态 ×

十二、案例演示

生成学习报告流程:

text 复制代码
User提交请求 → WorkflowEngine创建实例 → ScoreNode → AnalysisNode → RecommendNode → ReportNode → 返回结果

节点状态:

Node Status Result
ScoreNode SUCCESS {score: 90}
AnalysisNode SUCCESS {weak_subjects:"Math","English"}
RecommendNode SUCCESS {courses:"Advanced Math","English Grammar"}
ReportNode SUCCESS {report_url:"..."}

十三、核心优化策略

  1. 节点缓存

    • 避免重复计算,降低Token消耗
  2. 异步并行执行

    • 提升吞吐量
  3. 上下文整合

    • Memory + Prompt + Knowledge融合
  4. 事件驱动调度

    • Event Bus解耦节点执行
  5. 重试与失败补偿机制

    • 提升系统稳定性

十四、企业落地价值

  • 统一工作流引擎,实现跨Agent任务编排
  • 支持复杂业务流程,多分支、多并行、人工介入
  • 完全可扩展,支持插件化工具与Agent
  • 可与AI OS、Multi-Agent平台、MCP无缝集成
  • 降低企业AI系统维护成本,提高开发效率

十五、面试高频问答

Workflow Engine

和Agent Engine区别?

  • Agent Engine:执行单个Agent任务
  • Workflow Engine:组织多个Agent任务,编排复杂流程

为什么要支持DAG而不是简单顺序?

  • 顺序执行无法支持分支、并行、条件
  • DAG保证依赖关系,同时可扩展

Workflow Engine的关键挑战?

  • 节点调度、并行与依赖关系
  • 异常处理与重试机制
  • HITL支持
  • 上下文管理与Memory整合
  • 可视化与监控

总结

到这里,你已经完成了:

  1. 企业级 Agent Framework
  2. 企业级 Workflow Engine
  3. 支持 DAG、条件分支、并行执行、HITL
  4. Node/Task/Workflow 完整生命周期管理
  5. 数据库持久化、事件驱动、重试与Checkpoint机制