1、Spring AI简介
Spring AI 是 2024年11月 由 Spring 官方推出的开源框架(2025年进入生产就绪阶段),旨在将 Spring 生态系统的设计原则(如可移植性、模块化、约定优于配置)引入 AI 应用开发领域,帮助 Java 开发者像使用 Spring 开发 Web/微服务一样高效构建 AI 应用。 官网链接:docs.spring.io/spring-ai/r...
2、核心定位
1. 解决什么问题?
- Java 生态的 AI 鸿沟:Python 主导 AI 开发,Java 企业开发者难以快速集成 AI 能力
- 碎片化工具链 :开发者需要自行组合 LangChain、HuggingFace、向量数据库等组件5
- 云原生集成:缺乏与 Spring Boot/Cloud 的无缝集成方案
2. 关键优势
| 传统方案 | Spring AI 方案 |
|---|---|
| 手动管理 HTTP 调用 | 自动配置 AI 客户端(类似RestTemplate) |
| 自行处理流式响应 | 提供StreamingChatClient接口 |
| 独立维护 Prompt 模板 | 集成PromptTemplate(类似Thymeleaf) |
| 自定义向量存储 | 支持 Milvus/PgVector/Redis 等开箱即用 |
3、原生方案比对
3.1、原生HTTP方案(OkHttp + Jackson)
3.1.1. 基础调用
js
@RestController
public class RawAIController {
@Value("${deepseek.api-key}")
private String apiKey;
private final OkHttpClient client = new OkHttpClient();
private final ObjectMapper mapper = new ObjectMapper();
@PostMapping("/raw/chat")
public ResponseEntity<?> chat(@RequestBody UserRequest request) {
try {
// 1. 手动构建请求体
JsonNodeFactory factory = JsonNodeFactory.instance;
ObjectNode requestBody = mapper.createObjectNode()
.put("model", "deepseek-chat")
.set("messages", factory.arrayNode().add(
factory.objectNode()
.put("role", "user")
.put("content", request.getMessage())
))
.put("temperature", 0.7);
// 2. 手动处理HTTP调用
Request httpRequest = new Request.Builder()
.url("https://api.deepseek.com/v1/chat/completions")
.addHeader("Authorization", "Bearer " + apiKey)
.post(RequestBody.create(
mapper.writeValueAsString(requestBody),
MediaType.get("application/json")))
.build();
// 3. 手动解析响应
try (Response response = client.newCall(httpRequest).execute()) {
if (!response.isSuccessful()) {
return ResponseEntity.status(response.code()).build();
}
JsonNode root = mapper.readTree(response.body().string());
String aiResponse = root
.get("choices").get(0)
.get("message")
.get("content").asText();
return ResponseEntity.ok(Map.of("response", aiResponse));
}
} catch (IOException e) {
return ResponseEntity.status(500).build();
}
}
}
// 辅助类
class UserRequest {
private String message;
// getter/setter
}
3.1.2. 痛点分析
- 代码重复:每个接口都要手动构建HTTP请求
- 错误处理:需自行处理网络异常、状态码
- 扩展性差 :切换模型需修改
model字段 - 无监控:无法统计请求耗时、token用量
3.2、Spring AI方案
3.2.1. 基础调用
js
@RestController
public class SpringAIController {
@Autowired
private ChatClient chatClient; // 自动注入
@PostMapping("/spring-ai/chat")
public ResponseEntity<ChatResponse> chat(@RequestBody UserRequest request) {
// 1. 一行代码调用AI
String aiResponse = chatClient.call(request.message());
// 2. 自动处理错误(可配置重试/降级)
return ResponseEntity.ok(new ChatResponse(aiResponse));
}
}
// 辅助类
record UserRequest(String message) {}
record ChatResponse(String response) {}
3.3. 进阶功能
A. 流式响应
java复制代码
js
@GetMapping(value = "/stream/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
// 返回SSE流
return streamingChatClient.stream(message);
}
B. Prompt模板
java复制代码
js
@Service
public class CustomerService {
private final PromptTemplate template = new PromptTemplate(
"根据客户问题'{question}',生成专业回复。要求:{style}"
);
public String generateReply(String question, String style) {
return chatClient.call(template.create(Map.of(
"question", question,
"style", style
)));
}
}
C. 工具调用
java复制代码
js
@Component
public class Tools {
@Tool
public String getOrderStatus(String orderId) {
// 查询数据库逻辑
return "订单状态:已发货";
}
}
// 自动调用工具
@PostMapping("/tool/chat")
public String toolChat(@RequestBody UserRequest request) {
// AI自动选择调用getOrderStatus
return chatClient.call(request.getMessage());
}
D. 结构化输出
java复制代码
js
class ProductRecommendation {
String name;
String reason;
double price;
}
@GetMapping("/recommend")
public ProductRecommendation recommend(@RequestParam String category) {
// 自动映射到POJO
return chatClient.call("推荐一个" + category + "产品", ProductRecommendation.class);
}
4、关键优势对比分析
| 优势点 | 原生HTTP方案 | Spring AI方案 | 效果对比 |
|---|---|---|---|
| 开发效率 | 50+行代码 | 5行代码 | ✅ 提升10倍 |
| 模型切换 | 手动修改URL/model | 改配置即可 | ✅ 支持热切换 |
| 流式响应 | 需自行实现SSE | 一行代码 | ✅ 开箱即用 |
| 错误处理 | try-catch包裹 | 自动重试/降级 | ✅ 减少70%代码 |
| Prompt工程 | 字符串拼接 | 模板引擎 | ✅ 支持变量注入 |
| 工具调用 | 手动解析JSON | 自动绑定Java方法 | ✅ 类型安全 |
| 可观测性 | 无 | 内置Micrometer指标 | ✅ 实时监控 |
| 扩展性 | 自行封装 | 支持RAG/Agent | ✅ 面向未来 |
5、配置差异
原生方案配置
yaml复制代码
需自行封装配置类 deepseek: api-key: sk-xxx base-url: api.deepseek.com model: deepseek-chat
Spring AI配置
yaml复制代码
自动识别配置 spring: ai: chat: client: provider: deepseek options: api-key: ${DEEPSEEK_API_KEY} model: deepseek-chat temperature: 0.7 logging: sanitize: true # 自动脱敏
6、性能优化对比
原生方案需自行实现
java复制代码
js
// 连接池优化
OkHttpClient client = new OkHttpClient.Builder()
.connectionPool(new ConnectionPool(5, 10, TimeUnit.MINUTES))
.build();
// 重试机制
int maxRetries = 3;
int retries = 0;
while (retries < maxRetries) {
try {
// 执行请求逻辑
/* ... */
break; // 请求成功后跳出循环
} catch (IOException e) {
retries++;
// 可添加日志或其他处理逻辑
}
}
Spring AI自动优化
java复制代码
// 自动配置连接池/重试 spring: ai: chat: client: http: max-connections: 50 retry: max-attempts: 3
7、总结
选择建议:
- 简单场景:原生HTTP(如一次性脚本)
- 企业项目:Spring AI(节省30%+开发时间)
- 复杂AI应用:Spring AI + LangChain4j(功能互补)
Spring AI 的核心价值在于:让Java开发者专注业务逻辑,而非底层通信细节 。2025年调研显示,使用Spring AI的项目AI集成效率提升 70%+ ,维护成本下降 45% 135。对于需要快速迭代的企业应用,这是最优选择