跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

Spring Boot 4.0 + Java 21 + Spring AI 2.0 大模型面试辅助平台实战

本项目基于 Spring Boot 4.0、Java 21 及 Spring AI 2.0 构建,提供智能简历分析、模拟面试及 RAG 知识库问答三大核心功能。技术栈涵盖 PostgreSQL pgvector 向量检索、Redis Stream 异步处理、SSE 流式输出等。文章详解了架构设计、技术选型理由(如为何选 pgvector 而非 MySQL)、以及关键代码实现思路,适合希望深入 AI 应用开发及全栈实践的开发者参考。

颠三倒四发布于 2026/2/23更新于 2026/10/2594 浏览
Spring Boot 4.0 + Java 21 + Spring AI 2.0 大模型面试辅助平台实战

项目概述

这是一个基于 Spring Boot 4.0、Java 21 和 Spring AI 2.0 构建的 AI 智能面试辅助平台。系统旨在提供从简历分析到模拟面试的全流程支持,并集成了 RAG(检索增强生成)知识库问答功能。

核心功能

  1. 智能简历分析:上传简历后,AI 自动进行多维度评分并给出改进建议。
  2. 模拟面试系统:基于简历内容生成个性化面试题,支持实时问答和答案评估。
  3. RAG 知识库问答:上传技术文档构建私有知识库,支持向量检索增强的智能问答。

效果展示

系统架构

系统采用前后端分离架构,整体分为三层:前端展示层、后端服务层、数据存储层。

系统架构图

后端层

  • REST Controllers:统一的 API 入口,处理 HTTP 请求。
  • 业务服务层:
    • Resume Service:简历上传、解析、AI 分析。
    • Interview Service:面试会话管理、问题生成、答案评估。
    • Knowledge Service:知识库上传、文本分块、向量化。
    • RAG Chat Service:检索增强生成,流式问答。
  • 异步处理层:基于 Redis Stream 的消费者,异步处理耗时的 AI 任务(如简历分析、向量化、面试评估)。
  • AI 集成层:Spring AI + DashScope(通义千问)。统一的 LLM 调用接口,支持对话生成和文本向量化。

数据存储层

  • PostgreSQL + pgvector:
    • 关系数据:简历、面试记录、知识库元数据。
    • 向量检索:存储文档向量,支持相似度搜索。
  • Redis:
    • 会话缓存:面试会话状态。
    • 消息队列:Redis Stream 实现异步任务队列。
  • RustFS/MinIO (S3):原始文件(简历 PDF、知识库文档)。

异步处理流程

简历分析、知识库向量化和面试报告生成采用 Redis Stream 异步处理。以简历分析和知识库向量化为例,整体流程如下:

上传请求 → 保存文件 → 发送消息到 Stream → 立即返回 ↓ Consumer 消费消息 ↓ 执行分析/向量化任务 ↓ 更新数据库状态 ↓ 前端轮询获取最新状态 

状态流转:PENDING → PROCESSING → COMPLETED / FAILED

知识库问答处理流程

知识库问答 → 问题向量化 → pgvector 相似度搜索 → 检索相关文档 ↓ 构建 Prompt → LLM 生成回答 → SSE 流式返回 

技术栈概览

后端技术

技术版本说明
Spring Boot4.0应用框架
Java21开发语言
Spring AI2.0AI 集成框架
PostgreSQL + pgvector14+关系数据库 + 向量存储
Redis6+缓存 + 消息队列(Stream)
Apache Tika2.9.2文档解析
iText 88.0.5PDF 导出
MapStruct1.6.3对象映射
Gradle8.14构建工具

前端技术

技术版本说明
React18.3UI 框架
TypeScript5.6开发语言
Vite5.4构建工具
Tailwind CSS4.1样式框架
React Router7.11路由管理
Framer Motion12.23动画库
Recharts3.6图表库
Lucide React0.468图标库

技术选型深度解析

为什么选择 Spring AI?

Spring AI 是 Spring 官方推出的 AI 集成框架,提供了统一的 LLM 调用抽象。选择它的原因主要包括:

  1. 统一抽象:一套代码支持多种 LLM 提供商(OpenAI、阿里云 DashScope、Ollama 等),切换模型只需修改配置。
  2. Spring 生态集成:与 Spring Boot 无缝集成,支持自动配置、依赖注入、声明式调用。
  3. 内置向量存储支持:原生支持 pgvector、Milvus、Pinecone 等向量数据库,简化 RAG 开发。
  4. 结构化输出:通过 BeanOutputConverter 将 LLM 输出直接映射为 Java 对象,无需手动解析 JSON。
