From 81c4b868428bf882ddd5355a136bdea3347c0462 Mon Sep 17 00:00:00 2001 From: st2411020124 Date: Thu, 8 Jan 2026 22:23:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0README.md=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- test_api.py | 60 +++++++++++++++++++++++ test_feedback_feature.py | 68 ++++++++++++++++++++++++++ test_interview_flow.py | 103 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 test_api.py create mode 100644 test_feedback_feature.py create mode 100644 test_interview_flow.py diff --git a/README.md b/README.md index c03c1ff..c3da78e 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ MIT License #### |姓名|学号|主要贡献 (具体分工)| |----|----|------------------| -|陆程杰|2411020124|(组长) 核心逻辑开发、Prompt 编写| +|陆程杰|2411020124|核心逻辑开发、Prompt 编写| |蒲俊霖|2411020125| 文档撰写、测试与 Bug 修复| |陈一佳|2411020121| 前端界面设计、PPT 制作| #### AI面试官项目开发心得 diff --git a/test_api.py b/test_api.py new file mode 100644 index 0000000..df1c1c1 --- /dev/null +++ b/test_api.py @@ -0,0 +1,60 @@ +import logging +from services.deepseek_service import deepseek_service + +# 设置日志 +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +def test_feedback_generation(): + logger.info("开始测试反馈生成功能") + + # 准备测试数据 + conversation_history = [ + {"role": "assistant", "content": "你好!我是面试官,现在开始针对前端开发岗位的面试。请做一下自我介绍。"}, + {"role": "user", "content": "你好,我叫张三,有3年前端开发经验,熟悉React、Vue等框架。"}, + {"role": "assistant", "content": "请介绍一下你最印象深刻的项目。"}, + {"role": "user", "content": "我在之前的公司负责开发了一个电商网站,使用React框架,优化了页面加载速度,提升了用户体验。"} + ] + + system_prompt = """作为一位专业的面试评估专家,请对整场面试进行全面评估。 + +请提供: +1. 整体表现评分(0-100分)和评级(优秀/良好/一般/需改进) +2. 各轮回答的详细分析(针对每个问题和回答给出具体评价) +3. strengths(优势)- 列出至少3点 +4. areas_for_improvement(需要改进的方面)- 列出至少3点 +5. 具体的准备建议(针对改进点给出可操作的建议) + +请用中文回复,格式清晰、结构化,避免过于笼统的描述。""" + + user_prompt = f"请分析以下针对前端开发岗位的面试对话并给出综合反馈:\n\n" + "\n\n".join([ + f"{'面试官' if msg['role'] == 'assistant' else '候选人'}:{msg['content']}" + for msg in conversation_history + ]) + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + try: + logger.info("准备调用DeepSeek API") + response = deepseek_service._call_api(messages) + logger.info("API调用成功") + logger.debug(f"API响应:{response}") + + feedback = response["choices"][0]["message"]["content"] + logger.info("生成的反馈内容:") + logger.info(feedback) + + return True + except Exception as e: + logger.error(f"API调用失败:{str(e)}", exc_info=True) + return False + +if __name__ == "__main__": + success = test_feedback_generation() + if success: + logger.info("测试成功") + else: + logger.info("测试失败") diff --git a/test_feedback_feature.py b/test_feedback_feature.py new file mode 100644 index 0000000..a8302bc --- /dev/null +++ b/test_feedback_feature.py @@ -0,0 +1,68 @@ +import requests +import json + +# 测试服务器地址 +BASE_URL = "http://127.0.0.1:5000" + +def test_feedback_feature(): + print("=== 测试请求反馈功能 ===") + + # 1. 开始面试 + print("\n1. 开始面试...") + start_data = { + "job_position": "前端开发工程师", + "difficulty": "intermediate" + } + + start_response = requests.post(f"{BASE_URL}/api/interview/start", json=start_data) + if start_response.status_code != 200: + print(f"开始面试失败:{start_response.json().get('error')}") + return False + + start_result = start_response.json() + interview_id = start_result.get("interview_id") + first_question = start_result.get("question") + + print(f"面试ID: {interview_id}") + print(f"第一个问题: {first_question}") + + # 2. 回答问题并请求反馈 + print("\n2. 回答问题并请求反馈...") + answer_data = { + "interview_id": interview_id, + "answer": "我有3年的前端开发经验,主要使用React框架,熟悉JavaScript、HTML、CSS等技术。", + "request_feedback": True + } + print(f"发送的请求数据:{json.dumps(answer_data)}") + + answer_response = requests.post(f"{BASE_URL}/api/interview/answer", json=answer_data) + if answer_response.status_code != 200: + print(f"提交回答失败:{answer_response.json().get('error')}") + return False + + answer_result = answer_response.json() + + print(f"反馈请求成功") + print(f"是否结束: {answer_result.get('ended')}") + + if answer_result.get('feedback'): + print(f"\n3. 收到反馈:") + print(answer_result['feedback']) + + # 验证反馈是否包含改进建议 + if '改进建议' in answer_result['feedback'] or '建议' in answer_result['feedback']: + print("\n✅ 反馈中包含改进建议") + else: + print("\n❌ 反馈中未包含明确的改进建议") + + return True + else: + print(f"\n❌ 未收到反馈") + return False + +if __name__ == "__main__": + success = test_feedback_feature() + if success: + print("\n=== 测试通过!请求反馈功能正常工作 ===") + else: + print("\n=== 测试失败!请求反馈功能存在问题 ===") diff --git a/test_interview_flow.py b/test_interview_flow.py new file mode 100644 index 0000000..f74a6c6 --- /dev/null +++ b/test_interview_flow.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +import requests +import json +import time + +base_url = "http://127.0.0.1:5000" + +def test_interview_flow(): + print("=== 测试面试完整流程 ===") + + # 1. 开始面试 + print("\n1. 开始面试...") + start_response = requests.post( + f"{base_url}/api/interview/start", + headers={"Content-Type": "application/json"}, + json={"job_position": "前端开发工程师", "difficulty": "medium"} + ) + + if start_response.status_code != 200: + print(f"开始面试失败: {start_response.status_code}") + print(start_response.text) + return False + + start_data = start_response.json() + interview_id = start_data.get("interview_id") + print(f"面试ID: {interview_id}") + print(f"第一个问题: {start_data.get('question')}") + + # 2. 回答第一个问题 + print("\n2. 回答第一个问题...") + answer1 = "我有3年前端开发经验,熟悉React和Vue框架。" + answer1_response = requests.post( + f"{base_url}/api/interview/answer", + headers={"Content-Type": "application/json"}, + json={"interview_id": interview_id, "answer": answer1, "request_feedback": False} + ) + + if answer1_response.status_code != 200: + print(f"回答问题失败: {answer1_response.status_code}") + print(answer1_response.text) + return False + + answer1_data = answer1_response.json() + print(f"第二个问题: {answer1_data.get('question')}") + + # 3. 回答第二个问题 + print("\n3. 回答第二个问题...") + answer2 = "我在项目中使用过React Hooks,特别是useState、useEffect和useContext,能够有效管理组件状态和副作用。" + answer2_response = requests.post( + f"{base_url}/api/interview/answer", + headers={"Content-Type": "application/json"}, + json={"interview_id": interview_id, "answer": answer2, "request_feedback": False} + ) + + if answer2_response.status_code != 200: + print(f"回答问题失败: {answer2_response.status_code}") + print(answer2_response.text) + return False + + answer2_data = answer2_response.json() + + if answer2_data.get('ended'): + print("面试结束") + else: + print(f"第三个问题: {answer2_data.get('question')}") + + # 4. 生成面试反馈 + print("\n4. 生成面试反馈...") + + # 构造对话历史 + conversation_history = [ + {"role": "assistant", "content": start_data.get('question')}, + {"role": "user", "content": answer1}, + {"role": "assistant", "content": answer1_data.get('question')}, + {"role": "user", "content": answer2} + ] + + if not answer2_data.get('ended') and answer2_data.get('question'): + conversation_history.append({"role": "assistant", "content": answer2_data.get('question')}) + + feedback_response = requests.post( + f"{base_url}/api/interview/feedback", + headers={"Content-Type": "application/json"}, + json={"interview_id": interview_id, "conversation_history": conversation_history} + ) + + if feedback_response.status_code != 200: + print(f"生成反馈失败: {feedback_response.status_code}") + print(feedback_response.text) + return False + + feedback_data = feedback_response.json() + print("\n=== 面试反馈 ===") + print(feedback_data.get('feedback', '')) + + return True + +if __name__ == "__main__": + success = test_interview_flow() + if success: + print("\n=== 测试成功!完整的面试流程正常工作 ===") + else: + print("\n=== 测试失败!请检查相关代码 ===")