# foxprep **Repository Path**: dongchenglin/foxprep ## Basic Information - **Project Name**: foxprep - **Description**: ES向量数据库学习项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-19 - **Last Updated**: 2026-05-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FoxPrep - 智能面试助手 Fox借助AI开发的,基于 Spring Boot 3 + Spring AI + Vue 3 的 AI 驱动面试准备平台,集成 RAG 检索增强生成技术,为求职者提供智能简历分析、模拟面试、智能问答和代码生成等一站式面试准备服务。 ## 项目架构 ``` ┌─────────────────────────────────────────────────────────┐ │ FoxPrep UI (Vue 3) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 简历管理 │ │ 智能问答 │ │ 模拟面试 │ │ 代码生成 │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ └───────┼────────────┼────────────┼────────────┼──────────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────┐ │ Spring Boot 3.5 (REST API) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Resume │ │ Chat │ │Interview │ │ Code │ │ │ │Controller│ │Controller│ │Controller│ │Controller│ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ │ ┌────┴─────┐ ┌────┴─────┐ ┌────┴─────┐ ┌────┴─────┐ │ │ │ Resume │ │ Chat │ │Interview │ │ Code │ │ │ │ Service │ │ Service │ │ Service │ │ Service │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Spring AI (ChatClient) │ │ │ │ 硅基流动 SiliconFlow API 兼容层 │ │ │ └───────────────────┬──────────────────────────────┘ │ │ │ │ │ ┌───────────────────┴──────────────────────────────┐ │ │ │ Elasticsearch VectorStore (RAG) │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ MySQL │ │Elasticsearch │ │ SiliconFlow │ │ 业务数据存储 │ │ 向量检索引擎 │ │ AI 模型服务 │ └──────────────┘ └──────────────┘ └──────────────┘ ``` ## 技术栈 ### 后端 | 技术 | 版本 | 说明 | |------|------|------| | Spring Boot | 3.5.13 | 核心框架 | | Spring AI | 1.1.4 | AI 模型集成(OpenAI 兼容接口) | | MyBatis-Plus | 3.5.9 | ORM 框架 | | Elasticsearch | 8.x | 向量存储与语义检索 | | MySQL | 8.0 | 业务数据存储 | | PDFBox | 2.0.29 | PDF 文件解析 | | Apache POI | 5.2.5 | Word 文档解析 | | Lombok | - | 代码简化 | | Hutool | 5.8.26 | 工具类库 | ### 前端 | 技术 | 版本 | 说明 | |------|------|------| | Vue 3 | 3.4+ | 前端框架 | | Vite | 5.2+ | 构建工具 | | Element Plus | 2.6+ | UI 组件库 | | Vue Router | 4.3+ | 路由管理 | | Axios | 1.6+ | HTTP 客户端 | | Markdown-it | 14.0+ | Markdown 渲染 | | Highlight.js | 11.9+ | 代码高亮 | ### AI 服务 | 服务 | 模型 | 用途 | |------|------|------| | 硅基流动 SiliconFlow | GLM-5.1 | Chat 对话模型 | | 硅基流动 SiliconFlow | Qwen3-Embedding-8B | 文本向量化模型 | 硅基流动地址:https://cloud.siliconflow.cn/i/wn4Ok7Iz ### 基础设施 | 服务 | 说明 | |------|------| | MySQL 8.0 | 业务数据持久化 | | Elasticsearch 8.x | 向量存储与语义检索 | | Docker Compose | 一键部署基础设施 | ## 功能模块 ### 1. 简历管理 **核心功能**:上传、解析、向量化、下载简历 - **文件上传**:支持 PDF / DOCX 格式,最大 10MB - **内容解析**:自动提取简历文本内容 - **智能切片**:按简历结构(技术栈/项目/教育)语义切片,长度过长时自动按 400 字符固定切片 - **向量化存储**:通过 Spring AI Embedding 模型将切片向量化并存入 Elasticsearch - **重新向量化**:支持对失败简历重新执行向量化 - **文件下载**:支持原始文件下载,正确处理中文文件名 **关键实现**: ``` 上传 PDF/DOCX → 解析文本 → 语义切片 → Embedding 向量化 → 存入 ES ↓ MySQL 记录简历元数据 + 向量化状态 ``` **API 接口**: | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/resume/upload` | 上传并解析简历 | | GET | `/api/resume/list` | 获取简历列表 | | GET | `/api/resume/{id}` | 获取简历详情 | | GET | `/api/resume/download/{id}` | 下载简历文件 | | POST | `/api/resume/revectorize/{id}` | 重新向量化 | ### 2. 智能问答(RAG) **核心功能**:基于简历内容的检索增强生成(RAG)智能问答 - **RAG 检索**:从 Elasticsearch 向量库中检索相关简历片段作为上下文 - **流式响应**:支持 SSE 流式输出,用户无需等待完整响应 - **多轮对话**:支持传入历史消息,AI 能理解上下文进行连贯对话 - **智能 RAG 跳过**:简单问候(如"你好")自动跳过向量检索,提升响应速度 - **完整保存**:流式响应完成后自动保存完整问答记录到数据库 - **AI 角色标识**:前端显示"面试助手小菲"角色名称 **关键实现**: ``` 用户提问 → 判断是否简单对话 ├── 是 → 直接调用 ChatClient └── 否 → RAG 检索相关简历片段 → 构造增强 Prompt → 流式调用 ChatClient ↓ 流式输出到前端 + 完成后保存到 MySQL ``` **API 接口**: | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/chat/stream` | 流式问答(推荐) | | POST | `/api/chat/send` | 非流式问答 | | GET | `/api/chat/test` | 测试 AI 连接 | ### 3. 模拟面试 **核心功能**:根据简历内容生成针对性面试题 - **RAG 增强出题**:从向量库检索简历的技术栈、项目经验、教育背景关键信息 - **增强 Prompt**:8 道题,难度分布(2 简单 + 4 中等 + 2 困难),类型分布(3 技术栈 + 3 项目 + 2 算法) - **流式生成**:支持 SSE 流式进度反馈(分析简历 → 检索信息 → 生成题目 → 解析保存) - **题目去重**:生成前自动清空该简历的旧题目 - **答题记录**:支持保存用户回答、评分、自我评价 - **答题统计**:提供正确率、平均分等统计信息 - **Markdown 渲染**:答案支持 Markdown 格式和代码高亮 **关键实现**: ``` 选择简历 → RAG 检索技术栈/项目/教育 → 构造增强 Prompt → LLM 生成 8 道题 ↓ 解析 JSON → 保存到 MySQL → 返回前端 ``` **API 接口**: | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/interview/generate/{resumeId}` | 生成面试题(阻塞式) | | POST | `/api/interview/generate-stream/{resumeId}` | 流式生成面试题 | | GET | `/api/interview/list/{resumeId}` | 获取面试题列表 | | POST | `/api/interview/answer` | 保存答题记录 | | GET | `/api/interview/statistics/{resumeId}` | 获取答题统计 | ### 4. 代码生成 **核心功能**:根据自然语言描述生成代码和测试用例 - **多语言支持**:Java、Python、JavaScript 等 - **测试用例生成**:自动生成对应的测试代码 - **代码高亮**:前端支持 Markdown 代码块渲染 **API 接口**: | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/code/generate` | 生成代码 | ## 数据库设计 ### ER 关系 ``` t_resume (1) ──── (N) t_interview_question │ │ │ └── (1) ── (1) t_interview_answer │ └── (1) ── (N) t_chat_session t_code_generation (独立) t_ai_call_log (独立) ``` ### 核心表结构 | 表名 | 说明 | 关键字段 | |------|------|---------| | `t_resume` | 简历信息 | id, file_name, content_text, vector_status | | `t_chat_session` | 问答会话记录 | session_id, user_question, llm_answer, total_tokens | | `t_interview_question` | 面试题库 | resume_id, question_content, answer_content, difficulty_level | | `t_interview_answer` | 答题记录 | question_id, user_answer, is_correct, score | | `t_code_generation` | 代码生成记录 | user_description, language, code_content | | `t_ai_call_log` | AI 调用日志 | service_type, model_name, total_tokens, status | ## 快速开始 ### 环境要求 - JDK 17+ - Node.js 16+ - MySQL 8.0+ - Elasticsearch 8.x+ - Maven 3.8+ ### 1. 启动基础设施 ```bash # 使用 Docker Compose 启动 MySQL 和 Elasticsearch docker-compose up -d ``` ### 2. 初始化数据库 ```bash # 创建数据库 mysql -u root -proot -e "CREATE DATABASE IF NOT EXISTS foxprep DEFAULT CHARACTER SET utf8mb4;" # 执行建表脚本 mysql -u root -proot foxprep < src/main/resources/schema.sql ``` ### 3. 配置环境变量 ```bash # Linux/Mac export AI_SILICONFLOW_API_KEY=your_siliconflow_api_key # Windows PowerShell $env:AI_SILICONFLOW_API_KEY = "your_siliconflow_api_key" ``` ### 4. 启动后端 ```bash cd foxprep mvn spring-boot:run ``` 后端启动在 `http://localhost:8080` ### 5. 启动前端 ```bash cd foxprep-ui npm install npm run dev ``` 前端启动在 `http://localhost:3000` ### 6. 一键启动(Windows) ```bash start-all.bat ``` ## 项目结构 ``` foxprep/ ├── src/main/java/com/fox/foxprep/ │ ├── common/ # 通用组件 │ │ ├── GlobalExceptionHandler.java # 全局异常处理 │ │ └── Result.java # 统一响应封装 │ ├── config/ # 配置类 │ │ ├── AiLogAspect.java # AI 调用日志切面 │ │ ├── ElasticsearchConfig.java # ES 向量存储配置 │ │ └── WebConfig.java # Web 跨域与静态资源配置 │ ├── controller/ # 控制器层 │ │ ├── ChatController.java # 智能问答 │ │ ├── CodeController.java # 代码生成 │ │ ├── InterviewController.java # 模拟面试 │ │ └── ResumeController.java # 简历管理 │ ├── dto/ # 数据传输对象 │ ├── entity/ # 实体类 │ ├── mapper/ # MyBatis Mapper │ ├── service/ # 服务接口 │ │ └── impl/ # 服务实现 │ └── util/ # 工具类 ├── src/main/resources/ │ ├── application.yml # 应用配置 │ └── schema.sql # 数据库建表脚本 ├── foxprep-ui/ # 前端项目 │ ├── src/ │ │ ├── api/ # API 接口封装 │ │ ├── router/ # 路由配置 │ │ ├── utils/ # 工具类(Axios 封装) │ │ └── views/ # 页面组件 │ │ ├── Chat.vue # 智能问答 │ │ ├── CodeGenerator.vue # 代码生成 │ │ ├── Interview.vue # 模拟面试 │ │ └── ResumeUpload.vue # 简历管理 │ └── vite.config.js # Vite 配置 ├── docker-compose.yml # Docker 编排 └── pom.xml # Maven 依赖 ``` ## 关键技术决策 ### Spring AI 集成硅基流动 项目使用 Spring AI 的 OpenAI 兼容接口对接硅基流动平台: ```yaml spring: ai: openai: base-url: https://api.siliconflow.cn # 注意:不含 /v1,Spring AI 会自动拼接 api-key: ${AI_SILICONFLOW_API_KEY} chat: options: model: Pro/zai-org/GLM-5.1 embedding: options: model: Qwen/Qwen3-Embedding-8B ``` > **重要**:`base-url` 不能包含 `/v1` 后缀,因为 Spring AI 会自动拼接 `/v1/chat/completions` 和 `/v1/embeddings`,双重 `/v1` 会导致 404 错误。 ### RAG 架构 ``` 简历上传 → 文本切片 → Embedding 向量化 → 存入 Elasticsearch ↓ 用户提问 → 向量相似度检索 → Top-K 相关片段 → 拼接到 Prompt → LLM 生成回答 ``` ### 简历切片策略 采用**语义优先 + 长度备用**的双重切片策略: 1. 优先按简历结构(技术栈/项目/教育等标题)进行语义切片 2. 若无明确结构,按 400 字符固定长度切片,100 字符重叠 3. 跳过长度小于 50 字符的无效切片 ## 优化方向 ### 近期优化(高优先级) - [ ] **面试题同步到 ES**:生成面试题时同步存入 Elasticsearch,构建通用题库 - [ ] **题目语义去重**:生成前通过向量相似度检查是否已有类似题目 - [ ] **题库检索功能**:支持按技术栈、难度、类型多维度检索题目 - [ ] **面试历史记录**:前端增加面试历史列表和答题详情页面 - [ ] **AI 答题评估**:LLM 根据用户回答和参考答案进行智能评分 ### 中期优化(中优先级) - [ ] **用户认证体系**:引入 Spring Security,支持用户注册/登录 - [ ] **多简历管理**:支持用户关联多份简历,跨简历综合分析 - [ ] **能力成长曲线**:根据历史答题数据绘制技术能力趋势图 - [ ] **面试题收藏**:支持收藏优质题目到个人题库 - [ ] **题目难度自适应**:根据用户答题正确率动态调整出题难度 ### 远期优化(低优先级) - [ ] **语音面试**:集成语音识别实现模拟语音面试 - [ ] **视频面试分析**:通过摄像头分析面试表现(表情、语速等) - [ ] **简历优化建议**:AI 分析简历弱点并给出修改建议 - [ ] **面试官模拟**:模拟不同风格的面试官(技术型/压力型/友好型) - [ ] **多语言支持**:支持英文面试题生成和英文简历解析 ## License MIT License