같은 이력서를 넣어도, 회사가 다르면 질문이 다릅니다. Solar Pro3의 고유 기능을 역할별로 매핑한 한국형 AI 모의면접 에이전트 시스템
Upstage Solar Pro3 AI Agent 해커톤 출품작입니다. 자소서·이력서·포트폴리오·채용공고를 분석해 그 회사의 실제 면접 스타일을 추론하고, 5개 에이전트가 협력해 동적으로 면접을 진행하는 음성 기반 모의면접 서비스입니다.
| 항목 | 내용 |
|---|---|
| 작품명 | AI 모의 면접 에이전트 시스템 |
| 팀명 | 솔솔(solsol) |
| 팀원 | 김나경, 박민영, 유지예, 이정연 |
| 핵심 모델 | Upstage Solar Pro3, Solar Mini |
| 주요 형태 | 웹 기반 음성 모의면접 서비스 |
메타 에이전트가 회사명과 채용공고를 분석해 그 회사의 실제 면접 스타일을 LLM으로 추론합니다. 같은 이력서를 넣어도 토스 면접과 삼성전자 면접은 톤·격식·압박 상한·중점 평가 역량이 달라지고, 모든 면접관 에이전트가 이 프로파일을 공유해 회사 분위기에 맞는 질문을 생성합니다.
| 회사 | 격식 | 압박 상한 | 면접 톤 예시 |
|---|---|---|---|
| 토스 (예시) | casual | 2/5 | "가장 임팩트가 컸던 결정의 트레이드오프는?" |
| 삼성전자 (예시) | formal | 4/5 | "MSA 전환 시 데이터 정합성 검증 방법을 단계별로 설명해 주십시오." |
"모델 이름만 박은" 게 아니라 Pro3의 차별 기능 세 가지를 명시적으로 활용했습니다.
| 역할 | 모델 | reasoning_effort | 목적 |
|---|---|---|---|
라우터·평가자 (meta, judge) |
Solar Pro3 | high | 깊은 판단·종합 평가 |
면접관 (resume, trend, stress) |
Solar Pro3 | low | 빠른 질문 생성 |
답변 품질 분류기 (answer_quality) |
Solar Mini | — | 비용·속도 우선 |
추가로 prompt_cache_key로 세션별 캐싱을 적용해 같은 면접 안에서 이력서·자소서가 매 라운드 반복되는 비용을 줄였습니다.
메타 에이전트가 LLM 호출 한 번으로 끝나지 않습니다. 3중 가드레일이 시연 안정성과 면접 흐름의 균형을 보장합니다.
- 답변 품질 게이트 — 답변이 회피적·모순·근거 부족이면 메타가
stress로 강제 라우팅 - trend 하드 캡 — 트렌드 질문이 면접당 최대 2회를 넘지 못하도록 코드 레벨 제한
- 에이전트 균형 보정 — 한 면접관이 다른 면접관보다 2회 이상 앞서면 자동으로 가장 적게 쓰인 면접관으로 보정
trend 에이전트는 사전 수집한 네이버 뉴스 DB에서 회사·직무 키워드로 매칭한 실제 기사 본문을 보고 질문을 만듭니다. 각 질문에 사용된 출처 메타데이터(current_question_sources)도 함께 저장해 "이 질문이 어떤 기사 기반으로 만들어졌는가" 까지 추적 가능합니다.
최근 면접은 단순한 질문 답변이 아니라 지원자의 경험, 직무 이해도, 문제 해결력, 커뮤니케이션 능력을 종합적으로 평가하는 과정입니다. 더 나아가 회사마다 면접 문화와 평가 기준이 다릅니다. 토스의 임팩트 중심 면접과 삼성의 단계별 검증 면접은 같은 직무라도 요구되는 답변의 결이 완전히 다릅니다.
이 프로젝트는 사용자의 지원 자료와 채용공고를 분석해 그 회사의 실제 면접 스타일을 추론하고, 여러 AI 면접관이 역할을 나누어 회사 분위기에 맞는 질문을 이어가는 모의면접 환경을 제공합니다. 면접 종료 후에는 질문과 답변 기록을 바탕으로 강점과 개선점을 정리한 피드백 리포트를 제공합니다.
| 기능 | 설명 |
|---|---|
| 지원 자료 입력 | 자소서, 이력서, 포트폴리오 PDF, 회사명, 직무명, 채용공고 링크를 입력합니다. |
| 회사 스타일 추론 | 메타 에이전트가 회사명과 채용공고를 분석해 격식·압박 상한·중점 평가 역량·실제 면접 관행을 추론합니다. |
| 다중 AI 면접관 | 이력서 기반, 뉴스/트렌드 기반, 꼬리질문/압박 질문, 총괄 평가 에이전트가 면접을 진행합니다. |
| 답변 품질 진단 | 매 답변마다 별도 분류기가 score·flag·action_hint를 산출해 메타의 라우팅 결정에 피드백을 제공합니다. |
| 음성 면접 | 사용자의 음성 답변을 STT로 텍스트화하고, 생성된 질문을 TTS 음성으로 출력합니다. |
| 동적 꼬리질문 | 답변의 모호함·근거 부족·구체성 부족을 자동 감지해 압박 면접관으로 강제 라우팅합니다. |
| 최종 피드백 | 전체 대화를 바탕으로 논리성·경험 구체성·트렌드 이해도·종합 점수와 한국어 피드백을 제공합니다. |
사용자 입력
자소서 / 이력서 / 포트폴리오 PDF / 회사명 / 직무명 / 채용공고 URL
│
▼
문서 및 공고 분석
PDF 파싱, 채용공고 크롤링, 핵심 경험 및 직무 요구사항 추출
│
▼
메타 에이전트 — 회사 스타일 추론 (1회)
격식 / 압박 상한 / 중점 평가 역량 / 실제 면접 관행 / 대표 질문 패턴
│
▼
AI 모의면접 루프 (라운드 반복)
Answer Quality → Meta → Resume / Trend / Stress → STT/TTS
│
▼
최종 평가
Judge 에이전트가 4축 점수와 한국어 피드백 리포트 생성
본 시스템은 LangGraph 기반 5개 노드와 1개의 별도 분류기(answer_quality)로 구성됩니다.
| Agent | 모델 / reasoning_effort | 책임 |
|---|---|---|
meta |
solar-pro3 / high | 회사 스타일 추론 + 동적 라우팅 + 3중 가드레일 |
answer_quality |
solar-mini | 답변 품질 점수·flag·action_hint 산출 (메타에 피드백) |
resume |
solar-pro3 / low | 이력서·자소서 기반 사실 검증 질문 |
trend |
solar-pro3 / low | 네이버 뉴스 DB 기반 트렌드 질문 + 출처 추적 |
stress |
solar-pro3 / low | 직전 답변 약점 인용 + 컨텍스트 검증 폴백 |
judge |
solar-pro3 / high | 4축 점수(overall/logic/experience/trend) + 종합 피드백 |
[지원자 답변]
│
▼
┌─ Answer Quality Classifier (solar-mini)
│ score / flags / action_hint
▼
┌──────────────────────────────────────────┐
│ Meta Orchestrator (solar-pro3 / high) │
│ - 회사 스타일 추론 (첫 진입 1회) │
│ - quality_gate: 저품질 → stress 강제 │
│ - trend_cap / balance 가드레일 │
└─────┬───────────┬──────────┬─────────────┘
│ │ │
▼ ▼ ▼
[Resume] [Trend] [Stress]
(pro3 low) (pro3 low + (pro3 low +
naver news) structured)
│ │ │
└───────────┼──────────┘
▼
(max_rounds 도달)
│
▼
[Judge] (solar-pro3 / high)
overall / logic / experience / trend
Solar Pro3의 3가지 고유 기능과 Solar Mini와의 분업으로 "왜 Solar Pro3여야 하는가" 에 명확히 답할 수 있게 설계했습니다.
| 컴포넌트 | 모델 | reasoning_effort | prompt_cache_key | 이유 |
|---|---|---|---|---|
meta (라우터·회사 스타일 결정) |
solar-pro3 | high | ✅ | 다단계 추론·전략적 판단 |
judge (종합 평가) |
solar-pro3 | high | ✅ | 전체 대화 정밀 평가 |
resume / trend / stress |
solar-pro3 | low | ✅ | 질문 1문장 빠른 생성 |
answer_quality (분류기) |
solar-mini | — | ✅ | 분류 작업은 가볍게 |
| 기능 | 활용 방식 | 효과 |
|---|---|---|
reasoning_effort 등급 차등 |
깊은 사고가 필요한 라우터·평가자만 high, 질문 생성기는 low | 응답 속도·비용 최적화 |
prompt_cache_key |
세션 ID를 캐시 키로 — 이력서·자소서가 매 라운드 반복되는 비용 절감 | 두 번째 라운드부터 캐시 히트 |
구조화 출력 (with_structured_output) |
RouteDecision, CompanyStyle, JudgeResult, StressQuestion, AnswerQualityResult 5종 스키마 강제 |
JSON 파싱 오류 0 |
| Solar Mini 분업 | 답변 품질 라벨링(good/fair/bad)은 Mini로 분리 | Pro3 호출 1회 절약 |
reasoning_effort파라미터는 Solar Pro3 전용 — 다른 모델에 동일 개념 없음- 한국어 면접 도메인의 존댓말·관행 표현이 자연스러움
- 한국 기업(토스·네이버·삼성 등)의 실제 면접 후기 정보를 학습 단계에서 풍부하게 보유
| 레이어 | 기술 |
|---|---|
| 프론트엔드 | React, Vite, TanStack Router, Tailwind CSS, Radix UI |
| 백엔드 | FastAPI, Python 3.11, Pydantic |
| Agent | LangGraph, LangChain Upstage, Upstage Solar Pro3 / Mini |
| 문서 처리 | pdfplumber, Upstage Document Parse / Information Extract |
| 채용공고 수집 | httpx, BeautifulSoup |
| 트렌드 데이터 | 네이버 뉴스 수집 + SQLite 키워드 매칭 |
| 음성 처리 | OpenAI STT, ElevenLabs TTS, OpenAI TTS fallback |
| 저장소 | Redis(세션), SQLite(인터뷰 기록·뉴스 DB) |
shipyak/
├── backend/ # FastAPI 백엔드와 멀티에이전트 로직
│ ├── main.py # API 엔트리포인트
│ ├── app/
│ │ ├── agents/ # meta, resume, trend, stress, judge + llm/state/helpers
│ │ ├── routers/ # 세션, 면접, 턴 기록 API
│ │ ├── services/ # answer_quality, naver_news, STT/TTS, 크롤링, 그래프, 저장소
│ │ └── models/ # Pydantic 모델
│ └── scripts/ # 데모 및 데이터 수집 스크립트
├── lovable/ # 웹 프론트엔드
│ └── src/
│ ├── components/interview/
│ ├── routes/
│ └── assets/interviewers/
├── docs/ # 설계 문서와 API/에이전트 문서
├── data/ # 데이터 수집·전처리 자료 + 뉴스 DB
├── design/ # 디자인 에셋
└── presentation/ # 발표 자료
cd backend
uv sync
cp .env.example .env.env에 필요한 API 키를 입력합니다.
UPSTAGE_API_KEY=
OPENAI_API_KEY=
ELEVENLABS_API_KEY=
ELEVENLABS_VOICE_ID=brew install redis
brew services start rediscd backend
uv run uvicorn main:app --reload- API 문서: http://localhost:8000/docs
- 헬스체크: http://localhost:8000/health
cd lovable
npm install
npm run dev| 메서드 | 경로 | 설명 |
|---|---|---|
POST |
/api/v1/session |
지원 자료 업로드 및 면접 세션 생성 |
GET |
/api/v1/session/{id} |
세션 조회 |
POST |
/api/v1/session/{id}/start |
면접 시작 및 첫 질문 생성 (회사 스타일 추론 포함) |
POST |
/api/v1/session/{id}/answer |
답변 제출 후 다음 질문 생성 |
GET |
/api/v1/session/{id}/report |
최종 피드백 리포트 조회 |
POST |
/api/interview-sessions/{id}/turns/audio |
음성 답변 업로드 및 다음 질문 TTS 반환 |
GET |
/health |
서버 및 Redis 상태 확인 |
| 영역 | 일반 멀티에이전트 데모 | 본 프로젝트 |
|---|---|---|
| 회사 적응 | 회사명을 프롬프트에 끼워넣고 끝 | 메타가 채용공고를 분석해 격식·압박 상한·중점 역량·실제 면접 관행을 추론 |
| 라우팅 | 라운드별 고정 순서 (resume → trend → stress 반복) | 답변 품질 분류기(solar-mini)가 매 턴 score·flag·action_hint 산출 → 메타가 동적 선택 |
| 에이전트 견고성 | LLM 응답이 깨지면 시연 멈춤 | 5종 구조화 출력 + 다중 폴백 경로 + 3중 가드레일 (quality_gate, trend_cap, balance) |
| 트렌드 질문 | LLM 학습 시점의 일반론 | 네이버 뉴스 DB에서 키워드 매칭한 실제 기사 + 출처 메타데이터 추적 |
| Upstage 활용도 | 모델 이름만 박음 | reasoning_effort 등급 차등 + prompt_cache_key + Mini 분업 |
| 추적 가능성 | 블랙박스 | meta_decisions, answer_quality_history, current_question_sources 세 가지 로그로 "왜 이 질문이 나왔는가" 추적 가능 |
- 한 세션당 LLM 호출 패턴: meta(1) + answer_quality(N) + 면접관(N) + judge(1)
- 5종 구조화 스키마로 JSON 파싱 실패율 0
- 데모 영상에서 "같은 이력서, 회사만 다르게" 비교 시연 가능
- 브랜치 전략 — 팀원별
feat/*브랜치에서 작업 (예:feat/agent,feat/backend,feat/data,feat/design).main은 항상 동작 가능한 통합 브랜치 - PR·머지 —
feat/*→mainPR 후 머지. 작은 단위로 자주 머지하고, 머지 후 다른 팀원은main을 다시 pull해 동기화 - 커밋 — 작게 자주 push (해커톤 환경 대비 백업). 커밋 메시지는 한국어로, 변경 의도가 한 줄에 드러나게 작성
- 코드 스타일 — PEP 8 준수, snake_case 변수/함수명, 줄 길이 최대 100자.
ruff로 lint - 의존성 변경 — 패키지 추가/제거는 반드시
uv add/uv remove. 변경된pyproject.toml·uv.lock을 함께 커밋 - 환경변수 — 모든 API 키는
.env로만 관리(하드코딩 금지)..env.example만 공유하고 실제.env는.gitignore처리 - 문서 갱신 — 새 엔드포인트·에이전트·환경변수가 추가되면 README와
docs/관련 문서를 같은 PR에서 갱신
취업 준비자는 고비용 면접 컨설팅 없이 실제 면접과 유사한 환경에서 반복 연습할 수 있습니다. 특히 개인의 지원 자료뿐 아니라 지원 회사의 실제 면접 스타일까지 반영되기 때문에 일반적인 예상 질문보다 실전 대응력을 높일 수 있습니다.
향후에는 직무별 전문 면접관, 기업별 면접 스타일 라이브러리화, 면접 리포트 PDF, 답변 개선 예시, 실시간 발화 습관 분석 등으로 확장할 수 있습니다.