Spring AI:从入门到实战,我踩过的坑与收获
最近半年一直在探索 Spring 生态与 AI 的结合。从最开始的“AI 离后端开发太远”的偏见,到现在能用 Spring AI 快速实现对话机器人、文本生成等功能,中间踩了不少坑,也积累了一些实用经验
Spring AI 到底是什么?
刚开始接触的时候,我以为 Spring AI 是个“大而全的 AI 框架”,上手才发现理解错了。其实它更像是一个“AI 集成工具包”,核心作用是帮我们把各种主流 AI 模型(OpenAI、Azure OpenAI、本地部署的 Llama 等)快速集成到 Spring 项目中,不用我们自己去写复杂的 API 调用、签名验证、请求重试逻辑。
举个通俗的例子:以前我们要调用 OpenAI 的接口,得自己用 RestTemplate 或者 OkHttp 构造请求体、处理 API Key、解析返回的 JSON 数据,还得考虑超时、限流这些问题。现在用 Spring AI,只需要简单配置一下,就能像调用 Spring 里的普通 Bean 一样使用 AI 能力,完全符合我们后端开发者的使用习惯。
这里插一句我的踩坑经历:最开始我直接去啃 Spring AI 的官方文档,看了半天没看懂核心逻辑,后来发现应该先从“集成一个简单的 AI 模型”开始动手,跑通第一个 Demo 后,很多概念自然就理解了。所以建议新手别上来就死磕理论,先动手实践!
3 步在 Spring Boot 中集成 AI 能力
下面以“集成 OpenAI 的 GPT-3.5 模型,实现一个简单的文本生成接口”为例,跟大家分享具体的实现步骤。我会把关键代码和注意事项都写清楚,新手跟着做就能跑通。
1. 准备工作:获取 OpenAI API Key
首先得有一个 OpenAI 的 API Key,获取方式很简单:登录 OpenAI 官网(需要科学上网),进入个人中心的 API Keys 页面,创建一个新的 Key 即可。注意:这个 Key 要妥善保管,不要泄露到代码仓库里!
2. 项目依赖配置
创建一个普通的 Spring Boot 项目,然后在 pom.xml 中添加 Spring AI 相关的依赖。这里我用的是 Spring Boot 3.2.x 版本,Spring AI 版本对应 1.0.0-M1(不同版本可能有差异,建议参考官方最新文档):
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M1</version>
</dependency>
<!-- Web 依赖,用于暴露接口 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这里有个坑要提醒大家:Spring AI 目前还处于里程碑版本(M 版本),部分功能可能不稳定,而且 Maven 中央仓库可能没有,需要在 pom.xml 中添加 Spring 的快照仓库:
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
3. 核心代码实现
第一步:在 application.yml 中配置 OpenAI 的 API Key 和模型信息:
spring:
ai:
openai:
api-key: 你的 OpenAI API Key
chat:
model: gpt-3.5-turbo
temperature: 0.7 # 温度,0-2 之间,值越高生成内容越随机,越低越严谨
第二步:编写一个 Controller,直接注入 Spring AI 提供的 ChatClient 接口,就能调用 AI 模型了:
import org.springframework.ai.chat.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class AIController {
// 直接注入 Spring AI 提供的 ChatClient,自动根据配置连接 OpenAI
@Resource
private ChatClient chatClient;
// 暴露一个文本生成接口,参数是用户的提示词
@GetMapping("/generate")
public String generateText(@RequestParam String prompt) {
// 调用 chatClient.generate 方法,传入提示词即可获取 AI 生成的内容
return chatClient.generate(prompt);
}
}
第三步:启动项目,测试接口。用 Postman 或者浏览器访问:http://localhost:8080/generate?prompt=用 Java 写一个单例模式的懒加载实现,带注释,,就能看到 AI 生成的代码了!是不是超级简单?
我第一次跑通这个 Demo 的时候特别兴奋,因为以前要自己写很多冗余代码,现在几行配置+几行代码就搞定了,这就是 Spring 生态的魅力——简化开发流程。
Spring AI 的核心能力与实际应用场景
上面的 Demo 只是入门,Spring AI 还有很多强大的功能,我结合自己的使用经历,跟大家分享几个实用的核心能力和应用场景。
1. 提示词工程(Prompt Engineering)
AI 生成内容的质量,很大程度上取决于提示词。Spring AI 提供了 Prompt 类,可以帮我们更灵活地构造提示词,比如添加系统指令、历史对话上下文等。
比如我之前做的“解析数据库表结构生成 CRUD 代码”的功能,就用了 Prompt 来构造复杂的提示词:
Prompt prompt = Prompt.from(
// 系统指令:告诉 AI 它的角色和任务要求
SystemPrompt.from("你是一个资深 Java 后端开发工程师,擅长根据数据库表结构生成规范的 Spring Boot CRUD 代码,包含实体类、Mapper 接口、Service 层、Controller 层,代码要符合阿里巴巴开发规范,带详细注释。"),
// 用户指令:传入数据库表结构信息
UserPrompt.from("数据库表结构:表名 user,字段:id (bigint, 主键)、username (varchar(50), 非空)、password (varchar(100), 非空)、create_time (datetime),生成对应的 CRUD 代码。")
);
// 调用 AI 生成代码
String crudCode = chatClient.generate(prompt);}
通过这种方式,AI 生成的代码质量会高很多,基本不用我们再做太多修改。
2. 支持多种 AI 模型,可灵活切换
Spring AI 支持 OpenAI、Azure OpenAI、Google Gemini、本地部署的 Llama 2、通义千问等多种 AI 模型。而且由于 Spring AI 做了抽象封装,切换模型的时候,核心代码基本不用改,只需要修改配置即可。
比如我后来因为某些原因,需要把 OpenAI 换成本地部署的 Llama 2,只需要修改 pom.xml 依赖(添加 spring-ai-llama2 依赖),然后修改 application.yml 中的配置,核心的 Controller 代码完全没变。这种“面向接口编程”的设计,让我们的项目更灵活,不用担心绑定某个具体的 AI 服务商。
3. 实际应用场景推荐
结合我的实践,给大家推荐几个 Spring 与 AI 结合的实用应用场景:
- 接口文档自动生成:根据 Controller 代码的注释和方法定义,自动生成 Swagger 文档或者 Markdown 格式的接口文档,省去手动编写的麻烦。
- 日志分析与异常诊断:集成 AI 能力,让系统能自动分析日志中的异常信息,给出可能的原因和解决方案,帮助运维和开发快速定位问题。
- 智能客服/帮助中心:基于公司的产品文档、FAQ 等内容,训练一个专属的 AI 客服,集成到 Spring Boot 项目中,为用户提供智能问答服务。
- 代码生成与重构:除了前面提到的 CRUD 代码,还能让 AI 帮我们做代码重构、优化,比如把冗余的代码简化,或者把旧的代码升级到新的语法规范。
四、踩过的坑与避坑指南
在探索 Spring 与 AI 结合的过程中,我踩了不少坑,这里总结几个常见的,希望能帮大家避坑:
- 版本兼容问题:Spring AI 目前的版本迭代比较快,不同版本对应的 Spring Boot 版本有要求,比如 Spring AI 1.0.0-M1 建议搭配 Spring Boot 3.2.x,用低版本的 Spring Boot 可能会出现依赖冲突。建议严格按照官方文档的版本要求来配置。
- API Key 泄露风险:很多新手会把 API Key 直接写在代码里,或者提交到 Git 仓库,这是非常危险的。正确的做法是用配置文件、环境变量或者 Spring Cloud Config 来管理敏感信息。
- AI 生成内容的不确定性:有时候 AI 会生成错误的代码或者不准确的信息,所以不能完全依赖 AI,生成的内容一定要经过人工审核。尤其是在生产环境中,更要谨慎。
- 网络问题:如果使用 OpenAI、Google Gemini 等国外的 AI 模型,可能会遇到网络延迟、连接不稳定的问题。可以考虑使用国内的 AI 模型(比如通义千问、文心一言),或者搭建代理服务。