Spring AI 把大模型调用封装成了 Spring 生态的标准组件,把接入大模型变成接入数据库一样简单。
本篇内容第一版的作者:星球嘉宾灰灰。二哥做了二期的优化和迭代。
访问 Spring AI 官网,通过 start.spring.io 快速生成项目骨架。

填好 Group、Artifact、Name 等基本信息,点击 Generate 下载压缩包。
解压后导入 IDEA,就能得到一个标准的 Spring Boot 项目。

默认生成的是 OpenAI 依赖,可以在 application.properties 中配置 API key:
spring.ai.openai.api-key=<your-openai-api-key>
也可以通过环境变量注入:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
# 设置环境变量
export OPENAI_API_KEY=<your-openai-api-key>
智谱提供了免费额度的大模型,可直接替换依赖。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
去智谱开放平台获取 API Key:https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys

在配置文件中填入密钥并指定模型。免费模型列表可以在官网定价页查看。
spring:
ai:
zhipuai:
api-key: ${zhipuai-api-key}
chat:
options:
model: GLM-4-Flash
除了环境变量,本地开发时还可以通过 IDEA 的启动参数注入,避免密钥写进配置文件被提交到 Git。
在 IDEA 中操作:
- 打开 Run/Debug Configurations
- 点击 Modify options → 勾选 Program arguments
- 在参数框中填入
--spring.ai.zhipuai.api-key=<your-key>

为什么不建议直接在配置文件里写密钥?
因为推送到 Git 后很容易忘记删除,即便后续删了,Git 历史记录里依然能找到。一旦泄露,只能作废重新申请。
新建一个 Controller,提供同步和流式两种调用方式:
@RestController
public class ChatController {
private final ZhiPuAiChatModel chatModel;
@Autowired
public ChatController(ZhiPuAiChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message",
defaultValue = "Tell me a joke") String message) {
return Map.of("generation", chatModel.call(message));
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message",
defaultValue = "Tell me a joke") String message) {
var prompt = new Prompt(new UserMessage(message));
return chatModel.stream(prompt);
}
}
chatModel.call() 是同步调用,等大模型生成完整响应后一次性返回。
chatModel.stream() 是流式调用,大模型边生成边推送,适合长文本场景。
启动项目后访问 http://localhost:8080/ai/generate?message=你好,能看到大模型的回复就说明接入成功了。

完整代码在 spring-ai-demo 仓库。
求职派用的是 Spring Boot 4.0.5 + Spring AI 2.0.0-M4 + Java 21,版本比这个 demo 更新。但核心用法一样。
三个依赖,一个配置,一个 Controller,就能搞定。
回复