일반_질문_모델_선정.md - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

일반 질문 모델 선정

최종 업데이트: 2026-02-09


📋 목차


1. 개요

목적

평시 일반 질문 모드(채팅 모드) 에서 사용할 LLM 모델 구성을 정의한다.

  • 취업/진로 관련 일반 Q&A
  • 이력서·포트폴리오 작성 팁
  • 회사/직무 정보, 학습 로드맵 안내
  • 필요 시 RAG(VectorDB) 기반 개인화된 답변

배경

초기에는 04_채팅_모델_선정.md 에 따라 Gemini Flash 단일 모델로 일반 채팅을 처리했다.
이후 05_꼬리질문_모델_선정.md 에서 평시 질의응답 트래픽이 많아지면 API 비용이 커진다는 문제가 확인되었고,

  • Primary: vLLM EXAONE 8B (자체 서빙)
  • Fallback: Gemini Flash (오류/과부하 시)

라는 비용 최적화 전략으로 v2 구조를 변경하였다. 이 문서는 그 최종 구조를 기준으로 한다.


2. 요구사항

요구사항 목표 우선순위
응답 속도 2~3초 이내 높음
한국어 자연스러움 4.5/5.0 이상 높음
문맥 이해 최근 대화 히스토리·사용자 프로필 활용 높음
비용 월 $30 이내 (평시 Q&A 중심) 높음
안정성 vLLM 장애 시 자동 Fallback 높음
프라이버시 이력서·포트폴리오 내용 유출 방지 중간
RAG 연동 VectorDB 검색 결과 주입 중간

3. 후보 모델 비교

3.1 vLLM EXAONE-3.5-8B (자체 서빙) ✅

개요

  • LG AI Research의 한국어 특화 7.8B 모델
  • vLLM OpenAI 호환 서버로 자체 서빙
  • GPU: NVIDIA L4 (24GB) 기준

장점

  • API 비용 0원 (인프라 비용만 발생)
  • ✅ 한국어 비율·자연스러움 우수 (75~80점 수준)
  • ✅ 우리 서비스에 특화된 프롬프트·시스템 메시지 튜닝 가능
  • ✅ 사용자 데이터가 외부로 나가지 않아 프라이버시 우수

단점

  • ❌ Gemini Flash 대비 응답 속도 느림 (1015초, 벤치마크 기준)
  • ❌ GPU 서버 관리 필요 (콜드스타트, 헬스체크 등)
  • ❌ 모델 업데이트·튜닝 책임이 팀에 있음

적합도

  • 평시 질의응답의 비용프라이버시를 최우선으로 할 때 매우 적합
  • 다만, 속도는 GPU·서빙 최적화 정도에 따라 튜닝 필요

3.2 Gemini Flash (API) ✅

개요

  • Google의 경량 LLM (문서 04_채팅_모델_선정.md에서 이미 검증)
  • 스트리밍 응답, RAG 연동 용이

장점

  • ✅ 빠른 응답 (1~2초)
  • ✅ 한국어 자연스러움 4.8/5.0
  • ✅ API 사용만으로 인프라 관리 불필요
  • ✅ 스트리밍 지원으로 대화 UX 우수

단점

  • ❌ 호출량이 많아질수록 API 비용 증가
  • ❌ 프롬프트·데이터가 Google로 전송됨 (정책상 민감한 정보는 마스킹 필요)

비용(요약)04_채팅_모델_선정.md 기준

  • $0.075/1M 입력 토큰, $0.30/1M 출력 토큰
  • 일반 채팅 5,000건/월 기준 비용은 매우 낮지만, 면접·RAG와 합산 시 점점 커질 수 있음

3.3 Gemini Pro (비교용)

개요

  • 고성능 LLM, 복잡한 추론·분석에 적합

결론

  • 일반 질문 모드에서는 과도한 스펙
  • 면접 평가 등 복잡한 분석 파트에서만 사용 (문서 05_꼬리질문_모델_선정.md 참고)

4. 최종 선정

4.1 전략 요약

역할 모델 선정 근거
Primary vLLM EXAONE-3.5-8B 자체 서빙으로 API 비용 0원, 한국어 품질 우수
Fallback Gemini Flash vLLM 장애·과부하·타임아웃 시 빠르게 대체 가능 (저비용 API)

