基于 Spring Boot + DeepSeek API 的 AI 面试模拟 + 知识库管理平台。支持 Pipeline / Subagent 双模式面试、混合知识库检索(RAG)、简历 AI 分析、SSE 流式评分。
┌─────────────────────────────────────────────────────────────┐
│ ① AI 双模式面试 │
│ Pipeline 固定流程 → 逐题作答/评分/报告 │
│ Subagent 协同架构 → AI 自主出题/追问/收尾 │
├─────────────────────────────────────────────────────────────┤
│ ② 混合知识库检索(RAG) │
│ BM25 + BGE-m3 双路召回 → RRF 融合 → Reranker 精排门控 │
│ 父子双层分块(LLM 语义父块 + 递归规则子块) │
│ AI 回答卡片 + 来源笔记列表 │
├─────────────────────────────────────────────────────────────┤
│ ③ 简历 AI 分析 │
│ PDFBox 解析 + Tesseract OCR → 综合评分/岗位匹配/改进建议 │
├─────────────────────────────────────────────────────────────┤
│ ④ SSE 流式评分 + 报告 │
│ 评分/追问/报告三路流式推送,Markdown 实时渲染 │
├─────────────────────────────────────────────────────────────┤
│ ⑤ 面试数据看板 │
│ ECharts 趋势图 + 薄弱点分布 + Top5 排名 │
├─────────────────────────────────────────────────────────────┤
│ ⑥ 面经社区 + 用户系统 │
│ JWT 认证 + @RateLimit 限流 + MySQL LIKE 搜索 + AI 总结 │
└─────────────────────────────────────────────────────────────┘
| 层 | 技术 |
|---|---|
| 后端 | Spring Boot 2.7 + MyBatis-Plus 3.5 + Maven |
| 数据库 | MySQL 8.0 + Redis 7 |
| 认证/限流 | JWT 无状态认证 + 自定义 @RateLimit 注解 + Redis 滑动窗口 |
| AI 平台 | DeepSeek API(chat / chatStream 两种模式,未采用 Function Calling) |
| Embedding | BAAI/bge-m3(1024 维,硅基流动) |
| Reranker | BAAI/bge-reranker-v2-m3(cross-encoder 精排,sigmoid k=3 归一化) |
| BM25 | 自研(2-gram 中文分词 + ConcurrentHashMap 倒排索引) |
| 评估 | RAGAS 四维指标(ContextPrecision / ContextRecall / Faithfulness / AnswerRelevancy) |
| OCR/PDF | Tesseract OCR(chi_sim+eng)+ Apache PDFBox |
| 接口文档 | Knife4j 4.1(Swagger 增强) |
| 前端 | Vue 3 + Element Plus + ECharts 6 + Axios + Vite |
interview-ai/
├── sql/ # 数据库迁移脚本
│ ├── schema.sql # 初始建表
│ ├── V2__knowledge_entry.sql # 知识笔记表
│ ├── V3__search_eval.sql # 检索评测标注表
│ ├── V4__api_usage_log.sql # Token 用量日志
│ ├── V5__follow_up_support.sql # 追问机制
│ ├── V6__knowledge_chunk.sql # 语义分块表
│ ├── V7__agent_mode.sql # Agent 模式字段(幂等)
│ ├── V8__ragas_eval_data.sql # 种子笔记 + 标注 query
│ ├── V9__parent_child_chunk.sql # 父子双层分块
│ ├── V10__index_optimization.sql # 索引优化
│ ├── V11__api_usage_log_duration.sql # Token 用量耗时/成功率列
│ ├── V12__agent_state_machine.sql # Agent 面试状态机(幂等)
│ └── V13__follow_up_chain.sql # 追问链 JSON 列(幂等)
├── src/main/java/com/interviewai/
│ ├── controller/
│ │ ├── UserController # 用户(注册/登录)
│ │ ├── InterviewController # Pipeline 面试 + 简历分析 + SSE
│ │ ├── AgentInterviewController # Agent 面试(Subagent 协同)
│ │ ├── KnowledgeController # 知识库 CRUD + 混合检索
│ │ ├── ExperienceController # 面经库
│ │ ├── DashboardController # 仪表盘统计
│ │ ├── FileController # 文件上传
│ │ └── UsageController # Token 用量统计
│ ├── service/
│ │ ├── AiService # AI 出题/评分/报告/分块/标签/摘要
│ │ ├── AgentInterviewService # Subagent 面试引擎
│ │ ├── HybridSearchService # BM25 + 向量 + Reranker 混合检索
│ │ ├── EmbeddingService # Embedding 生成与父子分块
│ │ └── PdfService # PDF 解析(PDFBox + OCR)
│ ├── utils/
│ │ ├── DeepSeekClient # DeepSeek HTTP 封装(chat/stream/chatWithTools)
│ │ ├── EmbeddingClient # 硅基流动 Embedding API
│ │ ├── RerankerClient # 硅基流动 Reranker API + sigmoid 归一化
│ │ ├── Bm25Index # 自研 BM25 内存索引(2-gram 分词)
│ │ ├── PromptTemplate # 全部 Prompt 模板
│ │ ├── RagasMetrics # RAGAS 四维评估引擎
│ │ └── TesseractClient # Tesseract OCR 调用
│ ├── interceptor/ # JwtInterceptor + RateLimitInterceptor
│ ├── annotation/ # @RateLimit 注解
│ ├── aop/ # OperationLogAspect
│ └── common/ # Result / ResultCode(36) / GlobalExceptionHandler
├── frontend/
│ ├── src/api/ # 6 个 API 模块
│ ├── src/views/ # 13 个页面(创建/编辑复用 KnowledgeCreate)
│ │ ├── InterviewCreate.vue # 创建面试(Pipeline/Agent 切换 + 简历分析)
│ │ ├── InterviewRoom.vue # Pipeline 答题(SSE 流式评分)
│ │ ├── InterviewAgentRoom.vue # Agent 聊天面试(Subagent 驱动)
│ │ ├── InterviewReport.vue # 面试报告
│ │ ├── InterviewHistory.vue # 历史记录
│ │ ├── Home.vue # 仪表盘首页(ECharts 图表)
│ │ ├── KnowledgeList.vue # 知识库列表 + 混合检索
│ │ ├── KnowledgeCreate.vue # 创建/编辑笔记(Markdown)
│ │ ├── KnowledgeDetail.vue # 笔记详情 + 关联推荐
│ │ ├── ExperienceList.vue # 面经库
│ │ ├── Login.vue / Register.vue # 登录/注册
│ │ └── Profile.vue # 个人中心
│ ├── src/router/ # 14 条路由 + 鉴权守卫
│ └── src/components/ # NavBar 等公共组件
└── CLAUDE.md # AI 协作规则
- JDK 11+ / Maven 3.6+
- MySQL 8.0 / Redis 7
- Node.js 16+(前端)
- Tesseract OCR(可选,用于扫描件简历解析)
- DeepSeek API Key + 硅基流动 API Key(Embedding / Reranker)
mysql -u root -p < sql/schema.sql
mysql -u root -p < sql/V2__knowledge_entry.sql
mysql -u root -p < sql/V3__search_eval.sql
mysql -u root -p < sql/V4__api_usage_log.sql
mysql -u root -p < sql/V5__follow_up_support.sql
mysql -u root -p < sql/V6__knowledge_chunk.sql
mysql -u root -p < sql/V7__agent_mode.sql
mysql -u root -p < sql/V8__ragas_eval_data.sql
mysql -u root -p < sql/V9__parent_child_chunk.sql
mysql -u root -p < sql/V10__index_optimization.sql
mysql -u root -p < sql/V11__api_usage_log_duration.sql
mysql -u root -p < sql/V12__agent_state_machine.sql
mysql -u root -p < sql/V13__follow_up_chain.sqlV12/V13 含中文 COMMENT,Windows mysql 客户端执行需加
--default-character-set=utf8mb4(否则报 ERROR 1366);两者均为幂等存储过程,可重复执行。
编辑 src/main/resources/application-dev.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/interview_ai?useUnicode=true&characterEncoding=utf-8
username: root
password: your_password
redis:
host: localhost
port: 6379
interview:
deepseek:
api-key: your_deepseek_api_key
base-url: https://api.deepseek.com
embedding:
api-key: your_siliconflow_api_key
base-url: https://api.siliconflow.cn# 后端
mvn spring-boot:run
# 接口文档:http://localhost:8080/doc.html
# 前端
cd frontend
npm install
npm run dev
# 访问:http://localhost:3000| 接口 | 说明 |
|---|---|
POST /api/user/register |
注册 |
POST /api/user/login |
登录,返回 JWT |
POST /api/interview/start |
创建 Pipeline 面试,AI 预出题 |
POST /api/interview/{recordId}/questions/{questionId}/answer |
提交答案,AI 评分 |
POST /api/interview/{recordId}/questions/{questionId}/answer-stream |
SSE 流式评分 |
POST /api/interview/{recordId}/finish-stream |
SSE 流式报告生成 |
POST /api/interview/{recordId}/questions/{questionId}/follow-up-stream |
SSE 流式追问评分 |
POST /api/interview/agent/start |
创建 Agent 面试(Subagent) |
POST /api/interview/agent/{recordId}/chat |
Agent 对话 |
POST /api/interview/agent/{recordId}/chat/stream |
Agent 对话 SSE 流式 |
POST /api/interview/agent/{recordId}/abort |
中止进行中的 Agent 面试 |
POST /api/interview/resume/analyze |
AI 简历分析 |
GET /api/interview/{recordId}/weak-topics |
薄弱知识点分析 |
GET /api/interview/{recordId}/match-knowledge |
匹配知识库推荐笔记 |
GET /api/knowledge/hybrid-search |
BM25 + 向量 + Reranker 混合检索 |
GET /api/knowledge/search-compare |
三路检索对比(BM25 vs 向量 vs 混合) |
GET /api/knowledge/eval-recall |
检索质量评估(Recall@K + MRR) |
GET /api/knowledge/eval-ragas |
RAGAS 四维评估 |
GET /api/dashboard |
面试数据看板 |
POST /api/file/resume/upload |
简历上传(PDFBox + OCR) |
GET /api/experience/list |
面经库(MySQL LIKE 模糊搜索 + AI 总结) |
GET /api/experience/search?keyword= |
面经 AI 搜索 |
三个独立 Agent(Orchestrator/Interviewer/Evaluator),各调一次 chat(),差异化 temperature:Orchestrator 0.5(决策稳定)、Interviewer 0.7(出题多样性)、Evaluator 0.2(评分一致性)。显式状态机(AWAITING_ANSWER → EVALUATING → AWAITING_DECISION → AWAITING_ANSWER/COMPLETED,白名单校验跳转)+ Java 代码控制调度(ASK_QUESTION → EVALUATE → NEXT_QUESTION/FOLLOW_UP/FINISH),安全阀:追问 ≤ 2 层(内容驱动,最多追到薄弱点)、总轮数 ≤ 8 轮。对话走 POST /agent/{recordId}/chat/stream SSE(message/status/error 事件),前端逐条流式渲染,失败自动回退同步接口。
未采用 Function Calling(chatWithTools)方案:FC 一次调用三个角色共用 temperature,决策稳定和出题多样性互相矛盾。拆成三个独立 Agent 后各自控制温度,流程也由代码显式控制而非依赖 AI 自主决策。
自研 BM25:2-gram 中文分词 + ConcurrentHashMap 倒排索引 + @PostConstruct 全量加载 + 写操作增量更新,数百条笔记毫秒级响应,无需引入 ES。与 BGE-m3 向量语义召回(子块级 + entry 级双路)合并后 RRF(k=60) 融合,送入 BGE-reranker-v2-m3 交叉编码器精排,sigmoid(k=3) 归一化到 [0,1],最后按阈值 0.45 门控(API 失败时 fallback 全量保留)。用户搜索实际走 hybridSearchWithRewrite:LLM Query Rewrite 多路召回 → 跨查询 RRF → 单次 Reranker。
LLM 按主题边界切父块(PARENT),存完整段落上下文;每个父块内部递归规则按 \n\n → \n → 。→ ;→ , 优先级拆成 ~300 字子块(CHILD),生成向量用于检索。命中子块 → 返回所属父块完整内容。LLM 管"在哪切",规则管"切多细",各司其职,成本可控。
四维指标(ContextPrecision / ContextRecall / Faithfulness / AnswerRelevancy)+ 15 篇种子笔记 + 16 条标注 query(3 个难度组),量化验证每次改动。三项优化:批量声明提取(N→1 次 API 调用)、声明去重缓存、短答案跳过。
评分、追问评分、报告生成三路 SseEmitter 流式推送,前端 EventSource 逐字渲染 Markdown。保留非流式 Fallback。
- 36 个业务错误码覆盖 7 个领域,GlobalExceptionHandler 统一捕获 6 类异常
- @RateLimit 注解 + Redis 滑动窗口,fail-open 策略保证 Redis 故障时可用
- Resilience4j 熔断保护 AI API 调用(10 次窗口 / 50% 失败率 / open 30s 自动恢复)+ Actuator 健康检查 + HikariCP 连接池调参
- API Token 用量追踪(api_usage_log,含耗时/成功率,16 种 purpose 分类)
- V7/V12/V13 幂等迁移(存储过程查 INFORMATION_SCHEMA 避免重复 DDL)
- 文件安全:类型白名单 + 大小校验 + Tesseract 子进程隔离
- 20 个测试类,137 个测试用例(AgentInterviewEvalTest 离线评测默认 @Disabled,开启需 dev 库 + 真 API)