当前位置: 首页 > news >正文

【2025最新】Spring Boot + Spring AI 玩转智能应用开发

一、前言

  • Spring Boot
    • 简化 Spring 应用开发的框架
    • 通过自动配置、内嵌服务器(如 Tomcat)和约定优于配置的原则,让开发者快速构建独立、生产级的应用。
  • Spring AI
    • Spring AI 是 Spring 生态中集成 AI 能力的模块
    • 旨在简化大语言模型(LLM)、生成式 AI 服务的调用,提供统一的 API 抽象层,支持 OpenAI、Azure AI、Hugging Face 等主流 AI 服务。

二、具体实现(Spring Boot + Spring AI的简单应用)

1.环境准备

  • JDK 17+
  • Maven 3.6+
  • OpenAI API Key(在平台.openai.com获取)

2.项目初始化

  • 使用 start.spring.io 生成项目,选择依赖:
    • Spring Web
    • Spring AI (选择对应版本)
  • 或直接在pom.xml中添加依赖:
<!-- Spring AI OpenAI -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.1</version> <!-- 使用最新版本 -->
</dependency><!-- Spring Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.配置OpenAI API Key

  • 在application.properties / yml中配置:
# OpenAI配置
spring.ai.openai.api-key=your-api-key-here
spring.ai.openai.chat.options.model=gpt-3.5-turbo

4.创建Controller

import org.springframework.ai.chat.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AIController {private final ChatClient chatClient;// 构造器注入public AIController(ChatClient chatClient) {this.chatClient = chatClient;}@GetMapping("/ai/chat")public String chat(@RequestParam String message) {return chatClient.call(message);}
}

5.进阶:自定义Prompt模板【提示词工程】

  • 创建更结构化的提示词模板【提示词工程】,方便AI理解和推理
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@PostMapping("/ai/translate")
public String translate(@RequestBody TranslationRequest request) {PromptTemplate promptTemplate = new PromptTemplate("""将以下{sourceLang}文本翻译成{targetLang}:{text}""");promptTemplate.add("sourceLang", request.sourceLang());promptTemplate.add("targetLang", request.targetLang());promptTemplate.add("text", request.text());return chatClient.call(promptTemplate.render());
}// DTO:名为 TranslationRequest 的记录类(record),用于存储翻译请求的信息
// 该记录类通常用于封装翻译 API 请求所需的数据
record TranslationRequest(String sourceLang, String targetLang, String text) {}

6.运行应用

  • 通过命令行或开发工具启动Spring Boot项目

7.接口测试

(1)/ai/chat 接口

  • a.在浏览器或接口测试工具中输入URL:
http://localhost:8080/ai/chat?message=用Java写一个Hello World程序
  • b.页面输出的内容:成功响应(HTTP 200 OK)
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}

(2) /ai/translate 接口

  • a.在接口测试工具(如Postman、ApiFox)中输入以下信息:
    • 请求方式:POST
    • 请求地址:http://localhost:8080/ai/translate
    • 请求头:Content-Type: application/json
    • 请求体:
// json
{"sourceLang": "中文","targetLang": "英文","text": "今天天气真好"
}  
  • b.接口返回的响应内容:成功响应(HTTP 200 ok)
// text
"Today's weather is really nice."  

8.高级配置

  • 在application.properties / yml中添加更多参数:
# 控制生成内容
spring.ai.openai.chat.options.temperature=0.7
spring.ai.openai.chat.options.max-tokens=500

9.异常处理

  • 全局异常捕获和处理:
import org.springframework.ai.openai.api.OpenAiApiException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(OpenAiApiException.class)public ResponseEntity<String> handleOpenAiError(OpenAiApiException ex) {return ResponseEntity.status(ex.getStatusCode()).body("AI服务错误: " + ex.getMessage());}
}

10.完整项目结构

src/main/java
└── com.example
└── aiapp
├── AIController.java
├── GlobalExceptionHandler.java
└── AiAppApplication.java (主类)

11.关键点说明

  • 依赖管理:Spring AI的starter包简化了与AI服务的集成
  • 自动配置:ChatClient会自动注入配置好的OpenAI客户端
  • 模板引擎:PromptTemplate支持动态提示词生成
  • 可扩展性:可轻松切换不同AI提供商(如Azure OpenAI)

三、拓展

1.错误场景示例

  • API Key 无效时的响应
// json
{"status": 401,"error": "Unauthorized","message": "AI服务错误: Invalid API Key"
}
  • 字段缺失:若请求体缺少 sourceLang 或 text 字段,会返回 400 Bad Request 错误。
  • 语言不支持:若指定语言(如 targetLang: 火星文)模型不支持,返回‘无法完成翻译’提示。

