SpringAI Alibaba Graph学习笔记
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. 核心概念
-
StateGraph(状态图/工作流图):定义整个工作流的主类。 支持添加节点(addNode)、边(addEdge、addConditionalEdges)、条件分支、子图等。 可校验图结构,最终编译为 CompiledGraph 以供执行。
-
Node(节点):表示工作流中的单个步骤(如模型调用、数据处理等)。 支持异步节点,可封装大模型调用或自定义逻辑。
-
Edge(边):表示节点之间的转移关系。 支持条件分支(根据状态决定下一个节点)。
-
OverAllState(全局状态):可序列化的全局状态对象,贯穿整个工作流。 支持按 key 注册不同的合并/更新策略(如替换、合并等)。 用于数据传递、断点续跑、人工干预等。
-
CompiledGraph(已编译图):StateGraph 的可执行版本。 负责实际的节点执行、状态流转、结果流式输出。 支持中断、并行节点、检查点等高级特性。
6.3. 示例
-
引入依赖:
<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}; -
创建ChatClient
// 引入依赖后, Spring容器会自动生成一个chatModel bean对象 ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build(); -
设置全局状态 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; }; -
定义节点 (Node):创建工作流中的核心节点,包括两个文本分类节点和一个记录节点;
节点定义见:
Spring-ai-alibaba-examples/spring-ai-alibaba-graph-example项目下的FeedbackDispatcher和RewordingNode、SummarizerNode、SummaryFeedbackClassifierNode、TitleGeneratorNode;关注这些类实现的接口、返回值类型的区别;(看注释,不懂或忘了重新问GPT)
-
添加节点到 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); -
编译运行
@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(); } }
更多推荐



所有评论(0)