초기 설계(문서 04_채팅_모델_선정.md)에서는 Gemini Flash 단일 모델을 사용했으나,
05_꼬리질문_모델_선정.md에서 평시 질의응답의 호출 빈도가 매우 높아질 수 있음이 확인되었다.
이에 따라 v2에서는 다음과 같이 조정했다.

  • 평시 채팅의 대부분은 vLLM EXAONE 8B로 처리 → API 비용 없음
  • vLLM 서버 장애·콜드스타트·타임아웃 등 예외 상황에서만 Gemini Flash 호출

결과적으로,

  • 사용자 체감 품질을 유지하면서
  • API 비용을 크게 줄이는 구조를 채택하였다.

5. 일반 질문 모드 동작 전략

5.1 모델 선택 로직 (요약)

def select_model_for_general_chat() -> str:
    \"\"\"평시 일반 질문 모드 모델 선택\"\"\"
    # 기본은 vLLM EXAONE 8B
    return \"vllm-exaone-8b\"  # 오류 시 Gemini Flash Fallback

상세 로직은 05_꼬리질문_모델_선정.mdselect_model() 예시에서
mode == "chat" 분기와 동일하게 동작한다.

5.2 처리 플로우

[사용자 일반 질문]
    │
    ▼
[세션/히스토리 조회]  ← Redis
    │
    ▼
[RAG 필요 여부 판단]
    ├─ 필요 O → VectorDB(Chroma) 검색 → 컨텍스트 생성
    └─ 필요 X → 기본 시스템 프롬프트만 사용
    │
    ▼
[vLLM EXAONE 8B 호출]
    │   └─ 실패/타임아웃 → Gemini Flash Fallback
    ▼
[SSE 스트리밍 응답]

5.3 RAG 연동

  • 사용자의 이력서·포트폴리오·지원 공고 등은 ChromaDB에 임베딩되어 있다.
  • 일반 질문이라도, 아래와 같은 경우에는 RAG를 활성화한다.
    • 이력서 피드백, 공고 매칭, 포트폴리오 개선 요청 등
  • RAG 활성화 시:
    • VectorDB에서 관련 문서를 top-k로 검색
    • 검색 결과를 시스템 프롬프트/컨텍스트로 주입한 뒤 vLLM 호출

6. 구현 참조

6.1 코드 파일

  • 3.model/app/infrastructure/llm/vllm.py — vLLM Provider
  • 3.model/app/services/vllm_service.py — vLLM 서버 호출·스트리밍 처리
  • 3.model/app/services/llm_service.py — Gemini 호출 및 Fallback 로직
  • 3.model/app/services/rag_service.py — VectorDB 기반 RAG 처리
  • 3.model/app/api/routes/v2/chat.py/ai/chat v2 채팅 엔드포인트

6.2 설정

  • .env / settings.py 주요 항목:

    • GCP_VLLM_BASE_URL — vLLM EXAONE 8B 서버 URL
    • GOOGLE_API_KEY — Gemini Flash Fallback 용
    • CHROMA_SERVER_HOST, CHROMA_SERVER_PORT — VectorDB 서버

7. 비용 및 확장 전략

7.1 비용 구조 (요약)

05_꼬리질문_모델_선정.md 기준, 월 2,000회 일반 대화 + 500회 면접이 있다고 가정하면:

  • 평시 일반 대화 2,000회:
    • vLLM EXAONE 8B: 자체 서빙 → API 비용 $0
    • Fallback (약 5%): 100회 × $0.0005 ≒ $0.05/월

→ 일반 질문 모드 자체의 API 비용은 사실상 0에 가깝고,
전체 비용은 면접 평가(Gemini Pro, OpenAI) 쪽이 지배적이다.

7.2 향후 확장

  • 트래픽 증가 시:
    • vLLM 서버를 수평 확장(컨테이너/인스턴스 수 증가)
    • /ai/chat Endpoint 서버 역시 복수 인스턴스로 로드 밸런싱
  • 품질 향상이 필요할 경우:
    • EXAONE 8B → 32B 전환을 고려하되, 비용·지연 시간을 면접 모드와 함께 재평가

일반 질문 모드는 비용 효율 + 적당한 품질을 목표로 하므로,
현재 구조(8B Primary + Gemini Flash Fallback)가 v2 요구사항에 가장 적합하다.