当前位置: 首页 > news >正文

Spring AI Alibaba Graph智能工作流-顺序执行

1、官方文档

Graph 工作流编排指南 | Spring AI Alibaba

Spring AI Alibaba Graph 可以改变您构建智能代理的思维方式。使用 Graph 构建代理时,您将首先把它分解为称为**节点(nodes)的离散步骤。然后,描述每个节点的不同决策和转换。最后,通过一个共享的状态(state)**将节点连接起来,每个节点都可以读取和写入该状态。在本教程中,我们将指导您完成使用 Spring AI Alibaba Graph 构建客服邮件处理代理的思维过程。

2、多个Agent顺序执行

核心组件:SequentialAgent(框架内置顺序流水线) 底层基于 Graph 状态机OverAllState列表顺序 = Agent 执行顺序数据传递机制:outputKey+ 指令内{key}占位符自动渲染

核心概念

  • ReactAgent:最小可编排智能体单元(支持工具调用 ReAct)
  • SequentialAgent:顺序编排容器
    • subAgents(List<A,B,C>):严格按 A→B→C 串行
    • 全局状态OverAllState保存所有中间结果
  • outputKey:每个 Agent 输出存入 State 的 key
  • 占位符语法
    • {input}:用户原始输入
    • {自定义key}:读取前面 Agent 输出

3、代码

固定流水线:摘要 → 翻译 → 润色

依赖

<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-agent-framework</artifactId> </dependency>

配置类

