【Spring AI & LangChain4j 基础篇】告别“Hello World”!用Spring Boot开发带多轮对话的智能问答助手
引言
对于Java入门者来说,最头疼的莫过于“学完基础却没项目可练”,要么项目太复杂无从下手,要么太简单达不到实战效果。今天就带大家做一个闭环实战项目——Java版极简智能问答助手,整合Spring Boot+极简前端,实现会话历史、多轮对话核心功能,代码完整可运行,还会分享进阶学习路径,帮新手快速打通“理论→实战→部署”的链路~ 👍 建议点赞收藏,跟着步骤走,入门也能写出可落地的项目!
文章目录
一、项目需求与架构设计
1.1 核心需求(新手友好版)
作为入门级项目,我们不追求复杂功能,聚焦“能用、易懂、可扩展”,核心需求如下:
- 基础对话:用户输入问题,后端接收并返回回答(暂用模拟数据,后续可无缝对接AI接口);
- 会话管理:记录用户会话历史,支持多轮对话(比如用户追问“刚才的问题再解释下”,能关联上下文);
- 极简前端:无需复杂UI,一个输入框+对话展示区即可,降低开发门槛;
- 异常处理:处理空输入、会话超时等常见问题,提升用户体验;
- 可运行部署:提供打包教程,本地可直接运行,支持后续二次开发。
1.2 技术架构选型
考虑到入门友好性,技术栈均选用主流、易上手的框架,避免冷门技术增加学习成本:
- 后端:Spring Boot(简化配置,快速搭建后端服务);
- 前端:HTML+CSS+JavaScript(极简写法,无需框架,新手也能看懂);
- 数据存储:HashMap(临时存储会话历史,入门阶段无需数据库,降低复杂度);
- 交互方式:前后端通过HTTP接口通信,简单直观。
1.3 架构流程图 📊
核心流程:用户输入 → 前端提交请求 → 后端接收并处理(会话管理+模拟回答) → 后端返回结果 → 前端展示(含历史记录)
二、核心功能开发(附完整代码)
2.1 项目初始化(Step 1:搭建Spring Boot项目)
2.1.1 初始化步骤
- 打开IDEA,新建Spring Boot项目,选择“Spring Initializr”;
- 填写项目信息(Group、Artifact自行定义,比如group=com.yufeng,artifact=qa-assistant);
- 勾选依赖:Spring Web(用于开发HTTP接口);
- 完成项目创建,删除默认的DemoApplication以外的无用文件,整理目录结构。
2.1.2 目录结构(极简版)
qa-assistant/
├── src/
│ ├── main/
│ │ ├── java/com/yufeng/qa/
│ │ │ ├── controller/ // 接口层,接收前端请求
│ │ │ ├── service/ // 业务层,处理会话和回答逻辑
│ │ │ ├── model/ // 实体类,存储会话和消息
│ │ │ └── QaAssistantApplication.java // 启动类
│ │ └── resources/
│ │ ├── static/ // 存放前端页面
│ │ └── application.properties // 配置文件
│ └── test/ // 测试类,入门阶段可暂不编写
└── pom.xml // 依赖配置
2.2 实体类开发(Step 2:定义核心数据模型)
新建实体类,用于存储会话信息和消息内容,代码简洁,注释详细,新手可直接复制:
2.2.1 会话实体(Session.java)
package com.yufeng.qa.model;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 会话实体类,存储单个用户的会话信息
* 新手提示:@Data注解是Lombok的功能,可自动生成getter/setter,无需手动编写
* 如需使用,需在pom.xml中添加Lombok依赖(下文会给出)
*/
@Data
public class Session {
// 会话ID(唯一标识,用于区分不同用户的会话)
private String sessionId;
// 会话创建时间(毫秒级,用于后续会话超时判断)
private Long createTime;
// 会话历史消息列表(存储用户和助手的所有消息)
private List<Message> messageList = new ArrayList<>();
}
2.2.2 消息实体(Message.java)
package com.yufeng.qa.model;
import lombok.Data;
/**
* 消息实体类,存储单条对话消息
*/
@Data
public class Message {
// 消息发送方(USER:用户,ASSISTANT:助手)
private String sender;
// 消息内容
private String content;
// 消息发送时间
private Long sendTime;
}
2.2.3 补充Lombok依赖(pom.xml)
在pom.xml中添加Lombok依赖,简化实体类开发:
<!-- Lombok依赖,简化实体类getter/setter -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.3 业务层开发(Step 3:实现会话管理和回答逻辑)
业务层是核心,负责处理会话的创建、查询、更新,以及模拟回答生成,代码逻辑清晰,适合新手理解:
2.3.1 会话服务接口(SessionService.java)
package com.yufeng.qa.service;
import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;
import java.util.List;
/**
* 会话服务接口,定义核心业务方法
*/
public interface SessionService {
// 创建新会话,返回会话ID
String createSession();
// 根据会话ID获取会话信息
Session getSessionById(String sessionId);
// 新增会话消息(用户提问/助手回答)
void addMessage(String sessionId, Message message);
// 模拟生成回答(入门阶段用固定逻辑,后续可替换为AI接口)
String generateAnswer(String question, List<Message> history);
}
2.3.2 会话服务实现类(SessionServiceImpl.java)
package com.yufeng.qa.service.impl;
import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;
import com.yufeng.qa.service.SessionService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* 会话服务实现类,核心业务逻辑
*/
@Service
public class SessionServiceImpl implements SessionService {
// 用HashMap存储会话信息,key=会话ID,value=会话对象(入门阶段无需数据库)
private final Map<String, Session> sessionMap = new HashMap<>();
/**
* 创建新会话
* UUID.randomUUID():生成唯一会话ID,无需手动维护
*/
@Override
public String createSession() {
Session session = new Session();
String sessionId = UUID.randomUUID().toString().replace("-", "");
session.setSessionId(sessionId);
session.setCreateTime(System.currentTimeMillis());
sessionMap.put(sessionId, session);
return sessionId;
}
/**
* 根据会话ID获取会话,若会话不存在则创建新会话
*/
@Override
public Session getSessionById(String sessionId) {
// 会话不存在或为空,创建新会话
if (sessionId == null || sessionId.isEmpty() || !sessionMap.containsKey(sessionId)) {
return sessionMap.get(createSession());
}
return sessionMap.get(sessionId);
}
/**
* 新增会话消息,添加到会话历史中
*/
@Override
public void addMessage(String sessionId, Message message) {
Session session = getSessionById(sessionId);
message.setSendTime(System.currentTimeMillis());
session.getMessageList().add(message);
sessionMap.put(sessionId, session);
}
/**
* 模拟生成回答(新手可修改这里的逻辑,实现自定义回答)
* 这里简单处理:如果提问包含“你好”“哈喽”,则回复问候;否则回复默认内容
*/
@Override
public String generateAnswer(String question, List<Message> history) {
// 模拟关联上下文:如果历史中有“什么是Java”,后续追问“它的特点”,则针对性回复
boolean hasJavaQuestion = history.stream()
.anyMatch(msg -> msg.getContent().contains("什么是Java"));
if (question.contains("你好") || question.contains("哈喽") || question.contains("hi")) {
return "你好呀~ 我是Java极简智能问答助手,有什么问题可以问我哦!😊";
} else if (hasJavaQuestion && (question.contains("特点") || question.contains("特性"))) {
return "Java的核心特点有:跨平台、面向对象、安全性高、可移植性强,非常适合入门学习~";
} else if (question.contains("Java") || question.contains("java")) {
return "Java是一门面向对象的编程语言,广泛用于后端开发、移动开发等领域,是入门编程的好选择!";
} else {
return "抱歉,我还在学习中~ 目前只能回答关于Java的基础问题哦,你可以试试问“什么是Java”~";
}
}
}
2.4 接口层开发(Step 4:编写前后端交互接口)
接口层负责接收前端请求,调用业务层方法,返回结果,这里提供2个核心接口:创建会话、发送消息,代码简洁,带异常处理:
2.4.1 问答接口(QaController.java)
package com.yufeng.qa.controller;
import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;
import com.yufeng.qa.service.SessionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 问答接口控制器,接收前端请求
*/
@RestController
public class QaController {
@Autowired
private SessionService sessionService;
/**
* 接口1:创建新会话
* 前端初始化时调用,获取会话ID
*/
@PostMapping("/createSession")
public Map<String, String> createSession() {
Map<String, String> result = new HashMap<>();
try {
String sessionId = sessionService.createSession();
result.put("code", "200"); // 成功状态码
result.put("sessionId", sessionId);
result.put("msg", "会话创建成功");
} catch (Exception e) {
result.put("code", "500"); // 异常状态码
result.put("msg", "会话创建失败:" + e.getMessage());
}
return result;
}
/**
* 接口2:发送消息,获取回答
* 用户输入问题时调用,携带会话ID和问题内容
*/
@PostMapping("/sendMessage")
public Map<String, Object> sendMessage(
@RequestParam(required = false) String sessionId,
@RequestParam String question
) {
Map<String, Object> result = new HashMap<>();
try {
// 1. 校验输入(异常处理:空问题直接返回提示)
if (question == null || question.trim().isEmpty()) {
result.put("code", "400");
result.put("msg", "请输入您的问题哦~");
return result;
}
// 2. 获取会话,新增用户消息
Session session = sessionService.getSessionById(sessionId);
Message userMessage = new Message();
userMessage.setSender("USER");
userMessage.setContent(question.trim());
sessionService.addMessage(session.getSessionId(), userMessage);
// 3. 生成助手回答,新增助手消息
String answer = sessionService.generateAnswer(question.trim(), session.getMessageList());
Message assistantMessage = new Message();
assistantMessage.setSender("ASSISTANT");
assistantMessage.setContent(answer);
sessionService.addMessage(session.getSessionId(), assistantMessage);
// 4. 返回结果(会话ID、回答、历史消息)
result.put("code", "200");
result.put("sessionId", session.getSessionId());
result.put("answer", answer);
result.put("history", session.getMessageList());
result.put("msg", "消息发送成功");
} catch (Exception e) {
result.put("code", "500");
result.put("msg", "消息处理失败:" + e.getMessage());
}
return result;
}
}
2.5 前端页面开发(Step 5:极简页面,快速实现交互)
前端无需复杂框架,用纯HTML+CSS+JavaScript实现,放在resources/static目录下,命名为index.html,打开即可使用:
<!DOCTYPE html>
Java极简智能问答助手Java极简智能问答助手(入门实战版)
2.6 配置文件优化(application.properties)
简化配置,设置端口号(避免默认端口冲突),添加日志配置,方便调试:
# 服务器端口号,可自行修改(比如8081、8082)
server.port=8080
# 日志配置,打印接口请求日志,方便调试
logging.level.org.springframework.web=INFO
logging.level.com.yufeng.qa=DEBUG
三、项目打包与运行教程(新手必看)
3.1 本地运行(IDEA中直接运行)
- 打开QaAssistantApplication.java(启动类),点击右上角的“运行”按钮(绿色三角);
- 启动成功后,控制台会显示“Started QaAssistantApplication in xxx seconds”;
- 打开浏览器,输入地址:http://localhost:8080(端口号与配置文件一致),即可看到问答助手页面,开始测试。
3.2 打包成JAR包(可在任何电脑运行)
3.2.1 打包步骤
- 在IDEA右侧,找到“Maven”面板,展开“Lifecycle”;
- 双击“clean”,清理项目编译文件;
- 双击“package”,开始打包,打包成功后,控制台会显示“BUILD SUCCESS”;
- 找到打包后的JAR包,路径:项目根目录/target/qa-assistant-0.0.1-SNAPSHOT.jar(名称根据你的项目配置而定)。
3.2.2 运行JAR包
- 将JAR包复制到任意文件夹(比如桌面);
- 打开cmd(Windows)或终端(Mac/Linux),进入JAR包所在目录;
- 输入命令:java -jar qa-assistant-0.0.1-SNAPSHOT.jar(替换为你的JAR包名称);
- 运行成功后,打开浏览器输入http://localhost:8080,即可使用。
💡 新手提示:如果运行失败,大概率是JDK版本问题,建议使用JDK8或JDK11(Spring Boot的兼容版本),无需安装其他软件。
四、入门阶段总结与进阶路径规划
4.1 项目总结(核心收获)
这个项目是Java入门的“闭环实战”,看似简单,但覆盖了后端开发的核心流程:
- 掌握Spring Boot项目的搭建、配置和运行;
- 理解前后端交互的基本原理(HTTP接口调用);
- 学会会话管理、异常处理等基础业务逻辑的实现;
- 掌握项目打包部署的基本方法,实现“写得出、跑起来”;
- 学会用极简前端快速实现交互,不用纠结复杂UI。
👍 小提示:这个项目虽然是入门级,但可扩展性极强,后续只需修改少量代码,就能对接ChatGPT、百度文心一言等AI接口,实现真正的智能问答,建议大家动手实践,不要只看不动手!
4.2 进阶学习路径(新手友好)
如果想进一步提升,从入门走向进阶,可按照以下路径学习,循序渐进:
- 基础强化:熟练掌握Java基础(集合、多线程、IO)、Spring Boot核心注解和配置;
- 数据存储:学习MySQL数据库,将项目中的HashMap替换为数据库,实现会话持久化;
- 接口优化:学习RESTful接口规范,添加接口文档(Swagger),优化异常处理;
- AI对接:学习调用ChatGPT/文心一言API,替换项目中的模拟回答,实现真正的智能对话;
- 前端升级:学习Vue.js,开发更美观的前端页面,添加更多功能(如会话切换、消息删除);
- 部署优化:学习Docker容器化,将项目部署到云服务器(如阿里云、腾讯云),实现公网访问。
结尾
本文通过一个极简智能问答助手项目,带大家完成了Java入门的闭环实战,从架构设计、代码开发到打包部署,每一步都有详细说明和完整代码,新手也能轻松上手。这个项目的核心价值在于“落地性”,让大家摆脱“只会看不会写”的困境,真正感受到Java开发的乐趣。
✨ 最后,如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我(CSDN博主:予枫),后续会分享更多Java入门实战项目和进阶技巧,一起从新手成长为资深开发者!
更多推荐




所有评论(0)