☰
第一章:3、Spring AI 2.0 入门
2026/10/9 7:53:59 网站建设 项目流程

学习内容一览

  • Spring AI 2.0核心架构:ChatClient、ChatModel、Advisors API
  • 第一个Spring AI项目搭建:引入 spring-ai-starter,配置 API Key,完成 Hello World
  • Spring AI抽象设计理解:模型切换仅需修改配置,无需更改代码
  • 流式输出(Streaming)体验:借助 Spring WebFlux 实现“打字机”式输出

推荐资源

  • Spring AI官方文档: 简介 :: Spring AI 中文文档
  • Spring Initializr: https://start.spring.io/

项目搭建与第一个接口

目标

创建 Spring AI 项目,配置 DeepSeek/通义千问,跑通第一个对话接口

步骤详解

1. 创建项目
方式一(推荐):使用 Spring Initializr 快速生成
  • 访问 Spring Initializr
  • 主要配置如下:
    • Project:Maven
    • Language:Java
    • Spring Boot:4.1.1
    • Java:21
    • Dependencies: Spring Web + Spring AI OpenAI
DeepSeek/通义千问兼容 OpenAI 接口,选这个 starter 即可
方式二:手动创建 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>4.1.1</version> <relativePath/> </parent> <groupId>com.hejie</groupId> <artifactId>ai-study</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ai-study</name> <properties> <java.version>21</java.version> <spring-ai.version>2.0.1</spring-ai.version> </properties> <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring AI --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> <!-- Resilience4j --> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot3</artifactId> <version>2.1.0</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

2. 配置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: 10

3. 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/stream
@RestController @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 CompletableFuture<String> chatFallback(String message, Exception e) { return CompletableFuture.supplyAsync(() -> "服务繁忙,请稍后重试"); } @GetMapping("/detail") public Map<String, 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 Flux<String> 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 项目搭建及核心接口整理,涵盖了从依赖配置、模型切换到流式输出的完整流程,适合快速入门和实战参考。如有疑问,欢迎留言交流!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询