利用元旦假期,我开源了一个大模型智能面试平台+知识库!

你好,我是 Guide。利用元旦假期,我开源了一个基于 Spring Boot 4.0 + Java 21 + Spring AI + PostgreSQL + pgvector + RustFS + Redis 的大模型项目,实现了简历智能分析、AI 模拟面试、知识库 RAG 检索等核心功能。

项目介绍

InterviewGuide 是一个集成了简历分析、模拟面试和知识库管理的智能面试辅助平台。系统利用大语言模型(LLM)和向量数据库技术,为求职者和 HR 提供智能化的简历评估和面试练习服务。

系统架构

提示:架构图采用 draw.io 绘制,导出为 svg 格式,在 Github Dark 模式下的显示效果会有问题。

异步处理流程

简历分析和知识库向量化采用 Redis Stream 异步处理:

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

状态流转: PENDINGPROCESSINGCOMPLETED / FAILED

技术栈

后端技术

技术 版本 说明
Spring Boot 4.0 应用框架
Java 21 开发语言
Spring AI 2.0 AI 集成框架
PostgreSQL + pgvector 14+ 关系数据库 + 向量存储
Redis 6+ 缓存 + 消息队列(Stream)
Apache Tika 2.9.2 文档解析
iText 8 8.0.5 PDF 导出
MapStruct 1.6.3 对象映射
Gradle 8.14 构建工具

技术选型常见问题解答:

  1. 数据存储为什么选择 PostgreSQL + pgvector?PG 的向量数据存储功能够用了,精简架构,不想引入太多组件。

  2. 为什么引入 Redis?

    • Redis 替代 ConcurrentHashMap 实现面试会话的缓存。
    • 基于 Redis Stream 实现简历分析、知识库向量化等场景的异步(还能解耦,分析和向量化可以使用其他编程语言来做)。不使用 Kafka 这类成熟的消息队列,也是不想引入太多组件。
  3. 构建工具为什么选择 Gradle?个人更喜欢用 Gradle,也写过相关的文章:Gradle核心概念总结

前端技术

技术 版本 说明
React 18.3 UI 框架
TypeScript 5.6 开发语言
Vite 5.4 构建工具
Tailwind CSS 4.1 样式框架
React Router 7.11 路由管理
Framer Motion 12.23 动画库
Recharts 3.6 图表库
Lucide React - 图标库

功能特性

简历管理模块

  • 多格式支持:PDF、DOCX、DOC、TXT
  • 异步分析:上传后立即返回,后台 Redis Stream 处理
  • 状态轮询:实时显示分析进度(待分析/分析中/已完成/失败)
  • 自动重试:分析失败自动重试(最多 3 次)
  • 简历去重:基于内容哈希检测重复
  • PDF 报告导出

模拟面试模块

  • 基于简历生成个性化面试问题
  • 实时问答交互
  • 多维度评分(技术能力、沟通能力等)
  • 面试报告生成和导出
  • 雷达图可视化展示
  • 面试历史统计

知识库管理模块

  • 多格式支持:PDF、DOCX、DOC、TXT、Markdown
  • 文档上传和自动分块
  • 异步向量化处理
  • RAG 检索增强生成
  • 流式响应(SSE)
  • 智能问答对话
  • 知识库统计信息

TODO

  • 问答助手的 Markdown 展示优化
  • 知识库管理页面的下载
  • 异步生成模拟面试评估报告
  • 模拟面试增加追问功能
  • 打通模拟面试和知识库

效果展示

简历与面试

简历库:

简历上传分析:

简历分析详情:

面试记录:

面试详情:

模拟面试:

知识库

知识库管理:

问答助手:

项目结构

bash 复制代码
interview-guide/
├── app/                              # 后端应用
│   ├── src/main/java/interview/guide/
│   │   ├── App.java                  # 主启动类
│   │   ├── common/                   # 通用模块
│   │   │   ├── config/               # 配置类
│   │   │   ├── exception/            # 异常处理
│   │   │   └── result/               # 统一响应
│   │   ├── infrastructure/           # 基础设施
│   │   │   ├── export/               # PDF 导出
│   │   │   ├── file/                 # 文件处理
│   │   │   ├── redis/                # Redis 服务
│   │   │   └── storage/              # 对象存储
│   │   └── modules/                  # 业务模块
│   │       ├── interview/            # 面试模块
│   │       ├── knowledgebase/        # 知识库模块
│   │       └── resume/               # 简历模块
│   └── src/main/resources/
│       ├── application.yml           # 应用配置
│       └── prompts/                  # AI 提示词模板
│
├── frontend/                         # 前端应用
│   ├── src/
│   │   ├── api/                      # API 接口
│   │   ├── components/               # 公共组件
│   │   ├── pages/                    # 页面组件
│   │   ├── types/                    # 类型定义
│   │   └── utils/                    # 工具函数
│   ├── package.json
│   └── vite.config.ts
│
└── README.md

