SpringBoot+ Spring AI:掌握智能应用开发
构建AI驱动的功能通常意味着要处理分散在代码库中的SDK、HTTP客户端和提示逻辑。有了Spring AI,这个故事就改变了。当与SpringBoot结合使用时,您可以获得一种干净的、生产就绪的方式,将大型语言模型(LLM)功能直接添加到Java应用程序中。
在本文中,我们将介绍一个简单但现实的SpringBoot+ Spring AI项目,解释关键思想,然后探索高级特性和未来趋势。
I.介绍
Springboot
SpringBoot是现代Java后端开发的支柱。它通过提供以下功能简化了Spring应用:
- 自动配置
- 像Tomcat这样的嵌入式服务器
- 强烈的“约定优于配置”理念
结果很简单:您可以用最少的设置构建独立的生产级应用程序。
Spring AI
Spring AI是Spring生态系统中一个较新的模块,专注于AI集成。它的目标是在流行的AI服务(如OpenAI,Azure OpenAI和Hugging Face)上提供统一的抽象层。
与处理原始HTTP调用或特定于供应商的SDK不同,您可以使用熟悉的Spring概念,如客户端,模板和配置属性。
二.实现细节
SpringBoot+ Spring AI应用
让我们逐步构建一个最小的AI驱动的REST服务。
1.环境准备
在你开始之前,确保你有:
- JDK 17+
- Maven 3.6+
- OpenAI API密钥(来自platform.openai.com)
2.项目简介
您可以使用start.spring.io生成具有以下依赖项的项目:
- Spring Web
- Spring AI(OpenAI starter)
或者直接添加到pom.xml:
Copy<!-- 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>
这个初学者隐藏了大部分样板文件,并为您提供了一个现成的AI客户端。
3.配置OpenAI API密钥
在application.properties或application.yml中,配置您的API密钥和模型:
Copyspring.ai.openai.api-key=your-api-key-here
spring.ai.openai.chat.options.model=gpt-3.5-turbo
SpringBoot会自动为您连接所有内容。
4.创建简单控制器
现在让我们公开一个基本的聊天端点。
Copyimport 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);
}
}
这就是Spring AI的美妙之处:单个方法调用将提示发送给模型并返回响应。
5.高级:自定义提示模板
对于真实的应用程序,纯文本提示往往是不够的。Spring AI提供了PromptTemplate来创建结构化,可重用的提示。
Copyimport 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("""
Translate the following {sourceLang} text into {targetLang}:
{text}
""");
promptTemplate.add("sourceLang", request.sourceLang());
promptTemplate.add("targetLang", request.targetLang());
promptTemplate.add("text", request.text());
return chatClient.call(promptTemplate.render());
}
record TranslationRequest(String sourceLang, String targetLang, String text) {}
这种方法使提示更易于阅读、维护和扩展。
6.运行应用程序
使用IDE或命令行启动应用程序:
Copymvn spring-boot:run
嵌入式服务器将在端口8080上启动。
7.接口测试
第一章/ai/chat
请求:
CopyGET http://localhost:8080/ai/chat?message=Java一Hello World
回应:
Copypublic class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
(二)/ai/translate
请求(POST):
Copy{
"sourceLang": "Chinese",
"targetLang": "English",
"text": "The weather is really nice today"
}
回应:
Copy"Today's weather is really nice."
8.高级配置
您可以使用配置选项微调模型行为:
Copyspring.ai.openai.chat.options.temperature=0.7
spring.ai.openai.chat.options.max-tokens=500
- 温度控制随机性
- max-tokens限制响应长度
9.异常处理
全局异常处理程序使错误处理保持干净和一致。
Copyimport 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 Exception: " + ex.getMessage());
}
}
10.完整的项目结构
Copysrc/main/java
└── com.example.aiapp
├── AIController.java
├── GlobalExceptionHandler.java
└── AiAppApplication.java
11.关键点解释
- 依赖管理:Spring AI starters简化设置
- 自动配置:
ChatClient自动注入 - 提示模板:简洁、结构化的提示生成
- 可扩展性:以后易于切换AI提供商
三.膨胀
1.错误场景
无效的API密钥:
Copy{
"status": 401,
"error": "Unauthorized",
"message": "AI: Invalid API Key"
}
其他常见情况包括缺少字段或不支持的语言。
2.输出可能不同
AI输出是概率性的。不同的模型或温度值可能会产生略有不同的结果,即使是对于相同的提示。
3.流响应(高级)
对于实时输出,类似于ChatGPT类型,使用流式传输:
Copy@GetMapping("/ai/chat-stream")
public Flux<String> chatStream(@RequestParam String message) {
return streamingChatClient.stream(message);
}
4.处理超长文本
如果响应被截断,则增加令牌限制:
Copyspring.ai.openai.chat.options.max-tokens=2000
5.自定义响应模板
返回JSON而不是纯文本:
Copy@PostMapping(value = "/ai/translate", produces = "application/json")
public Map<String, String> translate(...) {
return Map.of("result", translatedText);
}
回应:
Copy{ "result": "Today's weather is really nice." }
6.其他测试想法
- 询问算法:
Write a Fibonacci sequence function in Python- 翻译成不同的语言:
Copy{
"sourceLang": "English",
"targetLang": "French",
"text": "Hello, how are you?"
}
预期产出:
Copy"Bonjour, comment allez-vous ?"
四.总结和趋势
SpringBoot仍然是Java后端开发的基础,而Spring AI在其上添加了一个强大的AI层。它们共同实现了“传统业务+ AI增强”架构,适用于聊天机器人、文档分析、代码生成等。
未来趋势
1.技术方向
- 多模式支持(文本、图像、语音、视频)
- 更好的本地模型集成(Llama、Ollama)
- 更快、更高效的流响应
2.生态系统扩展
- 支持更多AI提供商(Gemini、Claude)
- 与Spring Security和Spring Cloud深度集成
- 速率限制和监控等业务就绪功能
3.行业应用
- 面向金融、医疗和教育的垂直解决方案
- 用于自主任务执行的AI Agent框架