You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
id VARCHAR(64) PRIMARY KEY
user_id UUID NOT NULL
session_id VARCHAR(64) NULL UNIQUE
job_title VARCHAR(128) NOT NULL
difficulty VARCHAR(16) NOT NULL
role_summary JSONB NOT NULL
recording_object_key TEXT NULL
recording_duration_seconds INTEGER NULL
completed_at TIMESTAMPTZ NULL
created_at TIMESTAMPTZ NOT NULL
updated_at TIMESTAMPTZ NOT NULL
约束:
difficulty仅允许 BASIC / STANDARD / CHALLENGE。
role_summary必须是JSON对象。
完成后必须同时存在 session_id、录音Key、录音时长和 completed_at。
录音时长必须大于0。
历史查询使用完成记录索引: (user_id, completed_at DESC) WHERE completed_at IS NOT NULL。
不保存:
status
completion_reason
report_status
recording_status
job_title_normalized
cefr_level
source_interview_id
运行时进度字段
deleted_at
12.2 interview_question
interview_id VARCHAR(64) NOT NULL
question_no INTEGER NOT NULL
question_type VARCHAR(16) NOT NULL
question_text TEXT NOT NULL
created_at TIMESTAMPTZ NOT NULL
updated_at TIMESTAMPTZ NOT NULL
约束:
复合主键:(interview_id, question_no)。
question_type仅允许 MAIN / FOLLOW_UP。
只保存实际提出的问题。
不保存 main_question_no 和 follow_up_no,通过问题顺序和类型推导。
不保存用户回答、转写或分轮音频。
12.3 interview_report
interview_id VARCHAR(64) PRIMARY KEY
report_type VARCHAR(16) NOT NULL
overall_score NUMERIC(5,2)
overall_summary TEXT NOT NULL
created_at TIMESTAMPTZ NOT NULL
updated_at TIMESTAMPTZ NOT NULL
POST /api/interviews
POST /api/interviews/{interviewId}/sessions
GET /api/interview-sessions/{sessionId}
GET /api/interview-sessions/{sessionId}/evaluation
RFC:英文模拟面试(Interview)模块详细设计
1. 背景与目标
英文模拟面试需要根据目标岗位和用户材料,完成有结构的英文问答、动态追问、完整录音和面试报告,并沉淀为可复练的学习资产。
本次设计目标:
2. 架构边界
Interview 是待实现的独立业务模块,沿用现有项目约定:
Interview 模块负责:
现有能力继续复用:
EvaluationServiceSessionStatus禁止新增:
InterviewLlmServiceInterviewTtsService评分模块复用的是评分能力,不直接复用旧五维契约、
session_evaluation表或现有固定权重。3. 面试输入
3.1 简历
简历为可选项。
支持:
不支持:
3.2 岗位信息
材料解析或岗位摘要生成失败时,不创建
interview记录。3.3 数据保留
原始简历、JD文字、JD图片及 OCR 临时文件只用于本次准备,不进入最终学习资产。
最终只保留岗位名称及“岗位信息摘要”。
4. 面试结构与难度
不提供面试时长选择。每场面试固定规划5个主问题,以问题完成情况结束。
BASICSTANDARDCHALLENGE用户现有的 A–D 英语水平只影响面试官用词和句式复杂度,不写入 Interview 记录,也不改变问题数量。
5. Interview 内部业务对象
TargetRoleSummaryinterview.role_summary保存InterviewQuestionPlanInterviewProgressInterviewTurnInterviewReportInterviewSessionInterviewQuestionPlan不预生成具体追问,也不承担运行状态。InterviewTurn中的回答音频引用和临时转写仅存在于运行时。完成后只持久化实际AI问题。6. 单轮面试流程
采用受控的
ASR → LLM → TTS三段式,不使用自主实时语音大模型驱动面试流程。单轮流程:
ASK_FOLLOW_UPMOVE_TO_NEXT_MAINInterviewProgress检查难度对应的追问上限。VAD只可用于录音辅助,不得自动结束业务轮次。
前端不显示用户逐字稿,只显示AI问题字幕。
临时转写只用于:
临时转写不得持久化、进入日志或作为历史资产展示。
7. 结束条件与状态
7.1 业务结束原因
只保留两种业务结束原因:
PLAN_COMPLETED:完成问题计划。USER_ENDED:用户主动结束。不设置时间到期结束,也不设置
SAFETY_LIMIT_REACHED。结束原因由
InterviewProgress在运行时管理,不写入数据库。持久化后的完整程度由报告类型表达:PLAN_COMPLETED→FULLUSER_ENDED→PARTIAL7.2 Session状态
Interview 完全复用现有
SessionStatus,不新增FINALIZING等状态。InterviewSession仅保存在进程内存中:interview_session表。7.3 断网清理
网络超时不等同于用户主动结束:
PARTIAL。8. 完成链路
报告与完整录音共同构成面试完成门槛。
完整录音必须包含:
完成顺序:
InterviewProgress确定FULL或PARTIAL。completed_at。SessionStatus设为COMPLETED。报告或完整录音任意一项最终失败时:
SessionStatus = FAILED因此不保存:
report_statusrecording_status9. 面试报告与评分复用
报告类型:
FULLPARTIAL五个固定评分维度:
每个维度包含:
报告同时包含综合分和整场总结。
评分实现继续复用现有
EvaluationService、Provider Registry、LLM及语音评分能力,但不直接复用现有五维结果模型:accuracy不等同于发音可理解度。naturalness不等同于逻辑与连贯性。InterviewScoringService。FULL报告参与最近成绩和能力趋势;PARTIAL报告不参与趋势。10. 学习资产与快速复练
一次实际面试对应一条学习资产。
资产保留:
资产不保留:
历史与训练时长包含
FULL和PARTIAL记录。最近成绩和能力趋势:
FULL报告。BASIC、STANDARD、CHALLENGE分别计算。快速复练
快速复练创建一个新的 Interview,并带入:
不带入:
为避免问题重复:
source_interview_id。11. 数据保留与删除
完成后的录音和学习资产不自动过期。
用户删除一条面试记录时,同时删除:
业务表采用物理删除,不增加
deleted_at。趋势基于现有
FULL报告动态计算,不建立趋势汇总表。因此删除报告后,其趋势贡献自然消失。12. 数据库设计
数据库遵循项目现有规范:
本模块只需要三张业务表。
12.1
interview约束:
difficulty仅允许BASIC / STANDARD / CHALLENGE。role_summary必须是JSON对象。session_id、录音Key、录音时长和completed_at。(user_id, completed_at DESC) WHERE completed_at IS NOT NULL。不保存:
statuscompletion_reasonreport_statusrecording_statusjob_title_normalizedcefr_levelsource_interview_iddeleted_at12.2
interview_question约束:
(interview_id, question_no)。question_type仅允许MAIN / FOLLOW_UP。main_question_no和follow_up_no,通过问题顺序和类型推导。12.3
interview_report五个维度分别展开为:
维度前缀:
不增加:
session_iduser_iddifficultytrend_contributiongenerated_atdifficulty从interview组合返回;created_at同时作为报告生成时间。12.4 明确不建立的表
13. 初始接口边界
现有架构已经预留以下路由方向:
回答提交、主动结束、重连、历史、播放、删除、快速复练和趋势接口尚未形成最终契约,本 RFC 不预设具体路径或通信方式。
14. 关键决策与代价
15. 非目标
本阶段不实现:
16. 待后续设计
以下内容尚未裁决,不得在实现中自行假设:
PARTIAL报告的最低有效回答门槛。PARTIAL是否始终包含综合分和完整五维分数,以及数据库字段是否允许为空。role_summary的具体JSON Schema。17. 实现验收要点
FULL报告参与分难度成绩与趋势。