# 감정 시스템 구현 계획 (rb8001) **작성일**: 2025-09-20 **작성자**: Claude **관련 서비스**: rb8001 **이슈**: 감정 분석 시스템 미구현 ## 현재 상황 ### rb8001 감정 시스템 현황 - **구조만 존재**: base.py, emotion_llm.py 등 파일은 있으나 임시 구현 - **실제 분석 없음**: 모든 감정에 균등 분포 (1/9) 반환 - **rb10508 부재**: 이식하려던 rb10508 디렉토리 자체가 없음 ### 구현된 부분 ```python # /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: 추론 엔진 구현** ```python # /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 스키마 구현** ```sql 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 엔드포인트** ```python # /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주 (전체 구현)