연구 모의 면접 (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)는 선택적 백엔드로, 전부 lazy loading 처리되어 의존성 부재 시 명확한 에러 발생 (핵심 제로 의존성 유지). - 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로 소유자 전체 데이터 일괄 삭제.
2. 언제 실행하는가
- 사용자가 연구 관련 면접(보험, 박사 진학, 연구직, 논문答辩, 그룹 미팅, 해외 PhD)을 연습/복기하고 싶을 때.
- 사용자가 자신의 프로젝트 경험을 바탕으로 '명확하고 자세하게 설명하는' 압박 테스트를 원할 때.
- 사용자가 구조화된 회고 보고서와 축적 가능한 약점 리스트를 필요로 할 때.
3. 워크플로우 (주관자/사용자 실행 순서)
1단계: 환경 준비 (일회성)
cd research-mock-interview
python --version # 필요 >=3.11, 권장 3.12
pip install -r requirements.txt # 선택 사항: config.yaml 사용 시에만 PyYAML 필요
2단계: 데모 실행 (인터넷 없이도 가능)
python src/cli.py run --demo
--demo는 내장 예제 자료 + mock 백엔드를 사용하여 '질문→답변→하드 블로킹 추궁→평가→회고 보고서' 전체 과정을 자동 실행,
시스템이 오프라인에서도 동작하고 데이터가 로컬 SQLite에 저장됨을 확인합니다.
3단계: 실제 자료 연결
실제 이력서/프로젝트를 JSON으로 정리한 후 (data/sample_profile.json 필드 참조):
python src/cli.py run --profile /path/to/your_profile.json --scenario 보험
대화형 모드로 진입, 라운드별 답변; /finish 입력으로 종료 및 보고서 생성, /quit은 중간 종료 (기록은 유지).
4단계: LLM 백엔드 전환 (선택 사항)
config.example.yaml을 config.yaml로 복사하고 llm.backend를 다음 중 선택:
mock: 오프라인 제로 의존성 (기본값, 데모/무인터넷에 적합).ollama: 로컬 기본 프로덕션 백엔드,base_url/model입력 (예:qwen2.5:7b).cloud: 클라우드 API (BYOK), 키는 환경 변수(RMI_LLM_API_KEY)에서만 가져오며 절대 하드코딩/영구 저장 안 함.
5단계: 데이터 확인 및 삭제 권한
python src/cli.py list # 현재 테넌트의 모든 면접 목록 출력
python src/cli.py report --id <session_id 앞 8자리 또는 전체> # 회고 보고서 보기
python src/cli.py weakness # 약점 라이브러리 보기
python src/cli.py purge --yes # 소유자 삭제 권한: 현재 테넌트의 모든 로컬 데이터 삭제
6단계 (v1.1 추가): 음성 이중 통신 모드 (플러그인 가능)
# 오프라인 자가 진단: mock 이중 통신, 마이크/네트워크 필요 없음, 음성 오케스트레이션 체인 증명
python src/cli.py run --demo --voice
# 실제 음성 연결 (먼저 해당 선택적 의존성 설치 필요, requirements.txt 참조)
# config.example.yaml을 config.yaml로 복사, voice.enabled=true 설정 또는 실행 시 --voice 추가,
# voice.stt/tts의 backend를 vosk/whisper/pyttsx3/edge로 설정, 모델 경로 입력.
7단계 (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 로컬 지속성을 캡슐화, 테넌트 범위 격리,purge_owner()로 삭제 권한 완결.interview_engine.py:InterviewSession이 '가져오기→질문→하드 블로킹 추궁→평가→약점 라이브러리→회고 보고서'를 구동.voice_io.py(v1.1):STTProvider/TTSProvider/DuplexVoice플러그인 가능 음성;mock오프라인 제로 의존성, 실제 백엔드 lazy loading + 의존성 부재 가드.analytics.py(v1.1):aggregate_weaknesses/render_aggregate_report약점 교차 시나리오 집계 (순수 표준 라이브러리).cli.py: argparse 진입점 (run/list/report/weakness/purge/analyze,run은--voice지원).
5. 설계 규율 (위반 불가)
- 데이터 출구 금지: 모든 데이터는 로컬 SQLite에만 저장; 클라우드 백엔드는 면접 텍스트만 사용자 설정 API로 전송, 키는 환경 변수로만 전달.
- 원격 측정 금지: 사용 행위를 수집하거나 보고하지 않음.
- 삭제 가능:
data_dir전체 삭제 가능;purge로 프로그래밍 방식 일괄 삭제 제공. - 백엔드 플러그인 가능: 비즈니스 코드는
LLMBackend추상에만 의존, 새 백엔드는generate()만 구현하면 됨. - 콜드 스타트 친화적: 예제 데이터로 설치 직후 실행 가능; 실제 자료는
--profile로 가져오며 형식 하위 호환성 유지.
6. 실행 환경
- 대상 Python 3.12; 최소 3.11 (
requirements.txt주석 참조). - 핵심 의존성은 표준 라이브러리만;
PyYAML은 선택 사항 (config.yaml활성화 시에만 필요). - 음성은 선택적 강화 기능: 핵심은 여전히 제로 필수 타사 의존성; 실제 STT/TTS 의존성은 음성 활성화 및 실제 엔진 선택 시에만 필요 (
requirements.txt주석 참조).