- 핵심 파일 4개 위치:줄번호 명시 - EmotionState 확장 검토 - DB 스키마 변경 계획 - 복합 감정 매핑 예시 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
92 lines
2.9 KiB
Markdown
92 lines
2.9 KiB
Markdown
# 감정 분석 Top-p 개선 방안
|
|
|
|
## 발생 일시
|
|
2025-10-02 16:20 ~ 16:30
|
|
|
|
## 현상
|
|
감정 분석 결과가 사용자에게 부적절하게 노출되고, 애매한 감정 판단 문제 발생
|
|
|
|
### 문제 사례
|
|
- "56.1%의 자신감으로 '중립' 상태를 감지" (논리적 모순)
|
|
- "81.1%로 두려움 감지" (감정 분석 결과 직접 노출)
|
|
- 1위 감정만 사용하여 복합 감정 무시
|
|
|
|
## 원인 분석
|
|
|
|
### 1. 감정 정보 노출 문제
|
|
- llm_service.py:87-94에서 감정 분석 결과를 프롬프트에 직접 포함
|
|
- Gemini가 "detection certainty"를 "자신감"으로 오역
|
|
- 사람은 감정을 숫자로 말하지 않음 (내부 처리만 해야 함)
|
|
|
|
### 2. 단일 감정 판단의 한계
|
|
- 현재: 1위 감정만 사용 (EmotionState.dominant)
|
|
- 문제: fear 45%, sadness 30% → fear만 선택 (sadness 무시)
|
|
- 실제: 복합 감정 상태 (불안정한 상태)
|
|
|
|
### 3. 애매한 확률 처리 부재
|
|
- 1위가 35%인 경우도 해당 감정으로 판단
|
|
- 임계값 없이 무조건 dominant 사용
|
|
|
|
## 해결 방안
|
|
|
|
### 1. 감정 정보 노출 제거 (완료)
|
|
- 커밋: 51e45d3
|
|
- system_instruction을 context에 포함
|
|
- 사용자에게 감정 분석 결과 절대 노출 금지
|
|
|
|
### 2. Top-p (Nucleus Sampling) 도입 (예정)
|
|
|
|
#### Top-p 원리
|
|
- 확률 높은 순 정렬 → 누적 합 p 도달까지 선택
|
|
- LLM 생성: p=0.9~0.95, 집중도 필요: p=0.5~0.7
|
|
- 감정 분석 적용: p=0.7 (70% 누적)
|
|
|
|
#### 임계값 설정
|
|
- 1위 ≥ 70%: 단일 감정 (명확)
|
|
- 1위 < 50%: 복합 감정 (top-p 70% 사용)
|
|
- 모두 < 30%: neutral 처리 (애매함)
|
|
|
|
#### 복합 감정 예시
|
|
```
|
|
fear 45% + sadness 30% = 75% (> 70%)
|
|
→ ["fear", "sadness"] 복합 감정
|
|
→ 톤: "조심스럽고 따뜻하게"
|
|
```
|
|
|
|
### 3. 구현 계획
|
|
|
|
#### 핵심 파일 위치
|
|
- emotion/base.py:19-50 (EmotionState 구조)
|
|
- emotion_llm.py:26-98 (analyze_user_emotion)
|
|
- llm_service.py:86-94 (프롬프트 조절)
|
|
- database.py:172-177 (DB 저장)
|
|
|
|
#### emotion_llm.py:26-98 수정
|
|
- Top-p 70% 로직 추가
|
|
- 복합 감정 리스트 반환 (EmotionState 확장 또는 별도)
|
|
|
|
#### llm_service.py:86-94 수정
|
|
- 단일/복합 감정 구분
|
|
- 복합 감정별 system_instruction 매핑
|
|
- fear+sadness: "조심스럽고 따뜻하게"
|
|
- anger+disgust: "침착하고 객관적으로"
|
|
|
|
#### database.py:172-177 수정
|
|
- top_label (VARCHAR) → top_emotions (JSONB array)
|
|
- top_p (FLOAT) → cumulative_p (FLOAT)
|
|
|
|
#### EmotionState 확장 검토
|
|
- 현재: emotion_dist, entropy, dominant, confidence
|
|
- 추가 필요: top_emotions (List[str]), cumulative_p (float)
|
|
|
|
## 참고 문헌
|
|
- Top-p Sampling: https://en.wikipedia.org/wiki/Top-p_sampling
|
|
- Multi-label Emotion (2025): ME-TIEK 모델, EmoBERTa-X
|
|
- Probability-based Classification (2025)
|
|
|
|
## 관련 커밋
|
|
- 29c0317: 순환 참조 제거
|
|
- a946cef: 감정 프롬프트 detection certainty 명확화
|
|
- c531519: 한글 프롬프트 변경 (Gemini 오역 방지)
|
|
- 51e45d3: 감정 분석 결과 사용자 노출 제거
|