目录

    • 工作流概念
    • 工作流程图
    • spring-boot 编码
      • 定义节点 (Node)
      • 定义节点图StateGraph
      • controller测试
        • 浏览器测试用户输入

工作流概念

工作流是以相对固化的模式来人为地拆解任务,将一个大任务拆解为包含多个分支的固化流程。工作流的优势是确定性强,模型作为流程中的一个节点起到的更多是一个分类决策、内容生成的职责,因此它更适合意图识别等类别属性强的应用场景。

参考文档:https://java2ai.com/docs/1.0.0.2/get-started/workflow/?spm=4347728f.7cee0e64.0.0.39076dd1jbppqZ

工作流程图

商品评价分类流程图:
在这里插入图片描述

如用户反馈

  • This product is excellent, I love it!
    则输出:Praise, no action taken.
    说明:很好,不需要改进措施

  • The product broke after one day, very disappointed."
    则输出:product quality
    说明:有问题,产品质量问题

spring-boot 编码

使用:Spring AI Alibaba Graph

附maven的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo-spring-test</artifactId><version>0.0.1-SNAPSHOT</version><name>demo-spring-test</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.0</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI Alibaba(通义大模型支持) --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M6.1</version></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>1.0.0-M6</version></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-autoconfigure</artifactId><version>1.0.0-M6.1</version></dependency><!-- 引入 Graph 核心依赖 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-graph-core</artifactId><version>1.0.0.2</version></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-document-parser-tika</artifactId><version>1.0.0.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

定义节点 (Node)

创建工作流中的核心节点,包括两个文本分类节点和一个记录节点

分类

// 评价正负分类节点
QuestionClassifierNode feedbackClassifier = QuestionClassifierNode.builder().chatClient(chatClient).inputTextKey("input").categories(List.of("positive feedback", "negative feedback")).classificationInstructions(List.of("Try to understand the user's feeling when he/she is giving the feedback.")).build();
// 负面评价具体问题分类节点
QuestionClassifierNode specificQuestionClassifier = QuestionClassifierNode.builder().chatClient(chatClient).inputTextKey("input").categories(List.of("after-sale service", "transportation", "product quality", "others")).classificationInstructions(List.of("What kind of service or help the customer is trying to get from us? " +"Classify the question based on your understanding.")).build();

记录节点 RecordingNode:


import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.action.NodeAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.HashMap;
import java.util.Map;public class RecordingNode implements NodeAction {private static final Logger logger = LoggerFactory.getLogger(RecordingNode.class);@Overridepublic Map<String, Object> apply(OverAllState state) throws Exception {String feedback = (String) state.value("classifier_output").get();Map<String, Object> updatedState = new HashMap<>();if (feedback.contains("positive")) {logger.info("Received positive feedback: {}", feedback);updatedState.put("solution", "Praise, no action taken.");} else {logger.info("Received negative feedback: {}", feedback);updatedState.put("solution", feedback);}return updatedState;}}

定义节点图StateGraph

StateGraph graph = new StateGraph("Consumer Service Workflow Demo", stateFactory)// 添加节点.addNode("feedback_classifier", node_async(feedbackClassifier)).addNode("specific_question_classifier", node_async(specificQuestionClassifier)).addNode("recorder", node_async(recordingNode))// 定义边(流程顺序).addEdge(START, "feedback_classifier")  // 起始节点.addConditionalEdges("feedback_classifier",edge_async(new CustomerServiceController.FeedbackQuestionDispatcher()),Map.of("positive", "recorder", "negative", "specific_question_classifier")).addConditionalEdges("specific_question_classifier",edge_async(new CustomerServiceController.SpecificQuestionDispatcher()),Map.of("after-sale", "recorder", "transportation", "recorder","quality", "recorder", "others", "recorder")).addEdge("recorder", END);  // 结束节点System.out.println("\n");return graph;