package com.ybw.config; import com.alibaba.cloud.ai.graph.agent.ReactAgent; import com.alibaba.cloud.ai.graph.agent.flow.agent.SequentialAgent; import org.springframework.ai.chat.model.ChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @Configuration public class SequentialAgentConfig { // ChatModel 由配置自动注入(DashScope/Ollama均可) @Bean public SequentialAgent textPipelineAgent(ChatModel chatModel) { // Agent1:文本摘要 ReactAgent summaryAgent = ReactAgent.builder() .name("summary_agent") .model(chatModel) .outputKey("summary_text") // 输出存入state键名 .instruction("你是文本摘要专家,将下面内容精简为100字摘要:{input}") .build(); // Agent2:中文→英文翻译(读取上一步 summary_text) ReactAgent translateAgent = ReactAgent.builder() .name("translate_agent") .model(chatModel) .outputKey("en_text") .instruction("将下面中文翻译成地道英文,只返回译文:{summary_text}") .build(); // Agent3:英文润色(读取翻译结果 en_text) ReactAgent polishAgent = ReactAgent.builder() .name("polish_agent") .model(chatModel) .outputKey("final_result") .instruction("润色这段英文,优化语句流畅度:{en_text}") .build(); // ========== 顺序编排核心 ========== // List顺序 = 执行顺序:summary → translate → polish return SequentialAgent.builder() .name("text_sequential_pipeline") .subAgents(List.of(summaryAgent, translateAgent, polishAgent)) .build(); } }

执行链路:用户输入→ summary_agent → state ["summary_text"] → translate_agent 读取{summary_text}→ state ["en_text"] → polish_agent 读取{en_text}→ state["final_result"]

测试

package com.ybw.agent; import com.alibaba.cloud.ai.graph.OverAllState; import com.alibaba.cloud.ai.graph.agent.flow.agent.SequentialAgent; import com.alibaba.cloud.ai.graph.exception.GraphRunnerException; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; /** * @author ybw * @version V1.0 * @className SequentialAgentTest * @date 2026/7/22 **/ @SpringBootTest @Slf4j public class SequentialAgentTest { @Resource private SequentialAgent pipelineAgent; @Test public void runPipeline() throws GraphRunnerException { String userInput = "小松鼠的冬天礼物\n" + "秋风一吹,森林里的树叶就变成了金灿灿的颜色。小松鼠果果忙着收集松果,为即将到来的冬天做准备。它每天早早起床,蹦蹦跳跳地穿梭在林间,把饱满的松果藏进树洞里,不出几天,树洞就堆满了沉甸甸的粮食。\n" + "这天下午,果果路过小兔子的胡萝卜地,看见小兔子正蹲在地上叹气。原来秋风太急,把小兔子储存的胡萝卜叶子全都吹枯了,冬天的食物少了一大半。果果看着难过的小兔子,摸了摸自己满满的树洞,心里悄悄软了下来。\n" + "第二天一早,果果背着小布口袋,装了满满一袋松果送到小兔子家。小兔子又惊讶又感动,连忙摆手推辞:“这是你过冬的粮食,我不能要!”果果笑着摇摇尾巴:“我藏的松果很多,足够我吃一整个冬天啦,我们要一起分享呀!”\n" + "之后的日子里,果果又把松果分给了没有存够粮食的小刺猬和小麻雀。慢慢的,自己的树洞空了大半,果果心里却暖暖的。\n" + "寒冷的冬天如约而至,大雪覆盖了整片森林。就在果果担心食物不够时,小伙伴们纷纷来到它的家门口。小兔子带来了甜甜的胡萝卜,小刺猬带来了酸甜的野果,小麻雀衔来了饱满的草籽。\n" + "大家围坐在果果的树洞里,吃着美食,聊着趣事,温暖的笑声填满了小小的树洞。果果终于明白,真正的快乐不是独自拥有满满一堆粮食,而是真诚分享、互帮互助。这个冬天,因为善意与陪伴,一点都不寒冷。"; // 启动顺序执行 Optional<OverAllState> stateOpt = pipelineAgent.invoke(userInput); if (stateOpt.isEmpty()) { log.info("stateOpt为空"); return; } OverAllState state = stateOpt.get(); // 获取最后一个Agent输出 String finalResult = state.value("final_result") .map(Object::toString) .orElse("无结果"); log.info("finalResult:{}", finalResult); } }
http://www.jsqmd.com/news/1248958/

相关文章:

  • Unity射线检测与LineRenderer可视化实战:从原理到性能优化
  • PyTorch实战:从零构建与优化大语言模型
  • 视频去模糊技术:轻量化DSTNet的创新与实践
  • 前端工程师收藏!2026年大模型风口,你的进阶“逃生”指南
  • 数字人口型同步不是调参游戏!真正决定商业落地的3个硬件感知阈值与2个不可绕过的物理延迟硬边界
  • 深入解析Tiva TM4C123BH6ZRB设备能力寄存器:实现硬件自识别与驱动健壮性
  • CDN能力边界的技术探讨与实践
  • Webpack5 完整性能调优实战:分包、缓存、tree-shaking、压缩、CDN
  • 2026北京彩钢房回收 制冷设备回收 电线电缆回收处理指南 - LYL仔仔
  • 实测 Doubao-Seed-Evolving:把 Windows 桌面图标做成一个会自己运转的小世界
  • 2026津南区低压电气公司哪家好|德力西DZ47S、德力西CJX2S口公司碑推荐,施耐德电气一站式供货公司推荐 - mobible
  • Codex + cc-switch + GPT-5.5 国内免魔法使用教程:从注册 API 到接入 Windows/macOS 桌面版,小白也能看懂
  • TM4C123深度睡眠时钟门控与外设就绪控制实战指南
  • MediaPipe手部追踪与Rerun可视化实战
  • HarmonyOS《柚兔学伴》项目实战19-云数据库——端云数据同步
  • SwiftUI:iOS 常用视图组件速查
  • 数字同事:RPA+AI如何提升团队生产力
  • 静态原生IP代理配置指南:从原理到VMLogin实战应用
  • AI公司技术架构演进与商业化路径全解析
  • 具身视觉语言导航与问答技术解析与应用
  • 帝舵青岛售后门店核验指南|权威公告最新认证网点(2026年7月最新) - 帝舵售后服务中心官网
  • Java面试八股文1000问(2026金九银十版),涵盖基础/网络/算法/设计模式/多线程
  • 兰州2026瓷砖空鼓维修靠谱推荐:厨卫阳台地砖空鼓修复 - 筑宅安
  • 苏州闲置翡翠快速变现攻略,认准易奢福 31 年连锁大品牌更靠谱 - 遁地的c
  • Appium自动化测试:详解应用启动与退出的核心配置与最佳实践
  • 实用视频格式转换工具:转GIF、转音频和各类格式转换
  • YOLOv11多模态目标检测:FDAM模块提升特征融合效果
  • 制造业智能库存管理:ERP系统如何破解库存积压与缺料难题
  • 头风隐毒探因:铅汞毒与代谢毒的双重启示
  • 文字转图片工具:提升内容创作效率的必备利器