[AI] 00.서비스_시나리오.md - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

서비스 시나리오

📚 목차

서비스 워크플로우

기술 스택 요약

Prompt 정리


서비스 워크 플로우

  1. 로그인

  2. AI 화면 진입

  3. 이전에 진행한 채팅 목록 출력

  4. 대화 시작

    • 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과 동일)
  5. 이력서와 채용 공고 종합 분석하기


    사용 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.2 분석 결과 기반 대화 진행
      • 5.2.1 분석 내용에 대해 추가 질문
      • 5.2.2 특정 섹션 상세 설명 요청
      • 5.2.3 개선 방안 구체적 제안 요청
  6. 모의 면접


    사용 AI API

    API 용도 처리방식
    POST /ai/interview/question 질문/꼬리질문 생성 (DB에서 히스토리 조회) ⚡ 동기
    POST /ai/interview/save Q&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.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 일반 대화 모드로 복귀
  7. 일반 대화


    사용 AI API

    API 용도 처리방식
    POST /ai/chat RAG 대화 + 에이전트 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 대화 중 파일 첨부하여 즉석 분석
  8. 캘린더 일정 자동 추가 (AI)


    사용 AI API

    API 용도 처리방식
    POST /ai/calendar/parse 일정 정보 파싱 (폼 자동 채우기용) ⚡ 동기

    📌 캘린더 모달에서 파일/텍스트를 분석하여 일정 정보 추출 💡 챗봇에서의 일정 추가는 /ai/chat API에서 에이전트 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 캘린더에 일정 등록 완료
  9. 챗봇에서 캘린더 관리 (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 면접 전 모의 면접 제안
  10. 게시판 (게시글 작성 시 첨부파일 업로드)


    사용 AI API

    API 용도 처리방식
    POST /ai/masking/draft 1차 개인정보 마스킹 🔄 비동기

    📌 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 처리)

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. 일정 기반 제안