From 357bdcc0020f90986c5c85b441adb77a3102211e Mon Sep 17 00:00:00 2001 From: huangyongxing <1473504781@qq.com> Date: Wed, 1 Apr 2026 21:03:53 +0800 Subject: [PATCH] =?UTF-8?q?4.1=E9=A1=B9=E7=9B=AE=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.1黄永兴-项目案例笔记.docx | Bin 0 -> 22042 bytes .../.mvn/wrapper/maven-wrapper.properties | 3 + .../SpringAIAlibaba/SpringAIAlibaba.iml | 10 ++ .../智能客服demo/SpringAIAlibaba/pom.xml | 127 +++++++++++++++ .../SpringAiAlibabaApplication.java | 13 ++ .../controller/CustomerServiceController.java | 177 +++++++++++++++++++++ .../src/main/resources/application.yml | 13 ++ .../SpringAiAlibabaApplicationTests.java | 13 ++ .../SpringAIAlibaba/target/classes/application.yml | 13 ++ .../SpringAiAlibabaApplication.class | Bin 0 -> 788 bytes .../controller/CustomerServiceController.class | Bin 0 -> 7240 bytes .../SpringAiAlibabaApplicationTests.class | Bin 0 -> 883 bytes 12 files changed, 369 insertions(+) create mode 100644 黄永兴学习笔记/4.1黄永兴-项目案例笔记.docx create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/.mvn/wrapper/maven-wrapper.properties create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/SpringAIAlibaba.iml create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/pom.xml create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/SpringAiAlibabaApplication.java create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/controller/CustomerServiceController.java create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/resources/application.yml create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/test/java/com/example/springaialibaba/SpringAiAlibabaApplicationTests.java create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/application.yml create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/com/example/springaialibaba/SpringAiAlibabaApplication.class create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/com/example/springaialibaba/controller/CustomerServiceController.class create mode 100644 黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/test-classes/com/example/springaialibaba/SpringAiAlibabaApplicationTests.class diff --git a/黄永兴学习笔记/4.1黄永兴-项目案例笔记.docx b/黄永兴学习笔记/4.1黄永兴-项目案例笔记.docx new file mode 100644 index 0000000000000000000000000000000000000000..158b0f1884b79e34f24f123a363b7d5aba21b8c6 GIT binary patch literal 22042 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 Y0Sglf!X^j*XTb`%j$c}^CE?Tm0nhY9Gynhq literal 0 HcmV?d00001 diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/.mvn/wrapper/maven-wrapper.properties b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..c595b00 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.14/apache-maven-3.9.14-bin.zip diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/SpringAIAlibaba.iml b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/SpringAIAlibaba.iml new file mode 100644 index 0000000..d62c586 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/SpringAIAlibaba.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/pom.xml b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/pom.xml new file mode 100644 index 0000000..2f3e575 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.13 + + + com.example + SpringAIAlibaba + 1.1.2.0 + SpringAIAlibaba + SpringAIAlibaba + + + 17 + + 2.22.13 + + 2.2.21 + + + + + + + + + + + + + + + + + + + + com.alibaba.cloud.ai + spring-ai-alibaba-bom + 1.1.2.0 + pom + import + + + org.springframework.ai + spring-ai-bom + 1.1.2 + pom + import + + + com.alibaba.cloud.ai + spring-ai-alibaba-extensions-bom + 1.1.2.1 + pom + import + + + + + + + + + + com.alibaba.cloud.ai + spring-ai-alibaba-agent-framework + 1.1.2.0 + + + + + com.alibaba.cloud.ai + spring-ai-alibaba-starter-dashscope + 1.1.2.0 + + + + org.springframework.boot + spring-boot-starter-web + + + + io.projectreactor.addons + reactor-adapter + 3.5.0 + + + + org.projectlombok + lombok + true + + + + + com.alibaba + dashscope-sdk-java + ${dashscope.version} + + + + + io.reactivex.rxjava2 + rxjava + ${rxjava.version} + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/SpringAiAlibabaApplication.java b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/SpringAiAlibabaApplication.java new file mode 100644 index 0000000..3b60de0 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/SpringAiAlibabaApplication.java @@ -0,0 +1,13 @@ +package com.example.springaialibaba; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringAiAlibabaApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringAiAlibabaApplication.class, args); + } + +} diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/controller/CustomerServiceController.java b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/controller/CustomerServiceController.java new file mode 100644 index 0000000..d42acb0 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/java/com/example/springaialibaba/controller/CustomerServiceController.java @@ -0,0 +1,177 @@ +package com.example.springaialibaba.controller; + + +import com.alibaba.cloud.ai.dashscope.agent.DashScopeAgent; +import com.alibaba.cloud.ai.dashscope.agent.DashScopeAgentOptions; +import com.alibaba.dashscope.app.Application; +import com.alibaba.dashscope.app.ApplicationParam; +import com.alibaba.dashscope.app.ApplicationResult; +import com.alibaba.dashscope.app.FlowStreamMode; +import com.alibaba.dashscope.exception.InputRequiredException; +import com.alibaba.dashscope.exception.NoApiKeyException; +import io.reactivex.Flowable; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.adapter.rxjava.RxJava2Adapter; +import reactor.core.publisher.Flux; + +import java.nio.charset.StandardCharsets; + +@Slf4j +@RestController +@RequiredArgsConstructor //使用RequiredArgsConstructor注解,自动注入final类型的字段 +@RequestMapping("/customer") +public class CustomerServiceController { + + //注入Spring AI Alibaba Agent + //@Autowired + private final DashScopeAgent dashScopeAgent; + + /** + * 智能客服接口(非流式,同步获取结果) + * @param question 用户问题 + * @return 知识库标准答案 + */ + @GetMapping("/service") + public String customerService(@RequestParam("question") String question) { + + try { + /* + DashScopeAgentOptions 是工作流 / 智能体的调用参数,它只负责「触发工作流」,不负责「修改大模型的推理参数」。 + 因为 Spring AI Alibaba 的自动配置在工作流(Agent)模式下不生效! + */ + + // + /* ChatResponse response = dashScopeAgent.call( + new Prompt(question, DashScopeAgentOptions.builder() + .appId("df04e1abf24a416c8702260e88863ac4") + .build() + ) + ); + + return response.getResult().getOutput().getText();*/ + + ApplicationParam param = ApplicationParam.builder() + // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。 + .apiKey(System.getenv("sk-f7d2253302b547c7a2fe257673cb854b")) + .appId("df04e1abf24a416c8702260e88863ac4") + .prompt(question) + .build(); + + Application application = new Application(); + ApplicationResult result = application.call(param); + return result.getOutput().getText(); + + } catch (Exception e) { + log.error("客服调用失败", e); + return "抱歉,智能客服暂时无法响应,请联系人工客服。"; + } + } + + // 官方原生流式调用(1:1对照文档) + @GetMapping(value = "/service2", produces = MediaType.TEXT_HTML_VALUE + ";charset=UTF-8") + public Flux customerService2( + @RequestParam("question") String question, + HttpServletResponse response + ) { + //设置字符编码为UTF-8,解决中文乱码问题 + response.setCharacterEncoding("UTF-8"); + + try { + // ============================================== + // 【官方原版写法】 + // ============================================== + ApplicationParam param = ApplicationParam.builder() + .apiKey("sk-f7d2253302b547c7a2fe257673cb854b") // 你的API Key + .appId("df04e1abf24a416c8702260e88863ac4") + .prompt(question) + .incrementalOutput(true) // 官方:流式必须开 + .flowStreamMode(FlowStreamMode.MESSAGE_FORMAT) // 设置为流模式 + .build(); + + Application application = new Application(); + + // 官方流式调用 + Flowable resultFlowable = application.streamCall(param); + + // 把 RxJava Flowable → Spring Flux(用于SSE输出) + // 正确的流式处理逻辑 + System.out.println(resultFlowable); + +/* return Flux.create(sink -> { + resultFlowable.subscribe( + res -> { + try { + if (res != null && res.getOutput() != null) { + String content = null; + + if ("stop".equals(res.getOutput().getFinishReason())) { + // 流结束 + content = res.getOutput().getText(); + if (content != null && !content.trim().isEmpty()) { + sink.next("data: " + content + "\n\n"); + } + } else { + // 流式输出 + if (res.getOutput().getWorkflowMessage() != null && + res.getOutput().getWorkflowMessage().getMessage() != null) { + + content = res.getOutput().getWorkflowMessage() + .getMessage().getContent(); + + if (content != null && !content.trim().isEmpty()) { + sink.next("data: " + content + "\n\n"); + } + } + } + } + } catch (Exception e) { + log.error("处理响应异常", e); + } + }, + error -> { + log.error("流式调用异常", error); + sink.next("data: 服务调用异常\n\n"); + sink.complete(); + }, + () -> { + log.info("流式调用完成"); + sink.complete(); + } + ); + });*/ + + // RxJava适配器 flowable 转换为 flux + return RxJava2Adapter.flowableToFlux(resultFlowable) + .map(this::extractContent) + .filter(content -> content != null && !content.trim().isEmpty()) + .map(content -> "data: " + content + "\n\n"); + + + } catch (Exception e) { + log.error("客服调用失败", e); + return Flux.error(e); + } + } + + // 从 ApplicationResult 中提取内容 + private String extractContent(ApplicationResult res) { + if (res == null || res.getOutput() == null) return null; + + if ("stop".equals(res.getOutput().getFinishReason())) { + return res.getOutput().getText(); + } else if (res.getOutput().getWorkflowMessage() != null && + res.getOutput().getWorkflowMessage().getMessage() != null) { + return res.getOutput().getWorkflowMessage().getMessage().getContent(); + } + return null; + } +} \ No newline at end of file diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/resources/application.yml b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/resources/application.yml new file mode 100644 index 0000000..fecb5d1 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/main/resources/application.yml @@ -0,0 +1,13 @@ +server: + port: 8080 + +spring: + ai: + dashscope: + # 核心:工作流应用的AppId + agent: + app-id: df04e1abf24a416c8702260e88863ac4 + # 核心:你的API-Key + api-key: sk-f7d2253302b547c7a2fe257673cb854b + # 业务空间ID + workspace-id: llm-fuczq7vkh8vyz716 diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/test/java/com/example/springaialibaba/SpringAiAlibabaApplicationTests.java b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/test/java/com/example/springaialibaba/SpringAiAlibabaApplicationTests.java new file mode 100644 index 0000000..ac8a730 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/src/test/java/com/example/springaialibaba/SpringAiAlibabaApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.springaialibaba; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringAiAlibabaApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/application.yml b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/application.yml new file mode 100644 index 0000000..fecb5d1 --- /dev/null +++ b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/application.yml @@ -0,0 +1,13 @@ +server: + port: 8080 + +spring: + ai: + dashscope: + # 核心:工作流应用的AppId + agent: + app-id: df04e1abf24a416c8702260e88863ac4 + # 核心:你的API-Key + api-key: sk-f7d2253302b547c7a2fe257673cb854b + # 业务空间ID + workspace-id: llm-fuczq7vkh8vyz716 diff --git a/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/com/example/springaialibaba/SpringAiAlibabaApplication.class b/黄永兴学习笔记/智能客服demo/SpringAIAlibaba/target/classes/com/example/springaialibaba/SpringAiAlibabaApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..a7758aa8ee5f11f56fe04b1d715eb13071464943 GIT binary patch literal 788 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 literal 0 HcmV?d00001