2.实际输出可能不同

  • 翻译结果会因模型版本(如 gpt-3.5-turbo 或 gpt-4)和参数(如 temperature)略有差异。
  • 示例是典型结果,但可能返回类似 “The weather is very nice today.” 的变体。

3.流式响应(高级功能)

  • 如果需要实时逐字输出(类似 ChatGPT),交互更友好,可以改用 StreamingChatClient:
@GetMapping("/ai/chat-stream")
public Flux<String> chatStream(@RequestParam String message) {return streamingChatClient.stream(message);
}

4.超长文本处理

  • 文本过长(超过模型 token 限制)时响应会被截断;
  • 需在 application.properties 中调整 max-tokens 参数:
spring.ai.openai.chat.options.max-tokens=2000

5.内容返回格式

  • 默认返回纯文本(text/plain),若希望返回 JSON 格式,可在 Controller 中修改响应类型:
@PostMapping(value = "/ai/translate", produces = "application/json")  
public Map<String, String> translate(...) {  return Map.of("result", translatedText);  
}  
  • 响应示例:
// json
{ "result": "Today's weather is really nice." }  

6.附加测试建议

  • 接口开发完成后,建议多使用几个请求进行测试:
    (1)提供其他需求:http://localhost:8080/ai/chat?message=用Python写一个斐波那契数列函数
def fibonacci(n):a, b = 0, 1for _ in range(n):print(a)a, b = b, a + b

(2)翻译不同语种:修改请求体中的sourceLang和targetLang

// json
{  "sourceLang": "英文",  "targetLang": "法语",  "text": "Hello, how are you?"  
}  
  • 预期响应输出:
"Bonjour, comment allez-vous ?"  

四、总结和趋势

  • Spring Boot 是构建现代 Java 应用的基石,而Spring AI 是其生态中专注于 AI 集成的利器。
  • 两者结合可快速实现“传统业务 + AI 增强”的架构,例如智能客服、文档分析、代码生成等场景。
  • Spring AI 将更注重开放性(多模型支持)、性能(低延迟流式响应)和企业级能力(安全、监控),成为 Java 生态中 AI 应用开发的首选框架。
未来趋势:

(1)技术方向

  • 多模态支持:从文本生成扩展到图像、语音、视频等多模态 AI 能力。
  • 本地模型集成:优化对本地运行的大模型(如 Llama.cpp,Ollama)的支持,降低云端依赖。
  • 流式响应优化:提升实时交互场景下的性能(如 StreamingChatClient)。

(2)生态扩展

  • 更多 AI 服务商:兼容新兴模型(如 Google Gemini、Anthropic Claude)。
  • 企业级工具链:与 Spring Security、Spring Cloud 深度集成,提供企业级 AI 应用的鉴权、限流、熔断能力。
  • 低代码整合:结合 Spring Boot 的快速开发特性,提供可视化 AI 编排工具。

(3)行业应用

  • 垂直领域解决方案:针对金融、医疗、教育等行业定制 Prompt 模板和评估工具。
  • AI Agent 框架:支持构建自主决策的 AI Agent 系统(如任务分解、工具调用)。

相关文章:

  • 1.1 Epson机器人常用指令1-Print函数、RobotInfo$
  • 实景VR展厅制作流程与众趣科技实景VR展厅应用
  • 将 Element UI 表格拖动功能提取为公共方法
  • Linux云计算训练营笔记day11(Linux CentOS7)
  • 智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆
  • Ansible模块——主机名设置和用户/用户组管理
  • 牛客网NC209794:使徒袭来
  • 一周快讯 | 银发文娱旅游一周新鲜事
  • 【愚公系列】《Manus极简入门》048-自然探险之旅:“户外活动规划师”
  • 深入理解 SPI 通信中的时钟极性与相位(CPOL 与 CPHA)
  • ARP 原理总结
  • 全新的开源监控工具CheckCle
  • C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶
  • Supermemory:让大模型拥有“长效记忆“
  • 开源AI大模型等“神秘组合”,如何颠覆零售业数字化转型?
  • 统计客户端使用情况,使用es存储数据,实现去重以及计数
  • java中的Servlet4.x详解
  • GitHub排名第一的开源ERP项目:Odoo生产计划与执行的功能概述
  • Git初始化本地已有项目,并推送到远端Git仓库完整操作指南
  • Linux《自主Shell命令行解释器》
  • 事关中国,“英伟达正游说美国政府”
  • 当“小铁人”遇上青浦,看00后如何玩转长三角铁三
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 淮安市车桥中学党总支书记王习元逝世,终年51岁
  • 烤肉店从泔水桶内捞出肉串再烤?西安未央区市监局:停业整顿
  • 在本轮印巴冲突的舆论场上也胜印度一筹,巴基斯坦靠什么?