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

123
backend/insert_mock_full.py Normal file
View File

@@ -0,0 +1,123 @@
"""
插入完整模拟面试数据8 条候选人 + 对话记录)
"""
import asyncio
import httpx
import json
import uuid
COZE_API_BASE = "https://api.coze.cn"
COZE_PAT_TOKEN = "pat_nd1wU47WyPS9GCIyJ1clnH8h1WOQXGrYELX8w73TnSZaYbFdYD4swIhzcETBUbfT"
WORKFLOW_ID = "7597376294612107318"
# 候选人数据
CANDIDATES = [
{"name": "张小美", "skill": 85, "concept": 82, "comp": 88, "status": "completed", "risk": ""},
{"name": "李明辉", "skill": 72, "concept": 70, "comp": 75, "status": "completed", "risk": ""},
{"name": "王晓丽", "skill": 92, "concept": 90, "comp": 95, "status": "completed", "risk": ""},
{"name": "陈建国", "skill": 65, "concept": 60, "comp": 68, "status": "completed", "risk": "面试中表现紧张,需关注"},
{"name": "刘芳芳", "skill": 78, "concept": 75, "comp": 80, "status": "completed", "risk": ""},
{"name": "赵大伟", "skill": 55, "concept": 52, "comp": 58, "status": "completed", "risk": "销售经验不足,需重点培训"},
{"name": "孙婷婷", "skill": 88, "concept": 85, "comp": 90, "status": "in_progress", "risk": ""},
{"name": "周志强", "skill": 45, "concept": 42, "comp": 48, "status": "completed", "risk": "不建议录用,综合能力较弱"},
]
# 简历模板
RESUMES = [
"3年销售经验曾在某知名医美机构担任销售顾问业绩连续12个月达成率超过120%",
"5年美容行业从业经验持有高级美容师证书。性格开朗沟通能力强。",
"应届毕业生,市场营销专业,在校期间有丰富的社团活动经验。对医美行业充满热情。",
"2年电商销售经验熟悉线上运营和客户服务。希望转型到线下医美销售领域。",
]
# 对话模板
DIALOGUES = [
("开场", "你好,请先做个自我介绍", "面试官您好,我是{name},很高兴参加这次面试。我之前有销售相关经验,对轻医美行业很感兴趣。"),
("技能", "请介绍你常用的销售技巧", "我主要采用顾问式销售方法,先通过沟通了解客户的真实需求,然后针对性地推荐适合的产品或服务。"),
("技能", "遇到客户异议时如何处理", "首先我会认真倾听客户的顾虑,表示理解。然后用专业知识解答疑问,必要时提供案例或数据支持。"),
("观念", "你如何看待销售这份工作", "我认为销售不仅是卖产品,更是帮助客户解决问题。好的销售是客户的顾问和朋友。"),
("素质", "你的职业规划是什么", "短期希望成为一名优秀的销售顾问,中期目标是带领团队,长期希望在医美行业有深入发展。"),
]
async def execute_sql(sql: str, table: str) -> dict:
headers = {
"Authorization": f"Bearer {COZE_PAT_TOKEN}",
"Content-Type": "application/json"
}
input_json = json.dumps({"table": table, "sql": sql}, ensure_ascii=False)
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
f"{COZE_API_BASE}/v1/workflow/run",
headers=headers,
json={"workflow_id": WORKFLOW_ID, "parameters": {"input": input_json}}
)
return response.json()
def escape(s):
"""转义 SQL 特殊字符"""
return s.replace("'", "''") if s else ""
async def main():
print("=" * 60)
print("插入完整模拟数据 (8 条候选人)")
print("=" * 60)
for idx, c in enumerate(CANDIDATES):
session_id = f"MOCK_{uuid.uuid4().hex[:8].upper()}"
resume = RESUMES[idx % len(RESUMES)]
# 生成报告
skill_report = f"销售技能评估:候选人在产品介绍和需求挖掘方面{'表现出色' if c['skill'] >= 80 else '有待提升'}。得分:{c['skill']}"
concept_report = f"销售观念评估:对销售工作{'有正确认知' if c['concept'] >= 70 else '认识不够深入'}。得分:{c['concept']}"
comp_report = f"综合素质评估:学习能力{'' if c['comp'] >= 80 else '一般'},抗压能力{'' if c['comp'] >= 75 else '需加强'}。得分:{c['comp']}"
# 1. 插入 Assessment
sql1 = f"""INSERT INTO ci_interview_assessments (
session_id, candidate_name, resume_text, current_stage,
sales_skill_score, sales_concept_score, competency_score,
sales_skill_report, sales_concept_report, competency_report,
motivation_summary, risk_warning, growth_plan, ref_check_list
) VALUES (
'{session_id}', '{c["name"]}', '{escape(resume)}', '{c["status"]}',
'{c["skill"]}', '{c["concept"]}', '{c["comp"]}',
'{escape(skill_report)}', '{escape(concept_report)}', '{escape(comp_report)}',
'候选人对轻医美行业表现出兴趣,希望长期发展。',
'{escape(c["risk"])}',
'建议入职后进行系统培训,由资深顾问带教。',
'建议背调:确认任职时间、业绩数据、离职原因。'
)"""
print(f"\n[{idx+1}/8] {c['name']} (session: {session_id})")
result = await execute_sql(sql1, "assessments")
if result.get('code') != 0:
print(f" ❌ Assessment 失败: {result.get('msg')}")
continue
print(f" ✅ Assessment: {c['skill']}/{c['concept']}/{c['comp']}")
# 2. 插入对话记录
for d_idx, (stage, q, a) in enumerate(DIALOGUES, 1):
log_id = f"LOG_{session_id}_{d_idx:02d}"
answer = a.replace("{name}", c["name"])
sql2 = f"""INSERT INTO ci_interview_logs (
log_id, session_id, stage, round, ai_question, user_answer, log_type
) VALUES (
'{log_id}', '{session_id}', '{stage}', '{d_idx}',
'{escape(q)}', '{escape(answer)}', 'interview'
)"""
result = await execute_sql(sql2, "logs")
if result.get('code') != 0:
print(f" ⚠️ 对话{d_idx}: {result.get('msg')[:30]}")
print(f" ✅ 对话: {len(DIALOGUES)}")
print("\n" + "=" * 60)
print("✅ 完成!共插入 8 条候选人 + 40 条对话记录")
print("=" * 60)
if __name__ == "__main__":
asyncio.run(main())