# Interview_py **Repository Path**: bkmsoft/interview_1py ## Basic Information - **Project Name**: Interview_py - **Description**: AI面试评估系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-12-17 - **Last Updated**: 2025-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 面向高校学生的多模态智能模拟面试评测系统 ### Multi-modal intelligent simulated interview evaluation system ### for college students > 作者:WSY > > 日期:2025年8月 --- ## 项目简介 本项目是一个基于Flask框架开发的智能模拟面试评测系统,专门为高校学生提供多模态(文字、语音、视频)的面试练习和AI智能评测服务。系统集成了先进的AI技术,能够自动分析学生的面试回答,提供专业的能力评估和改进建议。 ## 技术栈详细说明 ### 核心框架与库 - **Flask 3.1.1**: 轻量级Web框架,采用Blueprint模块化架构 - **Flask-SQLAlchemy 3.1.1**: ORM数据库操作,支持关系映射和查询优化 - **Flask-Login 0.6.3**: 用户会话管理,支持用户状态持久化 - **Flask-WTF 1.2.2**: 表单处理和CSRF保护 - **WTForms 3.2.1**: 表单验证和渲染 ### AI与机器学习 - **OpenAI 1.91.0**: 官方API客户端,用于Whisper语音识别 - **OpenAI-Whisper 20250625**: 多语言语音识别模型 - **Vosk 0.3.45**: 离线语音识别引擎,支持中文识别 - **Tiktoken 0.9.0**: OpenAI分词器,用于文本token计算 - **Tenacity 9.1.2**: 重试机制库,提供指数退避策略 ### 音视频处理 - **Pydub 0.25.1**: 音频文件格式转换和处理 - **Audioop-lts 0.2.1**: 音频操作库,用于音频数据预处理 - **FFmpeg**: 视频编解码和格式转换(通过subprocess调用) ### 数据处理 - **Demjson3 3.0.6**: JSON解析库,支持非标准JSON格式 - **Werkzeug 3.1.3**: WSGI工具库,提供安全工具和调试功能 ## 核心功能特性 ### 🎯 多模态面试练习 - **文字回答**:支持文本形式的面试回答 - **语音回答**:支持音频文件上传(WAV、MP3、M4A、OGG格式) - **视频回答**:支持视频文件上传(MP4、MOV、AVI、MKV格式) - **智能转写**:集成Whisper和Vosk模型,自动将语音/视频转换为文字 ### 🤖 AI智能评测 - **多维度分析**:从专业知识、表达能力、逻辑思维等6个核心维度进行评分 - **个性化建议**:基于AI分析结果,提供针对性的改进建议 - **综合评述**:生成400字以上的详细面试表现分析报告 ### 📝 简历管理 - **简历上传**:支持PDF、DOC、DOCX格式简历文件 - **智能匹配**:AI分析简历与岗位的匹配度 - **多维度评分**:从岗位匹配度、教育背景、技能特长等角度进行评分 ### 🎭 场景管理 - **多样化场景**:涵盖AI、大数据、物联网、智能系统等领域 - **智能问题生成**:基于DeepSeek API自动生成标准化面试问题 - **难度推荐**:AI自动推荐场景难度和练习时长 ### 👥 用户管理 - **角色区分**:支持学生和教师不同角色 - **登录注册**:完整的用户认证系统 - **历史记录**:保存所有练习和评测记录 ## 系统架构设计 ### 应用架构模式 系统采用**模块化Blueprint架构**,将功能按业务领域分离: ``` app.py (主应用) ├── auth.py (认证模块) ├── scenarios.py (场景管理) ├── practice.py (练习模块) ├── analysis.py (AI分析) └── resume.py (简历管理) ``` ### 数据库设计详解 #### 核心表结构 ```sql -- 用户表 CREATE TABLE user ( id INTEGER PRIMARY KEY, username VARCHAR(64) UNIQUE NOT NULL, password VARCHAR(128) NOT NULL, role VARCHAR(20) DEFAULT 'student' ); -- 场景表 CREATE TABLE scenario ( id INTEGER PRIMARY KEY, title VARCHAR(128) NOT NULL, domain VARCHAR(32) NOT NULL, description TEXT NOT NULL, difficulty VARCHAR(16) NOT NULL, duration INTEGER NOT NULL, questions TEXT ); -- 面试回答表 CREATE TABLE interview_response ( id INTEGER PRIMARY KEY, user_id INTEGER REFERENCES user(id), scenario_id INTEGER REFERENCES scenario(id), response_type VARCHAR(16) NOT NULL, -- 'text','audio','video' content TEXT, file_path VARCHAR(256), timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); -- AI分析报告表 CREATE TABLE analysis_report ( id INTEGER PRIMARY KEY, response_id INTEGER UNIQUE REFERENCES interview_response(id), per_question TEXT NOT NULL, -- JSON格式 metrics TEXT NOT NULL, -- JSON格式 suggestions TEXT NOT NULL, -- JSON格式 summary TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` #### 关系映射策略 - **一对多关系**: User → InterviewResponse, Scenario → InterviewResponse - **一对一关系**: InterviewResponse → AnalysisReport - **级联删除**: 用户删除时自动清理相关数据 - **外键约束**: 确保数据完整性 ### AI服务架构 #### DeepSeek API集成 ```python # API客户端配置 deep_api = OpenAI( api_key=Config.DEEPSEEK_API_KEY, base_url=Config.DEEPSEEK_BASE_URL, timeout=120 # 2分钟超时 ) # 重试机制 @retry(stop=stop_after_attempt(3), wait=wait_exponential(min=2, max=10)) def generate_analysis(response): # 分析逻辑 ``` #### 语音识别双引擎 1. **Whisper引擎** (在线) - 模型: whisper-small - 支持: 多语言识别 - 优势: 准确率高,支持长音频 2. **Vosk引擎** (离线) - 模型: vosk-model-cn-0.22 - 支持: 中文识别 - 优势: 本地处理,隐私保护 #### 文本分析流程 ``` 原始输入 → 格式检测 → 转写处理 → Token计算 → AI分析 → JSON解析 → 结果存储 ``` ### 文件处理架构 #### 上传目录结构 ``` uploads/ ├── resumes/ # 简历文件 (PDF, DOC, DOCX) ├── audios/ # 音频文件 (WAV, MP3, M4A, OGG) └── videos/ # 视频文件 (MP4, MOV, AVI, MKV) ``` #### 安全机制 - **文件名处理**: `secure_filename()` 防止路径遍历 - **文件类型验证**: 白名单机制验证文件扩展名 - **大小限制**: 最大50MB文件上传 - **目录隔离**: 按文件类型分目录存储 #### 音视频处理流程 ``` 上传文件 → 格式验证 → 安全存储 → 格式转换 → 语音提取 → 转写处理 → 文本分析 ``` ## 系统架构图 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 前端界面 │ │ Flask应用 │ │ 数据库层 │ │ (HTML/CSS/JS) │◄──►│ (Blueprint) │◄──►│ (SQLite) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ AI服务层 │ │ • DeepSeek API │ │ • Whisper │ │ • Vosk │ └─────────────────┘ ``` ## 核心算法与实现细节 ### AI分析算法 #### 多维度评分算法 ```python def generate_analysis(response): sys_prompt = """ 你是资深面试评测专家。请分别对候选人对每个问题的回答生成 50–100 字的分析, 给出至少6个核心能力指标 0–5 分,再给出5 条改进建议, 最后给出不少于400字的综合评述,并以纯 JSON 格式输出。 """ # 评分维度包括: # 1. 专业知识水平 (0-5分) # 2. 表达能力 (0-5分) # 3. 逻辑思维 (0-5分) # 4. 问题解决能力 (0-5分) # 5. 沟通技巧 (0-5分) # 6. 综合素质 (0-5分) ``` #### 语音转写算法 ```python def transcribe_audio(file_path): # 1. 音频预处理 audio = whisper.load_audio(file_path) # 2. 模型选择策略 if file_size < 25MB: model = whisper.load_model("small") else: model = whisper.load_model("base") # 3. 转写处理 result = model.transcribe(audio, language="zh") return result["text"] ``` #### 简历匹配算法 ```python def generate_resume_analysis(scenario, resume): # 评分维度: # 1. 岗位匹配度 (0-10分,两位小数) # 2. 教育背景 (0-10分) # 3. 技能特长 (0-10分) # 4. 工作经验 (0-10分) # 5. 综合素质 (0-10分) metrics = [ {"name": "岗位匹配度", "score": 8.75}, {"name": "教育背景", "score": 7.50}, # ... 其他维度 ] ``` ### 性能优化策略 #### 数据库优化 - **索引策略**: 在user_id, scenario_id, timestamp字段建立索引 - **查询优化**: 使用SQLAlchemy的lazy loading和eager loading - **连接池**: 配置数据库连接池提高并发性能 #### 缓存机制 ```python # 模型缓存 _whisper_model = None def get_whisper_model(): global _whisper_model if _whisper_model is None: _whisper_model = whisper.load_model("small") return _whisper_model ``` #### 异步处理 - **文件上传**: 使用异步处理大文件上传 - **AI分析**: 后台任务处理耗时的AI分析 - **转写服务**: 队列机制处理语音转写任务 ### 安全机制详解 #### 认证与授权 ```python # CSRF保护 csrf = CSRFProtect() csrf.exempt(scn_bp) # 免除特定Blueprint的CSRF # 用户认证 @login_required def protected_route(): # 需要登录才能访问 ``` #### 文件安全 ```python def allowed_file(filename, allowed_exts): return ( '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_exts ) # 安全文件名处理 filename = secure_filename(f"{current_user.id}_{sc_id}_{file.filename}") ``` #### 数据验证 - **输入验证**: WTForms提供表单验证 - **SQL注入防护**: SQLAlchemy ORM自动防护 - **XSS防护**: 模板自动转义HTML内容 ## 详细安装部署指南 ### 系统环境要求 #### 硬件要求 - **CPU**: 2核心以上,推荐4核心 - **内存**: 最少2GB,推荐4GB以上 - **存储**: 最少5GB可用空间 - **网络**: 稳定的互联网连接(用于AI API调用) #### 软件环境 - **操作系统**: Windows 10+, Ubuntu 18.04+, macOS 10.14+ - **Python**: 3.8+ (推荐3.9或3.10) - **FFmpeg**: 4.0+ (用于音视频处理) - **Git**: 用于代码版本管理 ### 详细安装步骤 #### 1. 环境准备 ```bash # 检查Python版本 python --version # 应该显示 Python 3.8.x 或更高版本 # 检查FFmpeg安装 ffmpeg -version # 如果没有安装,请先安装FFmpeg ``` #### 2. 项目部署 ```bash # 克隆项目 git clone [项目地址] cd [项目目录] # 创建虚拟环境 python -m venv .venv # 激活虚拟环境 # Windows .venv\Scripts\activate # Linux/Mac source .venv/bin/activate # 升级pip python -m pip install --upgrade pip ``` #### 3. 依赖安装 ```bash # 安装Python依赖 pip install -r requirements.txt # 验证关键依赖 python -c "import flask, openai, whisper, vosk; print('所有依赖安装成功')" ``` #### 4. 环境配置 ```bash # 创建环境变量文件 # Windows echo DEEPSEEK_API_KEY=your_deepseek_api_key > .env echo OPENAI_API_KEY=your_openai_api_key >> .env echo SECRET_KEY=your_secret_key >> .env # Linux/Mac cat > .env << EOF DEEPSEEK_API_KEY=your_deepseek_api_key OPENAI_API_KEY=your_openai_api_key SECRET_KEY=your_secret_key EOF ``` #### 5. 数据库初始化 ```bash # 初始化数据库 python -c "from app import create_app; from models import db; app = create_app(); app.app_context().push(); db.create_all(); print('数据库初始化完成')" ``` #### 6. 启动应用 ```bash # 开发模式启动 python app.py # 生产模式启动(使用Gunicorn) gunicorn -w 4 -b 0.0.0.0:5000 app:app ``` ### 配置文件详解 #### config.py 配置项 ```python class Config: # 基础配置 SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret') # 数据库配置 SQLALCHEMY_DATABASE_URI = os.environ.get( 'DATABASE_URL', 'sqlite:///' + os.path.join(basedir, 'app.db') ) SQLALCHEMY_TRACK_MODIFICATIONS = False # 文件上传配置 UPLOAD_FOLDER = os.path.join(basedir, 'uploads') MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50MB # AI服务配置 DEEPSEEK_API_KEY = os.environ.get('DEEPSEEK_API_KEY') DEEPSEEK_BASE_URL = os.environ.get('DEEPSEEK_BASE_URL', 'https://api.deepseek.com') OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY') # 语音识别配置 VOSK_MODEL_PATH = os.path.join(basedir, 'models', 'vosk-model-cn-0.22') ``` #### 环境变量说明 | 变量名 | 说明 | 示例值 | |--------|------|--------| | `DEEPSEEK_API_KEY` | DeepSeek API密钥 | `sk-xxx...` | | `OPENAI_API_KEY` | OpenAI API密钥 | `sk-xxx...` | | `SECRET_KEY` | Flask密钥 | `your-secret-key` | | `DATABASE_URL` | 数据库连接URL | `sqlite:///app.db` | ### 生产环境部署 #### 使用Docker部署 ```dockerfile FROM python:3.9-slim # 安装系统依赖 RUN apt-get update && apt-get install -y \ ffmpeg \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 5000 # 启动命令 CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"] ``` #### Nginx配置 ```nginx server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /static { alias /path/to/your/app/static; expires 30d; } location /uploads { alias /path/to/your/app/uploads; expires 7d; } } ``` #### 系统服务配置 ```ini [Unit] Description=Interview System After=network.target [Service] Type=simple User=www-data WorkingDirectory=/path/to/your/app Environment=PATH=/path/to/your/app/.venv/bin ExecStart=/path/to/your/app/.venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app Restart=always [Install] WantedBy=multi-user.target ``` ## 使用说明 ### 用户注册登录 1. 访问系统首页 2. 点击"注册"创建新账户 3. 使用用户名密码登录系统 ### 面试练习流程 1. **选择场景**:从场景列表中选择感兴趣的面试场景 2. **查看问题**:阅读场景描述和面试问题 3. **提交回答**:选择回答方式(文字/语音/视频) 4. **等待分析**:系统自动进行AI分析 5. **查看报告**:获取详细的能力评估和改进建议 ### 简历管理 1. **上传简历**:选择场景并上传简历文件 2. **AI分析**:系统自动分析简历与岗位匹配度 3. **查看结果**:获取评分和改进建议 ### 场景管理(教师角色) 1. **创建场景**:设置场景标题、领域、描述等 2. **AI生成问题**:自动生成标准化面试问题 3. **难度设置**:设置推荐难度和练习时长 ## API接口详细文档 ### 认证模块 (auth.py) #### 用户登录 ```http POST /auth/login Content-Type: application/x-www-form-urlencoded username=testuser&password=testpass ``` **响应示例**: ```json { "status": "success", "message": "登录成功", "user": { "id": 1, "username": "testuser", "role": "student" } } ``` #### 用户注册 ```http POST /auth/register Content-Type: application/x-www-form-urlencoded username=newuser&password=newpass&confirm_password=newpass ``` #### 用户登出 ```http POST /auth/logout ``` ### 场景管理模块 (scenarios.py) #### 获取场景列表 ```http GET /scenarios/ ``` **响应示例**: ```json { "scenarios": [ { "id": 1, "title": "AI算法工程师面试", "domain": "AI", "description": "针对AI算法工程师的面试场景", "difficulty": "中等", "duration": 120, "questions": "1. 请介绍机器学习的基本概念..." } ] } ``` #### 创建新场景 ```http POST /scenarios/create Content-Type: application/x-www-form-urlencoded title=新场景&domain=AI&description=场景描述&difficulty=中等&duration=120 ``` #### 获取场景详情 ```http GET /scenarios/ ``` ### 练习模块 (practice.py) #### 获取练习场景列表 ```http GET /practice/ ``` #### 提交面试回答 ```http POST /practice//answer Content-Type: multipart/form-data resp_type=text&text_answer=我的回答内容 ``` **或者音频/视频上传**: ```http POST /practice//answer Content-Type: multipart/form-data resp_type=audio&audio_file=@audio.wav ``` #### 下载媒体文件 ```http GET /practice/files// ``` ### 分析模块 (analysis.py) #### 获取分析报告列表 ```http GET /analysis/ ``` **响应示例**: ```json { "reports": [ { "id": 1, "scenario_title": "AI算法工程师面试", "response_type": "text", "timestamp": "2024-01-01T10:00:00Z", "has_analysis": true } ] } ``` #### 获取分析报告详情 ```http GET /analysis/ ``` **响应示例**: ```json { "id": 1, "per_question": [ { "question": "请介绍机器学习的基本概念", "analysis": "回答较为全面,涵盖了监督学习、无监督学习等核心概念..." } ], "metrics": [ {"name": "专业知识水平", "score": 4}, {"name": "表达能力", "score": 3}, {"name": "逻辑思维", "score": 4} ], "suggestions": [ "建议加强表达的逻辑性和条理性", "可以多举一些具体的例子来说明概念" ], "summary": "整体表现良好,专业知识掌握扎实..." } ``` #### 生成AI分析报告 ```http POST /analysis/generate Content-Type: application/json { "response_id": 1 } ``` ### 简历模块 (resume.py) #### 获取简历列表 ```http GET /resume/ ``` #### 上传简历文件 ```http POST /resume/upload Content-Type: multipart/form-data scenario_id=1&resume_file=@resume.pdf ``` #### 获取简历分析报告 ```http GET /resume/analysis/ ``` **响应示例**: ```json { "id": 1, "metrics": [ {"name": "岗位匹配度", "score": 8.75}, {"name": "教育背景", "score": 7.50}, {"name": "技能特长", "score": 8.25}, {"name": "工作经验", "score": 6.75}, {"name": "综合素质", "score": 7.50} ], "suggestions": [ "建议在简历中突出与目标岗位相关的项目经验", "可以增加一些量化的工作成果描述" ], "summary": "简历整体质量较高,教育背景和技能特长与岗位要求匹配度较好..." } ``` ### 错误处理 #### 标准错误响应格式 ```json { "status": "error", "message": "错误描述", "code": 400 } ``` #### 常见错误码 - `400`: 请求参数错误 - `401`: 未授权访问 - `403`: 权限不足 - `404`: 资源不存在 - `413`: 文件过大 - `500`: 服务器内部错误 ## 部署建议 ### 生产环境部署 1. **使用Gunicorn**:替代Flask开发服务器 2. **配置Nginx**:作为反向代理和静态文件服务器 3. **数据库优化**:考虑使用PostgreSQL或MySQL 4. **文件存储**:使用云存储服务(如阿里云OSS、AWS S3) 5. **监控日志**:集成日志收集和监控系统 ### 性能优化 1. **缓存策略**:Redis缓存常用数据 2. **异步处理**:使用Celery处理耗时任务 3. **CDN加速**:静态资源使用CDN分发 4. **负载均衡**:多实例部署提高并发能力 ## 开发指南与扩展 ### 项目结构详解 ``` ├── app.py # 主应用入口,Blueprint注册 ├── config.py # 配置管理,环境变量处理 ├── models.py # 数据模型定义,ORM映射 ├── auth.py # 用户认证模块 │ ├── 登录/注册逻辑 │ ├── 会话管理 │ └── 权限控制 ├── scenarios.py # 场景管理模块 │ ├── 场景CRUD操作 │ ├── AI问题生成 │ └── 难度推荐算法 ├── practice.py # 练习模块 │ ├── 多模态回答处理 │ ├── 文件上传管理 │ └── 回答记录存储 ├── analysis.py # AI分析模块 │ ├── 语音转写服务 │ ├── 多维度评分算法 │ └── 报告生成逻辑 ├── resume.py # 简历管理模块 │ ├── 简历文件处理 │ ├── 匹配度分析 │ └── 评分报告生成 ├── templates/ # HTML模板文件 │ ├── base.html # 基础模板 │ ├── auth/ # 认证相关模板 │ ├── scenarios/ # 场景管理模板 │ ├── practice/ # 练习相关模板 │ ├── analysis/ # 分析报告模板 │ └── resume/ # 简历管理模板 ├── static/ # 静态资源文件 │ ├── style.css # 样式文件 │ ├── js/ # JavaScript文件 │ └── images/ # 图片资源 ├── uploads/ # 文件上传目录 │ ├── resumes/ # 简历文件 │ ├── audios/ # 音频文件 │ └── videos/ # 视频文件 ├── models/ # AI模型文件 │ └── vosk-model-cn-0.22/ # Vosk中文模型 ├── ffmpeg.exe # FFmpeg可执行文件 ├── app.db # SQLite数据库文件 └── requirements.txt # 依赖包列表 ``` ### 核心开发模式 #### Blueprint模块化架构 ```python # 创建新的Blueprint new_bp = Blueprint( 'new_module', __name__, template_folder='templates/new_module', url_prefix='/new' ) # 注册Blueprint app.register_blueprint(new_bp) ``` #### 数据模型扩展 ```python # 在models.py中添加新模型 class NewModel(db.Model): __tablename__ = 'new_table' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) # 关系映射 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) user = db.relationship('User', back_populates='new_models') ``` #### API接口开发 ```python @new_bp.route('/api/endpoint', methods=['POST']) @login_required def new_endpoint(): try: # 参数验证 data = request.get_json() if not data: return jsonify({'error': '无效的JSON数据'}), 400 # 业务逻辑处理 result = process_data(data) # 返回结果 return jsonify({ 'status': 'success', 'data': result }) except Exception as e: logger.error(f"API错误: {str(e)}") return jsonify({'error': '服务器内部错误'}), 500 ``` ### 扩展开发指南 #### 1. 新增功能模块 ```python # 1. 创建新的Blueprint文件 # new_feature.py # 2. 定义路由和视图函数 # 3. 在app.py中注册Blueprint # 4. 创建对应的HTML模板 # 5. 添加必要的静态资源 ``` #### 2. 数据库扩展 ```python # 1. 在models.py中定义新模型 # 2. 建立关系映射 # 3. 运行数据库迁移 # 4. 更新相关查询逻辑 ``` #### 3. AI功能扩展 ```python # 1. 集成新的AI服务 # 2. 实现新的分析算法 # 3. 添加模型缓存机制 # 4. 实现错误处理和重试逻辑 ``` #### 4. 前端界面扩展 ```html {% extends "base.html" %} {% block content %}
{% endblock %} {% block scripts %} {% endblock %} ``` ### 调试与测试 #### 开发环境调试 ```python # 启用调试模式 app.config['DEBUG'] = True # 添加日志记录 import logging logging.basicConfig(level=logging.DEBUG) # 使用Flask调试器 if __name__ == '__main__': app.run(debug=True) ``` #### 单元测试 ```python import unittest from app import create_app, db class TestCase(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_new_feature(self): # 测试逻辑 pass if __name__ == '__main__': unittest.main() ``` ### 性能优化建议 #### 数据库优化 ```python # 1. 添加索引 class User(db.Model): username = db.Column(db.String(64), unique=True, index=True) # 2. 使用查询优化 users = User.query.options(joinedload(User.responses)).all() # 3. 分页查询 users = User.query.paginate(page=1, per_page=20) ``` #### 缓存策略 ```python from flask_caching import Cache cache = Cache(app) @cache.memoize(timeout=300) def expensive_operation(param): # 耗时操作 return result ``` #### 异步处理 ```python from celery import Celery celery = Celery(app.name, broker='redis://localhost:6379') @celery.task def process_ai_analysis(response_id): # 异步AI分析处理 pass ``` ## 常见问题与故障排除 ### 安装部署问题 #### Q: Python依赖安装失败? **A: 解决方案**: ```bash # 1. 升级pip python -m pip install --upgrade pip # 2. 使用国内镜像源 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 3. 逐个安装问题包 pip install flask==3.1.1 pip install openai==1.91.0 ``` #### Q: FFmpeg未找到错误? **A: 解决方案**: ```bash # Windows: 下载FFmpeg并添加到PATH # Linux: sudo apt-get install ffmpeg # macOS: brew install ffmpeg # 验证安装 ffmpeg -version ``` #### Q: 数据库初始化失败? **A: 解决方案**: ```bash # 1. 检查数据库文件权限 chmod 644 app.db # 2. 删除旧数据库重新创建 rm app.db python -c "from app import create_app; from models import db; app = create_app(); app.app_context().push(); db.create_all()" ``` ### AI服务问题 #### Q: 语音/视频转写失败? **A: 故障排除步骤**: 1. **检查文件格式**: 确保支持WAV、MP3、M4A、OGG、MP4、MOV、AVI、MKV 2. **检查文件大小**: 不超过50MB限制 3. **检查网络连接**: 确保能访问OpenAI API 4. **验证API密钥**: 检查OPENAI_API_KEY配置 5. **查看日志**: 检查控制台错误信息 ```python # 调试代码 import whisper try: model = whisper.load_model("small") result = model.transcribe("test.wav") print("转写成功:", result["text"]) except Exception as e: print("转写失败:", str(e)) ``` #### Q: AI分析结果不准确? **A: 优化建议**: 1. **调整Prompt模板**: 修改analysis.py中的系统提示词 2. **优化输入内容**: 确保转写文本质量 3. **调整评分标准**: 修改评分维度和权重 4. **增加训练数据**: 提供更多示例数据 ```python # 自定义分析提示词 sys_prompt = """ 你是资深面试评测专家。请根据以下标准进行评分: 1. 专业知识水平 (0-5分) 2. 表达能力 (0-5分) 3. 逻辑思维 (0-5分) 4. 问题解决能力 (0-5分) 5. 沟通技巧 (0-5分) 6. 综合素质 (0-5分) """ ``` #### Q: DeepSeek API调用失败? **A: 解决方案**: 1. **检查API密钥**: 验证DEEPSEEK_API_KEY是否正确 2. **检查网络**: 确保能访问api.deepseek.com 3. **检查配额**: 确认API调用次数未超限 4. **重试机制**: 系统已内置重试,等待自动重试 ### 性能问题 #### Q: 系统运行缓慢? **A: 性能优化**: 1. **硬件升级**: 增加内存和CPU核心数 2. **数据库优化**: 添加索引,优化查询 3. **缓存策略**: 使用Redis缓存常用数据 4. **异步处理**: 使用Celery处理耗时任务 ```python # 数据库索引优化 class InterviewResponse(db.Model): user_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True) scenario_id = db.Column(db.Integer, db.ForeignKey('scenario.id'), index=True) timestamp = db.Column(db.DateTime, default=datetime.utcnow, index=True) ``` #### Q: 文件上传失败? **A: 解决方案**: 1. **检查文件大小**: 确保不超过50MB 2. **检查文件格式**: 验证文件扩展名 3. **检查磁盘空间**: 确保uploads目录有足够空间 4. **检查权限**: 确保uploads目录可写 ```bash # 检查磁盘空间 df -h # 检查目录权限 ls -la uploads/ chmod 755 uploads/ ``` ### 安全问题 #### Q: 用户认证失败? **A: 解决方案**: 1. **检查密码**: 确保密码正确 2. **检查会话**: 清除浏览器Cookie重新登录 3. **检查数据库**: 验证用户数据完整性 4. **重置密码**: 通过数据库直接重置 ```python # 重置用户密码 from werkzeug.security import generate_password_hash user = User.query.filter_by(username='testuser').first() user.password = generate_password_hash('newpassword') db.session.commit() ``` #### Q: CSRF令牌错误? **A: 解决方案**: 1. **清除浏览器缓存**: 重新加载页面 2. **检查表单**: 确保包含CSRF令牌 3. **检查配置**: 验证CSRF保护设置 ### 开发调试 #### Q: 如何开启调试模式? **A: 配置方法**: ```python # 在app.py中设置 app.config['DEBUG'] = True # 或通过环境变量 export FLASK_DEBUG=1 ``` #### Q: 如何查看详细日志? **A: 日志配置**: ```python import logging logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(levelname)s %(name)s %(message)s', handlers=[ logging.FileHandler('app.log'), logging.StreamHandler() ] ) ``` #### Q: 如何测试API接口? **A: 测试方法**: ```bash # 使用curl测试 curl -X POST http://localhost:5000/auth/login \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=testuser&password=testpass" # 使用Python requests import requests response = requests.post('http://localhost:5000/auth/login', data={'username': 'testuser', 'password': 'testpass'}) print(response.json()) ``` ## 联系方式 - 联系邮箱:`202207020624@sust.edu.cn` - 院校背景:陕西科技大学 计算机科学与技术 - 研究方向:多模态大模型、智能体