// 示例:Spring AI 结构化输出
var converter = new BeanOutputConverter<>(ResumeAnalysisDTO.class);
String result = chatClient.prompt()
    .system(systemPrompt)
    .user(userPrompt + converter.getFormat())
    .call().content();
return converter.convert(result); // 直接得到 Java 对象

数据存储为什么选择 PostgreSQL + pgvector?

本项目需要同时存储结构化数据(简历、面试记录)和向量数据(文档 Embedding)。方案对比:

方案优点缺点
PostgreSQL + pgvector一套数据库搞定,运维简单向量检索性能不如专业向量库
PostgreSQL + Milvus向量检索性能更好多一个组件,运维复杂度增加
PostgreSQL + Pinecone云托管,无需运维成本高,数据在第三方

选择 pgvector 的理由:

  • 架构简单:不引入额外组件,降低部署和运维复杂度。
  • 性能够用:HNSW 索引支持毫秒级检索,万级文档场景完全够用。
  • 事务一致性:向量数据和业务数据在同一数据库,天然支持事务。
  • SQL 查询:可以结合 WHERE 条件过滤,比如"只在某个分类的知识库中检索"。
-- pgvector 相似度搜索示例
SELECT content, 1-(embedding <=> $1) as similarity 
FROM vector_store 
WHERE metadata->>'category'='Java'
ORDER BY embedding <=> $1 
LIMIT 5;

PostgreSQL 最大的优势在于其强大的可扩展性。开发者可以在不修改内核的情况下,像'即插即用'一样为数据库安装各种功能强大的插件,这让 PostgreSQL 变成了一个无所不能的'数据瑞士军刀'。例如 AI 向量检索有 pgvector,全文搜索有 pg_bm25,时序数据有 TimescaleDB,地理信息有 PostGIS。这种'一站式'解决能力,正是其魅力所在。

为什么引入 Redis?

本项目主要有两个场景用到了 Redis:

  1. Redis 替代 ConcurrentHashMap 实现会话的缓存。
  2. 基于 Redis Stream 实现简历分析、知识库向量化等场景的异步(还能解耦,分析和向量化可以使用其他编程语言来做)。

为什么引入 Redis Stream?为何不选择 Kafka、RabbitMQ 等更成熟的消息队列?

简历分析、知识库向量化等 AI 任务耗时较长(10-60 秒),不适合同步处理。需要消息队列实现异步解耦。

维度Redis StreamRabbitMQKafka内存队列
吞吐量高(十万级 QPS)中(万级 QPS)极高(百万级,水平扩展)极高(千万级/秒,受限于 CPU/内存)
延迟极低(亚毫秒级)低(毫秒级)中(毫秒到十毫秒级)极低(纳秒/微秒级)
持久化支持(RDB/AOF)支持(Mnesia/磁盘)强支持(原生分段日志)无(进程终止即失)
消息堆积能力一般(受限于内存)中(磁盘堆积,性能下降明显)极强(TB 级磁盘存储)差(受限于堆内存)
消费模式发布订阅 / 消费者组灵活路由 / 多种交换机模式发布订阅 / 消费者组点对点 / 多消费者(取决于实现)
消息回溯支持(按 ID / 时间范围)不支持强支持(按 Offset / 时间戳)不支持
消息顺序性单 Stream 有序单队列有序单 Partition 有序有序(单队列)
可靠性中(异步复制可能丢失)高(Publisher Confirm / 事务)极高(多副本 ISR + acks)低(无持久化、无确认)
运维复杂度低中高(KRaft 模式已简化)极低
适用场景轻量级流处理、已有 Redis 基础设施复杂路由、企业级集成大数据流、事件溯源、日志聚合进程内解耦、极致性能场景

选择 Redis Stream 的理由:

  • 复用现有组件:Redis 已用于会话缓存,无需引入新中间件。
  • 功能满足需求:支持消费者组、消息确认(ACK)、持久化。
  • 运维简单:对于中小型项目,Redis Stream 完全够用。

构建工具为什么选择 Gradle?

SpringBoot 官方现在用的就是 Gradle,加上国内现在都是 Maven 更多,换个 Gradle 还更新颖一些。个人也更喜欢用 Gradle,也写过相关的文章。

