1. Spring AI 2.0 多模型集成架构解析
Spring AI 2.0 作为 Spring Boot 4.0 生态的重要成员,彻底重构了 AI 模型集成方案。与 1.x 版本相比,2.0 最大的突破在于建立了标准化的多模型适配体系。这套架构的核心价值在于:业务代码无需关心底层模型差异,开发者可以通过统一接口调用不同厂商的 AI 能力。
1.1 版本兼容性矩阵
在开始配置前,必须确认环境基线:
java复制// 版本要求
Spring Boot: 4.0 GA+
Java: 21+ (必须支持虚拟线程)
构建工具: Maven 3.9+/Gradle 8.5+
关键依赖关系:
xml复制<!-- 父POM定义 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version>
</parent>
<!-- AI核心依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-core</artifactId>
<version>2.0.0</version>
</dependency>
1.2 分层架构设计
Spring AI 2.0 采用三层抽象设计:
1.2.1 应用层 (Application Layer)
java复制// 业务代码示例
public class ChatService {
private final ChatModel chatModel;
public String generateResponse(String prompt) {
// 统一调用接口
return chatModel.call(prompt);
}
}
特点:
- 完全模型无关
- 使用标准 ChatModel 接口
- 支持同步/异步调用
1.2.2 便携选项层 (Portable Options)
java复制public interface ChatOptions {
Double getTemperature(); // 0.0-1.0
Double getTopP(); // 0.0-1.0
Integer getMaxTokens();
String getModel();
}
设计要点:
- 使用 Double 统一参数类型
- 内置参数范围校验
- 支持流式构建器模式
1.2.3 模型特化层 (Model-Specific)
java复制// OpenAI特化选项
public class OpenAIChatOptions implements ChatOptions {
private Float temperature; // OpenAI原生使用Float
private ResponseFormat responseFormat;
// 类型转换逻辑
@Override
public Double getTemperature() {
return temperature.doubleValue();
}
}
转换机制:
- 自动处理类型差异
- 保留厂商特有功能
- 配置属性自动绑定
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. OpenAI 深度集成实战
2.1 环境准备
2.1.1 依赖配置
xml复制<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
2.1.2 关键配置项
yaml复制spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://api.openai.com/v1
connect-timeout: 10s
read-timeout: 30s
chat:
options:
model: gpt-5-mini
temperature: 0.7
response-format: json_object
2.2 核心功能实现
2.2.1 基础对话
java复制@RestController
public class OpenAIController {
@GetMapping("/chat")
public String chat(@RequestParam String message) {
Prompt prompt = new Prompt(message);
return chatModel.call(prompt).getResult().getOutput().getContent();
}
}
2.2.2 工具调用
java复制public List<ToolDefinition> createTools() {
return List.of(
ToolDefinition.builder()
.name("get_weather")
.description("获取城市天气")
.inputSchema(/* JSON Schema */)
.build()
);
}
@PostMapping("/with-tools")
public ChatResponse useTools(@RequestBody String question) {
OpenAIChatOptions options = OpenAIChatOptions.builder()
.withTools(createTools())
.build();
return chatModel.call(new Prompt(question, options));
}
2.3 性能优化技巧
- 流式响应:
java复制@GetMapping("/stream")
public Flux<String> streamChat(@RequestParam String message) {
return chatModel.stream(new Prompt(message))
.map(response -> response.getResult().getOutput().getContent());
}
- 批量处理:
java复制public List<String> batchProcess(List<String> prompts) {
return prompts.parallelStream()
.map(prompt -> chatModel.call(prompt))
.collect(Collectors.toList());
}
- 缓存策略:
java复制@Cacheable("aiResponses")
public String cachedResponse(String prompt) {
return chatModel.call(prompt);
}
3. Gemini 企业级配置指南
3.1 两种集成模式
3.1.1 Google AI API (免费版)
yaml复制spring:
ai:
google:
ai:
api-key: ${GEMINI_API_KEY}
chat:
model: gemini-2.0-flash
3.1.2 Vertex AI (企业版)
yaml复制spring:
ai:
vertex:
ai:
project-id: my-project
location: us-central1
credentials:
location: classpath:service-account.json
3.2 高级特性实现
3.2.1 Thinking Mode
java复制GeminiChatOptions options = GeminiChatOptions.builder()
.withThinkingLevel(ThinkingLevel.MEDIUM)
.build();
Prompt prompt = new Prompt("解释量子力学", options);
chatModel.call(prompt);
3.2.2 多模态处理
java复制UserMessage message = new UserMessage(
"描述这张图片",
List.of(new Image(new URL("https://example.com/image.jpg")))
);
chatModel.call(new Prompt(List.of(message)));
3.3 安全配置
yaml复制safety-settings:
- category: HARM_CATEGORY_DANGEROUS
threshold: BLOCK_ONLY_HIGH
- category: HARM_CATEGORY_HATE_SPEECH
threshold: BLOCK_MEDIUM_AND_ABOVE
4. Anthropic Claude 专业配置
4.1 特有参数配置
yaml复制spring:
ai:
anthropic:
chat:
options:
top-k: 40
stop-sequences: ["\n\nHuman:", "\n\nAssistant:"]
4.2 工具调用最佳实践
java复制@PostMapping("/claude-tools")
public ChatResponse useClaudeTools(@RequestBody String query) {
AnthropicChatOptions options = AnthropicChatOptions.builder()
.withTools(createTools())
.build();
ChatResponse response = chatModel.call(new Prompt(query, options));
// 处理工具调用
response.getMetadata().get("contentBlocks").forEach(block -> {
if (block.getType().equals("tool_use")) {
executeTool(block.getName(), block.getInput());
}
});
return response;
}
5. Ollama 本地化部署
5.1 模型管理
bash复制# 拉取模型
ollama pull mistral
ollama pull codellama
# 查看已安装模型
ollama list
5.2 Spring 集成
yaml复制spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: mistral
num-predict: 512
5.3 私有化 RAG 实现
java复制public ChatResponse localRAG(String question) {
// 1. 生成嵌入
Embedding embedding = embeddingModel.embed(question);
// 2. 向量检索
List<Document> docs = vectorStore.similaritySearch(embedding);
// 3. 构建提示
String context = docs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n"));
String prompt = String.format("基于以下上下文:\n%s\n\n问题:%s", context, question);
// 4. 生成回答
return chatModel.call(new Prompt(prompt));
}
6. 多模型路由策略
6.1 基于成本的动态路由
java复制public ChatModel selectModel(String prompt) {
int complexity = estimateComplexity(prompt);
if (complexity < 3) {
return openAIChatModel; // gpt-5-mini
} else if (complexity < 7) {
return geminiChatModel; // gemini-pro
} else {
return claudeChatModel; // claude-3-opus
}
}
6.2 故障转移机制
java复制public String faultTolerantCall(String prompt) {
try {
return primaryModel.call(prompt);
} catch (Exception e) {
log.warn("Primary model failed, fallback to secondary");
return secondaryModel.call(prompt);
}
}
7. 生产环境最佳实践
-
监控指标:
- 请求延迟 (P99 < 5s)
- 错误率 (< 0.1%)
- Token 消耗 (按模型分桶)
-
限流策略:
java复制@Bean
RateLimiter openAILimiter() {
return RateLimiter.create(100); // 100请求/秒
}
- 日志规范:
java复制@Around("@within(org.springframework.web.bind.annotation.RestController)")
public Object logAICalls(ProceedingJoinPoint pjp) {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
log.info("AI call duration={}ms", System.currentTimeMillis()-start);
return result;
}
在实际项目落地时,建议先从单一模型开始验证核心业务流程,再逐步引入多模型策略。对于关键业务路径,务必实现完善的降级方案和监控覆盖。Spring AI 2.0 的模块化设计使得这些扩展可以平滑进行,不会对现有代码造成破坏性变更。
