
学习内容一览Spring AI 2.0核心架构ChatClient、ChatModel、Advisors API第一个Spring AI项目搭建引入 spring-ai-starter配置 API Key完成 Hello WorldSpring AI抽象设计理解模型切换仅需修改配置无需更改代码流式输出Streaming体验借助 Spring WebFlux 实现“打字机”式输出推荐资源Spring AI官方文档 简介 :: Spring AI 中文文档Spring Initializr https://start.spring.io/项目搭建与第一个接口目标创建 Spring AI 项目配置 DeepSeek/通义千问跑通第一个对话接口步骤详解1. 创建项目方式一推荐使用 Spring Initializr 快速生成访问 Spring Initializr主要配置如下Project:MavenLanguage:JavaSpring Boot:4.1.1Java:21Dependencies: Spring Web Spring AI OpenAIDeepSeek/通义千问兼容 OpenAI 接口选这个 starter 即可方式二手动创建 Maven 项目参考核心 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 parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version4.1.1/version relativePath/ /parent groupIdcom.hejie/groupId artifactIdai-study/artifactId version0.0.1-SNAPSHOT/version nameai-study/name properties java.version21/java.version spring-ai.version2.0.1/spring-ai.version /properties dependencies !-- Spring Boot Starter Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring AI -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency !-- Resilience4j -- dependency groupIdio.github.resilience4j/groupId artifactIdresilience4j-spring-boot3/artifactId version2.1.0/version /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project2. 配置application.yml重点API Key 使用环境变量不要写死在配置文件支持 DeepSeek 和通义千问Qwen3.8-27b模型切换集成 Resilience4j 实现熔断、限流、超时、舱壁等能力server: port: 8080 spring: application: name: ai-study servlet: encoding: enabled: true force-response: true charset: UTF-8 threads: virtual: enabled: true ai: openai: api-key: ${OPENAI_API_KEY} # DeepSeek # base-url: https://api.deepseek.com # chat: # model: deepseek-chat # temperature: 0.7 # 通义千问 base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 chat: model: qwen3.8-27b temperature: 0.7 logging: level: org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: DEBUG resilience4j: circuitbreaker: configs: default: slidingWindowSize: 10 failureRateThreshold: 50 waitDurationInOpenState: 10000 permittedNumberOfCallsInHalfOpenState: 5 registerHealthIndicator: true instances: default: baseConfig: default chat-service: slidingWindowSize: 10 failureRateThreshold: 50 waitDurationInOpenState: 10000 permittedNumberOfCallsInHalfOpenState: 5 registerHealthIndicator: true ratelimiter: configs: default: limitForPeriod: 100 limitRefreshPeriod: 1000ms timeoutDuration: 0ms instances: default: baseConfig: default chat-service: limitRefreshPeriod: 1000ms limitForPeriod: 5 timeoutDuration: 0 timelimiter: configs: default: timeoutDuration: 3000ms instances: default: baseConfig: default chat-service: timeoutDuration: 3000ms bulkhead: configs: default: maxConcurrentCalls: 50 maxWaitDuration: 500ms instances: default: baseConfig: default chat-service: maxConcurrentCalls: 103. ChatClient 配置3.1 通过提示词模板创建客户端Configuration public class PromptClientConfiguration { Bean public ChatClient conceptExplainChatClient(ChatModel chatModel) throws IOException { return ChatClient.builder(chatModel) .defaultSystem(new String(Files.readAllBytes(Paths.get(src/main/resources/templates/concept-explain-prompt.txt)))) .defaultUser(从以下内容中提取技术概念的名称、分类、一句话解释\n) .build(); } Bean public ChatClient codeReviewChatClient(ChatModel chatModel) throws IOException { return ChatClient.builder(chatModel) .defaultSystem(new String(Files.readAllBytes(Paths.get(src/main/resources/templates/code-review-prompt.txt)))) .defaultUser(请审查以下代码\n) .build(); } }3.2 多模型客户端配置支持“快/深”两种模式灵活应对不同场景Configuration public class MultModelsClientConfiguration { Bean(fastChatClient) public ChatClient fastChatClient(ChatClient.Builder builder) { return builder .defaultSystem(你是一个简洁的技术助手回答控制在100字以内。) .defaultOptions(ChatOptions.builder() .model(deepseek-chat) .temperature(0.3)) .build(); } Bean(deepChatClient) public ChatClient deepChatClient(ChatClient.Builder builder) { return builder .defaultSystem(你是一个资深架构师回答要详细、有深度先给框架再逐步分析。) .defaultOptions(ChatOptions.builder() .model(qwen3.8-27b) .temperature(0.7)) .build(); } }4. Controller 层接口设计4.1 聊天相关接口纯文本对话/chat/chat完整响应对象含 token 消耗等元数据/chat/detail结构化提取返回 Java 对象/chat/extract流式输出打字机效果/chat/streamRestController RequestMapping(/chat) public class ChatController { Resource private ChatClient conceptExplainChatClient; GetMapping(/chat) CircuitBreaker(name chat-service, fallbackMethod chatFallback) RateLimiter(name chat-service) TimeLimiter(name chat-service) Bulkhead(name chat-service, type Bulkhead.Type.SEMAPHORE) public String chat(RequestParam String message) { return conceptExplainChatClient.prompt() .user(message) .call() .content(); } public CompletableFutureString chatFallback(String message, Exception e) { return CompletableFuture.supplyAsync(() - 服务繁忙请稍后重试); } GetMapping(/detail) public MapString, Object chatDetail(RequestParam String message) { ChatResponse response conceptExplainChatClient.prompt() .user(message) .call() .chatResponse(); return Map.of( content, response.getResult().getOutput().getText(), model, response.getMetadata().getModel(), usage, response.getMetadata().getUsage().toString() ); } GetMapping(/extract) public TechConceptVO extract(RequestParam String text) { return conceptExplainChatClient.prompt() .user(text) .call() .entity(TechConceptVO.class); } GetMapping(value /stream, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxString chatStream(RequestParam String message) { SimpleLoggerAdvisor customLogger SimpleLoggerAdvisor.builder() .requestToString(request - 【用户提问】: request.prompt().getUserMessage()) .responseToString(response - 【AI回复】: response.getResult().getOutput().getText()) .build(); return conceptExplainChatClient.prompt() .user(message) .advisors(customLogger) .stream() .content(); } }结构化输出对象示例Data public class TechConceptVO { String name; // 概念名称 String category; // 分类 String explanation;// 一句话解释 }4.2 代码审核相关接口RestController RequestMapping(/code) public class CodeReviewController { Resource private ChatClient codeReviewChatClient; GetMapping(/review) public String reviewCode(RequestParam String code) { return codeReviewChatClient.prompt() .user(code) .call() .content(); } }4.3 多模型相关接口支持快速模式fast与深度模式deep切换满足不同对话需求RestController RequestMapping(/model) public class MutiModelController { Resource private ChatClient fastChatClient; Resource private ChatClient deepChatClient; GetMapping(/smart-chat) public String smartChat(RequestParam String message, RequestParam(defaultValue fast) String mode) { ChatClient client deep.equals(mode) ? deepChatClient : fastChatClient; return client.prompt() .user(message) .call() .content(); } }5. 启动与测试设置环境变量启动项目export OPENAI_API_KEY你的key mvn spring-boot:run接口测试示例访问纯文本对话接口http://localhost:8080/chat/chat?message你好请用一句话介绍你自己查看 prompt 设置http://localhost:8080/chat/chat?message你的prompt设置是什么以上为 Spring AI 2.0 项目搭建及核心接口整理涵盖了从依赖配置、模型切换到流式输出的完整流程适合快速入门和实战参考。如有疑问欢迎留言交流