Initial commit: AI Interview System

This commit is contained in:
111
2026-01-23 13:57:48 +08:00
commit 95770afe21
127 changed files with 24686 additions and 0 deletions

View File

@@ -0,0 +1,194 @@
# AI 语音面试系统 - 项目进度总结
**更新日期**: 2026-01-21
**项目代号**: 011-ai-interview-2601
---
## 一、已完成功能
### 1. 基础架构 ✅
- [x] 前端项目初始化 (Vue 3 + TypeScript + Vite + Element Plus)
- [x] 后端项目初始化 (FastAPI + Python)
- [x] Coze API 集成 (PAT Token 认证)
- [x] 文件服务器搭建 (Nginx + PHP 上传脚本)
### 2. 工作流 A - 面试初始化 ✅
- [x] 接收姓名和简历 PDF
- [x] 上传简历到自建文件服务器 (`files.test.ai.ireborn.com.cn`)
- [x] 调用 Coze 工作流解析简历
- [x] 生成 `session_id` 并写入 `ci_interview_assessments`
- [x] 返回 `session_id` 给前端
### 3. 工作流 B - 面试对话 ⚠️ (部分完成)
- [x] 调用 Coze `/v3/chat` API 进行对话
- [x] 支持文字面试模式
- [x] 支持语音面试模式 (RTC 房间创建)
- [ ] **未完成**: 多轮对话状态维持
- [ ] **未完成**: 对话日志写入 `ci_interview_logs`
### 4. 工作流 C1 - 数据查询 ✅
- [x] 支持查询 `ci_interview_assessments`
- [x] 支持查询 `ci_interview_logs`
- [x] 支持查询 `ci_business_config`
- [x] 通过 JSON 输入指定表名和 SQL
### 5. 后台管理页面 ✅
- [x] 登录页面 (`/admin/login`)
- [x] 面试列表页面 (`/admin/interviews`)
- [x] 面试详情页面 (`/admin/interviews/:id`)
- [x] 基本信息展示
- [x] 维度评分展示
- [x] 评估报告展示
- [x] 对话记录展示 (数据依赖工作流 B)
- [x] 配置管理页面 (`/admin/configs`)
### 6. 文件服务 ✅
- [x] 自建文件服务器 (`files.test.ai.ireborn.com.cn`)
- [x] PHP 上传接口 (Token 认证)
- [x] Nginx 静态文件服务
- [x] CORS 支持
---
## 二、核心问题
### 问题:工作流 B 多轮对话状态无法维持
**现象**:
- 每次调用 `/v3/chat` APICoze 返回新的 `conversation_id`
- 即使传入上一次的 `conversation_id`,仍然返回新值
- 导致工作流 B 每次都从头执行,重复显示欢迎语
**影响**:
1. 面试无法正常进行多轮问答
2. 对话日志无法写入 `ci_interview_logs`
3. 后台管理页面无法显示对话记录
**已尝试的方案**:
1. ❌ 传入 `conversation_id` 参数 - Coze 仍返回新值
2. ❌ 使用 `/v1/workflows/chat` 接口 - 接口不存在或参数格式不对
3. ⏳ 通过 `session_id` 在工作流内部管理状态 - 需要修改工作流 B
---
## 三、解决方案建议
### 方案:工作流 B 内部状态管理
修改 Coze 工作流 B不依赖 Coze 的 conversation 机制,改为:
1. **开始节点**: 接收 `session_id` 和用户消息
2. **查询状态**: 从 `ci_interview_logs` 表查询该 `session_id` 的历史对话数量
3. **条件分支**:
- 如果历史为 0显示欢迎语更新状态
- 如果历史 > 0直接进入下一轮提问
4. **写入日志**: 每次对话后,将 AI 问题和用户回答写入 `ci_interview_logs`
5. **结束判断**: 当对话轮次达到设定值时,生成评估报告
---
## 四、技术栈
| 模块 | 技术 |
|------|------|
| 前端 | Vue 3 + TypeScript + Vite + Element Plus + Tailwind CSS |
| 后端 | Python + FastAPI + Pydantic + httpx |
| AI 平台 | Coze (扣子) |
| 文件服务 | Nginx + PHP |
| 数据库 | Coze 内置数据库 |
---
## 五、API 端点
### 后端 API
| 端点 | 方法 | 说明 |
|------|------|------|
| `/api/init-interview` | POST | 初始化面试(上传简历、生成 session_id |
| `/api/chat` | POST | 文字面试对话 |
| `/api/rooms` | POST | 创建语音面试房间 |
| `/api/admin/login` | POST | 管理员登录 |
| `/api/admin/interviews` | GET | 面试列表 |
| `/api/admin/interviews/{id}` | GET | 面试详情 |
| `/api/admin/interviews/{id}/logs` | GET | 对话记录 |
### Coze 工作流
| 工作流 | ID | 说明 |
|--------|-----|------|
| 工作流 A | 7597357422713798710 | 面试初始化(简历解析) |
| 工作流 B | 7595077233002840079 | 面试对话Chatflow |
| 工作流 C1 | 7597376294612107318 | 数据查询 |
---
## 六、数据库表
| 表名 | 说明 |
|------|------|
| ci_interview_assessments | 面试评估记录 |
| ci_interview_logs | 面试对话日志 |
| ci_business_config | 业务配置 |
---
## 七、下一步工作
1. **修改工作流 B** - 实现内部状态管理,不依赖 conversation_id
2. **测试多轮对话** - 验证对话日志正确写入数据库
3. **完善语音面试** - 测试 RTC 语音对话功能
4. **优化后台页面** - 改进布局和用户体验
---
## 八、文件结构
```
011-ai-interview-2601/
├── frontend/ # 前端项目
│ ├── src/
│ │ ├── api/ # API 请求
│ │ ├── pages/
│ │ │ ├── interview/ # 面试页面
│ │ │ └── admin/ # 后台管理
│ │ ├── composables/ # 组合式函数 (useRTC)
│ │ └── router/ # 路由配置
│ └── package.json
├── backend/ # 后端项目
│ ├── app/
│ │ ├── routers/ # API 路由
│ │ ├── services/ # 服务层 (coze_service)
│ │ └── schemas.py # 数据模型
│ ├── main.py
│ └── requirements.txt
├── docs/ # 文档
│ ├── upload.php # PHP 上传脚本
│ ├── nginx-files-server.conf
│ └── 项目进度总结-20260121.md
└── coze-workflows/ # Coze 工作流配置
```
---
## 九、配置信息
### 环境变量 (.env)
```env
COZE_PAT_TOKEN=pat_xxx
COZE_BOT_ID=7595113005181386792
FILE_SERVER_TOKEN=ai_interview_2026_secret
TUNNEL_URL=http://files.test.ai.ireborn.com.cn
```
### 文件服务器
- 域名: `files.test.ai.ireborn.com.cn`
- 上传接口: `/upload.php`
- 文件目录: `/resumes/`
---
**总结**: 项目基础架构已完成,核心问题是工作流 B 的多轮对话状态维持。需要在 Coze 工作流 B 中实现基于 session_id 的状态管理,才能正确记录对话日志并在后台展示。