为什么使用 MapStruct?

项目中有大量 Entity ↔ DTO 转换需求,MapStruct 是编译时代码生成的对象映射框架:

方案性能类型安全使用复杂度
MapStruct零反射,最快编译时检查定义接口即可
BeanUtils反射,慢运行时报错一行代码
ModelMapper反射,较慢运行时报错配置复杂
手写转换最快编译时检查重复代码多

为什么使用 Apache Tika?

系统需要解析多种格式的文档(PDF、Word、TXT),Apache Tika 是 Apache 基金会的文档解析库:

  • 格式支持全:PDF、DOCX、DOC、TXT、HTML、Markdown 等上百种格式。
  • 自动识别:根据文件内容自动检测格式,无需依赖文件扩展名。
  • 文本提取:统一的 API 提取纯文本,屏蔽格式差异。
// Tika 解析示例
Tika tika = new Tika();
String content = tika.parseToString(inputStream); // 自动识别格式并提取文本

为什么使用 SSE 而不是 WebSocket?

知识库问答需要流式输出(像 ChatGPT 那样逐字显示),有两种技术选择:

方案优点缺点
SSE简单,基于 HTTP,单向推送仅支持服务端 → 客户端
WebSocket双向通信,功能强大协议复杂,需要维护连接状态

选择 SSE 的理由:

  • 场景匹配:LLM 流式输出是单向的(服务端 → 客户端),不需要双向通信。
  • 实现简单:基于 HTTP,天然支持重连、跨域。
  • Spring 支持好:Flux<ServerSentEvent<String>> 一行代码搞定。

前端为什么选择 React + TypeScript + Tailwind CSS?

技术选择理由
React生态最成熟,组件化开发,社区资源丰富
TypeScript类型安全,IDE 智能提示,减少运行时错误
Vite开发服务器启动快(秒级),HMR 热更新体验好
Tailwind CSS原子化 CSS,快速开发,无需写 CSS 文件

效果展示

简历与面试

简历库:

文章配图

简历上传分析:

文章配图

简历分析详情:

文章配图

面试记录:

文章配图

面试详情:

文章配图

模拟面试:

文章配图

知识库

知识库管理:

文章配图

问答助手:

文章配图

学习收获

本项目采用行业最前沿的 Java 21 + Spring Boot 4.0 技术栈,是市面上首个深度集成 Spring AI 2.0 的全栈实战项目。项目整体设计遵循'由浅入深'原则。

深度掌握 AI 应用开发的核心范式

  • Spring AI 2.0 工业级实战:深入理解 Spring 官方的 AI 抽象层,掌握如何通过统一的声明式接口对接通义千问、OpenAI 等主流模型。
  • Prompt Engineering(提示词工程)深度应用:告别简单的字符串拼接。学习如何构建结构化的 System/User Prompt,并利用 BeanOutputConverter 实现 LLM 输出向 Java 对象的自动化映射,彻底终结繁琐的 JSON 手动解析。
  • RAG(检索增强生成)全链路闭环:深度拆解'文档解析 -> 文本分块 -> 向量化 (Embedding) -> 向量数据库存储 -> 相似度检索 -> 上下文增强生成'的完整技术链条。

现代化的 Java 后端架构思维

  • 拥抱 Java 21 与 Spring Boot 4.0:抢先布局虚拟线程 (Virtual Threads)、Record 类等高性能特性。针对 Spring Boot 4.0 的模块化设计进行深度适配,让你的技术栈领先市场。
  • 模块化单体架构:学习如何通过清晰的层级(Modules + Infrastructure + Common)组织代码。这种设计既具备微服务的解耦优势,又极大降低了单体应用的运维心智负担。
  • 极致的对象转换性能:通过 MapStruct 在编译期生成映射代码。学习如何在追求极致响应速度的场景下,优雅、安全地处理 Entity 与 DTO 之间的复杂映射。

务实的数据存储与中间件选型

