Spring Boot 整合
大约 3 分钟
第十三章:Spring AI与Spring Boot集成
13.1 自动配置:为什么“加依赖就能用”
Spring AI 的 Spring Boot Starter 做了两件事:
- 把与供应商交互的客户端封装成可注入的 Bean(例如
ChatClient) - 把配置项(API Key、Base URL、模型名、温度等)绑定到属性系统
因此你通常只需要:
- 引入 starter 依赖
- 配置
spring.ai.* - 在 Controller/Service 里注入
ChatClient使用
13.2 属性配置:把“模型选择”做成可运营的开关
建议把以下参数全部做成配置项,而不是写死在代码里:
- 模型名(model)
- temperature / top_p / max_tokens
- base-url(有些供应商需要)
- 超时(connect/read)
13.2.1 application.yml(统一入口)
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY:}
base-url: ${OPENAI_BASE_URL:}
chat:
options:
model: ${OPENAI_MODEL:gpt-4o-mini}
temperature: ${OPENAI_TEMPERATURE:0.7}
qwen:
api-key: ${QWEN_API_KEY:}
chat:
options:
model: ${QWEN_MODEL:qwen-plus}
temperature: ${QWEN_TEMPERATURE:0.7}
deepseek:
api-key: ${DEEPSEEK_API_KEY:}
chat:
options:
model: ${DEEPSEEK_MODEL:deepseek-chat}
temperature: ${DEEPSEEK_TEMPERATURE:0.7}13.3 环境管理:dev/prod 多环境部署
最推荐的方式:用 Spring Profiles 分离环境配置,不要在同一个文件里堆条件。
13.3.1 application-dev.yml(开发环境)
开发环境建议默认使用更便宜、更快的模型,降低成本:
spring:
profiles:
active: dev
ai:
openai:
chat:
options:
model: gpt-4o-mini13.3.2 application-prod.yml(生产环境)
生产环境建议更强调稳定性与可回退:
spring:
profiles:
active: prod
ai:
openai:
chat:
options:
model: gpt-4o启动时切换:
java -jar app.jar --spring.profiles.active=prod13.4 多供应商共存:按业务路由到不同模型
一个常见需求:同一套业务接口,按不同任务选择模型:
- 摘要/改写:便宜模型
- 复杂推理:更强模型
- 工具调用:优先选择工具调用更稳定的模型
一种简单实现方式是“路由层”:
package com.example.routing.service;
import java.util.Locale;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
@Service
public class AiRoutingService {
private final ChatClient openAiChatClient;
private final ChatClient qwenChatClient;
private final ChatClient deepSeekChatClient;
public AiRoutingService(
ChatClient openAiChatClient,
ChatClient qwenChatClient,
ChatClient deepSeekChatClient
) {
this.openAiChatClient = openAiChatClient;
this.qwenChatClient = qwenChatClient;
this.deepSeekChatClient = deepSeekChatClient;
}
public String route(String taskType, String userMessage) {
String t = taskType == null ? "" : taskType.trim().toLowerCase(Locale.ROOT);
ChatClient client = switch (t) {
case "rewrite", "summary" -> qwenChatClient;
case "reasoning" -> deepSeekChatClient;
default -> openAiChatClient;
};
return client.prompt().user(userMessage).call().content();
}
}工程上你还需要解决“如何区分这三个 ChatClient Bean”。常见做法:
- 用不同的
@Bean方法显式创建并命名 - 或者使用 Spring AI 提供的多客户端能力(如果你的版本支持)
13.5 多环境部署建议
- 密钥不要写进配置文件:使用环境变量或 KMS/Secrets Manager
- 配置变更要可回滚:模型名、温度等配置支持灰度发布
- 保留降级通道:某家供应商故障时快速切换到备用 点击这里👇🏻获取:100万QPS短链系统、复杂的商城微服务系统、智能翻译助手AI Agent、SaaS点餐系统、刷题吧小程序、商城系统、秒杀系统、AI项目、代码生成神器、苏三demo项目、智能天气播报AI Agent、智能代码审查AI Agent等 10 个项目的:项目源代码、开发教程和技术答疑