完整代码:

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.OverAllStateFactory;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.exception.GraphStateException;
import com.alibaba.cloud.ai.graph.node.QuestionClassifierNode;
import com.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;
import java.util.Map;import static com.alibaba.cloud.ai.graph.StateGraph.END;
import static com.alibaba.cloud.ai.graph.StateGraph.START;
import static com.alibaba.cloud.ai.graph.action.AsyncEdgeAction.edge_async;
import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.node_async;@Configuration
public class WorkflowAutoconfiguration {@Beanpublic StateGraph workflowGraph(ChatModel chatModel) throws GraphStateException {ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build();RecordingNode recordingNode = new RecordingNode();// 评价正负分类节点QuestionClassifierNode feedbackClassifier = QuestionClassifierNode.builder().chatClient(chatClient).inputTextKey("input").categories(List.of("positive feedback", "negative feedback")).classificationInstructions(List.of("Try to understand the user's feeling when he/she is giving the feedback.")).build();// 负面评价具体问题分类节点QuestionClassifierNode specificQuestionClassifier = QuestionClassifierNode.builder().chatClient(chatClient).inputTextKey("input").categories(List.of("after-sale service", "transportation", "product quality", "others")).classificationInstructions(List.of("What kind of service or help the customer is trying to get from us? " +"Classify the question based on your understanding.")).build();// 定义一个 OverAllStateFactory,用于在每次执行工作流时创建初始的全局状态对象OverAllStateFactory stateFactory = () -> {OverAllState state = new OverAllState();state.registerKeyAndStrategy("input", new ReplaceStrategy());state.registerKeyAndStrategy("classifier_output", new ReplaceStrategy());state.registerKeyAndStrategy("solution", new ReplaceStrategy());return state;};StateGraph graph = new StateGraph("Consumer Service Workflow Demo", stateFactory).addNode("feedback_classifier", node_async(feedbackClassifier)).addNode("specific_question_classifier", node_async(specificQuestionClassifier)).addNode("recorder", node_async(recordingNode))// 定义边(流程顺序).addEdge(START, "feedback_classifier")  // 起始节点.addConditionalEdges("feedback_classifier",edge_async(new CustomerServiceController.FeedbackQuestionDispatcher()),Map.of("positive", "recorder", "negative", "specific_question_classifier")).addConditionalEdges("specific_question_classifier",edge_async(new CustomerServiceController.SpecificQuestionDispatcher()),Map.of("after-sale", "recorder", "transportation", "recorder","quality", "recorder", "others", "recorder")).addEdge("recorder", END);  // 结束节点System.out.println("\n");return graph;}}

controller测试

