# 감정 분석 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.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. 구현 계획 #### 현재 상태 (코드 확인 완료) - 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 복합 감정 매핑 - fear+sadness: "조심스럽고 따뜻하게" #### 4단계: DB 스키마 변경 - top_label → top_emotions (JSONB) - 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: 감정 분석 결과 사용자 노출 제거