docs: EmotionState 에러 해결 전략 및 51124 서버 확인 사실 추가
- 정확한 에러 발생 시간 (13:29:52, 13:30:01) - 4곳의 에러 발생 위치 명시 (line 35, 67, 80-83, 89) - 해결 전략 문서화 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
bdd450945f
commit
1e0596b578
@ -0,0 +1,140 @@
|
||||
# Slack 봇 메시지 403 에러 처리
|
||||
|
||||
## 발생 일시
|
||||
2025-10-02 13:29 ~ 13:31
|
||||
|
||||
## 현상
|
||||
robeing-gateway 로그에서 지속적인 403 Forbidden 에러 발생
|
||||
|
||||
### 에러 로그
|
||||
```
|
||||
app.services.slack_proxy - WARNING - No UUID found for Slack user U0935RJ60V6
|
||||
app.routers.slack - ERROR - User not registered: team_id=T0925SXPS4D, slack_user_id=U0935RJ60V6
|
||||
```
|
||||
|
||||
### 패턴
|
||||
- **빈도**: 1-2분마다 반복 발생
|
||||
- **HTTP 응답**: 403 Forbidden
|
||||
- **영향**: 불필요한 에러 로그 생성, 리소스 낭비
|
||||
|
||||
## 원인 분석
|
||||
|
||||
### 문제의 핵심
|
||||
`U0935RJ60V6`는 로빙(Robeing) 봇의 Slack User ID로, 봇이 메시지를 보낼 때마다 게이트웨이가 이를 일반 사용자 메시지로 처리하려고 시도
|
||||
|
||||
### 상세 분석
|
||||
1. **현재 로직**
|
||||
- 모든 Slack 이벤트에 대해 UUID 매핑 요구
|
||||
- 봇 메시지도 사용자 등록 검증 시도
|
||||
- UUID가 없으면 403 반환
|
||||
|
||||
2. **정상 동작 vs 비정상 동작**
|
||||
- 정상: `U0925SXQFDK`(사용자) → UUID 변환 성공 → rb8001 전달 → 200 OK
|
||||
- 비정상: `U0935RJ60V6`(봇) → UUID 찾기 실패 → 403 Forbidden
|
||||
|
||||
## 관련 파일
|
||||
- `/home/admin/robeing-gateway/app/routers/slack.py` (line 56-57)
|
||||
- `/home/admin/robeing-gateway/.env`
|
||||
|
||||
---
|
||||
|
||||
# rb8001 EmotionState 객체 생성 에러
|
||||
|
||||
## 발생 일시
|
||||
2025-10-02 13:29:52, 13:30:01 (KST)
|
||||
- 서버: 51124
|
||||
- 컨테이너: rb8001 (Up About an hour, healthy)
|
||||
- 발생 빈도: 10월 1일 이후 2회
|
||||
|
||||
## 현상
|
||||
- 입력: "로빙 하이"
|
||||
- 응답: "죄송합니다. 요청을 처리할 수 없습니다."
|
||||
- 연속 입력 "왜?"에도 동일한 에러 응답
|
||||
|
||||
## 에러 추적
|
||||
|
||||
### 1. 인사 패턴 미인식
|
||||
- decision_engine.py의 GREETING 패턴: "안녕", "hello", "hi", "반가워"
|
||||
- "로빙 하이"는 전체가 UNKNOWN으로 분류됨
|
||||
- UNKNOWN 타입은 LLM 처리로 넘어감
|
||||
|
||||
### 2. EmotionState 생성자 불일치
|
||||
**rb8001/app/core/emotion/base.py:16-23** (51124 서버 확인)
|
||||
```python
|
||||
class EmotionState(NamedTuple):
|
||||
basic_dist: List[float] # 5개 기본정서 분포
|
||||
social_dist: List[float] # 4개 사회기능 분포
|
||||
combined_dist: List[float] # 9개 통합 분포
|
||||
entropy: float # 엔트로피 값
|
||||
dominant: str # 주요 감정
|
||||
mode: str # 'basic', 'social', 'combined'
|
||||
```
|
||||
|
||||
**에러 발생 위치 (4곳)**
|
||||
|
||||
**rb8001/app/llm/emotion_llm.py:35**
|
||||
```python
|
||||
emotion_state = EmotionState(
|
||||
emotions=result['probs'], # 잘못된 필드명, 3개 인자만 전달
|
||||
dominant=result['top_label'],
|
||||
entropy=result['entropy']
|
||||
)
|
||||
```
|
||||
|
||||
**rb8001/app/llm/emotion_llm.py:67**
|
||||
```python
|
||||
except Exception as e:
|
||||
logger.error(f"감정 분석 실패: {e}")
|
||||
return EmotionState() # 빈 생성자 호출 - 6개 인자 필요
|
||||
```
|
||||
|
||||
**rb8001/app/llm/emotion_llm.py:80-83**
|
||||
```python
|
||||
emotion_state = EmotionState(
|
||||
emotions=user_emotion.get('probs', {}), # 잘못된 필드명, 3개 인자만 전달
|
||||
dominant=user_emotion.get('top_label', 'neutral'),
|
||||
entropy=user_emotion.get('entropy', 1.0)
|
||||
)
|
||||
```
|
||||
|
||||
**rb8001/app/llm/emotion_llm.py:89**
|
||||
```python
|
||||
else:
|
||||
emotion_state = EmotionState() # 빈 생성자 호출
|
||||
```
|
||||
|
||||
### 3. 에러 발생 순서
|
||||
1. "로빙 하이" → UNKNOWN 분류 (DecisionEngine)
|
||||
2. LLM 처리 시도 (app.llm.llm_service)
|
||||
3. EmotionState() 빈 생성자 호출 또는 3개 인자만 전달
|
||||
4. TypeError: EmotionState.__new__() missing 6 required positional arguments: 'basic_dist', 'social_dist', 'combined_dist', 'entropy', 'dominant', and 'mode'
|
||||
5. fallback_message 반환: "죄송합니다. 요청을 처리할 수 없습니다."
|
||||
|
||||
## 문제 파일
|
||||
- `/home/happybell/projects/ivada/rb8001/app/llm/emotion_llm.py` (line 35, 67, 80-83, 89)
|
||||
- `/home/happybell/projects/ivada/rb8001/app/core/emotion/base.py` (line 16-23)
|
||||
|
||||
## 해결 전략
|
||||
|
||||
### EmotionState 기본값 함수 추가
|
||||
**rb8001/app/core/emotion/base.py**에 추가:
|
||||
```python
|
||||
def create_default_emotion_state() -> EmotionState:
|
||||
basic_dist = [0.2] * 5
|
||||
social_dist = [0.25] * 4
|
||||
combined_dist = [1.0/9] * 9
|
||||
return EmotionState(basic_dist, social_dist, combined_dist, 2.197, 'neutral', 'combined')
|
||||
```
|
||||
|
||||
### emotion_llm.py 수정
|
||||
- Line 67: `return create_default_emotion_state()`
|
||||
- Line 89: `emotion_state = create_default_emotion_state()`
|
||||
- Line 80-84: 올바른 필드명으로 재구성
|
||||
|
||||
### 인사 패턴 추가
|
||||
**rb8001/app/brain/decision_engine.py:103-105**
|
||||
```python
|
||||
IntentType.GREETING: [
|
||||
r"안녕", r"hello", r"hi", r"반가워", r"하이", r"로빙.*하이"
|
||||
]
|
||||
```
|
||||
Loading…
x
Reference in New Issue
Block a user