  • CustomerServiceController 完整代码
import java.util.HashMap;
import java.util.Map;import com.alibaba.cloud.ai.graph.CompiledGraph;
import com.alibaba.cloud.ai.graph.exception.GraphStateException;
import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.action.EdgeAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/customer")
public class CustomerServiceController {private static final Logger logger = LoggerFactory.getLogger(CustomerServiceController.class);private CompiledGraph compiledGraph;public CustomerServiceController(@Qualifier("workflowGraph") StateGraph stateGraph) throws GraphStateException {this.compiledGraph = stateGraph.compile();}/*** localhost:8080/customer/chat?query=The product broke after one day, very disappointed.*/@GetMapping("/chat")public String simpleChat(String query) throws Exception {logger.info("simpleChat: {}", query);return compiledGraph.invoke(Map.of("input", query)).get().value("solution").get().toString();}public static class FeedbackQuestionDispatcher implements EdgeAction {@Overridepublic String apply(OverAllState state) throws Exception {/*** 反馈的是商品的负面内容* 分类为:negative*/String classifierOutput = (String) state.value("classifier_output").orElse("");logger.info("classifierOutput: {}", classifierOutput);if (classifierOutput.contains("positive")) {return "positive";}return "negative";}}public static class SpecificQuestionDispatcher implements EdgeAction {@Overridepublic String apply(OverAllState state) throws Exception {/*** 反馈的是产品的质量* 分类为:quality*/String classifierOutput = (String) state.value("classifier_output").orElse("");logger.info("classifierOutput: {}", classifierOutput);Map<String, String> classifierMap = new HashMap<>();classifierMap.put("after-sale", "after-sale");classifierMap.put("quality", "quality");classifierMap.put("transportation", "transportation");for (Map.Entry<String, String> entry : classifierMap.entrySet()) {if (classifierOutput.contains(entry.getKey())) {return entry.getValue();}}return "others";}}}
浏览器测试用户输入

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86851.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86851.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86851.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重头开始学ROS(6)---Eigen库安装与使用

Eigen库 矩阵运算是一种非常重要的运算方式&#xff0c;在Matlab中&#xff0c;矩阵运算可以轻松的实现&#xff0c;但在C这种偏底层的语言中&#xff0c;若不借助第三方库&#xff0c;矩阵运算需要我们进行较为复杂的代码设计。Eigen库是一个用于线性运算的C模板库&#xff0…

【STM32】外部中断

STM32 外部中断&#xff08;EXTI&#xff09;概述 这篇文章结合示例代码&#xff0c;系统性地讲述 STM32 外部中断&#xff08;EXTI&#xff09;实验的原理、以及配置流程。目的在于辅助读者掌握STM32F1 外部中断机制。 STM32F1xx官方资料&#xff1a;《STM32中文参考手册V10》…

LeetCode Hot100 算法题 (矩阵篇)

1、73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]// 将第一行…

Flutter基础(项目创建)

一、使用命令行创建项目 1. 确认 Flutter 环境正常 要保证 Flutter SDK 已经正确安装&#xff0c;并且环境变量配置无误。可以通过执行以下命令来验证&#xff1a; flutter doctor 要保证所有检查项都显示绿色对勾&#xff0c;要是有问题&#xff0c;可按照提示进行修复。 …

【Actix Web】Rust Web开发实战:Actix Web框架全面指南(2025企业级应用版)

​ 在2025年高并发、低延迟成为Web服务核心指标的背景下&#xff0c;​​Actix Web凭借异步Actor模型与零成本抽象​​&#xff0c;成为Rust生态中生产环境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技术&#xff0c;覆盖​​百万级并发架构设计​​、​​内存安全…

HTML之常用基础标签

HTML之常用基础标签 一、HTML文档基本结构标签1. <html>标签2. <head>标签3. <body>标签 二、文本相关基础标签1. 标题标签&#xff08;<h1> - <h6>&#xff09;2. 段落标签&#xff08;<p>&#xff09;3. 换行标签&#xff08;<br>…

外键列索引优化:加速JOIN查询的关键

在使用数据库时&#xff0c;特别是在执行涉及JOIN操作的查询时&#xff0c;优化外键列的索引是非常重要的。外键通常用于建立表之间的关联&#xff0c;而JOIN操作则是基于这些外键列来实现的。下面是一些关键步骤和技巧&#xff0c;可以帮助你优化外键列的索引&#xff0c;从而…

2025年 UI 自动化框架使用排行

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

【软考高项论文】论信息系统项目的整体管理

摘要 在信息系统项目的管理中&#xff0c;整体管理处于核心地位&#xff0c;对项目全局规划与协调起着关键作用&#xff0c;保障项目各阶段目标一致且高效执行。本文结合作者参与的 2024 年 6 月启动的信息系统项目&#xff0c;深入探讨项目整体管理的过程&#xff0c;着重阐述…

(4)Wireshark捕获设置

1.简介 WireShark的强大之处就在于不用你再做任何配置就可以抓取http或者https的包。主要是讲解和分享如何使用WireShark抓包。 2.运行Wireshark 安装好 Wireshark 以后&#xff0c;就可以运行它来捕获数据包了。方法如下&#xff1a; 1.在 Windows 的“开始”菜单中&#…

智慧校园电子班牌系统源码的开发与应用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7数据库

智慧校园系统源码&#xff0c;智慧班牌源码&#xff0c;java语言 技术栈&#xff1a; ‌后端开发‌&#xff1a;采用Java语言和Spring Boot框架进行开发。Java是一种广泛使用的、面向对象的编程语言&#xff0c;而Spring Boot是基于Spring框架的快速应用开发框架&#xff0c;能…

工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三种常见的实时通信技术&#xff0c;它们的核心区别在于通信方向、协议实现、数据格式和适用场景。以下是分维度的详细解释&#xff0c;并附带Python示例和应用场景选…

【TiDB 社区智慧合集】 TiDB x 运营商|掌上营业厅、账务、物联网等多核心业务场景的实战应用案例

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/bb1467af 在信息基础设施国产化战略加速落地的背景下&#xff0c;电信及广电领域正迎来数据库国产化替代的关键转型期。TiDB 凭借自身技术创新优势&#xff0c;深度携手各大运营商&#xff0c;以全…

Java 17 下 Spring Boot 与 Pulsar 队列集成实战:生产者与消费者实现指南

Pulsar队列与Springboot集成有2种模式&#xff1a;官方pulsar-client 或社区Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考虑最新、最快、最齐全的功能&#xff0c;使用官方pulsar-client如果考虑快速低成本接入&#xff0c;使用社区Starter&#xff0…

《Go语言高级编程》RPC 入门

《Go语言高级编程》RPC 入门 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是分布式系统中不同节点间的通信方式&#xff0c;允许程序像调用本地函数一样调用远程服务的方法。 Go 语言的标准库 net/rpc 提供了基础的…

第N5周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.加载数据 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘

根目录下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"腾讯地图申请的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】结构化面试开口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 结构化 面试 开口秘笈 目 录 第一章 自我认知类 ........................................................................................................................... 2 第二章 工作关系处理类 .......…

Webpack 热更新(HMR)原理详解

&#x1f525; Webpack 热更新&#xff08;HMR&#xff09;原理详解 &#x1f4cc; 本文适用于 Vue、React 等使用 Webpack 的项目开发者&#xff0c;适配 Vue CLI / 自定义 Webpack 项目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…

MySQL索引完全指南

一、索引是什么&#xff1f;为什么这么重要&#xff1f; 索引就像字典的目录 想象一下&#xff0c;你要在一本1000页的字典里找"程序员"这个词&#xff0c;你会怎么做&#xff1f; 没有目录&#xff1a;从第1页开始一页一页翻&#xff0c;可能要翻500页才能找到有…