把机器学习模型轻松部署上线:SpringBoot + 通义千问 + RAG 实战指南

线程池保洁员
2026-05-10 08:00
阅读 4450

大家好!我是一名从培训班出来的前端开发,后来因为项目需要硬着头皮学了后端和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密钥

  1. 打开 阿里云百炼平台(免费注册)
  2. 创建应用 → 获取 API_KEY
  3. 记下你的 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 "未找到相关信息。";
    }
}

🔜 后续升级:可以用 LangChain4jMilvus 做真正的语义检索。

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.ymlserver.servlet.encoding.charset=UTF-8
AI答非所问 Prompt设计不好 明确告诉AI“只根据资料回答,不知道就说不知道”
知识库查不到 关键词不匹配 后续改用向量检索(如Sentence-BERT)

下一步怎么学?我的真心建议

  1. 先跑通再优化:你现在这个版本虽然简单,但架构是对的。别一上来就想搞复杂。
  2. 升级知识库
    • Apache Tika 解析PDF/Word
    • H2MySQL 存文本
    • 引入 LangChain4j 做向量化检索
  3. 部署到云服务器
    • 打包:mvn clean package
    • 上传jar包到云服务器(阿里云ECS)
    • 后台运行:nohup java -jar demo.jar &
  4. 加前端页面:用Vue/React做个简单输入框,调用你的 /api/ask 接口,立刻变成品!

💬 我当初就是从这样一个“玩具项目”开始,三个月后进了AI创业公司做全栈。动手比完美更重要


总结

今天我们用 SpringBoot + 通义千问 + RAG,从零搭建了一个可控、可信、可上线的AI问答系统。整个过程没有复杂的数学,全是可复制的代码。

记住这个公式:

用户问题 + 你的资料 + 大模型 = 专业AI助手

现在,去试试吧!遇到问题,欢迎留言讨论。毕竟,我也曾是个连Maven都不会配的小白 😄

评论 0

最热最新
暂无评论
线程池保洁员Lv.1
0
影响力
0
文章
0
粉丝