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

使用 Spring AI Alibaba Graph 实现工作流

1 依赖

<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version>
</dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-graph-core</artifactId><version>1.0.0.2</version>
</dependency><!--接入兼容OpenAI api的大模型--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai</artifactId></dependency>

2 实战

以实现一个简单的模型调用工作流为例,阐述工作流实现步骤。

2.1 实现业务节点 (NodeAction)

通用模型调用节点。

@Slf4j
public class CommonModelCallNode implements NodeAction {private ChatClient chatClient;public CommonModelCallNode(ChatClient chatClient) {this.chatClient = chatClient;}@Overridepublic Map<String, Object> apply(OverAllState state) {// 调用AI模型,生成查询String result = null;try {result = chatClient.prompt().user(u -> u.text(state.value("query", ""))).call().content();} catch (Exception e) {log.error("CommonModelCallNode error", e);HashMap<String, Object> resultMap = new HashMap<>();resultMap.put("errorMsg", e.getMessage());return resultMap;}// 将结果放入Map,该Map会根据状态策略合并到OverAllState中HashMap<String, Object> resultMap = new HashMap<>();resultMap.put("commonModelCallResult", result);return resultMap;}
}


2.2 创建工作流 (StateGraph)

创建工作流时,需要定义状态策略。

@Configuration
public class GraphConfig {@Resourceprivate ChatClient chatClient4VolcesDoubaoV1;/*** 定义状态策略* ps:定义在全局状态 OverAllState 中,各个字段的更新策略。*/@Bean("overAllStateFactory4Demo1")public OverAllStateFactory overAllStateFactory4Demo1() {return () -> {OverAllState state = new OverAllState();// 入参必须在OverAllState中注册,否则无法传递给NodeActionstate.registerKeyAndStrategy("query", new ReplaceStrategy()); // 新值替换旧值state.registerKeyAndStrategy("commonModelCallResult", new ReplaceStrategy());state.registerKeyAndStrategy("errorMsg", new ReplaceStrategy());return state;};}/*** 创建工作流*/@Bean("stateGraph4Demo1")public StateGraph stateGraph4Demo1(@Qualifier("overAllStateFactory4Demo1") OverAllStateFactory factory) throws GraphStateException {return new StateGraph("stateGraph4Demo1", factory).addNode("commonModelCallNode", node_async(new CommonModelCallNode(chatClient4VolcesDoubaoV1))) // 添加业务节点.addEdge(StateGraph.START, "commonModelCallNode") // 从开始节点连接到业务节点.addEdge("commonModelCallNode", StateGraph.END);   // 从业务节点连接到结束节点}}

2.3 编译工作流并执行

创建一个 http 接口,执行工作流。

@Slf4j
@RestController
@RequestMapping("/graph")
public class SimpleGraphController {@Resourceprivate StateGraph stateGraph4Demo1;@GetMapping("/demo1")@ResponseBodypublic BaseResponse<Map<String, Object>> demo1(@RequestParam(name = "query") String query,@RequestParam(name = "threadId", defaultValue = "test-thread") String threadId) {long startTime = System.currentTimeMillis();log.info("======>>> SimpleGraphController demo1 start. query: {}", query);if (StringUtils.isBlank(query)) {return BaseResponse.error("query 不能为空");}// 准备初始输入参数Map<String, Object> inputMap = new HashMap<>();inputMap.put("query", query);// 配置执行参数,如线程ID(用于会话追踪)RunnableConfig config = RunnableConfig.builder().threadId(threadId).build();// 执行Graph并获取最终状态CompiledGraph compiledGraph;try {compiledGraph = stateGraph4Demo1.compile();} catch (GraphStateException e) {log.error("Graph compile error: {}", e.getMessage());return BaseResponse.error("Graph compile error");}Optional<OverAllState> resultState = compiledGraph.invoke(inputMap, config);Map<String, Object> resultMap = resultState.map(OverAllState::data).orElse(new HashMap<>());log.info("======>>> SimpleGraphController demo1 end. cost:{}ms, query:{}", System.currentTimeMillis() - startTime, query);return BaseResponse.success(resultMap);}
}

2.5 打印工作流

可以打印工作流流程图。包括 PLANTUML 和 MERMAID 两种格式的语言。

public class GraphPrintTest extends BaseTest{@Resourceprivate StateGraph stateGraph4Demo1;@Testpublic void testGraphPrint() {System.out.println(stateGraph4Demo1.getGraph(GraphRepresentation.Type.PLANTUML, "Demo1工作流", true).content());System.out.println("=========================");System.out.println(stateGraph4Demo1.getGraph(GraphRepresentation.Type.MERMAID, "Demo1工作流", true).content());Assert.assertTrue(true);}}@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringAiDemoApplication.class)
public class BaseTest {
}

打印的流程图如下所示:


文章转载自:

http://wdYCxqCO.kntbk.cn
http://xlQZSpvY.kntbk.cn
http://7jjL4noX.kntbk.cn
http://5EIowB5H.kntbk.cn
http://YF5atedJ.kntbk.cn
http://L7ONAXf6.kntbk.cn
http://rGac3dCb.kntbk.cn
http://JQh9mtJA.kntbk.cn
http://bm5ShXkr.kntbk.cn
http://trunXbV8.kntbk.cn
http://soczWZOv.kntbk.cn
http://ebhTymoA.kntbk.cn
http://WjTCIp8U.kntbk.cn
http://F4YONHNF.kntbk.cn
http://y6cixRzy.kntbk.cn
http://HfBkSx5P.kntbk.cn
http://s8tZDRCy.kntbk.cn
http://wxRiFqqA.kntbk.cn
http://5cGrWQq0.kntbk.cn
http://xJ5TSsRB.kntbk.cn
http://32EyStgg.kntbk.cn
http://OQxFNXkN.kntbk.cn
http://njyIzJoE.kntbk.cn
http://tQmyoesg.kntbk.cn
http://pDPlL1RF.kntbk.cn
http://PI4lN7XJ.kntbk.cn
http://v4MkJOG2.kntbk.cn
http://R16K7CEs.kntbk.cn
http://7qCPf9mB.kntbk.cn
http://6Qqogkyt.kntbk.cn
http://www.dtcms.com/a/378897.html

相关文章:

