Skip to content

Repository files navigation

InterviewAI — 智能面试训练平台

基于 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)

1. 数据库初始化

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.sql

V12/V13 含中文 COMMENT,Windows mysql 客户端执行需加 --default-character-set=utf8mb4(否则报 ERROR 1366);两者均为幂等存储过程,可重复执行。

2. 配置文件

编辑 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

3. 启动

# 后端
mvn spring-boot:run
# 接口文档:http://localhost:8080/doc.html

# 前端
cd frontend
npm install
npm run dev
# 访问:http://localhost:3000

核心 API

接口 说明
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 模式 — Subagent 协同架构

三个独立 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 + 向量双路召回 → RRF 融合 → Reranker 精排 → 相关性门控

自研 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 管"在哪切",规则管"切多细",各司其职,成本可控。

RAGAS 评估体系

四维指标(ContextPrecision / ContextRecall / Faithfulness / AnswerRelevancy)+ 15 篇种子笔记 + 16 条标注 query(3 个难度组),量化验证每次改动。三项优化:批量声明提取(N→1 次 API 调用)、声明去重缓存、短答案跳过。

SSE 流式评分

评分、追问评分、报告生成三路 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)

About

基于 Spring Boot + DeepSeek API 的全功能 AI 面试模拟平台。支持 Pipeline / Agent 双模式面试、混合知识库检索、简历 AI 分析、SSE 流式评分,帮助求职者进行系统化面试训练。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages