Spring AI Alibaba 搭建示例(一):环境搭建对话 Demo

📅 2026/8/14 14:10:09
Spring AI Alibaba 搭建示例(一):环境搭建对话 Demo
一、本章概述从零开始项目环境搭建基于Deepseek和阿里云 DashScope百炼通义大模型完成第一个 AI 对话接口 Demo。Spring Ai Alibaba是基于Spring Ai的所以版本之间要做适配。版本说明版本说明 | Spring AI Alibaba项目建立的父子工程用父工程来管理依赖版本子工程只负责引入对应依赖即可。二、前期准备1. Deepseek和阿里云 DashScope需要先注册appKey2. 构建工具Maven 3.6以上版本本人使用的3.9.16版本3. JDK版本使用的214. springboot版本3.5.55. redis版本8.10.0后期会使用redis做会话记忆和向量库三、开始构建使用父子工程父工程统一管理依赖版本子工程只管引入本人的工程目录3.1 父工程pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdorg.example/groupId artifactIdSAA-demo/artifactId version1.0-SNAPSHOT/version packagingpom/packaging modules moduleSAA-01HelloWorld/module moduleSAA-02Memory/module /modules properties maven.compiler.source21/maven.compiler.source maven.compiler.target21/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding spring-boot.version3.5.5/spring-boot.version spring-ai.version1.1.2/spring-ai.version SpringAIAlibaba.version1.1.2.0/SpringAIAlibaba.version spring-ai-alibaba-extensions-bom.version1.1.2.1/spring-ai-alibaba-extensions-bom.version hutool.version5.8.46/hutool.version redisson.version3.36.0/redisson.version /properties dependencyManagement dependencies !-- Spring Boot BOM -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency !-- Spring AI Alibaba BOM -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-bom/artifactId version${SpringAIAlibaba.version}/version typepom/type scopeimport/scope /dependency !-- Spring AI BOM -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-extensions-bom/artifactId version${spring-ai-alibaba-extensions-bom.version}/version typepom/type scopeimport/scope /dependency !-- 后面的依赖可以不引入 -- dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version${hutool.version}/version /dependency dependency groupIdorg.redisson/groupId artifactIdredisson/artifactId version${redisson.version}/version /dependency /dependencies /dependencyManagement repositories repository idspring-milestones/id nameSpring Milestones/name urlhttps://repo.spring.io/milestone/url snapshots enabledfalse/enabled /snapshots /repository repository idaliyun/id nameAliyun Maven/name urlhttps://maven.aliyun.com/repository/public/url /repository /repositories /project3.2 SAA-01HelloWorld的pom.xml文件配置?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion !-- 继承父工程 SAA-demo -- parent groupIdorg.example/groupId artifactIdSAA-demo/artifactId version1.0-SNAPSHOT/version relativePath../pom.xml/relativePath /parent artifactIdSAA-01HelloWorld/artifactId nameSAA-01HelloWorld/name descriptionSAA-01HelloWorld/description properties java.version21/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !-- Spring AI Alibaba DashScope Starter核心依赖 -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter-dashscope/artifactId /dependency !-- Deepseek Starter核心依赖 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-deepseek/artifactId /dependency !-- 后面依赖主要是为了 会话记忆向量库调用MCP可暂时不添加 -- !-- 聊天记忆 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-chat-memory-repository-jdbc/artifactId /dependency !-- jdbc mysql驱动 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency !-- 向量存储 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-vector-store-redis/artifactId /dependency !-- MCP调用 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-client/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2/artifactId version2.0.64/version /dependency dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId /dependency !--redisson-- dependency groupIdorg.redisson/groupId artifactIdredisson/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId executions execution iddefault-compile/id phasecompile/phase goals goalcompile/goal /goals configuration annotationProcessorPaths path groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /path /annotationProcessorPaths /configuration /execution execution iddefault-testCompile/id phasetest-compile/phase goals goaltestCompile/goal /goals configuration annotationProcessorPaths path groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /path /annotationProcessorPaths /configuration /execution /executions /plugin /plugins /build /project3.3 application.yml 核心配置# 项目端口 server.port8080 # 调用模型返回内容编码配置 server.servlet.encoding.charsetutf-8 server.servlet.encoding.enabledtrue server.servlet.encoding.forcetrue # 配置DashScope API密钥 spring.ai.dashscope.api-key: 你的apikey spring.ai.dashscope.chat.options.model: qwen-plus # 配置DeepSeek API密钥 spring.ai.deepseek.api-key: 你的apikey spring.ai.deepseek.base-url: https://api.deepseek.com/v1 spring.ai.deepseek.chat.options.model: deepseek-v4-flash # 打印日志配置 logging.level.org.springframework.web.client: DEBUG logging.level.com.alibaba.cloud.ai.dashscope: DEBUG3.4 SAAConfig.javapackage org.example.config; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.deepseek.DeepSeekChatModel; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 配置chatModel和chatClient * 同时引入了阿里和deepseek两个模型 */ Configuration public class SAAConfig { // DashScope Resource private DashScopeChatModel dashScopeChatModel; // DeepSeek Resource private DeepSeekChatModel deepSeekChatModel; /** * 配置文件中添加了memoryspring会自动注入 * param chatMemory * return */ // DashScope ChatClient Bean public ChatClient chatClientDashScope(ChatMemory chatMemory) { return ChatClient.builder(dashScopeChatModel) .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .build(); } /** * 配置文件中添加了toolsspring会自动注入 * param chatMemory * param tools * return */ // DashScope 调用MCP的client Bean public ChatClient chatClientMcpDashScope(ChatMemory chatMemory, ToolCallbackProvider tools) { return ChatClient.builder(dashScopeChatModel) .defaultToolCallbacks(tools.getToolCallbacks()) .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .build(); } // DeepSeek ChatClient Bean public ChatClient chatClientDeepSeek() { return ChatClient.builder(deepSeekChatModel).build(); } }3.5 分别使用model和client方式调用大模型返回String类型内容是一下全部返回。返回FluxString流式响应内容是一点一点的返回。3.5.1 ModelController.javapackage org.example.controller; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; import jakarta.annotation.Resource; import org.springframework.ai.deepseek.DeepSeekChatModel; 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.core.publisher.Flux; /** * 使用chatModel调用模型 * 引入spring AI */ RestController RequestMapping(/model) public class ModelController { // Qwen3--DashScope Resource private DashScopeChatModel dashScopeChatModel; // DeepSeek Resource private DeepSeekChatModel deepSeekChatModel; /** * 测试接口 * param msg * return */ GetMapping(/test) public String test(RequestParam(value msg, defaultValue ModelController--测试接口) String msg) { return 返回内容 msg; } // DashScope GetMapping(/simple/chat) public String simpleChat(RequestParam(value msg, defaultValue 你是谁) String msg) { String call dashScopeChatModel.call(msg); return call; } GetMapping(/qwen/stream/chat) public FluxString streamChat(RequestParam(value msg, defaultValue 你是谁) String msg) { return dashScopeChatModel.stream(msg); } // DeepSeek GetMapping(/ds/simple/chat) public String dsSimpleChat(RequestParam(value msg, defaultValue 你是谁) String msg) { String call deepSeekChatModel.call(msg); return call; } GetMapping(/ds/stream/chat) public FluxString dsStreamChat(RequestParam(value msg, defaultValue 你是谁) String msg) { return deepSeekChatModel.stream(msg); } }3.5.2 ClientController.javapackage org.example.controller; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.memory.ChatMemoryRepository; import org.springframework.ai.chat.memory.MessageWindowChatMemory; import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository; import org.springframework.ai.chat.memory.repository.jdbc.MysqlChatMemoryRepositoryDialect; import org.springframework.beans.factory.annotation.Autowired; 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.core.publisher.Flux; import java.util.List; /** * 使用chatClient调用模型 * 引入spring AI Alibaba */ RestController RequestMapping(/client) Slf4j public class ClientController { Resource(name chatClientDashScope) private ChatClient chatClientDashScope; Resource(name chatClientDeepSeek) private ChatClient chatClientDeepSeek; /** * 测试接口 * param msg * return */ GetMapping(/test) public String test(RequestParam(value msg, defaultValue ClientController--测试接口) String msg) { return 返回内容 msg; } // DashScope GetMapping(/simple/chat) public String simpleChat(RequestParam(value msg, defaultValue 你是谁) String msg) { String content chatClientDashScope.prompt().user(msg).call().content(); return content; } GetMapping(/stream/chat) public FluxString streamChat(RequestParam(value msg, defaultValue 你是谁) String msg) { FluxString content chatClientDashScope.prompt().user(msg).stream().content(); return content; } // deepseek GetMapping(/ds/simple/chat) public String dsSimpleChat(RequestParam(value msg, defaultValue 你是谁) String msg) { String content chatClientDeepSeek.prompt().user(msg).call().content(); return content; } GetMapping(/ds/stream/chat) public FluxString dsStreamChat(RequestParam(value msg, defaultValue 你是谁) String msg) { FluxString content chatClientDeepSeek.prompt().user(msg).stream().content(); return content; } }3.6 项目测试验证启动 SpringBoot 项目确保控制台无报错、端口 8080 正常启动浏览器/Postman 访问接口正常返回大模型问答内容即环境搭建、接口调用全部成功