DOCS/troubleshooting/20251002_emotion_top-p_improvement.md
happybell80 c201b6bba3 docs: Plutchik 기반 복합 감정 응답 전략 추가
- 6개 복합 감정 조합별 응답 톤 정의
- despair, contempt, envy, shame, love, disapproval
- Plutchik Dyads 참고문헌 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 17:11:04 +09:00

3.7 KiB

감정 분석 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
  • llm_service.py:87-98에서 system_instruction 생성
  • context['system_instruction']에 포함
  • 문제: 핸들러(gemini/openai/claude)가 system_instruction 미사용
  • 결과: 직접 노출은 제거되었으나 톤 조절 미적용

2. Top-p (Nucleus Sampling) 도입 (예정)

Top-p 원리

  • 확률 높은 순 정렬 → 누적 합 p 도달까지 선택
  • LLM 생성: p=0.90.95, 집중도 필요: p=0.50.7
  • 감정 분석 적용: p=0.7 (70% 누적)

임계값 설정

  • 1위 ≥ 70%: 단일 감정 (명확)
  • 1위 < 50%: 복합 감정 (top-p 70% 사용)
  • 모두 < 30%: neutral 처리 (애매함)

복합 감정 예시

fear 45% + sadness 30% = 75% (> 70%)
→ ["fear", "sadness"] 복합 감정
→ 톤: "조심스럽고 따뜻하게"

3. 구현 계획

현재 상태 (코드 확인 완료)

  • EmotionState: base.py:19-24 (4개 필드)
  • 감정 분석: emotion_llm.py:26-98
  • 프롬프트 조절: llm_service.py:87-98 (system_instruction 생성만)
  • DB 저장: database.py:172-177 (top_label, top_p)
  • 미완성: 핸들러가 system_instruction 무시

1단계: 핸들러 수정 (필수)

  • gemini_handler.py:59-150의 chat() 메서드
  • context['system_instruction'] 읽어서 프롬프트에 포함
  • openai/claude 핸들러도 동일 수정

2단계: Top-p 로직 추가

  • emotion_llm.py:26-98에 Top-p 70% 계산
  • EmotionState 확장 또는 별도 반환

3단계: 복합 감정 처리

  • llm_service.py:87-98 복합 감정 매핑
  • Plutchik 기반 복합 감정 전략:
    • fear+sadness (despair): "희망을 제시하며 지지적으로"
    • anger+disgust (contempt): "침착하고 객관적으로, 다른 관점 제시"
    • sadness+anger (envy): "공정성 인정하며 긍정적 대안 제시"
    • fear+disgust (shame): "판단 없이 수용적으로"
    • joy+trust (love): "따뜻하고 열정적으로"
    • surprise+sadness (disapproval): "이해하며 건설적 대안 제안"

4단계: DB 스키마 변경

  • top_label → top_emotions (JSONB)
  • top_p → cumulative_p

참고 문헌

관련 커밋

  • 29c0317: 순환 참조 제거
  • a946cef: 감정 프롬프트 detection certainty 명확화
  • c531519: 한글 프롬프트 변경 (Gemini 오역 방지)
  • 51e45d3: 감정 분석 결과 사용자 노출 제거