Files
011-ai-interview/docs/项目进度总结-20260121.md
2026-01-23 13:57:48 +08:00

195 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 的状态管理,才能正确记录对话日志并在后台展示。