Simulación de Entrevista de Investigación (Research Mock Interview) - Skill de Hermes
1. ¿Qué es esto?
Un sistema de simulación de entrevistas de investigación local-first, entregado como un Skill de Hermes. Lee los materiales de investigación reales del candidato (currículum / proyecto / tesis) y, para escenarios como admisión a posgrado, solicitud de doctorado, búsqueda de empleo en investigación, defensa de tesis, reuniones de grupo, PhD en el extranjero, etc., utiliza un backend LLM intercambiable para actuar como un examinador riguroso, llevando a cabo una simulación de entrevista conversacional de múltiples rondas. Cuando el candidato responde de forma superficial sobre su proyecto/código, el sistema realiza preguntas de seguimiento difíciles (hard blocking). Al finalizar, genera una puntuación, un repositorio de debilidades y un informe de revisión.
1.1 Consistencia con el plan arquitectónico (decisiones tomadas)
- X1 Usuario objetivo: Todos los perfiles (admisión a posgrado/solicitud de doctorado + versión ligera para búsqueda de empleo). Esta versión v1 cubre seis escenarios: admisión a posgrado/solicitud de doctorado/búsqueda de empleo/defensa/reunión de grupo/PhD en el extranjero.
- X2 Forma: Skill de Hermes local + captación de tráfico mediante contenido público; este repositorio es el Skill en sí mismo.
- X3 Voz: En v1.1 se ha implementado un dúplex de voz intercambiable -
mockfunciona sin conexión y sin dependencias para completar todo el flujo; STT real (vosk/whisper) y TTS real (pyttsx3/edge-tts) son backends opcionales, todos con carga diferida, y si falta una dependencia, se muestra un error claro en tiempo de ejecución (sin romper el núcleo sin dependencias). - X4 Captura de artículos de WeChat: Descartado. Este Skill no captura contenido de fuentes externas.
- X5 Versión de Python: Objetivo 3.12, mínimo 3.11 (ver
requirements.txty §6). - Backend LLM intercambiable: Interfaz abstracta +
mock(sin conexión, sin dependencias) /ollama(predeterminado local) /cloud(BYOK, clave no almacenada en disco). - Material de inicio en frío: Datos de ejemplo anonimizados primero (
data/sample_profile.json), con entrada para datos reales (cli run --profile). - Regla de privacidad: Local, mono-tenant, eliminable, sin telemetría, sin enviar datos fuera del dominio;
tenant_id=local;purgeelimina todos los datos del propietario con un solo clic.
2. ¿Cuándo activarlo?
- El usuario quiere practicar/revisar entrevistas de investigación (admisión a posgrado, solicitud de doctorado, puesto de investigación, defensa, reunión de grupo, PhD en el extranjero).
- El usuario quiere hacer una prueba de estrés basada en su experiencia real de proyecto para "explicarlo claramente y con detalle".
- El usuario necesita un informe de revisión estructurado y una lista de debilidades consolidable.
3. Flujo de trabajo (orden de ejecución para el responsable/usuario)
Primer paso: Preparación del entorno (una sola vez)
cd research-mock-interview
python --version # Debe ser >=3.11, recomendado 3.12
pip install -r requirements.txt # Opcional: solo se necesita PyYAML si usas config.yaml
Segundo paso: Ejecutar la demostración (funciona sin conexión)
python src/cli.py run --demo
--demo usa los datos de ejemplo integrados + el backend mock, completando automáticamente el ciclo completo de "pregunta → respuesta → pregunta de seguimiento difícil → puntuación → informe de revisión", demostrando que el sistema funciona sin conexión y los datos se guardan localmente en SQLite.
Tercer paso: Cargar datos reales
Organiza tu currículum/proyecto real en un JSON (consulta los campos de data/sample_profile.json) y entonces:
python src/cli.py run --profile /ruta/a/tu_perfil.json --scenario 保研
Entra en modo interactivo, responde ronda por ronda; escribe /finish para terminar y generar el informe, /quit para salir a medio camino (los registros se conservan).
Cuarto paso: Cambiar el backend LLM (opcional)
Copia config.example.yaml como config.yaml, cambia llm.backend a:
mock: sin conexión, sin dependencias (predeterminado, adecuado para demostraciones / sin conexión).ollama: backend de producción local predeterminado, completabase_url/model(ej.qwen2.5:7b).cloud: API en la nube (BYOK), la clave solo proviene de variables de entorno (ej.RMI_LLM_API_KEY), nunca hardcodeada / almacenada en disco.
Quinto paso: Ver datos y derecho de eliminación
python src/cli.py list # Lista todas las entrevistas de este tenant
python src/cli.py report --id <primeros 8 caracteres de session_id o completo> # Ver informe de revisión
python src/cli.py weakness # Ver repositorio de debilidades
python src/cli.py purge --yes # Derecho de eliminación del propietario: borra todos los datos locales de este tenant
Sexto paso (nuevo en v1.1): Modo dúplex de voz (intercambiable)
# Autocomprobación sin conexión: dúplex mock, sin micrófono/red, demuestra que el flujo de voz está completo
python src/cli.py run --demo --voice
# Conectar voz real (primero pip install las dependencias opcionales correspondientes, ver requirements.txt)
# Copiar config.example.yaml a config.yaml, establecer voice.enabled=true o añadir --voice en tiempo de ejecución,
# y cambiar el backend de voice.stt/tts a vosk/whisper/pyttsx3/edge, completar la ruta del modelo.
Séptimo paso (nuevo en v1.1): Análisis agregado de debilidades entre sesiones
python src/cli.py analyze # Agregación de todos los escenarios
python src/cli.py analyze --scenario 保研 # Solo ver un escenario
python src/cli.py analyze --out report.md # Exportar informe Markdown
Dimensiones de agregación: distribución por categoría, distribución por gravedad, tendencias entre sesiones (mejora/empeoramiento/estable), debilidades recurrentes (≥2 veces) y recomendaciones de acción.
4. Responsabilidades de los módulos (src/)
llm_backend.py: AbstracciónLLMBackend+MockBackend/OllamaBackend/CloudBackend, fábricafrom_config(cfg)para cambiar según la configuración.storage.py:Storeencapsula la persistencia local SQLite, aislamiento del alcance del tenant,purge_owner()implementa el cierre del derecho de eliminación.interview_engine.py:InterviewSessionimpulsa el flujo "importar → preguntar → pregunta de seguimiento difícil → puntuar → repositorio de debilidades → informe de revisión".voice_io.py(v1.1):STTProvider/TTSProvider/DuplexVoicede voz intercambiable;mocksin conexión y sin dependencias, backends reales con carga diferida + guardia de dependencia faltante.analytics.py(v1.1):aggregate_weaknesses/render_aggregate_reportpara agregación de debilidades entre sesiones (solo bibliotecas estándar).cli.py: Punto de entrada argparse (run/list/report/weakness/purge/analyze,runsoporta--voice).
5. Disciplinas de diseño (no violar)
- No salir del dominio: Todos los datos solo en SQLite local; el backend cloud solo envía el texto de la entrevista a la API configurada por el usuario, la clave solo proviene de variables de entorno.
- Sin telemetría: No se recopila ni informa ningún comportamiento de uso.
- Eliminable:
data_dirse puede eliminar por completo;purgeproporciona una limpieza programática con un solo clic. - Backend intercambiable: El código de negocio solo depende de la abstracción
LLMBackend; para añadir un nuevo backend solo hay que implementargenerate(). - Amigable con el arranque en frío: Los datos de ejemplo garantizan que funcione desde el primer momento; los datos reales se importan mediante
--profile, con formato compatible hacia atrás.
6. Entorno de ejecución
- Python objetivo 3.12; mínimo 3.11 (ver comentarios en
requirements.txt). - Dependencias principales solo bibliotecas estándar;
PyYAMLes opcional (solo se necesita si se usaconfig.yaml). - La voz es una mejora opcional: el núcleo sigue sin dependencias de terceros obligatorias; las dependencias de STT/TTS reales solo son necesarias si se habilita la voz y se selecciona un motor real (ver comentarios en
requirements.txt).