diff --git a/journey/plans/251204_emotion_based_addressing_system.md b/journey/plans/251204_emotion_based_addressing_system.md index fcbffe5..8280a53 100644 --- a/journey/plans/251204_emotion_based_addressing_system.md +++ b/journey/plans/251204_emotion_based_addressing_system.md @@ -45,31 +45,47 @@ LLM 역할: 결정된 호칭 자연스럽게 사용만 **부정 감정**: fear, anger, sadness, disgust **감정 소스**: emotion_readings 최근 10분 평균 (현재 메시지 가중치 2배) -## 구현 +## 구현 (계층 분리 원칙 준수) -### 1. database.py -**추가**: `get_user_preferred_name(user_id, current_emotion) -> str` -- user 테이블에서 name, metadata 조회 -- emotion_readings 최근 10분 평균 계산 -- 규칙 적용하여 호칭 반환 +### 계층 구조 +``` +router.py (감정 분석 후) + ↓ +services/addressing_service.py (신규, 호칭 결정 비즈니스 로직) + ↓ +state/database.py (DB CRUD만) +``` -### 2. router.py:264-283 -**추가**: +### 1. services/addressing_service.py (신규) +**기능**: 호칭 결정 비즈니스 로직 +- `get_preferred_name(user_id: str, current_emotion: str) -> str` +- state 호출: user 정보, 최근 감정 조회 +- 호칭 규칙 적용 (직책 → 긍정감정=nickname → 부정감정=정식이름) +- 약 100줄 예상 + +### 2. state/database.py +**기존 함수 확인 후**: +- 없으면 추가: `get_user_basic_info(user_id)` - name, metadata 반환 +- 없으면 추가: `get_recent_emotions(user_id, minutes=10)` - 감정 평균 +- DB CRUD만, 비즈니스 로직 금지 + +### 3. router.py:264-283 +**수정**: 감정 분석 후 addressing_service 호출 ```python -# 감정 분석 후 -preferred_name = await get_user_preferred_name(user_id, user_emotion) +from app.services.addressing_service import get_preferred_name +preferred_name = await get_preferred_name(user_id, user_emotion) context['preferred_name'] = preferred_name ``` -### 3. llm_service.py:131-132 -**수정**: system_instruction에 호칭 지시 추가 +### 4. llm_service.py:131-132 +**수정**: system_instruction에 호칭 지시 ```python preferred_name = enhanced_context.get('preferred_name', '사용자') system_instruction += f"사용자를 '{preferred_name}'으로 호칭하세요. " ``` -### 4. tables.md -**추가**: user 테이블 metadata 컬럼 설명 +### 5. tables.md +**추가**: user.metadata 컬럼 문서화 ``` | metadata | JSONB | YES | nickname, position, short_name, preferences | ```