177 lines
5.1 KiB
Markdown
177 lines
5.1 KiB
Markdown
# 감정 시스템 구현 계획 (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주 (전체 구현) |