[AI] 00.서비스_시나리오.md - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
서비스 시나리오
📚 목차
서비스 워크플로우
- 1. 로그인
- 2. AI 화면 진입
- 3. 이전에 진행한 채팅 목록 출력
- 4. 대화 시작
- 5. 이력서와 채용 공고 종합 분석하기
- 6. 모의 면접
- 7. 일반 대화
- 8. 캘린더 일정 자동 추가 (AI)
- 9. 챗봇에서 캘린더 관리 (AI 에이전트)
- 10. 게시판
기술 스택 요약
Prompt 정리
서비스 워크 플로우
-
로그인
-
AI 화면 진입
-
이전에 진행한 채팅 목록 출력
-
대화 시작
-
4.1 새 대화 시작
-
4.1.1 이력서 및 포트폴리오 입력
사용 AI API
API 용도 처리방식 POST /ai/ocr/extract파일에서 텍스트 추출 + 임베딩 저장 (내부 처리) 🔄 비동기 POST /ai/file/embed텍스트 직접 입력 시 임베딩 저장 ⚡ 동기 💡 변경: 파일 업로드 시
/ai/ocr/extract가 내부에서 임베딩까지 처리 (Backend 재호출 불필요)
Embedding + VectorDB 적용
저장할 데이터 : 이력서 텍스트 임베딩 저장 collection : resumes (이력서 + 포트폴리오 같은 컬렉션) 활용 시점 : 매칭 분석, 면접 질문 생성 시 검색
- 4.1.1.1 파일 첨부
PDF 파일 첨부
PDF 파일은 바로 OCR,VLM이 안됨 따라서 * PyMuPDF : PDF를 이미지로 변환(추천) * pdfplumber : 텍스트 추출(이미지 PDF는 안됨)
- 4.1.1.2 이미지 첨부
- 4.1.1.3 텍스트 직접 입력
-
4.1.3 채용 공고 정보 입력
사용 AI API
API 용도 처리방식 POST /ai/ocr/extract파일에서 텍스트 추출 + 임베딩 저장 (내부 처리) 🔄 비동기 POST /ai/file/embed텍스트 직접 입력 시 임베딩 저장 ⚡ 동기 💡 변경: 파일 업로드 시
/ai/ocr/extract가 내부에서 임베딩까지 처리 (Backend 재호출 불필요)
Embedding + VectorDB 적용
저장할 데이터 : 채용 공고 텍스트 임베딩 저장 collection : job_postings 활용 시점 : 유사 공고 추천, 일정 추론
- 4.1.3.1 파일 첨부
- 4.1.3.2 이미지 첨부
- 4.1.3.3 텍스트 직접 입력
-
-
4.2 기존 대화 이어하기
- 4.2.1 대화 목록에서 선택
- 4.2.2 이전 대화 내용 불러오기
- 4.2.3 이력서 및 포트폴리오 추가/변경 (4.1.1과 동일)
- 4.2.4 채용 공고 정보 추가/변경 (4.1.2과 동일)
-
-
이력서와 채용 공고 종합 분석하기
사용 AI API
API 용도 처리방식 POST /ai/analyze분석 + 매칭도 통합 📡 스트리밍 (SSE) 💡 기존
/ai/analyze+/ai/matching통합 → 한 번의 호출로 분석 + 매칭 결과 반환
LangChain RAG
사용 기술 : Langchain RAG Chain
[이력서 입력] ↓ VectorDB에서 유사 이력서/피드백 검색 (RAG) ↓ 검색 결과 + 현재 이력서 → LLM 분석 ↓ "이전에 비슷한 이력서에서 이런 피드백을 받았어요" 형태로 출력
Embedding + VectorDB 적용
저장할 데이터 : 분석 결과 임베딩 저장 collection : analysis_results 활용 시점 : 이전에 받은 피드백 뭐였지?
Prompt 1: 이력서 분석 (5.1.1에서 사용)
역할: 이력서 텍스트 → 강점/약점/개선제안 추출 - JSON 형태로 구조화된 응답 유도
Prompt 2: 채용 공고 파싱 (5.1.2에서 사용)
역할: 채용 공고 텍스트 → 회사명, 직무, 필수요구사항, 우대사항 추출 - JSON Schema 기반 응답
Prompt 3: 매칭도 분석 (5.1.3에서 사용)
역할: 이력서 + 채용공고 → 매칭 점수, 등급, 스킬 비교 분석 예시: "이력서의 스킬과 채용공고 요구사항을 비교해서 매칭도를 분석해줘"
- 5.1 분석 결과 출력
- 5.1.1 이력서 분석 결과 → Prompt 1 사용
- 5.1.1.1 강점
- 5.1.1.2 약점
- 5.1.1.3 개선 제안
- 5.1.2 채용 공고 분석 결과 → Prompt 2 사용
- 5.1.2.1 회사명, 직무
- 5.1.2.2 필수 요구사항
- 5.1.2.3 우대사항
- 5.1.3 매칭도 분석 → Prompt 3 사용
- 5.1.3.1 종합 점수
- 5.1.3.2 등급 (S/A/B/C/D)
- 5.1.3.3 보유 스킬 / 부족 스킬 / 보너스 스킬
- 5.1.3.4 강점 요약
- 5.1.3.5 약점 요약
- 5.1.3.6 맞춤 추천 사항
- 5.1.1 이력서 분석 결과 → Prompt 1 사용
- 5.2 분석 결과 기반 대화 진행
- 5.2.1 분석 내용에 대해 추가 질문
- 5.2.2 특정 섹션 상세 설명 요청
- 5.2.3 개선 방안 구체적 제안 요청
- 5.1 분석 결과 출력
-
모의 면접
사용 AI API
API 용도 처리방식 POST /ai/interview/question질문/꼬리질문 생성 (DB에서 히스토리 조회) ⚡ 동기 POST /ai/interview/saveQ&A 개별 저장 (꼬리질문 맥락 유지) ⚡ 동기 POST /ai/interview/report면접 평가 및 피드백 📡 스트리밍 (SSE) 💡 핵심 흐름:
- 일반 대화 모드에서 면접 모드로 전환 (별도 화면 아님)
- 면접 모드 시작 시 "현재 면접 모드입니다" 메시지 출력
- 인성/기술 선택 버튼 + 면접 종료하기 버튼 표시
- 꼬리 질문 포함 최대 5개 질문 → 5개 채우면 자동 종료
- 면접 종료 시 "면접 모드가 종료되었습니다" 메시지 출력
- 리포트 출력 후 일반 대화 모드로 복귀
모의 면접 흐름
[일반 대화 중] ↓ [면접 모드 시작] → session_id 생성 ↓ "현재 면접 모드입니다" 메시지 출력 ↓ ┌──────────────────────────┐ │ [인성 면접] [기술 면접] │ ← 선택 버튼 │ [면접 종료하기] │ ← 종료 버튼 └──────────────────────────┘ ↓ [인성/기술 선택] → 첫 질문 생성 ↓ [답변 입력] → Q&A 저장 → 꼬리질문 생성 ↓ ... 반복 (최대 5개) ... ↓ ┌─ 5개 완료 ────┐ ┌─ 면접 종료하기 버튼 ─┐ │ 자동 종료 │ │ 직접 종료 │ └──────┬───────┘ └────────┬─────────┘ └────────┬────────┘ ↓ "면접 모드가 종료되었습니다" 메시지 출력 ↓ [리포트 생성 및 출력] ↓ [일반 대화 모드로 복귀]
DB 스키마 (참고)
interview_sessions 테이블: - session_id (PK) - room_id - interview_type (personality/technical) - status (in_progress/completed) - created_at, ended_at, ended_by interview_qa 테이블: - qa_id (PK) - session_id (FK) - question_id - question, answer - is_followup, question_number - created_at
Embedding + VectorDB 적용
저장할 데이터 : 면접 Q&A 임베딩 저장 (면접 종료 시) collection : interview_qa 활용 시점 : 다음 면접 시 약점 기반 질문 생성
Prompt 1: 질문/꼬리질문 생성 (6.3, 6.4에서 사용)
역할: 이력서 + 채용공고 + 면접유형 + 대화 히스토리 → 질문 생성 RAG 검색 활용: - VectorDB에서 이력서/포트폴리오 임베딩 검색 → 관련 컨텍스트 제공 - VectorDB에서 이전 면접 피드백 검색 → 약점 기반 질문 생성 예시 (첫 질문): \"다음 이력서와 채용공고를 참고하여 {면접유형} 면접 질문 1개를 생성해줘. 이력서: {resume} 채용공고: {job_posting} 이전 면접 약점: {previous_weaknesses} JSON 형태로 응답: { 'question': '질문 내용', 'is_followup': false }\" 예시 (꼬리질문): \"다음 대화 히스토리를 참고하여 꼬리질문 1개를 생성해줘. 면접유형: {면접유형} 대화 히스토리: {history} 관련 컨텍스트: {context} JSON 형태로 응답: { 'question': '꼬리질문 내용', 'is_followup': true }\"
Prompt 2: 면접 평가 및 피드백 (6.5에서 사용)
역할: 전체 Q&A → 점수 + 피드백 + 종합 분석 리포트 생성 RAG 검색 활용: - VectorDB에서 유사 면접 결과/피드백 검색 → 참조 데이터로 활용 - 리포트 생성 후 면접 결과 임베딩 저장 → 다음 면접에 활용 예시: \"다음 면접 결과를 종합 분석해줘. 면접 유형: {interview_type} 질문과 답변: {qa_list} 유사 면접 참조: {similar_interviews} 다음 항목을 포함해서 리포트 생성: 1. 각 질문별 점수 (0-100) 및 피드백 2. 전체 점수 및 등급 (S/A/B/C/D) 3. 강점 패턴 분석 4. 약점 패턴 분석 5. 다음 면접을 위한 학습 가이드\"
-
6.1 면접 모드 시작
- 6.1.1 session_id 생성 (면접 세션 시작)
- 6.1.2 "현재 면접 모드입니다" 메시지 출력
- 6.1.3 인성/기술 선택 버튼 + 면접 종료하기 버튼 표시
-
6.2 면접 유형 선택
- 6.2.1 인성 면접 버튼 클릭
- 6.2.1.1 인성 면접 관련 질문 생성
- 6.2.2 기술 면접 버튼 클릭
- 6.2.2.1 기술 면접 관련 질문 생성
- 6.2.1 인성 면접 버튼 클릭
-
6.3 면접 질문 생성 → Prompt 1 사용 →
POST /ai/interview/question- 6.3.1 첫 질문 생성 (AI 서버 호출, session_id 전달)
- 6.3.2 질문 출력
-
6.4 면접 진행 (꼬리질문 포함 최대 5개 질문)
- 6.4.1 사용자 답변 입력
- 6.4.2 Q&A DB 저장 →
POST /ai/interview/save- 6.4.2.1 session_id로 Q&A 연결
- 6.4.2.2 저장 후 다음 질문 요청
- 6.4.3 꼬리질문 생성 → Prompt 1 사용 (DB 히스토리 기반) →
POST /ai/interview/question- 6.4.3.1 session_id로 DB에서 히스토리 조회
- 6.4.3.2 LLM이 맥락 기반 꼬리질문 생성
- 6.4.4 다음 질문 출력
- 6.4.5 질문 수 체크 (5개 도달 시 자동 종료)
-
6.5 면접 종료
- 6.5.1 종료 조건
- 6.5.1.1 5개 질문 완료 → 자동 종료
- 6.5.1.2 면접 종료하기 버튼 클릭 → 직접 종료
- 6.5.2 "면접 모드가 종료되었습니다" 메시지 출력
- 6.5.3 리포트 생성 (DB에서 Q&A 조회) → Prompt 2 사용 →
POST /ai/interview/report - 6.5.4 리포트 생성 및 출력 (📡 스트리밍)
- 6.5.4.1 질문별 점수 및 피드백
- 6.5.4.2 전체 점수 및 등급
- 6.5.4.3 강점/약점 종합 분석
- 6.5.4.4 다음 면접을 위한 학습 가이드
- 6.5.5 결과 리포트 DB 저장 (세션 상태 completed 업데이트)
- 6.5.6 일반 대화 모드로 복귀
- 6.5.1 종료 조건
-
일반 대화
사용 AI API
API 용도 처리방식 POST /ai/chatRAG 대화 + 에이전트 Tool Calling 📡 스트리밍 (SSE) 📌 캘린더 Tool 실행은 Backend가 처리 (AI는 결정만)
LangChain RAG
[사용자 질문] ↓ VectorDB에서 관련 대화/분석 결과 검색 ↓ 검색 결과 + 최근 대화 히스토리 → LLM ↓ 맥락 있는 응답
Embedding + VectorDB 적용
저장할 데이터 : 중요 대화 임베딩 저장 collection : chat_context 활용 시점 : 맥락 유지한 대화
Prompt: 시스템 프롬프트 (일반 대화에서 사용)
역할: AI 커리어 코치 페르소나 설정 예시: "당신은 취업 준비생을 돕는 AI 커리어 코치입니다. - 친절하고 격려하는 톤으로 답변 - 구체적이고 실행 가능한 조언 제공 - 필요시 이력서/채용공고 분석 결과 참조 - 모르는 것은 모른다고 솔직히 답변"
- 7.1 취업 관련 자유 질문
- 7.2 이력서 작성 팁 문의
- 7.3 면접 준비 조언 요청
- 7.4 대화 중 파일 첨부하여 즉석 분석
-
캘린더 일정 자동 추가 (AI)
사용 AI API
API 용도 처리방식 POST /ai/calendar/parse일정 정보 파싱 (폼 자동 채우기용) ⚡ 동기 📌 캘린더 모달에서 파일/텍스트를 분석하여 일정 정보 추출 💡 챗봇에서의 일정 추가는
/ai/chatAPI에서 에이전트 Tool Calling으로 처리
OCR/VLM + LLM 적용
[채용 공고 입력] ↓ OCR/VLM으로 텍스트 추출 (파일인 경우) ↓ LLM으로 일정 정보 추출 (회사명, 전형 단계, 날짜) ↓ JSON 형태로 파싱 → Frontend가 폼에 자동 채워넣음 ↓ 사용자 확인/수정 → Backend가 Google Calendar에 등록
Prompt 1: 캘린더 일정 추출(8.3에서 사용)
역할: 채용 공고 정보 → 회사명, 직무, 전형 일정 추출 예시: "다음 채용 공고 정보를 참고하여 회사명, 직무, 전형 일정을 추출해줘. 채용 공고: {채용공고} JSON 형태로 응답: { 'company': '회사명', 'position': '직무', 'schedules': [ {'stage': '서류 마감', 'date': '2024-03-15'}, {'stage': '코딩테스트', 'date': '2024-03-20'} ], 'hashtags': ['#네이버', '#백엔드', '#신입'] }"
- 8.1 캘린더 화면에서 일정 추가 클릭
- 8.2 채용 공고 정보 입력
- 8.2.1 파일 첨부
- 8.2.2 이미지 첨부
- 8.2.3 텍스트 직접 입력
- 8.3 입력된 데이터 AI 분석 → Prompt 사용
- 8.3.1 회사명, 직무 추출
- 8.3.2 전형 일정 추출 (서류 마감, 코딩테스트, 1차 면접, 2차 면접, 최종 발표 등)
- 8.3.3 해시태그 자동 생성
- 8.4 분석 결과 확인 및 수정
- 8.4.1 추출된 일정 미리보기
- 8.4.2 사용자가 직접 수정 가능
- 8.4.3 일정 추가/삭제
- 8.5 캘린더에 일정 등록 완료
-
챗봇에서 캘린더 관리 (AI 에이전트)
사용 AI API
API 용도 처리방식 POST /ai/chat에이전트 Tool Calling으로 캘린더 CRUD 📡 스트리밍 (SSE) ⚠️ AI는 Tool 호출을 결정만 하고, 실행은 Backend가 함 Backend가 Google Calendar API를 호출하고 결과를 AI에게 전달
Calendar Agent - LangGraph Agent
사용자 입력: "내일 카카오 면접 추가해줘" ↓ ┌───────────────────────────────────────┐ │ Langgraph Agent │ │ │ │ [parse_intent] → "일정 추가" │ │ ↓ │ │ [select_tool] → add_schedule() │ │ ↓ │ │ [execute_tool] → Backend API 호출 │ │ ↓ │ │ [format_response] → "추가 완료!" │ └───────────────────────────────────────┘ tools = [ get_schedule, # 일정 조회 add_schedule, # 일정 추가 update_schedule, # 일정 수정 delete_schedule # 일정 삭제 ]
캘린더 에이전트 - Function Calling
자연어로 캘린더 CRUD 하려면 Function Calling 필요 사용자: "내일 오후 2시에 카카오 면접 추가해줘" ↓ LLM → Function Call: add_schedule(date="2026-01-07", time="14:00", title="카카오 면접") ↓ Backend API 호출 OpenAI : Function Calling 지원 Gemini : Tool USE 지원 현재 구글 캘린더 + gemini 를 사용하니 Gemini가 더 나은 선택
Prompt 1: 일정 기반 알림 및 제안(9.5)
프롬프트 역할: * 다가오는 일정 + 사용자 데이터 → 맞춤 준비 조언 * "내일 면접인데 뭐 준비해?" → 해당 회사/직무 맞춤 답변 프롬프트 예시: "사용자의 {회사명} {직무} 면접이 {날짜}에 있습니다. 이력서: {resume} 채용공고: {job_posting} 이전 면접 피드백: {feedback} 면접 준비를 위한 조언을 3가지 제공해줘."
- 9.1 자연어로 일정 조회
- 9.1.1 "이번 주 일정 알려줘"
- 9.1.2 "다음 면접 언제야?"
- 9.1.3 "네이버 전형 일정 보여줘"
- 9.2 자연어로 일정 추가
- 9.2.1 "내일 오후 2시에 카카오 면접 추가해줘"
- 9.2.2 채용 공고 첨부 후 "이거 캘린더에 등록해줘"
- 9.3 자연어로 일정 수정
- 9.3.1 "네이버 1차 면접 3월 20일로 변경해줘"
- 9.3.2 "카카오 코딩테스트 시간 오후 3시로 바꿔줘"
- 9.4 자연어로 일정 삭제
- 9.4.1 "라인 서류 접수 일정 삭제해줘"
- 9.5 일정 기반 알림 및 제안 → Prompt 사용
- 9.5.1 "내일 면접인데 준비할 거 있어?"
- 9.5.2 다가오는 일정 리마인드
- 9.5.3 면접 전 모의 면접 제안
- 9.1 자연어로 일정 조회
-
게시판 (게시글 작성 시 첨부파일 업로드)
사용 AI API
API 용도 처리방식 POST /ai/masking/draft1차 개인정보 마스킹 🔄 비동기 📌 AI는 1차 마스킹만 담당, 수정/최종 적용은 프론트/백엔드가 처리 💡 사용자 수정 시 AI 호출 없음! Backend가 좌표 기반 블러 처리
게시글 작성 시 첨부파일 업로드 + AI 마스킹 처리 흐름
[첨부 파일 선택 (이미지/PDF)] ↓ AI 마스킹 대기 모달 표시 ↓ POST /ai/masking/draft (AI - 비동기) ↓ 폴링으로 상태 확인 (GET /ai/task/{task_id}) ↓ ┌─ 성공 ─────────────────────────────┐ │ 대기 모달 자동 닫힘 │ │ 첨부 영역에 1차 마스킹된 썸네일 표시 │ │ 편집(연필) 버튼으로 이미지 편집 모달 진입 │ └───────────────────────────────────┘ ┌─ 실패 ─────────────────────────────┐ │ 대기 모달 자동 닫힘 │ │ 에러 토스트 표시 │ └───────────────────────────────────┘ ↓ [사용자 직접 수정 (선택적)] ← 프론트엔드 캔버스 UI ↓ POST /api/board/masking/apply (Backend - 동기, AI 불필요!) ↓ [게시글 등록]
개인정보 마스킹 기술
OCR/VLM으로만은 마스킹이 어려울 수 있음 1. YOLO - 얼굴,등 개인 정보 영역 마스킹 -> 학습 필요 2. VLM만 사용 -> 개인 정보 영역 좌표 알려줘 -> 블러 처리(정확도 이슈 있을 수 있음) 따라서 VLM만 먼저 해보고 정확도 이슈 있을 시 YOLO 추가 * YOLO는 RUNPOD에서 실행해야함(별도 API 없어서)
Prompt: 개인정보 좌표 추출 (10.1.2에서 사용)
역할: VLM으로 이미지에서 개인정보 영역 좌표 추출 예시: "이 이미지에서 개인정보(이름, 전화번호, 이메일, 주소, 주민번호, 얼굴 사진)가 있는 영역의 좌표를 [x1, y1, x2, y2] 형태로 모두 찾아줘"
- 10.1 첨부파일 업로드 (개인정보 마스킹 적용) → Prompt 사용 →
POST /ai/masking/draft- 10.1.1 파일 첨부
- 10.1.1.1 지원 파일: 이미지(JPG/PNG/GIF/WEBP), PDF
- 10.1.2 AI 개인정보 마스킹 대기 모달 (🔄 비동기 - 폴링)
- 10.1.2.1 표시 조건: 첨부 파일 선택 후 AI 마스킹 draft 생성 요청 시작 시
- 10.1.2.2 안내 문구: "AI가 개인정보를 마스킹하는 중입니다", "잠시만 기다려 주세요"
- 10.1.2.3 진행 상태: 로딩 스피너 표시
- 10.1.2.4 종료 조건 (성공): 대기 모달 자동 닫힘 → 첨부 영역에 1차 마스킹된 썸네일 표시
- 10.1.2.5 종료 조건 (실패): 대기 모달 자동 닫힘 → 에러 토스트 ("마스킹에 실패하였습니다. 다시 한 번 시도해주세요")
- 10.1.3 첨부 파일 카드
- 10.1.3.1 AI 1차 마스킹 완료 시 마스킹된 결과(초안 또는 최종본) 썸네일 노출
- 10.1.3.2 편집(연필) 버튼: 추가 마스킹 편집 모달 열기
- 10.1.3.3 삭제(X) 버튼: 첨부 제거
- 10.1.4 이미지 편집 모달 (추가 마스킹) → AI 호출 없음!
- 10.1.4.1 사용자가 직접 마스킹 영역 추가/제거 (프론트엔드 캔버스 UI)
- 10.1.4.2 마스킹 결과 미리보기
- 10.1.4.3 확인 후 최종 저장 →
POST /api/board/masking/apply(Backend 처리)
- 10.1.1 파일 첨부
- 10.1 첨부파일 업로드 (개인정보 마스킹 적용) → Prompt 사용 →
AI Server API 목록 (총 9개)
| # | Endpoint | Method | 설명 | 처리방식 |
|---|---|---|---|---|
| 1 | /ai/ocr/extract |
POST | OCR 텍스트 추출 + 임베딩 저장 (내부 처리) | 🔄 비동기 |
| 2 | /ai/file/embed |
POST | 텍스트 직접 입력 시 임베딩 저장 | ⚡ 동기 |
| 3 | /ai/analyze |
POST | 분석 + 매칭도 (통합) | 📡 스트리밍 |
| 4 | /ai/interview/question |
POST | 면접 질문/꼬리질문 생성 (DB 히스토리 기반) | ⚡ 동기 |
| 5 | /ai/interview/save |
POST | 면접 Q&A 개별 저장 (꼬리질문 맥락 유지) | ⚡ 동기 |
| 6 | /ai/interview/report |
POST | 면접 평가 및 피드백 | 📡 스트리밍 |
| 7 | /ai/chat |
POST | 대화 처리 (RAG + 에이전트) | 📡 스트리밍 |
| 8 | /ai/calendar/parse |
POST | 캘린더 일정 파싱 (모달용) | ⚡ 동기 |
| 9 | /ai/masking/draft |
POST | 게시판 첨부파일 1차 마스킹 | 🔄 비동기 |
📌 OCR 변경:
/ai/ocr/extract가 내부에서 임베딩까지 처리 (Backend 재호출 불필요)📌 마스킹 수정: 사용자가 프론트엔드에서 직접 수정 후 백엔드에서 처리 (AI 불필요)
📌 모의 면접 변경점: 꼬리 질문 맥락 파악을 위해 매 문답마다 개별 저장 (
/ai/interview/save)
처리방식 설명
| 방식 | 아이콘 | 설명 | 사용 시점 |
|---|---|---|---|
| 동기 | ⚡ | 요청 → 응답 대기 → 완료 | 빠른 처리 (1-2초 이내) |
| 비동기 | 🔄 | 요청 → task_id 반환 → 폴링/콜백 | 오래 걸리는 처리 (파일 처리 등) |
| 스트리밍 | 📡 | SSE로 실시간 응답 전송 | 대화형 UX (타이핑 효과) |
🔍 SSE vs WebSocket 비교
💡 결론: LLM 채팅에는 SSE 권장
| 항목 | SSE (Server-Sent Events) | WebSocket |
|---|---|---|
| 통신 방향 | 단방향 (서버 → 클라이언트) | 양방향 (서버 ↔ 클라이언트) |
| 프로토콜 | HTTP/1.1 기반 | 독자 프로토콜 (ws://) |
| 연결 방식 | 일반 HTTP 연결 유지 | 별도 핸드셰이크 필요 |
| 구현 복잡도 | 간단 (FastAPI StreamingResponse) |
상대적으로 복잡 |
| 로드밸런서/프록시 | 대부분 호환 | 설정 필요할 수 있음 |
| 자동 재연결 | 브라우저 기본 지원 | 직접 구현 필요 |
| HTTP/2 지원 | ✅ 멀티플렉싱 지원 | ❌ HTTP/1.1만 |
🏆 SSE 선택 이유 (현재 프로젝트)
1. LLM 응답은 단방향
- 사용자 메시지 전송 → LLM 스트리밍 응답
- 양방향 통신 불필요 → SSE로 충분
2. 업계 표준
- OpenAI, Anthropic, Google 등 대부분의 LLM API가 SSE 사용
- 검증된 방식
3. 구현 간단
- FastAPI: StreamingResponse 사용
- Frontend: EventSource API 사용
4. 인프라 친화적
- 기존 HTTP 인프라 그대로 사용 가능
- 별도 WebSocket 서버 불필요
WebSocket 선택이 적합한 경우
- 이미 WebSocket 인프라가 구축된 경우
- 실시간 양방향 기능 필요 (타이핑 중 표시, 실시간 협업)
- 하나의 연결로 여러 기능 처리 (채팅 + 알림 + 상태 동기화)
- 게임, 실시간 협업 도구 등
LangChain vs LangGraph 역할 분리
┌─────────────────────────────────────────────────────────────┐
│ Langchain │
│ - LLM 호출 래퍼 (Gemini, OpenAI) │
│ - Prompt Template 관리 │
│ - Output Parser (JSON 파싱) │
│ - VectorDB 연동 (ChromaDB, Pinecone) │
│ - RAG Chain (검색 → 컨텍스트 주입 → LLM 응답) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Langgraph │
│ - 복잡한 워크플로우 관리 (상태 기반) │
│ - 조건 분기 (if/else 로직) │
│ - 에이전트 (Function Calling + 도구 실행) │
│ - 멀티 스텝 처리 (OCR → 분석 → 저장) │
└─────────────────────────────────────────────────────────────┘
Embedding 추천
Gemini Embedding , OpenAI Embedding
VectorDB 추천
ChromaDB , Pinecone, Qdrant
📋 Prompt 위치 요약표
| 시나리오 | Prompt 유형 | 우선순위 |
|---|---|---|
| 10.1.2 게시판 마스킹 | 좌표 추출 프롬프트 | 중 |
| 5.1.1 이력서 분석 | 분석 프롬프트 | 상 |
| 5.1.2 공고 분석 | 파싱 프롬프트 | 상 |
| 5.1.3 매칭도 분석 | 매칭 프롬프트 | 상 |
| 6.2 질문 생성 | 질문 생성 프롬프트 | ⭐ 최상 |
| 6.3.3 답변 평가 | 평가 기준 프롬프트 | ⭐ 최상 |
| 6.4 리포트 | 종합 분석 프롬프트 | 중 |
| 7. 일반 대화 | 시스템 프롬프트 | 중 |
| 8.3 일정 추출 | 추출 프롬프트 | 하 |
| 9.5 알림/제안 | 제안 프롬프트 | 하 |
📝 주요 Prompt 목록
1. 개인정보 좌표 추출 (VLM)
2. 이력서 분석
3. 채용공고 파싱
4. 매칭도 분석
5. 면접 질문 생성 ⭐
6. 답변 평가 ⭐
7. 면접 평가 및 피드백
8. 일정 추출
9. 시스템 프롬프트 (일반 대화)
10. 일정 기반 제안