  • 【Debug日志 | DDP 下 BatchNorm 统计失真】
  • linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)
  • 综合文化信息管理系统|基于java和小程序的综合文化信息管理系统设计与实现(源码+数据库+文档)
  • 20250911_10.1.11.46车辆定位aidata-01_Apache Doris分布式数据库全量备份(本地+异地)Python脚本
  • DenseNet网络
  • 2025胶水分装机服务商技术解析:聚焦高精度、智能化应用
  • Drawnix白板本地部署指南:cpolar实现远程创意协作
  • leetcode189.轮转数组
  • SPI设备驱动
  • 第七节,探索 ​​CSS 的高级特性、复杂布局技巧、性能优化以及与现代前端工作流的整合(二)
  • O3.2 opencv高阶
  • c语言,识别到黑色就自动开枪,4399单击游戏狙击战场,源码分享,豆包ai出品
  • Spring Boot 原理与性能优化实战
  • PHP 性能优化实战 OPcache + FPM 极限优化配置
  • solidity的高阶语法(完结篇)
  • 端–边–云一体的实时音视频转发:多路RTSP转RTMP推送技术深度剖析
  • OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】
  • git的使用命令
  • uniapp | 实现微信小程序端的分包处理
  • C/C++项目练习:命令行记账本
  • mes之生产管理
  • 【51单片机】【protues仿真】基于51单片机多功能电子秤系统
  • VSCode 下 PlatformIO 的使用
  • Shell编程:生成10个随机数,并判断最大值和最小值
  • nginx参数介绍(Nginx配置文件结构、nginx命令)
  • Java mp4parser 实现视频mp4 切割
  • 安卓13_ROM修改定制化-----系统升级(OTA 更新)后保留 Magisk 的 root 权限和相关功能
  • Codebuddy Code CLI 实战体验:从安装到生成俄罗斯方块小游戏
  • 【代码随想录day 24】 力扣 90. 集合II
  • [iOS] 属性关键字