SpringAI Alibaba官方Demo地址:spring-ai-alibaba-examples/spring-ai-alibaba-graph-example at main · springaialibaba/spring-ai-alibaba-examples

6. SpringAI Alibaba Graph

6.1. 概述

Spring AI Alibaba Graph 是一款面向 Java 开发者的工作流、多智能体框架,用于构建由多个 AI 模型或步骤组成的复杂应用。它基于 Spring Boot 生态进行深度集成,提供声明式的 API 来编排工作流,让开发者能将 AI 应用的各个步骤抽象为节点(Node),并通过有向图(Graph)的形式连接这些节点,形成可定制的执行流程。与传统单 Agent(一问一答式)方案相比,Spring AI Alibaba Graph 支持更复杂的多步骤任务流程,有助于解决单一大模型对复杂任务力不从心的问题。

6.2. 核心概念

  1. StateGraph(状态图/工作流图):定义整个工作流的主类。 支持添加节点(addNode)、边(addEdge、addConditionalEdges)、条件分支、子图等。 可校验图结构,最终编译为 CompiledGraph 以供执行

  2. Node(节点):表示工作流中的单个步骤(如模型调用、数据处理等)。 支持异步节点,可封装大模型调用或自定义逻辑。

  3. Edge(边):表示节点之间的转移关系。 支持条件分支(根据状态决定下一个节点)。

  4. OverAllState(全局状态):可序列化的全局状态对象,贯穿整个工作流。 支持按 key 注册不同的合并/更新策略(如替换、合并等)。 用于数据传递、断点续跑、人工干预等。

  5. CompiledGraph(已编译图):StateGraph 的可执行版本。 负责实际的节点执行、状态流转、结果流式输出。 支持中断、并行节点、检查点等高级特性。

6.3. 示例

  1. 引入依赖:

    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        <version>1.0.0.1</version>
    </dependency>
    ​
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-graph-core</artifactId>
        <version>1.0.0.1</version>
    </dependency>

    添加依赖后,在项目的 application.yml 中配置模型 API 密钥:

    ai.dashscope.api-key: ${AI_DASHSCOPE_API_KEY};
  2. 创建ChatClient

    // 引入依赖后, Spring容器会自动生成一个chatModel bean对象
    ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build();
  3. 设置全局状态 OverAllState:定义一个 OverAllStateFactory,注册若干 Key 及其更新策略来管理上下文数据

    OverAllStateFactory stateFactory = () -> {
        // 创建并配置一个状态对象,可看成贯穿整个工作流的全局变量,用于管理写作助手的工作流程中的数据。
        OverAllState state = new OverAllState();
        // 注册工作流中使用到的各个状态项,并为每个状态项指定替换策略:
        state.registerKeyAndStrategy("original_text", new ReplaceStrategy());   // 存储原始输入文本
        state.registerKeyAndStrategy("summary", new ReplaceStrategy());         // 存储生成的摘要内容
        state.registerKeyAndStrategy("summary_feedback", new ReplaceStrategy());// 存储对摘要的反馈(如正面或负面)
        state.registerKeyAndStrategy("reworded", new ReplaceStrategy());        // 存储经过改写后的内容
        state.registerKeyAndStrategy("title", new ReplaceStrategy());           // 存储最终生成的文章标题
        return state;
    };
  4. 定义节点 (Node):创建工作流中的核心节点,包括两个文本分类节点和一个记录节点;

    节点定义见: Spring-ai-alibaba-examples/spring-ai-alibaba-graph-example项目下的FeedbackDispatcherRewordingNodeSummarizerNodeSummaryFeedbackClassifierNodeTitleGeneratorNode

    关注这些类实现的接口、返回值类型的区别;(看注释,不懂或忘了重新问GPT)

  5. 添加节点到 StateGraph

    StateGraph graph = new StateGraph("Writing Assistant with Feedback Loop", stateFactory.create())
        // 添加节点:summarizer - 用于生成原始文本的摘要
        .addNode("summarizer", node_async(new SummarizerNode(chatClient)))
        // 添加节点:feedback_classifier - 对生成的摘要进行反馈分类(positive/negative)
        .addNode("feedback_classifier", node_async(new SummaryFeedbackClassifierNode(chatClient, "summary")))
        // 添加节点:reworder - 如果摘要反馈为正面,则对其进行语言润色改写
        .addNode("reworder", node_async(new RewordingNode(chatClient)))
        // 添加节点:title_generator - 根据改写后的内容生成一个吸引人的标题
        .addNode("title_generator", node_async(new TitleGeneratorNode(chatClient)))
        // 添加边:从流程起点开始,首先进入 summarizer 节点生成摘要
        .addEdge(START, "summarizer")
        // 摘要完成后进入 feedback_classifier 节点进行反馈判断
        .addEdge("summarizer", "feedback_classifier")
        // 根据FeedbackDispatcher类的apply()方法返回值, 做条件分支:
        //   - 如果是 positive,进入 reworder 进行内容润色
        //   - 如果是 negative,返回 summarizer 重新生成摘要
        .addConditionalEdges("feedback_classifier", edge_async(new FeedbackDispatcher()),
                Map.of("positive", "reworder", "negative", "summarizer"))
        // 内容润色完成后进入 title_generator 生成标题
        .addEdge("reworder", "title_generator")
        // 最终输出标题,流程结束
        .addEdge("title_generator", END);
  6. 编译运行

    @RestController
    @RequestMapping("/write")
    public class WritingAssistantController {
    ​
        private final CompiledGraph compiledGraph;
    ​
        @Autowired
        public WritingAssistantController(@Qualifier("writingAssistantGraph") StateGraph writingAssistantGraph)
                throws GraphStateException {
            this.compiledGraph = writingAssistantGraph.compile();  // 编译
        }
    ​
        /**
         * 调用写作助手流程图 示例请求:GET /write?text=今天我去了西湖,天气特别好,感觉特别开心
         */
        @GetMapping
        public Map<String, Object> write(@RequestParam("text") String inputText) {
            var resultFuture = compiledGraph.invoke(Map.of("original_text", inputText));
            OverAllState result = resultFuture.get();
            return result.data();
        }
    ​
    }

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