DOCS/troubleshooting/250920_emotion_system_implementation_plan.md

5.1 KiB

감정 시스템 구현 계획 (rb8001)

작성일: 2025-09-20 작성자: Claude 관련 서비스: rb8001 이슈: 감정 분석 시스템 미구현

현재 상황

rb8001 감정 시스템 현황

  • 구조만 존재: base.py, emotion_llm.py 등 파일은 있으나 임시 구현
  • 실제 분석 없음: 모든 감정에 균등 분포 (1/9) 반환
  • rb10508 부재: 이식하려던 rb10508 디렉토리 자체가 없음

구현된 부분

# /app/core/emotion/base.py
- EmotionState 클래스 정의
- 9 감정: joy, sadness, anger, fear, disgust + anxiety, envy, embarrassment, ennui
- calculate_entropy() 함수
- Thompson Sampling 구조

미구현 부분

  1. 모델 통합: klue/bert-base 기반 7클래스 분류기
  2. ONNX 추론: 모델 변환 및 최적화
  3. Temperature Scaling: 확률 보정
  4. 데이터베이스: emotion_readings 테이블
  5. API 엔드포인트: /v1/emotion/infer 등

구현 로드맵

Phase 1: 기본 감정 분석 (1주)

  1. Day 1-2: 모델 준비

    • klue/bert-base 기반 감정 분류 모델 준비
    • 7개 클래스: fear, surprise, anger, sadness, neutral, happiness, disgust
    • ONNX 변환 및 최적화
  2. Day 3-4: 추론 엔진 구현

    # /app/core/emotion/inference.py
    class EmotionInference:
        def __init__(self, model_path: str):
            self.session = onnxruntime.InferenceSession(model_path)
            self.tokenizer = AutoTokenizer.from_pretrained("klue/bert-base")
            self.temperature = 1.0
    
        def predict(self, text: str) -> Dict[str, float]:
            # 토크나이징
            inputs = self.tokenizer(text, max_length=128, truncation=True)
            # ONNX 추론
            logits = self.session.run(None, inputs)[0]
            # Temperature Scaling
            probs = softmax(logits / self.temperature)
            return dict(zip(EMOTION_LABELS, probs))
    
  3. Day 5: DB 스키마 구현

    CREATE TABLE emotion_readings (
        id UUID PRIMARY KEY,
        user_id UUID REFERENCES "user"(id),
        text_hash VARCHAR(64),
        model_version VARCHAR(20),
        temperature FLOAT,
        logits JSONB,
        probs JSONB,
        top_label VARCHAR(20),
        top_p FLOAT,
        entropy FLOAT,
        meta JSONB,
        created_at TIMESTAMP DEFAULT NOW()
    );
    
    CREATE INDEX idx_emotion_user_time ON emotion_readings(user_id, created_at);
    

Phase 2: API 및 통합 (1주)

  1. Day 6-7: API 엔드포인트

    # /app/api/emotion.py
    @router.post("/v1/emotion/infer")
    async def infer_emotion(text: str, user_id: str):
        # 감정 분석
        result = emotion_inference.predict(text)
        # DB 저장
        await save_emotion_reading(user_id, text, result)
        return result
    
    @router.get("/v1/emotion/timeseries")
    async def get_emotion_timeseries(user_id: str, start: datetime, end: datetime):
        # 시계열 데이터 조회
        readings = await get_readings(user_id, start, end)
        return aggregate_emotions(readings)
    
  2. Day 8-9: 기존 시스템 통합

    • Router에서 감정 분석 호출
    • 메모리 저장 시 감정 메타데이터 추가
    • Slack 응답에 감정 정보 포함
  3. Day 10: 시각화

    • 감정 그래프 생성 (matplotlib/plotly)
    • Slack 이미지 업로드

Phase 3: 고도화 (선택적)

  1. Temperature Calibration

    • 검증 데이터셋으로 최적 T 값 찾기
    • ECE (Expected Calibration Error) 최소화
  2. 배치 처리 최적화

    • 마이크로배칭
    • 비동기 처리 큐
  3. 감정 공명 시스템

    • 과거 감정과 현재 감정 결합
    • 사용자별 감정 패턴 학습

구현 우선순위

즉시 구현 가능 (Quick Win)

  1. 감정 DB 테이블 생성
  2. 간단한 규칙 기반 감정 분석 (키워드 매칭)
  3. 감정 저장 및 조회 API

중기 목표 (1-2주)

  1. BERT 모델 통합
  2. ONNX 최적화
  3. Temperature Scaling

장기 목표 (1개월+)

  1. 📅 사용자별 감정 패턴 학습
  2. 📅 실시간 감정 모니터링 대시보드
  3. 📅 감정 기반 응답 생성

리소스 요구사항

모델

  • klue/bert-base (400MB)
  • ONNX 변환 모델 (100MB)
  • 추론 시간: CPU 40-80ms, GPU 10-20ms

인프라

  • 추가 메모리: 500MB-1GB
  • DB 스토리지: 사용자당 일 100KB
  • 계산 리소스: CPU 2 cores 권장

주의사항

  1. 프라이버시

    • 원문 텍스트는 해시만 저장
    • 사용자 동의 필요
    • 삭제 권한 보장
  2. 성능

    • 캐싱 적극 활용
    • 배치 처리로 효율화
    • 비동기 처리 필수
  3. 정확도

    • 한국어 특화 모델 필요
    • 지속적인 모니터링
    • 사용자 피드백 수집

결론

"감정시스템 이식"이라는 작업은 실제로는 새로운 구현이 필요합니다:

  • rb10508에 구현된 감정 시스템이 없음
  • rb8001에 기본 구조만 있고 실제 기능 없음
  • 처음부터 구현 필요

권장 사항:

  1. 단계적 구현 (간단한 키워드 기반 → BERT 모델)
  2. 우선순위: DB 스키마 → API → 모델 통합
  3. 예상 소요 시간: 2-3주 (전체 구현)