科研模拟面试(Research Mock Interview)Hermes Skill
1. 这是什么
一个本地优先的科研场景模拟面试系统,以 Hermes Skill 形态交付。它读取候选人的真实科研资料(简历 / 项目 / 论文), 针对保研、申博、科研岗求职、答辩、组会、海外 PhD 等场景,用可插拔的 LLM 后端扮演严谨考官,进行多轮对话式模拟面试, 并在候选人「讲项目 / 代码」回答过浅时发起硬阻塞追问,结束后产出评分 + 短板库 + 复盘报告。
1.1 与架构方案的一致性(已锁定决策)
- X1 目标用户:全方向(保研/申博 + 求职轻量版),本 v1 题库覆盖保研/申博/求职/答辩/组会/海外phd 六类场景。
- X2 形态:本地 Hermes Skill + 公域内容引流;本仓库即 Skill 本体。
- X3 语音:v1.1 已落地「可插拔语音双工」——
mock离线零依赖跑通整条链路;真实 STT(vosk/whisper)+ 真实 TTS(pyttsx3/edge-tts)为可选后端,全部懒加载,缺失依赖时运行时明确报错(不破坏核心零依赖)。 - X4 公众号采集:已放弃,本 Skill 不采集任何外部内容源。
- X5 Python 版本:目标 3.12,最低 3.11(详见
requirements.txt与 §6)。 - 可插拔 LLM 后端:抽象接口 +
mock(离线零依赖)/ollama(本地默认)/cloud(BYOK,密钥不落盘)。 - 冷启动资料:示例脱敏数据先行(
data/sample_profile.json),预留真实资料导入入口(cli run --profile)。 - 隐私铁律:本地单租户、可删除、无遥测、不出域;
tenant_id=local;purge一键清除 owner 全部数据。
2. 何时触发
- 用户想练习 / 复盘科研类面试(保研、申博、科研岗、答辩、组会、海外 PhD)。
- 用户希望基于自己的项目经历做「讲清楚、讲细节」的压力测试。
- 用户需要一份结构化复盘报告与可沉淀的短板清单。
3. 工作流(主理人 / 使用者执行顺序)
第一步:环境准备(一次性)
cd research-mock-interview
python --version # 需 >=3.11,推荐 3.12
pip install -r requirements.txt # 可选:仅当你要用 config.yaml 时才需 PyYAML
第二步:跑通演示(无网也能跑)
python src/cli.py run --demo
--demo 使用内置示例资料 + mock 后端,自动跑完「提问→作答→硬阻塞追问→评分→复盘报告」闭环,
证明系统离线可运行、数据已落盘本地 SQLite。
第三步:接入真实资料
把你的真实简历/项目整理成一个 JSON(参考 data/sample_profile.json 字段),然后:
python src/cli.py run --profile /path/to/your_profile.json --scenario 保研
进入交互模式,逐轮作答;输入 /finish 结束并生成报告,/quit 中途退出(记录仍保留)。
第四步:切换 LLM 后端(可选)
复制 config.example.yaml 为 config.yaml,把 llm.backend 改成:
mock:离线零依赖(默认,适合演示 / 无网)。ollama:本地默认生产后端,填base_url/model(如qwen2.5:7b)。cloud:云端 API(BYOK),密钥只来自环境变量(如RMI_LLM_API_KEY),绝不硬编码 / 落盘。
第五步:查看沉淀与删除权
python src/cli.py list # 列出本 tenant 全部面试
python src/cli.py report --id <session_id前8位或完整> # 看复盘报告
python src/cli.py weakness # 看短板库
python src/cli.py purge --yes # owner 删除权:清除本 tenant 全部本地数据
第六步(v1.1 新增):语音双工模式(可插拔)
# 离线自检:mock 双工,无需麦克风/网络,证明语音编排链路闭环
python src/cli.py run --demo --voice
# 接入真实语音(需先 pip install 对应可选依赖,见 requirements.txt)
# 复制 config.example.yaml 为 config.yaml,设 voice.enabled=true 或运行时加 --voice,
# 并把 voice.stt/tts 的 backend 改为 vosk/whisper/pyttsx3/edge,填好模型路径。
第七步(v1.1 新增):短板库跨场聚合分析
python src/cli.py analyze # 全部场景聚合
python src/cli.py analyze --scenario 保研 # 只看某场景
python src/cli.py analyze --out report.md # 导出 Markdown 报告
聚合维度:分类分布、严重度分布、跨场趋势(改善/恶化/持平)、反复出现的短板(≥2 次)与行动建议。
4. 模块职责(src/)
llm_backend.py:LLMBackend抽象 +MockBackend/OllamaBackend/CloudBackend,from_config(cfg)工厂按配置切换。storage.py:Store封装 SQLite 本地持久化,tenant 作用域隔离,purge_owner()实现删除权闭环。interview_engine.py:InterviewSession驱动「导入→提问→硬阻塞追问→评分→短板库→复盘报告」。voice_io.py(v1.1):STTProvider/TTSProvider/DuplexVoice可插拔语音;mock离线零依赖,真实后端懒加载 + 缺失依赖守卫。analytics.py(v1.1):aggregate_weaknesses/render_aggregate_report短板跨场聚合(纯标准库)。cli.py:argparse 入口(run/list/report/weakness/purge/analyze,run支持--voice)。
5. 设计纪律(不可违反)
- 不出域:任何数据只在本地 SQLite;cloud 后端只把面试文本发往用户配置的 API,密钥仅来自环境变量。
- 无遥测:不收集、不上报任何使用行为。
- 可删除:
data_dir可整体删除;purge提供程序化一键清除。 - 后端可插拔:业务代码只依赖
LLMBackend抽象,新增后端只需实现generate()。 - 冷启动友好:示例数据保证开箱即跑;真实资料通过
--profile导入,格式向后兼容。
6. 运行环境
- 目标 Python 3.12;最低 3.11(见
requirements.txt注释)。 - 核心依赖仅标准库;
PyYAML为可选(启用config.yaml时才需要)。 - 语音为可选增强:核心仍零硬性第三方依赖;真实 STT/TTS 依赖仅在启用语音且选择真实引擎时需要(见
requirements.txt注释)。