一、Spring AI 框架概述
Spring AI 是 Spring 官方团队推出的一个新兴开源框架,旨在简化基于 Java 的人工智能应用程序开发。它于 2023 年底首次发布,为 Spring 生态带来了与 AI 模型集成的标准化方式。
1.1 框架定位
Spring AI 的核心目标是:
- 降低 AI 集成门槛:让 Java 开发者无需深入掌握 AI 底层技术也能快速构建智能应用
- 统一访问接口:提供跨 AI 供应商的一致 API,减少厂商锁定风险
- Spring 风格集成:延续 Spring 框架熟悉的编程模型和设计理念
1.2 技术栈关系
Spring AI 在 Spring 生态中的位置:
┌───────────────────────────────────────┐
│ Spring Ecosystem │
│ ┌───────────┐ ┌───────────┐ │
│ │ Spring MVC │ │Spring Data│ │
│ └───────────┘ └───────────┘ │
│ ┌───────────────────────────────┐ │
│ │ Spring AI │ │
│ │ ┌───────┐ ┌──────────────┐ │ │
│ │ │ OpenAI │ │Azure OpenAI │ │ │
│ │ └───────┘ └──────────────┘ │ │
│ └───────────────────────────────┘ │
└───────────────────────────────────────┘
二、Spring AI 核心特性
2.1 统一 API 抽象
Spring AI 的核心设计是提供供应商中立的 API 接口,主要抽象包括:
2.1.1 ChatClient
public interface ChatClient {
default String call(String message) {
// 默认实现
}
ChatResponse call(Prompt prompt);
}
使用示例:
@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ask")
public String ask(@RequestParam String question) {
return chatClient.call(question);
}
}
2.1.2 Prompt 抽象
public class Prompt {
private final List<Message> messages;
public Prompt(String message) {
this.messages = List.of(new SystemMessage(message));
}
// 其他构造方法和工具方法
}
2.2 多模型支持
Spring AI 支持的主流 AI 提供商:
| 提供商 | 支持模型 | 特点 |
|---|---|---|
| OpenAI | GPT-3.5, GPT-4 | 最广泛使用的商业API |
| Azure OpenAI | GPT 系列 | 企业级部署方案 |
| HuggingFace | 开源模型 | 本地/自托管解决方案 |
| Anthropic | Claude 系列 | 注重安全性的模型 |
| Ollama | 本地LLM运行框架 | 开发者本地测试 |
配置示例(application.yml):
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
model: gpt-3.5-turbo
azure:
openai:
api-key: ${AZURE_OPENAI_KEY}
endpoint: https://your-resource.openai.azure.com
2.3 提示工程支持
Spring AI 提供了强大的提示模板功能:
@Bean
PromptTemplate questionPromptTemplate() {
return new PromptTemplate("""
你是一个专业的{role}。
请用{style}风格回答以下问题:
问题:{question}
""");
}
@Service
public class AdvisorService {
private final PromptTemplate promptTemplate;
private final ChatClient chatClient;
public String getAdvice(String role, String style, String question) {
Prompt prompt = promptTemplate.create(Map.of(
"role", role,
"style", style,
"question", question
));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
2.4 输出解析
Spring AI 提供类型安全的输出解析:
public record Movie(String title, int year, List<String> genres) {}
String promptText = """
请推荐一部{genre}类型的电影。
按照以下JSON格式返回:
{format}
""";
PromptTemplate template = new PromptTemplate(promptText);
template.add("genre", "科幻");
template.add("format", JsonOutputParser.OBJECT_MAPPER
.getTypeFactory()
.constructType(Movie.class));
Prompt prompt = template.create();
Movie movie = chatClient.call(prompt)
.getResult()
.getOutput()
.getParsedResult(Movie.class);
2.5 向量数据库集成
Spring AI 支持多种向量数据库:
@Configuration
public class VectorConfig {
@Bean
VectorStore vectorStore(EmbeddingClient embeddingClient) {
return new SimpleVectorStore(embeddingClient);
}
@Bean
EmbeddingClient embeddingClient() {
return new OpenAiEmbeddingClient();
}
}
@Service
public class DocumentService {
private final VectorStore vectorStore;
public void addDocument(String content) {
vectorStore.add(List.of(
new Document(content, Map.of("timestamp", Instant.now()))
);
}
public List<Document> search(String query, int topK) {
return vectorStore.similaritySearch(query, topK);
}
}
三、Spring AI 架构设计
3.1 核心模块划分
┌───────────────────────────────────┐
│ Spring AI Core │
├───────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Chat API │ │ Vector API │ │
│ └─────────────┘ └─────────────┘ │
├───────────────────────────────────┤
│ ┌─────────────────────────────┐ │
│ │ Connectors │ │
│ ├─────────────┬───────┬───────┤ │
│ │ OpenAI │ Azure │ HF │ │
│ └─────────────┴───────┴───────┘ │
└───────────────────────────────────┘
3.2 关键设计模式
- 模板方法模式:在 ChatClient 实现中广泛使用
- 策略模式:不同 AI 提供商作为可插拔策略
- 建造者模式:复杂 Prompt 的构建
四、Spring AI 实战示例
4.1 智能客服系统
@RestController
@RequestMapping("/api/customer-service")
public class CustomerServiceController {
private final ChatClient chatClient;
private final VectorStore vectorStore;
@PostMapping("/query")
public ResponseEntity<String> handleQuery(@RequestBody QueryRequest request) {
// 1. 知识库检索
List<Document> docs = vectorStore.similaritySearch(request.question(), 3);
// 2. 构建增强提示
String context = docs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
String prompt = """
你是一名客服代表,请基于以下知识库内容回答问题:
知识库:
{context}
用户问题:{question}
要求:
- 如果知识库没有相关信息,如实告知
- 保持专业友好的语气
""";
Prompt enhancedPrompt = new PromptTemplate(prompt)
.create(Map.of(
"context", context,
"question", request.question()
));
// 3. 获取AI响应
String response = chatClient.call(enhancedPrompt).getResult().getOutput().getContent();
return ResponseEntity.ok(response);
}
}
4.2 代码生成工具
@Service
public class CodeGenerator {
private final ChatClient chatClient;
public GeneratedCode generateClass(CodeSpec spec) {
String prompt = """
你是一个资深{language}开发专家。
请生成一个{classPurpose}的{classType}实现。
要求:
- 使用{style}编码风格
- 包含详细的文档注释
- 遵循{framework}最佳实践
具体需求:
{requirements}
""";
Prompt codePrompt = new PromptTemplate(prompt)
.create(Map.of(
"language", spec.language(),
"classPurpose", spec.classPurpose(),
"classType", spec.classType(),
"style", spec.style(),
"framework", spec.framework(),
"requirements", spec.requirements()
));
String code = chatClient.call(codePrompt).getResult().getOutput().getContent();
return new GeneratedCode(code, spec.language());
}
}
五、Spring AI 最佳实践
5.1 性能优化
- 批处理请求:
List<Prompt> prompts = // 多个提示
List<ChatResponse> responses = chatClient.batchCall(prompts);
- 流式响应:
@GetMapping("/stream")
public SseEmitter streamResponse(@RequestParam String question) {
SseEmitter emitter = new SseEmitter();
chatClient.stream(new Prompt(question))
.subscribe(
chunk -> {
try {
emitter.send(chunk.getResult().getOutput().getContent());
} catch (IOException e) {
emitter.completeWithError(e);
}
},
emitter::completeWithError,
emitter::complete
);
return emitter;
}
5.2 安全实践
- 输入净化:
public String sanitizeInput(String input) {
// 移除敏感信息
String sanitized = input.replaceAll("(?i)password|credit card|ssn", "[REDACTED]");
// 限制长度
return sanitized.length() > 1000
? sanitized.substring(0, 1000) + "...[TRUNCATED]"
: sanitized;
}
- 内容审核:
public boolean containsInappropriateContent(String text) {
// 实际应用中可以使用专门的审核API
return text.toLowerCase().matches(".*(暴力|色情|仇恨言论).*");
}
六、Spring AI 未来发展方向
- 多模态扩展:支持图像、音频等非文本交互
- Agent 框架:构建自主 AI Agent 的支持
- 本地模型优化:更好的一体化本地模型支持
- 企业级特性:监控、审计等生产就绪功能
- Spring Boot Starter:更简单的自动配置
七、总结
Spring AI 作为 Spring 生态中的新成员,为 Java 开发者提供了以下价值:
- 降低门槛:使传统 Java 开发者无需成为 AI 专家也能构建智能应用
- 标准化集成:统一不同 AI 供应商的接入方式
- Spring 原生体验:依赖注入、自动配置等熟悉的开发模式
- 生产就绪:与 Spring 安全、监控等基础设施无缝集成
随着 AI 技术的快速发展,Spring AI 有望成为 Java 生态中 AI 应用开发的事实标准框架。对于已经在使用 Spring 的技术团队,采用 Spring AI 可以显著降低技术栈复杂度和学习成本。
示例项目结构:
spring-ai-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── config/
│ │ │ ├── controller/
│ │ │ ├── model/
│ │ │ ├── service/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── prompts/
│ └── test/
└── pom.xml