Spring AI Alibaba 快速开始:5分钟用智谱 GLM 跑通第一个聊天应用
题外话
最近因为有功能有上线,这几天都忙着在整理投产资料。属实是更新不动了,当然还有一个原因就是之前发库存发的太爽了,现在地主家也没有余粮了。之前学完spring AI后,我其实就想结合我熟悉的领域开源一个项目(目前还在开发中...),里就有用到spring AI Alibaba,于是就有了这个系列。
正文
说实话,Java 开发者接入大模型这事儿,门槛早就该降下来了。Spring AI 就是干这个的——让你用写 Spring Boot 的手感,直接调大模型。
这个系列依旧坚持能白嫖就白嫖原则(才不是因为阿里的账户欠了0.3!!):使用智谱的 GLM-4.7 免费调用,0 成本就能跑通整条链路。这篇文章就用它来做示范,一步一步带你从零搭出一个能聊天、能记住上下文的应用。
5 分钟,开始。
写在前面:环境要求
就两个硬性条件:
- JDK 17 及以上(我用的是 JDK 17)
- 一个智谱开放平台的 API Key(注册就送免费额度)
JDK 版本低于 17 的话先升级,后面全是白搭。
智谱 API Key 去 open.bigmodel.cn 注册获取,登录后点右上角钥匙图标,进 API Key 管理页面创建一个就行。GLM-4 是免费模型,不用担心扣费。
第一步:创建项目
用 IDEA 新建一个 Spring Boot 3.x 项目,或者直接用 Spring Initializr。JDK 选 17,打包方式选 Maven。
项目基本信息随便填,关键是 pom.xml 里的依赖和版本。打开 pom.xml,按下面这个来:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/>
</parent>
<properties>
<java.version>17</java.version>
<spring-ai.version>1.1.2</spring-ai.version>
<spring-ai-alibaba.version>1.1.2.2</spring-ai-alibaba.version>
<spring-ai-alibaba-extensions.version>1.1.2.2</spring-ai-alibaba-extensions.version>
</properties>
版本号说明一下:spring-ai 1.1.2 是 Spring AI 的正式版本,spring-ai-alibaba 1.1.2.2 是阿里对 Spring AI 的扩展包。虽然这篇文章用的是智谱模型,但后续如果想接入通义千问或其他能力,扩展包已经提前准备好了。
接着是 BOM 管理和仓库配置:
<dependencyManagement>
<dependencies>
<!-- Spring AI 核心依赖管理 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring AI Alibaba 扩展依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${spring-ai-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-extensions-bom</artifactId>
<version>${spring-ai-alibaba-extensions.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>sonatype-snapshots</id>
<name>Sonatype Snapshot Repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>
BOM 的作用是统一管理版本号,不用在各个依赖里手动对齐,升级的时候只改 <properties> 就行。
最后是实际依赖——这次只用两个:
<dependencies>
<!-- 智谱模型支持 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
<!-- Web 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
就这两个,没了。spring-ai-starter-model-zhipuai 会通过 Spring Boot 自动装配机制帮你初始化好 ChatClient、ChatModel 这些核心 Bean,不用你手动创建。
第二步:配置 API Key 和模型
在 src/main/resources/application.yml 里写上:
server:
port: 8080
spring:
application:
name: spring-ai-alibaba-hello
ai:
zhipuai:
api-key: ${ZHIPUAI_API_KEY:your-api-key-here}
chat:
options:
model: glm-4
temperature: 0.7
max-tokens: 2000
这里有个小细节:${ZHIPUAI_API_KEY:your-api-key-here} 用的 SpEL 表达式,冒号后面是默认值。开发阶段图省事可以直接把 Key 写在默认值里,但正式项目别这么干。
设置环境变量:
# macOS / Linux
export ZHIPUAI_API_KEY=你的智谱API-KEY
# Windows PowerShell
$env:ZHIPUAI_API_KEY="你的智谱API-KEY"
第三步:写 Controller
新建 ChatController.java:
package com.alibaba.cloud.ai.examples.chatbot;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/chat")
public class ChatController {
private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!";
private final ChatClient chatClient;
public ChatController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder
.defaultSystem(DEFAULT_PROMPT)
// 支持对话记忆——模型能记住上下文
.defaultAdvisors(MessageChatMemoryAdvisor.builder(
MessageWindowChatMemory.builder()
.maxMessages(50)
.build())
.build())
// 开启日志,方便调试
.defaultAdvisors(new SimpleLoggerAdvisor())
.build();
}
@GetMapping("/simple")
public String simpleChat(@RequestParam String query) {
return chatClient.prompt(query).call().content();
}
}
这段代码核心就一个东西:ChatClient。
构造方法里通过 chatClientBuilder 注入,配了三个东西:
- System Prompt:告诉模型"你是一个博学的助手",设定角色
- MessageChatMemoryAdvisor:对话记忆,用了
MessageWindowChatMemory,maxMessages(50)表示保留最近 50 条消息的上下文。这样你连续问多个问题,模型能记住之前聊了什么 - SimpleLoggerAdvisor:日志,调试时能看到每次请求和响应的详情
请求进来时,chatClient.prompt(query).call().content() 这一行就搞定了——组装请求、调 API、解析响应,Spring AI 全自动处理,不需要你手写任何 HTTP 调用或 JSON 拼装。
第四步:启动,跑通第一个请求
./mvnw spring-boot:run
启动成功后会打印:
🎉========================================🎉
✅ Application is ready!
🚀 Chat with you agent: http://localhost:8080/chat/simple?query=你好
🎉========================================🎉
浏览器打开这个链接,或者直接访问:
http://localhost:8080/chat/simple?query=给我讲一个笑话吧
模型返回了一个笑话?恭喜,链路通了。全程 0 费用。
再试试连续对话:
http://localhost:8080/chat/simple?query=我叫小明
http://localhost:8080/chat/simple?query=我叫什么名字?
第二个请求如果回答"你叫小明",说明 ChatMemory 生效了——模型记住了你刚才说过的话。
项目结构总览
spring-ai-alibaba-hello/
├── pom.xml
├── src/main/java/.../chatbot/
│ ├── ChatbotApplication.java # 启动类
│ └── ChatController.java # 聊天接口
└── src/main/resources/
└── application.yml # 配置文件
就这么简单。一个启动类、一个 Controller、一个配置文件,3 个文件跑通 AI 聊天。
常见坑
依赖拉不下来 → 检查 pom.xml 里有没有补 spring-milestones 和 sonatype-snapshots 仓库,网络不通配国内镜像。
返回 401 Unauthorized → API Key 没配对。检查环境变量名是 ZHIPUAI_API_KEY,值是从 open.bigmodel.cn 复制的完整 Key。
返回空或报模型不存在 → 模型名写错了。确认是 glm-4,别写成 GLM-4(大小写敏感)或 glm-4.7-flash(除非你确实要用这个版本)。
JDK 版本报错 → 必须 JDK 17+,14/15/16 直接放弃。
想换通义千问 → 把 spring-ai-starter-model-zhipuai 换成 spring-ai-alibaba-starter,配置前缀改成 spring.ai.dashscope,环境变量改成 AI_DASHSCOPE_API_KEY,Controller 代码不用动。Spring AI 的 ChatClient 是模型无关的,换模型只换配置。
下一步可以玩什么
基础链路通了之后,可以继续往深了走(咱们之前用spring AI实现的功能都会重新实现一遍):
- Function Calling — 让模型主动调用你写好的 Java 方法,把 AI 嵌进业务流程
- Prompt 模板 — 构造更复杂的提示词,告别硬编码
- RAG 知识库问答 — 把自己的文档喂给模型,定制专属问答助手
- 流式输出 — 用
chatClient.prompt(query).stream().content()实现打字机效果
说实话,Function Calling 才是生产环境里最有价值的部分——让大模型调用你写好的接口,而不是简单问答。
Spring AI 这套东西的设计思路很清晰:ChatClient 抽象把模型选择和业务代码彻底解耦,今天用免费 GLM,明天换付费 Qwen,代码基本不用动。三个文件,5 分钟,0 费用,这就是 Java 开发者接入大模型该有的体验。
刚开始按照官方文档拉的示例demo,在换模型的过程中遇到了不少坑,这不下篇的素材就有了->_->
有问题欢迎评论区见。
🎯 收藏+关注,持续更新
如果觉得有帮助,请:
- ⭐ 收藏本文 —— 方便后续查阅,随时回顾核心概念
- 📱 关注同名公众号 —— 点击菜单「获取源码」获取完整代码(Gitee 仓库)
- 🔗 分享给同事 —— 一起学习 Spring AI Alibaba,少走弯路
系列更新不迷路,下篇推荐:[Spring AI Alibaba 报错合集:我踩过的坑]