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

基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 的智能面试辅助平台

一个基于 Spring Boot 4.0、Java 21 和 Spring AI 2.0 构建的 AI 智能面试辅助平台。项目包含智能简历分析、模拟面试系统及 RAG 知识库问答三大核心功能。技术架构采用前后端分离,后端使用 PostgreSQL 配合 pgvector 进行向量检索,Redis Stream 处理异步任务,前端基于 React 和 TypeScript。文章详细阐述了技术选型理由,包括为何选择 Spring AI、PostgreSQL 及 Redis Stream 等,并提供了相关代码示例与部署方案。

全栈工匠发布于 2026/3/29更新于 2026/9/1064 浏览
基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 的智能面试辅助平台

这是一个基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 的 AI 智能面试辅助平台。系统提供三大核心功能:

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

效果展示

项目地址

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

完整代码完全免费开源。

系统架构

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

架构图

后端层:

  • 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:会话缓存与消息队列(Stream)。
  • RustFS/MinIO (S3):原始文件存储。

异步处理流程:

上传请求 → 保存文件 → 发送消息到 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 扩展。

这种'一站式'解决能力,正是其魅力所在。它意味着许多项目不再需要依赖 Elasticsearch、Milvus 等大量外部中间件,仅凭一个增强版的 PostgreSQL 即可满足多样化需求,从而极大地简化了技术栈,降低了开发和运维的复杂度与成本。

为什么引入 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 还更新颖一些。

为什么使用 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 文件

效果展示

简历与面试

简历库:

文章配图

简历上传分析:

文章配图

简历分析详情:

文章配图

面试记录:

文章配图

面试详情:

文章配图

模拟面试:

文章配图

知识库

知识库管理:

文章配图

问答助手:

文章配图

目录

  1. 项目地址
  2. 系统架构
  3. 技术栈概览
  4. 后端技术
  5. 前端技术
  6. 技术选型常见问题解答
  7. 为什么选择 Spring AI?
  8. 数据存储为什么选择 PostgreSQL + pgvector?
  9. 为什么引入 Redis?
  10. 构建工具为什么选择 Gradle?
  11. 为什么使用 MapStruct?
  12. 为什么使用 Apache Tika?
  13. 为什么使用 SSE 而不是 WebSocket?
  14. 前端为什么选择 React + TypeScript + Tailwind CSS?
  15. 效果展示
  16. 简历与面试
  17. 知识库

更多推荐文章

查看全部
  • HTTP 应用层协议详解与简易服务器实现
  • 深入理解 C++ STL 优先队列 priority_queue 原理与实现
  • 2026 年知网 AIGC 检测算法升级要点解析
  • 基于 ColQwen2 与 Qwen2.5 的 PDF 多模态 RAG 方案(无需 OCR)
  • 基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • MySQL 5.7 解压版安装与配置实战
  • 人脸识别核心算法深度解析:FaceNet 与 ArcFace 从原理到实战
  • 2025 腾讯广告算法大赛 Baseline 项目解析
  • OpenClaw 多端交互实测指南:Web、TUI 与钉钉集成详解
  • ChatGLM3 大模型本地化部署与应用开发技术指南
  • LLaMA 大模型微调实践与 LoRA 调优经验
  • 多旋翼无人机电源系统详解及常见故障分析
  • C++ STL 优先队列(priority_queue)原理与模拟实现
  • Faster-Whisper 本地实时语音识别部署指南
  • Trae + Git 本地仓库管理指南
  • ofa_image-caption 扩展支持 WebP 格式与 EXIF 元数据保留
  • 医疗 AI 时代生物医学 Go 编程:高性能计算与精准医疗案例分析
  • Stable Diffusion 实现人脸一致的技术方案与实践
  • Spring Cloud 微服务架构核心概念与实战入门
  • 本地大模型部署优化:国内镜像加速与 LLama-Factory 微调实战

相关免费在线工具

  • 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