快速开始

环境要求:

依赖 版本 必需
JDK 21+
Node.js 18+
PostgreSQL 14+
pgvector 扩展 -
Redis 6+
S3 兼容存储 -

1. 克隆项目

bash 复制代码
git clone https://github.com/Snailclimb/interview-guide.git
cd interview-guide

2. 配置数据库

sql 复制代码
-- 创建数据库
CREATE DATABASE interview_guide;
​
-- 连接数据库并启用 pgvector 扩展(可选,启动后端SpringAI框架底层会自动创建)
CREATE EXTENSION vector;

3. 配置环境变量

ini 复制代码
# AI API 密钥(阿里云 DashScope)
export AI_BAILIAN_API_KEY=your_api_key

4. 修改应用配置

编辑 app/src/main/resources/application.yml

yaml 复制代码
spring:
  # PostgreSQL数据库配置
  datasource:
    url: jdbc:postgresql://localhost:5432/interview_guide
    username: your_username
    password: your_password
​
  data:
    redis:
      host: localhost
      port: 6379
​
# RustFS (S3兼容) 存储配置
app:
  storage:
    endpoint: http://localhost:9000
    access-key: your_access_key
    secret-key: your_secret_key
    bucket: interview-guide
    
 # Redisson配置
redisson:
  config: |
    singleServerConfig:
      address: "redis://localhost:6379"
      database: 0
      idleConnectionTimeout: 10000
      connectTimeout: 10000
      timeout: 3000
      retryAttempts: 3
      retryInterval: 1500
      password: null
      subscriptionsPerConnection: 5
      clientName: null
      subscriptionConnectionMinimumIdleSize: 1
      subscriptionConnectionPoolSize: 50
      connectionMinimumIdleSize: 10
      connectionPoolSize: 64
      dnsMonitoringInterval: 5000
​

5. 启动服务

后端:

bash 复制代码
./gradlew bootRun

后端服务启动于 http://localhost:8080

前端:

bash 复制代码
cd frontend
pnpm install
pnpm dev

前端服务启动于 http://localhost:5173

使用场景

用户角色 使用场景
求职者 上传简历获取分析建议,进行模拟面试练习
HR/招聘人员 批量分析简历,评估候选人能力
培训机构 提供面试培训服务,管理知识库资源

常见问题

Q: 简历分析失败

检查一下阿里云 DashScope API KEY 是否配置正确(申请地址:bailian.console.aliyun.com/)。

Q: 简历分析一直显示"分析中"?

检查 Redis 连接和 Stream Consumer 是否正常运行。查看后端日志确认是否有错误。

Q: 知识库问答没有响应?

确认知识库已完成向量化(状态为 COMPLETED),检查 pgvector 扩展是否正确安装。

Q: PDF 导出失败?

检查 iText 依赖是否正确,确认字体文件存在。

分支说明

分支 说明
master 主分支,包含完整功能(Redis Stream 异步处理)
v1.0-without-redis 基础版本,同步处理,无 Redis 依赖

贡献

欢迎提交 Issue 和 Pull Request!

许可证

AGPL-3.0 License(只要通过网络提供服务,就必须向用户公开修改后的源码)

相关推荐
技术小泽14 小时前
OptaPlanner入门以及实战教学
后端·面试·性能优化
yuanyxh14 小时前
程序设计
前端·设计
eason_fan15 小时前
前端性能优化利器:LitePage 轻量级全页设计解析
前端·性能优化·前端工程化
橙子家15 小时前
Serilog 日志库简单实践(四)消息队列 Sinks(.net8)
后端
Victor35615 小时前
Hibernate(21)Hibernate的映射文件是什么?
后端
pe7er15 小时前
如何阅读英文文档
java·前端·后端
pe7er15 小时前
IDEA 实用小技巧(自用)
后端
Victor35615 小时前
Hibernate(22)Hibernate的注解配置是什么?
后端
喵叔哟15 小时前
15.故障排查与调试
后端·docker·容器·服务发现