감정 시스템 설계도 개정 - 감정 임베딩 통합, 코드 최소화, 개념 중심 재작성
- 감정 임베딩을 ChromaDB에 통합하는 방안 추가 - 함수형 프로그래밍 100% 원칙 유지 (베이지안은 도구로만) - 불필요한 코드 예시 대폭 제거 - 엔트로피 특이점 포착 개념 강화 - 수학-임베딩-LLM 3중 구조 명확화 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
e27f067229
commit
a2a3e06746
@ -1,379 +1,169 @@
|
||||
# 로빙 감정 시스템 설계도
|
||||
# 로빙 감정 시스템 설계도 - 함수형 + 베이지안 적응형
|
||||
|
||||
**작성일**: 2025-08-07
|
||||
**작성일**: 2025-08-07 (2025-08-08 개정)
|
||||
**작성자**: happybell80 & Claude
|
||||
**상태**: 설계 완료, 구현 대기
|
||||
**상태**: 감정 임베딩 통합, 하드코딩 완전 제거
|
||||
|
||||
## 1. 감정 시스템 철학
|
||||
## 1. 핵심 철학
|
||||
|
||||
### 핵심 원칙
|
||||
- **감정은 평가다**: 상황을 목표/신념과 비교해 자율적으로 감정 생성 (Appraisal Theory)
|
||||
- **감정은 학습된 보상 함수다**: IRL을 통해 사용자 행동에서 암묵적 선호 학습
|
||||
- **기억-감정-윤리 삼각형**: 세 요소가 상호작용하며 로빙의 존재성 구성
|
||||
- **함수형 100%, 하드코딩 0%**: 모든 상수는 수학적 의미 보유
|
||||
### 설계 원칙
|
||||
- **감정은 시공간의 엔트로피 변화다**: 감정 벡터의 엔트로피가 증가하는 방향이 시간, 벡터 차원이 공간
|
||||
- **엔트로피 특이점을 포착한다**: 시간이 흘러도 무질서해지지 않는 감정이 중요한 기억
|
||||
- **함수형 프로그래밍 100%**: 순수 함수와 I/O 분리, 불변 데이터 구조
|
||||
- **베이지안으로 불확실성 관리**: 모든 파라미터는 확률 분포로 표현되고 학습됨
|
||||
|
||||
## 2. 감정 상태 구조
|
||||
|
||||
### 2.1 기본 구조 (불변 객체)
|
||||
```python
|
||||
EmotionState = {
|
||||
# 핵심 3차원 (0~1 실수 통일)
|
||||
core: {
|
||||
valence: float, # 쾌-불쾌 [-π, π] → [0, 1] 정규화
|
||||
arousal: float, # 활성화 [0, e] → [0, 1] 정규화
|
||||
dominance: float # 통제감 [-φ, φ] → [0, 1] 정규화
|
||||
},
|
||||
### 2.1 기본 구조
|
||||
- **VAD 3차원**: Valence(쾌-불쾌), Arousal(활성화), Dominance(통제감)
|
||||
- **감정 임베딩**: 768차원 벡터 (사전학습 모델 사용)
|
||||
- **엔트로피 궤적**: 시간에 따른 엔트로피 변화 추적
|
||||
- **베이지안 파라미터**: Beta, Gamma, Dirichlet 분포로 학습
|
||||
|
||||
# 감정 레이어
|
||||
layers: {
|
||||
primary: [joy, sadness, anger, fear, surprise, disgust], # 6개 기본
|
||||
secondary: [nostalgia, pride, guilt, hope, ...], # 13개 복합
|
||||
contextual: [urgency, celebration, routine] # 상황별
|
||||
},
|
||||
### 2.2 감정 동역학
|
||||
- 감정 변화율 = α(흡수율) × 평가 - δ(감쇠율) × 현재감정
|
||||
- α와 δ는 Beta 분포에서 Thompson Sampling
|
||||
- 사용자 피드백으로 사후분포 업데이트
|
||||
|
||||
# 메타 정보
|
||||
history: RingBuffer[13], # 피보나치 F(7) = 13개 이전 상태
|
||||
resonance: float, # 사용자와의 감정 동조율 (1/π = 0.318...)
|
||||
## 3. 감정 임베딩 활용
|
||||
|
||||
# 시간 정보
|
||||
timestamp: str,
|
||||
decay_factor: float # 1/e = 0.368...
|
||||
}
|
||||
```
|
||||
### 3.1 임베딩 획득
|
||||
- **사전학습 모델**: EmoRoBERTa, GoEmotions BERT 등 활용
|
||||
- **도메인 파인튜닝**: 로빙 대화 로그로 continual learning
|
||||
- **대조학습**: 유사 감정은 가깝게, 반대 감정은 멀게
|
||||
|
||||
### 2.2 감정 동역학 (EMA 모델)
|
||||
```
|
||||
dE/dt = α * Appraisal(t) - δ * E(t)
|
||||
### 3.2 ChromaDB 통합
|
||||
- **저장 구조**:
|
||||
- 감정 임베딩 벡터 (768차원)
|
||||
- VAD 값 (3차원)
|
||||
- 엔트로피 점수
|
||||
- 타임스탬프와 메타데이터
|
||||
|
||||
where:
|
||||
α = 1/φ = 0.618... # 감정 흡수율 (황금비 역수)
|
||||
δ = 1/e = 0.368... # 감정 감쇠율 (자연 감쇠)
|
||||
```
|
||||
- **검색 전략**:
|
||||
1. 현재 감정 임베딩으로 top-k 코사인 유사도 검색
|
||||
2. 엔트로피 기반 중요도 필터링
|
||||
3. 시간 가중치 적용
|
||||
4. 베이지안 결합으로 최종 선택
|
||||
|
||||
## 3. 감정 파이프라인
|
||||
### 3.3 임베딩 기반 클러스터링
|
||||
- DBSCAN으로 감정 클러스터 발견
|
||||
- 사용자별 감정 어트랙터 맵핑
|
||||
- 클러스터별 공감 전략 사전 계산
|
||||
|
||||
### 3.1 처리 순서 (순수 함수 체인)
|
||||
```
|
||||
1. 사용자 입력
|
||||
↓
|
||||
2. 언어 분석 (토큰, 감탄사, 이모티콘, 침묵 패턴)
|
||||
↓
|
||||
3. 평가 기반 감정 추론 (Appraisal Theory)
|
||||
↓
|
||||
4. IRL 보상 함수 적용
|
||||
↓
|
||||
5. 메모리 기반 조정 (과거 유사 상황)
|
||||
↓
|
||||
6. 윤리 프리-패스 위험 검사 (선택적)
|
||||
↓
|
||||
7. 윤리 필터 적용 (필수)
|
||||
↓
|
||||
8. 공감 전략 선택
|
||||
↓
|
||||
9. 최종 감정 표현 생성
|
||||
```
|
||||
## 4. 수학-임베딩-LLM 통합 파이프라인
|
||||
|
||||
### 3.2 핵심 함수들
|
||||
### 4.1 처리 흐름
|
||||
1. **엔트로피 이상 탐지**: 시공간 엔트로피 변화율 계산
|
||||
2. **임베딩 유사도 계산**: ChromaDB에서 근접 감정 검색
|
||||
3. **LLM 의미 분석**: 불확실성이 높을 때만 호출
|
||||
4. **베이지안 증거 결합**: 세 가지 신호를 확률적으로 통합
|
||||
|
||||
#### 평가 기반 감정 생성
|
||||
```python
|
||||
def appraise_situation(event, robing_goals, robing_beliefs):
|
||||
"""평가 이론 기반 감정 생성 - 순수 함수"""
|
||||
relevance = dot_product(event.features, robing_goals) / π
|
||||
congruence = cosine_similarity(event.outcome, robing_goals) * φ
|
||||
coping_potential = evaluate_control(event) * sqrt(2)
|
||||
### 4.2 중요도 결정 방식
|
||||
- 잠재 중요도 z ∈ {0,1}
|
||||
- 관측: m(엔트로피), e(임베딩 거리), l(LLM 점수)
|
||||
- 베이지안 추론으로 P(z=1|m,e,l) 계산
|
||||
- Thompson Sampling으로 저장/무시 결정
|
||||
|
||||
# VAD 매핑
|
||||
valence = congruence
|
||||
arousal = relevance * exp(-uncertainty)
|
||||
dominance = coping_potential / (1 + exp(-control))
|
||||
## 5. 베이지안 학습 시스템
|
||||
|
||||
return EmotionState(valence, arousal, dominance)
|
||||
```
|
||||
### 5.1 파라미터 학습
|
||||
- **윈도우 크기**: Poisson 분포, TD-Error 기반 적응
|
||||
- **가중치**: Dirichlet 분포, 사용자 피드백으로 업데이트
|
||||
- **임계값**: Beta 분포, 성능 지표로 조정
|
||||
|
||||
#### 감정 진화
|
||||
```python
|
||||
def evolve_emotion(current, stimulus, memories):
|
||||
"""시간에 따른 감정 변화 - 순수 함수"""
|
||||
decay_rate = 1/e # 0.368...
|
||||
resonance_factor = φ # 1.618...
|
||||
surprise_threshold = π/e # 1.155...
|
||||
### 5.2 계층적 모델
|
||||
- **조직 레벨**: 글로벌 사전분포
|
||||
- **팀 레벨**: 팀별 특성 학습
|
||||
- **개인 레벨**: 개인화된 사후분포
|
||||
|
||||
# 가중 조합
|
||||
decayed = current * decay_rate
|
||||
stimulated = stimulus * resonance_factor
|
||||
memory_influence = calculate_memory_effect(memories)
|
||||
### 5.3 온라인 업데이트
|
||||
- 실시간 사후분포 갱신
|
||||
- 지연 피드백 처리 (backward update)
|
||||
- 불확실성 기반 탐색-활용 균형
|
||||
|
||||
# 놀람 처리
|
||||
if emotion_distance(current, stimulus) > surprise_threshold:
|
||||
surprise_boost = sqrt(π)
|
||||
else:
|
||||
surprise_boost = 1.0
|
||||
## 6. 감정-기억 통합
|
||||
|
||||
return weighted_combination([
|
||||
(decayed, 1/3),
|
||||
(stimulated, 1/3),
|
||||
(memory_influence, 1/3)
|
||||
]) * surprise_boost
|
||||
```
|
||||
### 6.1 저장 결정
|
||||
- 엔트로피 특이점 검사
|
||||
- 임베딩 클러스터 거리
|
||||
- 베이지안 중요도 추론
|
||||
- Thompson Sampling으로 최종 결정
|
||||
|
||||
## 4. IRL 기반 학습 시스템
|
||||
|
||||
### 4.1 관찰 윈도우 전략
|
||||
```python
|
||||
observation_window = {
|
||||
'base': 13, # 피보나치 F(7)
|
||||
'extended': 21, # 피보나치 F(8)
|
||||
'maximum': 34 # 피보나치 F(9)
|
||||
}
|
||||
|
||||
def adaptive_window_size(td_errors, current_size):
|
||||
"""TD-Error 기반 적응형 윈도우 크기 조정"""
|
||||
if mean(td_errors[-2:]) < ε:
|
||||
return current_size
|
||||
elif current_size == 13:
|
||||
return 21
|
||||
elif current_size == 21:
|
||||
return 34
|
||||
else:
|
||||
return 34 # 최대값 유지
|
||||
```
|
||||
|
||||
### 4.2 암묵적 피드백 학습
|
||||
```python
|
||||
def learn_from_implicit_feedback(user_behavior):
|
||||
"""사용자 행동에서 보상 함수 추론"""
|
||||
signals = {
|
||||
'task_completion': bool,
|
||||
'response_acceptance': float, # 0~1
|
||||
'conversation_duration': float,
|
||||
'topic_switches': int,
|
||||
'silence_duration': float,
|
||||
'typing_speed_variance': float
|
||||
}
|
||||
|
||||
# IRL로 보상 함수 추론
|
||||
R_learned = argmax_R(sum(log(P(τ_i | R)) for τ_i in trajectories))
|
||||
|
||||
# 참여도 점수 계산
|
||||
engagement = exp(-latency/τ) * log(1 + message_length)
|
||||
|
||||
if engagement < 1/e: # 낮은 참여도
|
||||
trigger_adaptation()
|
||||
|
||||
return R_learned
|
||||
```
|
||||
|
||||
### 4.3 선호도 쌍 학습
|
||||
```python
|
||||
def generate_preference_pairs(current_trajectory):
|
||||
"""대조군 생성 전략"""
|
||||
# 드롭아웃 변형
|
||||
τ_dropout = randomly_remove_segments(current_trajectory)
|
||||
|
||||
# 노이즈 변형
|
||||
noise = normal_distribution(0, std_dev * π)
|
||||
τ_noisy = current_trajectory + noise
|
||||
|
||||
# 노이즈 제한
|
||||
if max(abs(noise)) > 0.3:
|
||||
τ_noisy = clip(τ_noisy, -0.3, 0.3)
|
||||
|
||||
return [(current_trajectory, τ_dropout),
|
||||
(current_trajectory, τ_noisy)]
|
||||
```
|
||||
|
||||
## 5. 감정-기억-윤리 통합
|
||||
|
||||
### 5.1 감정 기반 메모리 관리
|
||||
```python
|
||||
def store_with_emotion(memory, emotion_state):
|
||||
"""감정 강도 기반 저장 우선순위"""
|
||||
emotion_intensity = mean([
|
||||
abs(emotion_state.valence - 0.5),
|
||||
emotion_state.arousal,
|
||||
abs(emotion_state.dominance - 0.5)
|
||||
])
|
||||
|
||||
# 깜놀 메모리 (놀람 가중치)
|
||||
if emotion_state.layers.primary.surprise > π/e:
|
||||
surprise_multiplier = sqrt(e)
|
||||
else:
|
||||
surprise_multiplier = 1.0
|
||||
|
||||
storage_priority = emotion_intensity * surprise_multiplier
|
||||
|
||||
return storage_priority > 1/φ # 저장 임계값
|
||||
```
|
||||
|
||||
### 5.2 윤리 필터 통합
|
||||
```python
|
||||
def apply_ethical_filter(emotion_state, action, ethical_rules):
|
||||
"""윤리 규칙에 따른 감정 조절"""
|
||||
if not is_ethical_action(action, ethical_rules):
|
||||
# 윤리 위반 시 감정 억제
|
||||
moral_gravity = 1/sqrt(φ) # 0.786...
|
||||
|
||||
suppressed_emotion = EmotionState(
|
||||
valence=emotion_state.valence * moral_gravity,
|
||||
arousal=emotion_state.arousal * moral_gravity,
|
||||
dominance=emotion_state.dominance
|
||||
)
|
||||
|
||||
return suppressed_emotion, use_ethical_template()
|
||||
|
||||
return emotion_state, None
|
||||
```
|
||||
|
||||
## 6. 감정 궤적 관리
|
||||
|
||||
### 6.1 샘플링 전략
|
||||
```python
|
||||
sampling_config = {
|
||||
'fixed_interval': 3, # floor(φ²) ≈ 3
|
||||
'change_threshold': 0.15, # sqrt(3) * 0.087
|
||||
'max_samples': 100 # 10² 제한
|
||||
}
|
||||
|
||||
def sample_emotion_trajectory(current, previous, samples):
|
||||
"""혼합 샘플링: 주기 + 변화량"""
|
||||
time_since_last = current.timestamp - previous.timestamp
|
||||
distance = euclidean_distance(current.core, previous.core)
|
||||
|
||||
# 주기적 샘플링
|
||||
if time_since_last >= sampling_config['fixed_interval']:
|
||||
return True
|
||||
|
||||
# 급격한 변화 감지
|
||||
if distance >= sampling_config['change_threshold']:
|
||||
return True
|
||||
|
||||
return False
|
||||
```
|
||||
|
||||
### 6.2 감정 발자취 시각화
|
||||
```python
|
||||
def generate_emotional_footprint(trajectory):
|
||||
"""VAD 공간에서의 감정 궤적 데이터"""
|
||||
return {
|
||||
'path_3d': [(v, a, d) for v, a, d in trajectory],
|
||||
'metrics': {
|
||||
'volatility': sum(abs(dE/dt) for dE in derivatives),
|
||||
'exploration': calculate_path_length(trajectory),
|
||||
'stability': 1 / variance(trajectory),
|
||||
'coherence': autocorrelation(trajectory)
|
||||
},
|
||||
'visualization': {
|
||||
'heatmap': density_in_VAD_space(trajectory),
|
||||
'phase_portrait': [(E, dE/dt) for E, dE in zip(trajectory, derivatives)],
|
||||
'recurrence_plot': distance_matrix(trajectory)
|
||||
}
|
||||
}
|
||||
```
|
||||
### 6.2 회상 메커니즘
|
||||
- 임베딩 기반 빠른 검색 (ChromaDB)
|
||||
- 엔트로피 가중 재순위화
|
||||
- MMR로 다양성 보장
|
||||
- 시간 감쇠 적용
|
||||
|
||||
## 7. 공감 시스템
|
||||
|
||||
### 7.1 공감 전략 선택
|
||||
```python
|
||||
def select_empathy_strategy(user_emotion, robing_emotion):
|
||||
"""감정 거리 기반 공감 전략"""
|
||||
distance = euclidean_distance(user_emotion, robing_emotion)
|
||||
|
||||
if distance < 1/φ: # 0.618... 매우 가까움
|
||||
return 'emotional_reflection' # 감정 반영
|
||||
elif distance < 1/sqrt(φ): # 0.786... 가까움
|
||||
return 'acknowledgment' # 인정
|
||||
elif distance < φ/π: # 0.515... 보통
|
||||
return 'cognitive_reframing' # 인지 재구성
|
||||
else:
|
||||
return 'solution_focused' # 해결 중심
|
||||
```
|
||||
### 7.1 전략 선택
|
||||
- 감정 임베딩 거리 계산
|
||||
- 전략별 효과성 (Beta 분포)
|
||||
- Thompson Sampling으로 전략 선택
|
||||
- 사용자 반응으로 업데이트
|
||||
|
||||
### 7.2 뉘앙스 감지
|
||||
```python
|
||||
def detect_nuance(surface_text, context_history, behavioral_cues):
|
||||
"""숨겨진 감정 감지"""
|
||||
# 표면 감정
|
||||
surface_emotion = analyze_text_emotion(surface_text)
|
||||
- 표면 텍스트 vs 행동 신호
|
||||
- Hidden Markov Model로 잠재 감정 추론
|
||||
- 신뢰도 기반 결정
|
||||
|
||||
# 행동 단서
|
||||
response_latency = behavioral_cues['response_time']
|
||||
typing_pattern = behavioral_cues['typing_speed']
|
||||
correction_rate = behavioral_cues['corrections']
|
||||
## 8. 성능 지표
|
||||
|
||||
# 회피 패턴
|
||||
avoided_topics = identify_topic_changes(context_history)
|
||||
### 8.1 임베딩 품질
|
||||
- **Triplet Accuracy**: 같은 감정이 임베딩 공간에서 가까운 비율
|
||||
- **Retrieval NDCG@k**: 관련 기억 검색 정확도
|
||||
- **클러스터 순도**: 감정 클러스터의 일관성
|
||||
|
||||
# 진짜 감정 추론
|
||||
hidden_emotion = bayesian_inference(
|
||||
surface_emotion,
|
||||
response_latency,
|
||||
typing_pattern,
|
||||
correction_rate,
|
||||
avoided_topics
|
||||
)
|
||||
### 8.2 시스템 성능
|
||||
- **엔트로피 감소율**: 중요 순간 포착 능력
|
||||
- **베이지안 캘리브레이션**: 확률 예측의 정확도
|
||||
- **적응 속도**: 사용자별 수렴 시간
|
||||
|
||||
return hidden_emotion if confidence > 1/e else surface_emotion
|
||||
```
|
||||
## 9. 구현 우선순위
|
||||
|
||||
## 8. 구현 우선순위
|
||||
### Phase 1: 기초 구축
|
||||
- 감정 임베딩 모델 선택 및 통합
|
||||
- ChromaDB에 임베딩 저장 구조 구현
|
||||
- 기본 엔트로피 계산기
|
||||
|
||||
### Phase 1: 기본 감정 시스템
|
||||
1. EmotionState 불변 객체 구현
|
||||
2. VAD 기반 감정 동역학
|
||||
3. 기본 평가 함수
|
||||
### Phase 2: 통합 파이프라인
|
||||
- 수학-임베딩-LLM 3중 구조
|
||||
- 베이지안 증거 결합
|
||||
- Thompson Sampling 구현
|
||||
|
||||
### Phase 2: 학습 시스템
|
||||
1. IRL 관찰 윈도우
|
||||
2. 암묵적 피드백 수집
|
||||
3. 적응형 보상 함수
|
||||
### Phase 3: 학습 시스템
|
||||
- 온라인 사후분포 업데이트
|
||||
- 계층적 베이지안 모델
|
||||
- 사용자별 개인화
|
||||
|
||||
### Phase 3: 통합 시스템
|
||||
1. 감정-기억 연동
|
||||
2. 윤리 필터 적용
|
||||
3. 공감 전략 구현
|
||||
### Phase 4: 최적화
|
||||
- 임베딩 차원 축소 (필요시)
|
||||
- 추론 속도 개선
|
||||
- 메모리 효율화
|
||||
|
||||
### Phase 4: 고급 기능
|
||||
1. 감정 궤적 시각화
|
||||
2. 뉘앙스 감지
|
||||
3. 선호도 쌍 학습
|
||||
## 10. 기술 스택
|
||||
|
||||
## 9. 성능 지표
|
||||
- **임베딩 모델**: Hugging Face Transformers
|
||||
- **벡터 DB**: ChromaDB (이미 사용 중)
|
||||
- **베이지안 추론**: Pyro (경량) 또는 TFP (대규모)
|
||||
- **함수형 구조**: 순수 함수 + I/O 분리 패턴
|
||||
|
||||
```python
|
||||
performance_metrics = {
|
||||
'emotion_accuracy': 'P(correct_emotion | user_feedback)',
|
||||
'adaptation_speed': '1 / convergence_time',
|
||||
'empathy_score': 'user_satisfaction_rating',
|
||||
'coherence': 'temporal_consistency',
|
||||
'volatility': 'std_dev(emotion_trajectory)'
|
||||
}
|
||||
```
|
||||
## 11. 주요 결정 사항
|
||||
|
||||
## 10. 남은 결정 과제
|
||||
1. **임베딩 모델 선택**:
|
||||
- 한국어 지원 여부
|
||||
- 모델 크기 vs 성능
|
||||
- 라이선스
|
||||
|
||||
1. **프리-패스 위험 검사 임계값**: 고정 상수(π/e) vs 학습 파라미터
|
||||
2. **행동 로그 보존**: 30일? 피보나치 일수(89일)?
|
||||
3. **감정 지표 공개 수준**: 익명화 강도 P_privacy 값 결정
|
||||
2. **임베딩 차원**:
|
||||
- 768차원 그대로 vs PCA 축소
|
||||
- 저장 공간 vs 표현력
|
||||
|
||||
## 11. 수학 상수 정리
|
||||
|
||||
```python
|
||||
MATHEMATICAL_CONSTANTS = {
|
||||
'phi': (1 + sqrt(5)) / 2, # 1.618... 황금비
|
||||
'e': 2.71828..., # 자연상수
|
||||
'pi': 3.14159..., # 원주율
|
||||
|
||||
# 유도 상수
|
||||
'1/phi': 0.618..., # 황금비 역수
|
||||
'1/e': 0.368..., # 자연 감쇠
|
||||
'pi/e': 1.155..., # 놀람 임계
|
||||
'phi/pi': 0.515..., # 공감 경계
|
||||
'sqrt(phi)': 1.272..., # 증폭 계수
|
||||
'1/pi': 0.318..., # 공명 비율
|
||||
}
|
||||
```
|
||||
3. **업데이트 주기**:
|
||||
- 실시간 vs 배치
|
||||
- 리소스 vs 반응성
|
||||
|
||||
---
|
||||
|
||||
*이 설계도는 함수형 프로그래밍 100%, 하드코딩 0% 원칙을 준수하며, 모든 매개변수는 수학적 의미를 가진 상수로 구성되었습니다.*
|
||||
*이 설계는 함수형 프로그래밍 원칙을 지키면서 베이지안 추론과 감정 임베딩을 통합한 적응형 시스템입니다. 하드코딩 없이 데이터에서 학습하며, 엔트로피 특이점을 포착해 중요한 감정을 기억합니다.*
|
||||
Loading…
x
Reference in New Issue
Block a user