把机器学习模型轻松部署上线:SpringBoot + 通义千问 + RAG 实战指南
大家好!我是一名从培训班出来的前端开发,后来因为项目需要硬着头皮学了后端和AI部署。记得当初第一次听到“模型部署”“RAG”这些词时,简直一头雾水——文档又长又抽象,代码一跑就报错,连环境都装不明白。
所以今天,我想用最接地气的方式,带完全零基础的你,亲手完成一个能对话、能查知识、还能跑在真实服务器上的AI项目。不用懂高深数学,也不用会Python(当然会更好),只要你会写点Java,跟着一步步做就行!
这个项目到底能干啥?
我们最终要做的是:
一个用 SpringBoot 搭建的Web服务,用户输入问题,后端调用 通义千问(Qwen)大模型,并通过 RAG(检索增强生成)技术,让它只根据你提供的资料回答问题——比如公司手册、产品文档、课程讲义等。
举个栗子🌰:
你上传一份《员工考勤制度.pdf》,用户问“迟到怎么扣钱?”,系统就能准确从文档里找出答案,而不是瞎编。
这在企业应用中超级实用!而我们要做的,就是把这套流程跑通。
第一步:环境准备(别怕,超详细)
💡 我当初卡在环境配置上整整三天!所以这里我把每一步都写清楚,照着敲就行。
1. 安装必备软件
| 软件 | 版本建议 | 用途 |
|---|---|---|
| JDK | 17 或 21 | Java运行环境 |
| Maven | 3.8+ | 项目依赖管理 |
| Python | 3.9+ | 后续处理文档用(可选但推荐) |
| IDE | IDEA / VS Code | 写代码 |
✅ 检查是否安装成功:
java -version
mvn -v
python --version
2. 获取通义千问API密钥
- 打开 阿里云百炼平台(免费注册)
- 创建应用 → 获取
API_KEY - 记下你的
MODEL_NAME,比如qwen-max
⚠️ 新手注意:不要把API_KEY提交到GitHub!后面我们会教你怎么安全使用。
第二步:搞懂几个关键概念(说人话版)
什么是 SpringBoot?
简单说:Java写Web服务的“脚手架”。它帮你自动配好服务器、路由、数据库连接等,你只需专注写业务逻辑。
就像你开奶茶店,SpringBoot已经帮你把店面装修好、水电接通,你只需要放原料、做奶茶。
什么是 通义千问(Qwen)?
阿里巴巴开源的大语言模型。你可以把它当成一个“超级聪明的AI助手”,通过API提问,它就能回答。
比如你问:“北京天气怎么样?” → 它返回文字答案。
但我们不希望它胡说八道,所以要加 RAG。
什么是 RAG(Retrieval-Augmented Generation)?
中文叫“检索增强生成”。它的核心思想是:
先查资料,再让AI回答
流程如下:
用户提问
↓
从你的知识库(比如PDF/Word)中检索相关段落
↓
把这些段落 + 用户问题 一起发给大模型
↓
大模型基于资料生成准确回答
这样,AI就不会凭空编造,而是“有据可依”。
第三步:动手做一个完整项目
🛠️ 项目结构预览(Maven项目):
ml-deploy-demo/
├── pom.xml
├── src/
│ └── main/
│ ├── java/com/example/demo/
│ │ ├── controller/QaController.java
│ │ ├── service/RagService.java
│ │ └── DemoApplication.java
│ └── resources/application.yml
1. 创建SpringBoot项目
打开 start.spring.io,选择:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x
- Dependencies: Spring Web, Lombok
下载后解压,用IDEA打开。
2. 添加必要依赖(pom.xml)
在 <dependencies> 里加上:
<!-- 阿里云SDK(用于调用通义千问) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>aliyun-sdk-dashscope</artifactId>
<version>2.15.0</version>
</dependency>
<!-- 工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
3. 配置API密钥(安全第一!)
在 application.yml 中:
dashscope:
api-key: ${DASHSCOPE_API_KEY} # 从环境变量读取,不写死!
启动项目前,在终端设置环境变量:
# Linux/Mac
export DASHSCOPE_API_KEY=你的密钥
# Windows (PowerShell)
$env:DASHSCOPE_API_KEY="你的密钥"
✅ 避坑指南:永远不要把密钥写在代码里!否则一上传GitHub就被盗用。
4. 模拟一个“知识库”
为了简化,我们先不用PDF解析,直接用一个字符串数组当知识库:
// RagService.java
@Service
public class RagService {
// 模拟知识库(实际项目可用数据库或向量库)
private static final List<String> KNOWLEDGE_BASE = Arrays.asList(
"公司规定:迟到30分钟以内扣50元。",
"请假需提前24小时在OA系统申请。",
"加班费按1.5倍计算。"
);
public String retrieve(String query) {
// 简单关键词匹配(生产环境用向量搜索)
for (String doc : KNOWLEDGE_BASE) {
if (doc.contains(query)) {
return doc;
}
}
return "未找到相关信息。";
}
}
🔜 后续升级:可以用
LangChain4j或Milvus做真正的语义检索。
5. 调用通义千问生成答案
// RagService.java 继续添加
public String generateAnswer(String query, String context) {
try {
// 构造提示词(Prompt)
String prompt = "你是一个公司HR助手。请根据以下资料回答问题,不要编造。\n\n资料:"
+ context + "\n\n问题:" + query;
// 调用DashScope API
DashScope dashScope = new DashScope(System.getenv("DASHSCOPE_API_KEY"));
TextGenerationRequest request = new TextGenerationRequest();
request.setModel("qwen-max");
request.setInput(new TextGenerationRequest.Input(prompt));
request.setParameters(new TextGenerationParameters(512, 0.7, 0.85));
TextGenerationResponse response = dashScope.textGeneration().call(request);
return response.getOutput().getText();
} catch (Exception e) {
return "AI服务暂时不可用,请稍后再试。";
}
}
6. 编写接口控制器
// QaController.java
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class QaController {
private final RagService ragService;
@PostMapping("/ask")
public Map<String, String> ask(@RequestBody Map<String, String> request) {
String question = request.get("question");
// 1. 检索相关资料
String context = ragService.retrieve(question);
// 2. 让AI基于资料回答
String answer = ragService.generateAnswer(question, context);
Map<String, String> result = new HashMap<>();
result.put("answer", answer);
result.put("context", context);
return result;
}
}
7. 启动并测试!
运行 DemoApplication.java,然后用curl测试:
curl -X POST http://localhost:8080/api/ask \
-H "Content-Type: application/json" \
-d '{"question":"迟到扣多少钱?"}'
预期返回:
{
"answer": "根据公司规定,迟到30分钟以内扣50元。",
"context": "公司规定:迟到30分钟以内扣50元。"
}
🎉 成功!你刚刚完成了一个带RAG的AI问答系统!
新手常踩的坑 & 解决方案
| 问题 | 原因 | 解决办法 |
|---|---|---|
启动报错 NoClassDefFoundError |
Maven依赖没下载完 | 在IDEA里右键项目 → Maven → Reload |
| 调用API返回401 | API_KEY错误或过期 | 检查百炼平台密钥是否有效 |
| 中文乱码 | SpringBoot默认编码非UTF-8 | 在application.yml加 server.servlet.encoding.charset=UTF-8 |
| AI答非所问 | Prompt设计不好 | 明确告诉AI“只根据资料回答,不知道就说不知道” |
| 知识库查不到 | 关键词不匹配 | 后续改用向量检索(如Sentence-BERT) |
下一步怎么学?我的真心建议
- 先跑通再优化:你现在这个版本虽然简单,但架构是对的。别一上来就想搞复杂。
- 升级知识库:
- 用
Apache Tika解析PDF/Word - 用
H2或MySQL存文本 - 引入
LangChain4j做向量化检索
- 用
- 部署到云服务器:
- 打包:
mvn clean package - 上传jar包到云服务器(阿里云ECS)
- 后台运行:
nohup java -jar demo.jar &
- 打包:
- 加前端页面:用Vue/React做个简单输入框,调用你的
/api/ask接口,立刻变成品!
💬 我当初就是从这样一个“玩具项目”开始,三个月后进了AI创业公司做全栈。动手比完美更重要。
总结
今天我们用 SpringBoot + 通义千问 + RAG,从零搭建了一个可控、可信、可上线的AI问答系统。整个过程没有复杂的数学,全是可复制的代码。
记住这个公式:
用户问题 + 你的资料 + 大模型 = 专业AI助手
现在,去试试吧!遇到问题,欢迎留言讨论。毕竟,我也曾是个连Maven都不会配的小白 😄

评论 0