diff --git a/troubleshooting/20251002_emotion_top-p_improvement.md b/troubleshooting/20251002_emotion_top-p_improvement.md new file mode 100644 index 0000000..661c549 --- /dev/null +++ b/troubleshooting/20251002_emotion_top-p_improvement.md @@ -0,0 +1,79 @@ +# 감정 분석 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_llm.py 수정 +- analyze_user_emotion() 반환값 확장 +- EmotionState에 복합 감정 필드 추가 또는 별도 반환 + +#### llm_service.py 수정 +- 복합 감정별 system_instruction 매핑 +- 단일/복합 감정 구분 로직 + +#### DB 스키마 검토 +- top_label → top_emotions (array) +- top_p → cumulative_p (누적 확률) + +## 참고 문헌 +- 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: 감정 분석 결과 사용자 노출 제거