@@ -87,6 +87,7 @@ star: 5
8787- MapStruct 实体映射最佳实践
8888- ⭐基于 Redis Stream 的异步任务处理实现
8989- 封装 Redis + Lua 多维度分布式限流组件
90+ - ⭐Skill 架构设计
9091- Spring Boot 4.0 升级指南
9192- Docker Compose 一键部署
9293
@@ -176,34 +177,49 @@ star: 5
176177 构建 Prompt → LLM 生成回答 → SSE 流式返回
177178```
178179
179- ## 技术栈概览
180+ ## 技术栈
180181
181182### 后端技术
182183
183- | 技术 | 版本 | 说明 |
184- | --------------------- | ----- | ------------------------- |
185- | Spring Boot | 4.0 | 应用框架 |
186- | Java | 21 | 开发语言 |
187- | Spring AI | 2.0 | AI 集成框架 |
188- | PostgreSQL + pgvector | 14+ | 关系数据库 + 向量存储 |
189- | Redis | 6+ | 缓存 + 消息队列(Stream) |
190- | Apache Tika | 2.9.2 | 文档解析 |
191- | iText 8 | 8.0.5 | PDF 导出 |
192- | MapStruct | 1.6.3 | 对象映射 |
193- | Gradle | 8.14 | 构建工具 |
184+ | 技术 | 版本 | 说明 |
185+ | --------------------- | ---------- | ------------------------------ |
186+ | Spring Boot | 4.0.1 | 应用框架 |
187+ | Java | 21 | 开发语言(虚拟线程) |
188+ | Spring AI | 2.0.0-M4 | AI 集成框架 |
189+ | PostgreSQL + pgvector | 14+ | 关系数据库 + 向量存储 |
190+ | Redis + Redisson | 6+ / 4.0.0 | 缓存 + 消息队列(Stream) |
191+ | Apache Tika | 2.9.2 | 文档解析 |
192+ | iText 8 | 8.0.5 | PDF 导出 |
193+ | MapStruct | 1.6.3 | 对象映射 |
194+ | SpringDoc OpenAPI | 3.0.2 | API 接口文档 |
195+ | DashScope SDK | 2.22.7 | 语音识别/合成(Qwen3 ASR/TTS) |
196+ | spring-ai-agent-utils | 0.7.0 | Spring AI Agent Skills 工具库 |
197+ | WebSocket | - | 语音面试实时双向通信 |
198+ | Gradle | 8.14 | 构建工具 |
199+
200+ 技术选型常见问题解答:
201+
202+ 1 . 数据存储为什么选择 PostgreSQL + pgvector?PG 的向量数据存储功能够用了,精简架构,不想引入太多组件。
203+ 2 . 为什么引入 Redis?
204+ - Redis 替代 ` ConcurrentHashMap ` 实现面试会话的缓存。
205+ - 基于 Redis Stream 实现简历分析、知识库向量化等场景的异步(还能解耦,分析和向量化可以使用其他编程语言来做)。不使用 [ Kafka] ( https://javaguide.cn/high-performance/message-queue/kafka-questions-01.html ) 这类成熟的消息队列,也是不想引入太多组件。
206+ 3 . 构建工具为什么选择 Gradle?个人更喜欢用 Gradle,也写过相关的文章:[ Gradle核心概念总结] ( https://javaguide.cn/tools/gradle/gradle-core-concepts.html ) 。
194207
195208### 前端技术
196209
197- | 技术 | 版本 | 说明 |
198- | ------------- | ----- | -------- |
199- | React | 18.3 | UI 框架 |
200- | TypeScript | 5.6 | 开发语言 |
201- | Vite | 5.4 | 构建工具 |
202- | Tailwind CSS | 4.1 | 样式框架 |
203- | React Router | 7.11 | 路由管理 |
204- | Framer Motion | 12.23 | 动画库 |
205- | Recharts | 3.6 | 图表库 |
206- | Lucide React | 0.468 | 图标库 |
210+ | 技术 | 版本 | 说明 |
211+ | ------------------ | ----- | ------------- |
212+ | React | 18.3 | UI 框架 |
213+ | TypeScript | 5.6 | 开发语言 |
214+ | Vite | 5.4 | 构建工具 |
215+ | Tailwind CSS | 4.1 | 样式框架 |
216+ | React Router | 7.11 | 路由管理 |
217+ | Framer Motion | 12.23 | 动画库 |
218+ | Recharts | 3.6 | 图表库 |
219+ | Lucide React | 0.468 | 图标库 |
220+ | React Big Calendar | 1.19 | 面试日历组件 |
221+ | React Markdown | 9.0 | Markdown 渲染 |
222+ | React Virtuoso | 4.18 | 虚拟滚动列表 |
207223
208224## 技术选型常见问题解答
209225
@@ -353,10 +369,66 @@ String content = tika.parseToString(inputStream); // 自动识别格式并提
353369| Vite | 开发服务器启动快(秒级),HMR 热更新体验好 |
354370| Tailwind CSS | 原子化 CSS,快速开发,无需写 CSS 文件 |
355371
372+ ## 功能特性
373+
374+ ### 简历管理模块
375+
376+ - ** 多格式解析** :支持 PDF、DOCX、DOC、TXT 等多种简历格式。
377+ - ** 异步处理流** :基于 Redis Stream 实现异步简历分析,支持实时查看处理进度(待分析/分析中/已完成/失败)。
378+ - ** 稳定性保障** :内置分析失败自动重试机制(最多 3 次)与基于内容哈希的重复检测。
379+ - ** 分析报告导出** :支持将 AI 分析结果一键导出为结构化的 PDF 简历分析报告。
380+
381+ ### 模拟面试模块
382+
383+ - ** Skill 驱动出题** :内置 10+ 面试方向(Java 后端、阿里/字节/腾讯专项、前端、Python、算法、系统设计、测开、AI Agent 等),每个方向由 ` SKILL.md ` 定义考察范围、难度分布和参考知识库。基于 ` spring-ai-agent-utils ` 的 Progressive Disclosure 机制实现按需加载。
384+ - ** 并行双路出题** :有简历时,60% 简历项目深挖题(独立 Prompt)+ 40% 方向基础题(Skill 驱动),使用 Java 21 虚拟线程并行生成后合并,物理隔离避免 Prompt 冲突。
385+ - ** 自定义 JD 解析** :粘贴职位描述(JD),LLM 动态提取面试分类并匹配共享题库,无需预设方向即可开始面试。
386+ - ** 简历推荐方向** :上传简历后,LLM 通过 Semantic Matching 自动推荐最匹配的面试方向,降低用户选择成本。
387+ - ** 历史题目去重** :出题时自动排除已有会话中问过的题目,避免重复考察。
388+ - ** 面试阶段时长联动** :总时长滑块拖动后,各阶段(自我介绍、技术考察、项目深挖、反问环节)按时比自动分配。
389+ - ** 智能追问流** :支持配置多轮智能追问(默认 1 条),模拟多轮问答场景。
390+ - ** 统一评估架构** :文字面试和语音面试共用同一套评估引擎(分批评估 + 结构化输出 + 二次汇总 + 降级兜底),评估结果可对比。
391+ - ** 报告一键导出** :支持异步生成并导出详细的 PDF 模拟面试评估报告。
392+ - ** 面试中心入口** :面试中心页整合文字面试和语音面试入口,支持继续面试和重新面试。
393+
394+ ### 面试安排模块
395+
396+ - ** 邀请解析** :规则 + AI 双引擎,支持飞书/腾讯会议/Zoom 格式,自动提取公司、岗位、时间、会议链接
397+ - ** 日历管理** :日/周/月视图 + 拖拽调整 + 列表视图
398+ - ** 状态流转** :定时任务自动过期,手动标记待面试/已完成/已取消
399+ - ** 面试提醒** :可配置提醒,避免错过面试
400+
401+ ### 语音面试模块
402+
403+ 实时语音对话面试,WebSocket + 千问3 语音模型(ASR/TTS/LLM 统一 API Key):
404+
405+ - ** 实时流式对话** :句子级并发 TTS,边生成边合成边播放,首包延迟 200ms
406+ - ** 服务端 VAD** :自动断句,实时字幕(含中间结果)
407+ - ** 回声防护 + 手动提交** :避免 AI 语音被误录入
408+ - ** 多轮上下文记忆 + 暂停/恢复** :超时自动暂停
409+ - ** Micrometer 埋点** :TTS/ASR 延迟、会话时长等指标
410+
411+ > ** 已知问题** :端到端延迟偏高(服务端音频中转)、无耳机时回声泄漏、TTS 音色单一、弱网音频断续。后续计划探索 WebRTC、客户端 VAD 降噪、端到端语音模型等方案。
412+
413+ ### 知识库管理模块
414+
415+ - ** 文档智能处理** :支持 PDF、DOCX、Markdown 等多种格式文档的自动上传、分块与异步向量化。
416+ - ** RAG 检索增强** :集成向量数据库,通过检索增强生成(RAG)提升 AI 问答的准确性与专业度。
417+ - ** 流式响应交互** :基于 SSE(Server-Sent Events)技术实现打字机式流式响应。
418+ - ** 智能问答对话** :支持基于知识库内容的智能问答,并提供直观的知识库统计信息。
419+
356420## 效果展示
357421
358422### 简历与面试
359423
424+ 面试中心:
425+
426+ ![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-interview-hub.png )
427+
428+ Skill 出题 + JD 解析:
429+
430+ ![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-skill-jd-parse.png )
431+
360432简历库:
361433
362434![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-resume-history.png )
@@ -381,6 +453,10 @@ String content = tika.parseToString(inputStream); // 自动识别格式并提
381453
382454![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-mock-interview.png )
383455
456+ 面试安排
457+
458+ ![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-interview-schedule-list.png )
459+
384460### 知识库
385461
386462知识库管理:
@@ -389,7 +465,7 @@ String content = tika.parseToString(inputStream); // 自动识别格式并提
389465
390466问答助手:
391467
392- ![ ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-qa-assistant.png )
468+ ![ page-qa-assistant ] ( https://oss.javaguide.cn/xingqiu/pratical-project/interview-guide/page-qa-assistant.png )
393469
394470## 学习本项目你将获得什么?
395471
@@ -437,9 +513,13 @@ String content = tika.parseToString(inputStream); // 自动识别格式并提
437513
438514### 高级 AI 功能设计模式
439515
440- - ** 多轮追问生成机制** :学习如何在面试问题生成场景中,通过多层 Prompt 设计实现“主问题 + 追问”的树形结构。掌握可配置追问数量、问题类型权重分配、历史去重等实战技巧。
516+ - ** Skill 架构与 Agent Skills** :学习如何将面试方向配置从代码中解耦,基于 ` SKILL.md ` + ` skill.meta.yml ` 的双层配置设计。掌握 ` spring-ai-agent-utils ` 的 Discovery → Semantic Matching → Execution 三层 Progressive Disclosure 机制,以及文字面试(单次调用预加载)与语音面试(多轮 ReAct 按需加载)的差异化资源加载策略。
517+
518+ - ** 并行双路出题架构** :深入理解”单次调用无法兼顾简历和方向”的 Prompt 冲突问题,学习如何通过物理隔离(两套独立 Prompt 模板 + 两路并行 AI 调用)实现 60% 简历题 + 40% 方向题的混合出题,以及索引合并和降级策略的设计。
519+
520+ - ** 多轮追问生成机制** :学习如何在面试问题生成场景中,通过多层 Prompt 设计实现”主问题 + 追问”的树形结构。掌握可配置追问数量、问题类型权重分配、历史去重等实战技巧。
441521
442- - ** 流式输出智能处理** :掌握 SSE 流式场景下的“ 探测窗口”技术——在保持首字响应速度的同时,快速识别“ 无信息”输出并统一为固定模板,避免用户看到长篇拒答文字。
522+ - ** 流式输出智能处理** :掌握 SSE 流式场景下的” 探测窗口”技术——在保持首字响应速度的同时,快速识别” 无信息”输出并统一为固定模板,避免用户看到长篇拒答文字。
443523
444524- ** 统一无结果策略** :学习如何在 RAG 系统中设计一致的用户无结果体验,包括命中判定、输出归一化、流式截断等全链路优化。
445525
0 commit comments