- 원인 분석 3개 항목 모두 유지 - 구현 세부사항 file:line 참조 유지 - 테스트 결과 전체 보존 - 참고 문헌 2개로 축소 - 118줄 → 97줄 (100줄 제한 준수) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
99 lines
3.0 KiB
Markdown
99 lines
3.0 KiB
Markdown
# 감정 분석 Top-p 개선 방안
|
|
|
|
## 발생 일시
|
|
2025-10-02 16:20 ~ 16:30
|
|
|
|
## 완료 일시
|
|
2025-10-02 17:32
|
|
|
|
## 현상
|
|
감정 분석 결과가 사용자에게 부적절하게 노출되고, 애매한 감정 판단 문제 발생
|
|
|
|
### 문제 사례
|
|
- "56.1%의 자신감으로 '중립' 상태를 감지" (논리적 모순)
|
|
- "81.1%로 두려움 감지" (감정 분석 결과 직접 노출)
|
|
- 1위 감정만 사용하여 복합 감정 무시
|
|
|
|
## 원인 분석
|
|
|
|
### 1. 감정 정보 노출 문제
|
|
- Gemini가 "detection certainty"를 "자신감"으로 오역
|
|
- 사람은 감정을 숫자로 말하지 않음 (내부 처리만 해야 함)
|
|
|
|
### 2. 단일 감정 판단의 한계
|
|
- 1위 감정만 사용 (EmotionState.dominant)
|
|
- fear 45%, sadness 30% → fear만 선택 (sadness 무시)
|
|
|
|
### 3. 임계값 부재
|
|
- 1위가 35%인 경우도 해당 감정으로 판단
|
|
|
|
## 해결 방안 (완료)
|
|
|
|
### 1. 감정 정보 노출 제거 (완료)
|
|
- 커밋: 51e45d3, a5801e8
|
|
- llm_service.py에서 system_instruction 생성
|
|
- 핸들러 연동 완료 (gemini/openai/claude)
|
|
- 테스트 결과: 감정 언급 없음 ✅, 숫자/확률 표현 없음 ✅
|
|
|
|
### 2. Top-p (Nucleus Sampling) 도입 (완료)
|
|
- 확률 높은 순 정렬 → 누적 합 70% 도달까지 선택
|
|
- LLM 생성: p=0.9~0.95, 감정 분석: p=0.7
|
|
- 예: fear 45% + sadness 30% = 75% → ["fear", "sadness"]
|
|
|
|
### 3. 구현 완료 (커밋: a5801e8)
|
|
|
|
#### EmotionState 확장
|
|
- base.py:19-26에 top_emotions, cumulative_p 필드 추가
|
|
- calculate_top_p_emotions() 함수 구현
|
|
- dominant/confidence deprecated 표시
|
|
|
|
#### Top-p 로직 적용
|
|
- emotion_llm.py:47-48에 Top-p 70% 계산
|
|
- 복합 감정 리스트 반환
|
|
|
|
#### 복합 감정 응답 전략
|
|
- llm_service.py:86-123에 Plutchik 기반 6개 조합 매핑
|
|
- frozenset 매칭으로 복합 감정 처리
|
|
- 단일 감정 폴백 전략
|
|
|
|
#### 핸들러 연동
|
|
- gemini_handler.py:117-118
|
|
- openai_handler.py:30-34
|
|
- claude_handler.py:30-34
|
|
- context['system_instruction'] 프롬프트에 포함
|
|
|
|
#### DB 스키마 변경
|
|
- database.py:169-194에 top_emotions, cumulative_p 저장
|
|
- deprecated 컬럼 삭제 (top_label, top_p)
|
|
|
|
## 참고 문헌
|
|
- Top-p Sampling: https://en.wikipedia.org/wiki/Top-p_sampling
|
|
- Plutchik's Wheel of Emotions: https://www.6seconds.org/2025/02/06/plutchik-wheel-emotions/
|
|
|
|
## 테스트 결과 (2025-10-02 17:32)
|
|
|
|
### 프로덕션 검증
|
|
- 메시지: "복합 감정 잘 저장 되는지 체크 하려고 해."
|
|
- 응답: 감정 언급 없음 ✅, 숫자/확률 표현 없음 ✅
|
|
- 응답 시간: 3124ms
|
|
|
|
### DB 저장 확인
|
|
```json
|
|
{
|
|
"top_emotions": [
|
|
{"label": "fear", "probability": 0.499},
|
|
{"label": "neutral", "probability": 0.335}
|
|
],
|
|
"cumulative_p": 0.833
|
|
}
|
|
```
|
|
- fear 49.9% + neutral 33.5% = 83.3% (Top-p 70% 초과)
|
|
- 복합 감정 정상 저장 확인
|
|
|
|
## 관련 커밋
|
|
- 29c0317: 순환 참조 제거
|
|
- a946cef: 감정 프롬프트 detection certainty 명확화
|
|
- c531519: 한글 프롬프트 변경 (Gemini 오역 방지)
|
|
- 51e45d3: 감정 분석 결과 사용자 노출 제거
|
|
- a5801e8: Top-p 기반 복합 감정 처리 시스템 구현
|