news 2026/4/17 21:33:14

Spring AI Alibaba 快速开始:5分钟跑通第一个应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI Alibaba 快速开始:5分钟跑通第一个应用

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 自动装配机制帮你初始化好ChatClientChatModel这些核心 Bean,不用你手动创建。


第二步:配置 API Key 和模型

src/main/resources/application.yml里写上:

server:port:8080spring:application:name:spring-ai-alibaba-helloai:zhipuai:api-key:${ZHIPUAI_API_KEY:your-api-key-here}chat:options:model:glm-4temperature:0.7max-tokens:2000

这里有个小细节:${ZHIPUAI_API_KEY:your-api-key-here}用的 SpEL 表达式,冒号后面是默认值。开发阶段图省事可以直接把 Key 写在默认值里,但正式项目别这么干。

设置环境变量:

# macOS / LinuxexportZHIPUAI_API_KEY=你的智谱API-KEY
# Windows PowerShell$env:ZHIPUAI_API_KEY="你的智谱API-KEY"

第三步:写 Controller

新建ChatController.java

packagecom.alibaba.cloud.ai.examples.chatbot;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;importorg.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;importorg.springframework.ai.chat.memory.MessageWindowChatMemory;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/chat")publicclassChatController{privatestaticfinalStringDEFAULT_PROMPT="你是一个博学的智能聊天助手,请根据用户提问回答!";privatefinalChatClientchatClient;publicChatController(ChatClient.BuilderchatClientBuilder){this.chatClient=chatClientBuilder.defaultSystem(DEFAULT_PROMPT)// 支持对话记忆——模型能记住上下文.defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().maxMessages(50).build()).build())// 开启日志,方便调试.defaultAdvisors(newSimpleLoggerAdvisor()).build();}@GetMapping("/simple")publicStringsimpleChat(@RequestParamStringquery){returnchatClient.prompt(query).call().content();}}

这段代码核心就一个东西:ChatClient

构造方法里通过chatClientBuilder注入,配了三个东西:

  • System Prompt:告诉模型"你是一个博学的助手",设定角色
  • MessageChatMemoryAdvisor:对话记忆,用了MessageWindowChatMemorymaxMessages(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-milestonessonatype-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,在换模型的过程中遇到了不少坑,这不下篇的素材就有了->_->

官方文档:https://java2ai.com/docs/1.0.0-M6.1/get-started/

有问题欢迎评论区见。


🎯 收藏+关注,持续更新

如果觉得有帮助,请:

  1. 收藏本文—— 方便后续查阅,随时回顾核心概念
  2. 📱关注同名公众号—— 点击菜单「获取源码」获取完整代码(Gitee 仓库)
  3. 🔗分享给同事—— 一起学习 Spring AI Alibaba,少走弯路

系列更新不迷路,下篇推荐:[Spring AI Alibaba 报错合集:我踩过的坑]


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:30:09

华夏文化复兴,衣冠先行

近年来&#xff0c;汉服从昔日的小众圈层&#xff0c;一步步走出古籍、走出博物馆&#xff0c;走向街头巷尾、校园典礼、文旅景区&#xff0c;甚至登上央视春晚、文化盛典的舞台&#xff0c;被光明日报、人民日报等主流媒体频频肯定与倡导。一场由衣冠而起的文化回归&#xff0…

作者头像 李华
网站建设 2026/4/17 21:29:53

用PyTorch从零实现DQN算法:以CartPole游戏为例(附完整代码)

用PyTorch从零实现DQN算法&#xff1a;以CartPole游戏为例&#xff08;附完整代码&#xff09; 在强化学习领域&#xff0c;深度Q网络&#xff08;DQN&#xff09;算法无疑是一座重要的里程碑。它将深度学习的强大表征能力与强化学习的决策框架完美结合&#xff0c;为解决复杂环…

作者头像 李华
网站建设 2026/4/17 21:29:07

从程序员到AI大模型专家:一份超全转行攻略与学习资源大放送!

本文为有志于转行至AI大模型领域的开发程序员提供了一份详细攻略&#xff0c;涵盖数学知识、编程技能、机器学习基础、深度学习、特定领域知识、实践项目、阅读论文、参加会议、跟踪行业动态、面试准备、持续学习与适应变化以及心态调整等方面。此外&#xff0c;还提供了丰富的…

作者头像 李华
网站建设 2026/4/17 21:27:56

ABAP CDS注解实战:从元数据定义到系统交互的深度解析

1. ABAP CDS注解&#xff1a;数据模型的元数据桥梁 第一次接触ABAP CDS注解时&#xff0c;我把它当成了普通的代码注释——直到发现用AbapCatalog.sqlViewName定义的视图竟然自动出现在SE11事务码里&#xff0c;才意识到这完全是另一种存在。CDS注解本质上是一套结构化元数据标…

作者头像 李华
网站建设 2026/4/17 21:23:37

log2对数二阶多项式近似计算

目录 0. 目标 1. 对数核心分解 2. 为什么只需要近似 f ∈ [1,2)&#xff1f; 3. 二阶多项式近似公式 4. Q8 定点化&#xff08;系数 369、185 的由来&#xff09; 5. 归一化 f&#xff08;代码最关键一步&#xff09; 6. d 的 Q8 表示 7. 二阶多项式计算 8. 最终结果合…

作者头像 李华