초기 구현 상태는 여러 에이전트가 순차적으로 협업하는 구조이며, 각 노드는 State에 저장된 질문 상태(status)와 질문 메타데이터를 공유하면서 자신의 역할만 수행합니다.
즉, 하나의 거대한 에이전트가 모든 일을 처리하는 방식이 아니라,
질문 생성 → 답변 예측 → 꼬리질문 생성 → 품질 검토
를 역할별로 분리한 멀티 에이전트 전략입니다.
| 에이전트 / 노드 | 역할 | 주요 미션 |
|---|---|---|
| PrepareContext (문맥 준비 노드) | 입력 문맥 정리 | 세션 정보, 지원자 정보, 문서 텍스트를 하나의 공통 문맥(candidate_context)으로 병합하고, 기존 질문 ID를 안정화 |
| Questioner (질문자) | 기초 질문 설계 | 지원자 문서와 채용 기준을 바탕으로 핵심 질문과 평가 가이드 초안 생성. 질문 생성 근거(generation_basis)와 문서 근거(document_evidence)를 함께 기록 |
| Predictor (예측자) | 답변 시뮬레이션 | 지원자의 입장에서 가장 현실적인 예상 답변(predicted_answer) 을 생성하고, 답변 신뢰도(answer_confidence) 와 위험 포인트(answer_risk_points) 를 함께 남김 |
| Driller (추적자) | 꼬리 질문 생성 | 예상 답변의 빈틈, 검증 포인트, 오너십, 수치, 의사결정 지점을 파고드는 심층 2차 질문(Follow-up) 설계. 꼬리질문 목적(drill_type)도 함께 기록 |
| Reviewer (검토자) | 품질 보증 (QA) | 채용 기준과 질문 품질 루브릭에 따라 각 질문을 검토하고 approved / needs_revision / rejected 상태를 부여. 이슈 유형(issue_types)과 수정 대상 필드(requested_revision_fields)도 함께 기록 |
| Review Router (분기 노드) | 재시도 여부 판단 | Reviewer 결과를 보고 questioner로 되돌릴지, 최종 응답으로 종료할지 결정 |
사람의 개입(더보기, 재생성, 추가 질문 등)은 LangGraph 내부가 아니라 서비스 레이어에서 처리합니다. LangGraph는 순수하게 AI 파이프라인만 담당하고, 사람과의 인터랙션은 프론트/백엔드가 결과를 받아 재호출하는 방식으로 구현합니다. 현재 JH 그래프는 서비스 레이어에서 human_action, target_question_ids, additional_instruction, existing_questions를 조립해 재호출하는 구조입니다.
graph TD
%% 1. 시작 단계
StartNode((<b>START</b>)) --> InputSection["<b>[1. Input Data]</b><br/>지원자 문서 목록 + 채용 기준용 프롬프트 프로필<br/><i>+ 서비스 레이어에서 넘어온 재호출 파라미터 주입</i>"]
InputSection --> StateInit["<b>[2. State Initialization]</b><br/>에이전트 공유용 QuestionSet 리스트 생성<br/>(재호출 시: 기존 questions 상태 복원)"]
%% 2. 에이전트 순차 처리
StateInit --> PrepareContext
subgraph Multi_Agent_Engine ["<b>[3. Multi-Agent Sequential Logic]</b>"]
direction TB
PrepareContext["<b>Node 0: PrepareContext</b><br/>세션/지원자/문서 정보를 하나의 공통 문맥으로 병합<br/><i>+ 질문 ID 안정화</i>"]
Questioner["<b>Agent 1: Questioner (질문자)</b><br/>문서 기반 핵심 질문 & 평가 가이드 생성<br/><i>+ generation_basis / document_evidence 기록</i><br/><i>+ 재호출 시: human_action 파라미터에 따라 분기 처리</i>"]
Predictor["<b>Agent 2: Predictor (예측자)</b><br/>지원자 관점 예상 답변 생성<br/><i>+ answer_confidence / answer_risk_points 기록</i>"]
Driller["<b>Agent 3: Driller (추적자)</b><br/>답변 허점을 찌르는 2차 꼬리 질문 설계<br/><i>+ drill_type 기록</i>"]
Reviewer{"<b>Agent 4: Reviewer (검토자)</b><br/>루브릭 기반 품질 검증 및 승인"}
%% 내부 수직 흐름
PrepareContext --> Questioner
Questioner --> Predictor
Predictor --> Driller
Driller --> Reviewer
end
%% 3. 루프 및 종료 판단
Reviewer -- "needs_revision / rejected" --> Questioner
Reviewer -- "모든 질문 승인 완료" --> FinalReport["<b>[4. Final Output]</b><br/>최종 면접 질문 리포트 생성<br/>(JSON 반환 → 서비스 레이어로 전달)"]
%% 4. 종료
FinalReport --> FinishNode((<b>FINISH</b>))
%% 스타일 정의
style StartNode fill:#2196f3,stroke:#0d47a1,color:#fff
style FinishNode fill:#2196f3,stroke:#0d47a1,color:#fff
style InputSection fill:#e3f2fd,stroke:#2196f3
style StateInit fill:#e3f2fd,stroke:#2196f3
style Reviewer fill:#fff176,stroke:#fbc02d,stroke-width:2px
style Multi_Agent_Engine fill:#fafafa,stroke:#9e9e9e,stroke-dasharray: 5 5
style FinalReport fill:#c8e6c9,stroke:#2e7d32