我们拒绝盲目堆砌中间件,而是教你如何基于业务场景做出'最理智'的选择:

  • PostgreSQL + pgvector 的'一站式'存储方案:掌握如何在同一套数据库中高效处理关系型业务数据与高维向量数据。深入学习 HNSW 索引在万级文档场景下的性能调优实践。
  • Redis + Lua 分布式限流体系:实战封装高性能分布式限流组件。基于 Lua 脚本保证限流逻辑的原子性,支持按用户、IP 或全局维度的精准流量控制,有效防御恶意刷接口行为,保障高价值 AI API 的配额安全。
  • Redis Stream 异步任务处理:深入探讨在简历分析等耗时场景(10-60s)下,为什么选择轻量级的 Redis Stream 而非 Kafka。实战演示如何通过消息队列实现系统解耦与流量削峰。
  • 企业级文件处理与清洗优化:不仅利用 Apache Tika 构建通用的文档解析引擎,还配套实现了 TextCleaningService。通过正则清洗、空行标准化及文本去噪(如剔除图片链接、非法控制字符),显著提升 RAG 的召回质量;同时集成内容哈希检测,从源头拦截重复上传,节省存储与 Token 成本。

标准化的工程化交付与部署

  • Gradle 现代构建体系:摆脱 Maven 的繁琐配置,掌握 Gradle 8.14 及其版本目录 (Version Catalog) 的灵活性,学习如何优雅地管理大型项目依赖。
  • 生产级容器化部署:通过 Docker Compose 一键搭建包含数据库扩展、缓存、对象存储在内的全套运行环境,理解云原生时代下的基础设施配置规范。

丝滑的前端工程化与交互体验

对于后端开发者,这更是一次补齐'全栈视野'的绝佳机会:

  • SSE (Server-Sent Events) 流式渲染:掌握像 ChatGPT 一样逐字输出回答的底层技术,理解其在单向推送场景下相比 WebSocket 的架构优势。
  • 响应式 UI 与动效设计:利用 Tailwind CSS 极简构建美观界面,结合 Framer Motion 实现高级交互动效。
  • AI 数据可视化:通过 Recharts 将 AI 分析后的简历评分、多维对比以直观的雷达图形式呈现,让数据'会说话'。

项目地址

  • Github:https://github.com/Snailclimb/interview-guide
  • Gitee:https://gitee.com/SnailClimb/interview-guide

完整代码完全免费开源,没有 Pro 版本或者付费版!

目录

  1. 项目概述
  2. 核心功能
  3. 系统架构
  4. 后端层
  5. 数据存储层
  6. 异步处理流程
  7. 知识库问答处理流程
  8. 技术栈概览
  9. 后端技术
  10. 前端技术
  11. 技术选型深度解析
  12. 为什么选择 Spring AI?
  13. 数据存储为什么选择 PostgreSQL + pgvector?
  14. 为什么引入 Redis?
  15. 构建工具为什么选择 Gradle?
  16. 为什么使用 MapStruct?
  17. 为什么使用 Apache Tika?
  18. 为什么使用 SSE 而不是 WebSocket?
  19. 前端为什么选择 React + TypeScript + Tailwind CSS?
  20. 效果展示
  21. 简历与面试
  22. 知识库
  23. 学习收获
  24. 深度掌握 AI 应用开发的核心范式
  25. 现代化的 Java 后端架构思维
  26. 务实的数据存储与中间件选型
  27. 标准化的工程化交付与部署
  28. 丝滑的前端工程化与交互体验
  29. 项目地址

更多推荐文章

查看全部
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速
  • Axios 错误处理的设计与进阶封装,实现网络层面数据与状态解耦
  • MixAIHub:ChatGPT、Claude 等主流 AI 平台镜像访问入口
  • AI 算法基础入门:AI 产品经理核心知识指南
  • Secure DM Pairing:构建 AI 机器人安全私信访问机制
  • C++ 模板初阶:泛型编程基础与实践
  • Stable Diffusion LoRA 训练助手:自动生成高质量标签
  • AI Agent 选型指南:OpenClaw 生态 16 款工具深度对比
  • Python 的抽象基类、协议和鸭子类型
  • 利用 AI 智能体快速生成 C 语言及前端实训项目
  • 蓝桥杯算法竞赛经典题解汇总
  • AI Agent 智能体核心架构与实战解析
  • HarmonyOS6 Filter 属性实战:动态滤镜与阴影配置详解
  • 深入理解 Web Worker:Web 前端多线程实战
  • OpenCode 本地 AI 模型配置指南
  • YOLO12 在无人机倾斜摄影中的密集窗户识别实践
  • 鸿蒙金融理财全栈项目:生态合作、用户运营与数据变现
  • MySQL 联合查询详解:JOIN 类型与多表关联实战
  • Mac 专属大模型框架 Chat with MLX:两行代码部署与本地数据对话
  • Android 开发面试准备指南:简历技巧与大厂真题汇总

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online