咱们先还原一下,直接调用大模型API通常是怎么写的。无非就是构造请求、发HTTP、解析结果,大概长这样:
java
// 直接裸写调用OpenAI API
public String callOpenAI(String userPrompt) {
String apiUrl = "https://api.openai.com/v1/chat/completions";
String apiKey = "sk-xxxxxxxxxxxxxxxx";
// 1. 手动构造请求JSON
JSONObject reqBody = new JSONObject();
reqBody.put("model", "gpt-3.5-turbo");
JSONArray messages = new JSONArray();
messages.add(new JSONObject()
.put("role", "user")
.put("content", userPrompt));
reqBody.put("messages", messages);
// 2. 设置请求头、发请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(apiKey);
HttpEntity<String> entity = new HttpEntity<>(reqBody.toJSONString(), headers);
ResponseEntity<String> response = restTemplate.postForEntity(apiUrl, entity, String.class);
// 3. 手动解析返回结果
JSONObject resJson = JSON.parseObject(response.getBody());
return resJson.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
}
看起来代码不多,挺简单对不对?但真放到企业项目里做个生产可用的AI应用,问题就全冒出来了:
1. 切换大模型=重写一半代码
今天项目要用OpenAI,明天老板说要换成国产的文心一言,后天又要接通义千问做备选。每个大模型的请求格式不一样,返回结构不一样,错误码也不一样,你得把原来的请求构造、结果解析全改一遍,纯纯出力不讨好。
2. 重试、限流、日志、监控全要自己搭
大模型API不是百分百稳定的,超时、限流、500错误都是常有的事。这些异常你得处理吧?失败了要重试吧?请求耗时要打日志吧?线上出问题要监控报警吧?这些通用逻辑每个接口都要写一遍,纯纯重复造轮子。
3. 复杂提示词根本没法维护
正经业务里的提示词往往很长,还要动态替换参数,全堆在Java字符串里,代码乱成一锅粥,改个提示词还要重新发布项目,体验极差。
4. RAG开发全靠自己,从零搭到怀疑人生
现在做AI应用基本都离不开RAG(检索增强生成),从文档读取、文本切片、向量生成、存储到向量数据库,检索的时候再把相关片段拼到提示词里,这套流程全自己写没有几百行代码根本下不来,太折磨人了。
Spring AI:把这些破事全给你搞定了
Spring AI本质上做的事情,就是把AI开发中这些通用、重复的工作全都封装好,让你用熟悉的Spring风格开发AI应用,不用从零造轮子,专注写业务就行。
给大家看看用Spring AI调用大模型是什么体验:
java
// Spring AI调用大模型,就这么点代码
@RestController
public class ChatController {
private final ChatClient chatClient;
// 自动注入配置好的ChatClient
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chat")
public String chat(String prompt) {
return chatClient.call(prompt);
}
}
代码写完了,剩下的配置全丢在application.yml里:
yaml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-3.5-turbo
就搞定了?没错!如果哪天你想换成百度文心一言,只需要改依赖和配置,业务代码一行都不用动:
yaml
spring:
ai:
qianfan:
api-key: ${QIANFAN_API_KEY}
secret-key: ${QIANFAN_SECRET_KEY}
chat:
options:
model: ERNIE-Speed-8K
就问你香不香?除了统一API屏蔽差异,Spring AI还给我们准备了一大堆实用功能:
1. 提示词模板支持外部化,好维护太多
Spring AI内置了提示词模板,支持把长提示词放到单独的文件里,动态替换参数,改提示词不用动代码:
java
// 从resources加载提示词模板,动态替换参数
PromptTemplate promptTemplate = new PromptTemplate(
ResourceLoaderUtils.getResource("classpath:prompts/customer-service.tpl")
);
Prompt prompt = promptTemplate.create(Map.of(
"serviceName", "我的电商网站",
"userQuestion", "我的订单什么时候发货?"
));
ChatResponse response = chatClient.call(prompt);
2. RAG全流程封装,一行代码接入向量存储
Spring AI把RAG需要的文档读取、切片、向量生成、存储检索全做好了,想接向量数据库只需要改配置:
java
// 基于RAG实现问答,就这么简单
public String ragChat(String userQuestion) {
// 从向量数据库找相关文档
List<Document> relatedDocs = vectorStore.similaritySearch(userQuestion);
// 拼到提示词里调用大模型
String prompt = STR."根据以下内容回答问题:\{relatedDocs}\n问题:\{userQuestion}";
return chatClient.call(prompt);
}
Redis、PGVector、Milvus、Chroma这些常用的向量数据库全都支持,切换存储只需要改依赖,不用改业务代码。
3. 函数调用开箱即用,不用自己解析
现在大模型都支持函数调用,让大模型能调用你的本地方法获取数据。Spring AI直接把这个流程封装好了,只需要定义方法加注解就行:
java
// 定义查询天气的函数
@Bean
public Function<GetWeatherRequest, GetWeatherResponse> getCurrentWeather() {
return request -> weatherService.getWeather(request.getCity());
}
// 直接调用大模型,函数调用自动处理
ChatResponse response = chatClient.call(new Prompt("北京今天天气怎么样?"));
不用自己解析大模型返回的函数调用请求,也不用自己把结果塞回给大模型,全流程自动完成。
4. 无缝集成Spring生态,复用你熟悉的能力
如果你本来就是Spring Boot项目,集成Spring AI简直不要太舒服:自动配置、依赖注入、切面日志、异常处理全都和原生Spring打通,你可以直接用Spring Security做权限,用Spring Retry做重试,用Micrometer做监控,完全不用额外适配。
什么时候用Spring AI,什么时候直接调用?
Spring AI不是银弹,也不是所有场景都必须用,我给大家总结了判断标准:
✅ 推荐用Spring AI的场景
企业级Java/Spring项目,需要长期维护
需要对接多个大模型,方便后续切换扩展
需要做RAG、函数调用这类复杂AI应用
团队熟悉Spring生态,想快速落地AI功能
❌ 可以直接调用的场景
简单的Demo、测试项目,写完就扔
只对接一个大模型,未来也不会换
对包体积要求极高的轻量项目
最后唠两句
Spring AI 不是要替代直接调用大模型,它存在的意义就是降低Java生态开发AI应用的门槛:把不同大模型的差异给你屏蔽掉,把通用的异常处理、重试、日志、RAG这些能力给你封装好,让Spring开发者不用从零开始造轮子,把精力放在业务逻辑上就行。
你写个几十行的helloworldDemo,直接发HTTP当然没问题;但要是做一个生产环境可用、需要长期维护的AI应用,Spring AI真的能帮你省至少80%的重复工作,这就是它比直接调用大模型好用的原因。
如果你最近正在做Java+AI相关的项目,不妨试试Spring AI,相信你会回来给我点zan的~