系列导读:老张,38岁,Java后端12年,ERP系统的"活字典"。某天,总监拍着他说:"下季度给客服系统加个AI助手,你来负责。"老张的第一反应:完了,要学Python了。本系列将讲述老张如何用Spring AI在Java世界里玩转AI,从环境搭建到企业级Agent,全程实战,代码开源。
一、故事开场:老张的"晴天霹雳"
周三下午,总监老李把老张叫进会议室。
“小张啊,公司客服系统用户量涨了5倍,人力客服忙不过来。董事会说要加个AI助手,自动回答常见问题。你技术栈熟,这个项目你来带。”
老张愣了三秒。
AI助手?他脑子里蹦出的第一个念头是:Python、PyTorch、Transformers……那些他完全没碰过的东西。
“李总,这……我得先学Python吧?”
老李摆摆手:“不用那么复杂,就用你们熟悉的Java搞。现在有个叫Spring AI的东西,国内还做了阿里云版,直接调百炼的大模型就行。”
老张的内心独白:Java + AI?这不是跨服聊天吗?就像让一个厨师突然去开飞机——原理相通,但控制杆完全不一样啊!
二、技术破冰:什么是Spring AI?
2.1 Spring AI是什么?
一句话定义:Spring AI是Spring官方推出的AI应用开发框架,让Java开发者能用熟悉的Spring Boot习惯开发AI应用。
| 传统AI开发 | Spring AI开发 |
|---|---|
| Python + PyTorch/TensorFlow | Java + Spring Boot |
| 手写API调用、异常处理 | @Autowired注入ChatModel |
| 手动管理向量库连接 | Starter自动装配 |
| 换模型改一堆代码 | 改配置、换Starter |
2.2 双生态架构(关键!)
这是很多教程没讲清楚的:
┌─────────────────────────────────────────────┐ │ Spring AI(上游官方) │ │ 提供:ChatModel、EmbeddingModel、 │ │ RAG、向量库抽象、工具调用、记忆 │ │ 统一API,跨厂商可移植 │ └─────────────────────────────────────────────┘ ↓ 扩展 ┌─────────────────────────────────────────────┐ │ Spring AI Alibaba(阿里云版) │ │ 在Spring AI基础上增加: │ │ • DashScopeChatModel(百炼大模型) │ │ • Agent能力(工具调用循环、Skills) │ │ • Graph编排、多Agent协作 │ │ • MCP协议支持 │ └─────────────────────────────────────────────┘老张的理解:就像Android系统和MIUI的关系——Spring AI是底层系统,Spring AI Alibaba是加了本地化能力的定制版。
三、第一步:搭建环境
3.1 快速开始(5分钟搞定)
打开 start.spring.io,勾选:
- Spring Boot3.2+
- Spring AI AlibabaDashScope Starter
- Spring Web(后续做接口用)
或者直接复制Maven依赖:
<!-- 百炼大模型(Spring AI Alibaba,构建在 Spring AI 1.1 之上) --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><!-- 版本随 Spring AI Alibaba 发版同步,与配套仓库 pom.xml 一致(1.1.2.2) --><version>1.1.2.2</version></dependency>3.2 配置API Key
在application.yml里填入你的百炼API Key(去百炼平台申请):
spring:ai:dashscope:api-key:sk-xxxxxxxxxxxxxxxxxxxxxxxxchat:options:model:qwen-max# 选大模型还是qwen-turbo,看预算老张的吐槽:“这就完了?不需要装Python、不需要pip install、不需要配虚拟环境?Spring AI你是懂Java程序员的痛。”
四、第一个对话:ChatClient
4.1 传统方式 vs Spring AI方式
传统调用大模型API:
// 你得自己拼HTTP请求、处理JSON、管理TokenCloseableHttpClienthttpClient=HttpClients.createDefault();HttpParamsparams=newBasicHttpParams();// ... 50行代码后,终于拿到结果Spring AI方式:
@ServicepublicclassAiService{@AutowiredprivateChatClientchatClient;// 直接注入,框架帮你装配好publicStringchat(Stringquestion){returnchatClient.prompt().user(question).call().content();}}4.2 跑起来试试
写个Controller测一下:
@RestController@RequestMapping("/ai")publicclassAiController{@AutowiredprivateChatClientchatClient;@GetMapping("/chat")publicStringchat(@RequestParamStringquestion){returnchatClient.prompt().user(question).call().content();}}访问http://localhost:8080/ai/chat?question=你好
老张的惊喜:“返回了一段完整的问候语!没有报错、没有异常,就这么简单?”
五、进阶:让AI记住你(多轮对话)
5.1 问题:每问一次都是陌生人
默认情况下,ChatClient每次请求都是独立的。问"你叫什么名字",答完;再问"我刚才问了什么",AI一脸茫然。
5.2 解决方案:带历史的Prompt
publicStringchatWithHistory(Stringquestion,List<Message>history){Promptprompt=newPrompt(history);// 把历史消息传进去prompt.addMessage(newUserMessage(question));ChatResponseresponse=chatClient.prompt(prompt).call().getResult();// 把回复也加入历史,为下一轮做准备history.add(response.getResult().getOutput());returnresponse.getResult().getOutput().getText();}老张的类比:“这就像跟同事聊天——你不会每次见面都重新自我介绍一遍对吧?Spring AI的对话记忆就是让你’带着上下文继续聊’。”
六、实战项目:老张的客服助手原型
老张花了一晚上,写出了第一个可用版本:
@RestController@RequestMapping("/customer-service")publicclassCustomerServiceController{@AutowiredprivateChatClientchatClient;// 用Map存储每个用户的对话历史privatefinalMap<String,List<Message>>memory=newConcurrentHashMap<>();@PostMapping("/ask")publicStringask(@RequestBodyAskRequestrequest){StringuserId=request.getUserId();// 获取或创建该用户的历史List<Message>history=memory.computeIfAbsent(userId,k->newArrayList<>());// 构建带历史的PromptPromptprompt=newPrompt(history);prompt.addMessage(newUserMessage(request.getQuestion()));// 调用AIChatResponseresponse=chatClient.prompt(prompt).call().getResult();// 记录回复到历史history.add(response.getResult().getOutput());returnresponse.getResult().getOutput().getText();}}测试效果:
用户:你们退货政策是什么? AI:根据我们的规定,7天内可无理由退货... 用户:需要寄回原包装吗? AI:是的,需要保持原包装完整... 用户:那运费谁承担? AI:非质量问题由买家承担运费...老张的成就感:“这就跑通了!比我想象的简单太多了!”
七、下一集预告
老张刚把客服助手demo跑起来,总监老李又发来消息:“不错,但这只能回答通用问题。能不能让它学会我们公司的文档?比如产品手册、FAQ这些?”
AI学会了提问,但还没学会"读书"。
下一集《给AI装上知识库:RAG入门》将讲述:
- 什么是RAG(检索增强生成)
- 为什么单纯的大模型不够用
- 如何让AI基于你的文档回答问题
📦 完整代码仓库
所有代码已开源:
- GitHub:
https://github.com/yinclei/SpringAITutorial - 分支:
chapter01-first-chat
✅代码状态:本集代码见配套仓库
SpringAITutorial的ep01/包,已按 Spring AI 1.1.4(GA)编译验证(2026-08-23)。文中片段为教学简化示意,以仓库代码为准;API Key 用百炼免费额度自备。
💬 互动环节
老兵问答:
你在AI学习中遇到的最大障碍是什么?
A. Python环境配置
B. 数学公式看不懂
C. 不知道从哪学起
D. 其他(评论区说说)
下周一晚9点,我们继续老张的故事!
作者:Java老兵搞AI | 关注我,看Java如何玩转AI