diff --git a/troubleshooting/250808_claude_감정모델ONNX변환.md b/troubleshooting/250808_claude_감정모델ONNX변환.md new file mode 100644 index 0000000..4d3cedc --- /dev/null +++ b/troubleshooting/250808_claude_감정모델ONNX변환.md @@ -0,0 +1,142 @@ +# 한국어 감정 분류 모델 ONNX 변환 작업 + +작성일: 2025년 8월 8일 +작성자: Claude (51124 서버) + +## 작업 배경 + +rb10508_micro의 감정 시스템이 균등 분포 임시 코드를 사용 중이어서 실제 감정 분류 모델 통합이 필요했음. + +## 작업 과정 + +### 오후 12시 10분 - 감정 모델 조사 + +한국어 감정 분류 모델 후보군 조사: +1. **nlp04/korean_sentiment_analysis_kcelectra** - F1 70.72%, MIT 라이센스 +2. **monologg/koelectra-base-v3-goemotions** - 28개 감정, 라이센스 불명확 +3. **hun3359/klue-bert-base-sentiment** - 60개 감정, F1 29.10% +4. **tabularisai/multilingual-sentiment-analysis** - 5개 감정, 541MB + +1순위로 nlp04/korean_sentiment_analysis_kcelectra 선정. + +### 오후 12시 16분 - 모델 다운로드 및 ONNX 변환 + +```bash +cd /home/admin/ivada_project/onnx_models +mkdir -p korean-sentiment-kcelectra +``` + +모델 정보: +- **레이블 수**: 11개 +- **감정 카테고리**: + - 0: 기쁨(행복한) + - 1: 고마운 + - 2: 설레는(기대하는) + - 3: 사랑하는 + - 4: 즐거운(신나는) + - 5: 일상적인 + - 6: 생각이 많은 + - 7: 슬픔(우울한) + - 8: 힘듦(지침) + - 9: 짜증남 + - 10: 걱정스러운(불안한) + +ONNX 변환 완료: +- **모델 크기**: 488MB +- **토크나이저**: 저장 완료 +- **최대 시퀀스 길이**: 512 + +### 오후 12시 20분 - skill-embedding 구조 확인 + +skill-embedding 서비스 분석 결과: +- `/app/embedder.py`: ONNXEmbedder 클래스 이미 구현됨 +- `/app/http_embedding_function.py`: HTTPEmbeddingFunction 클래스 구현됨 +- 포트 8015에서 실행 중 + +별도 유틸리티 파일 생성 불필요함을 확인. + +### 오후 12시 30분 - 트러블슈팅 문서 수정 + +`250804_claude_ONNX임베딩경량화.md` 문서에서 잘못된 참조 수정: +- `onnx_embedder.py`, `chroma_onnx_function.py`는 별도 파일로 생성되지 않음 +- 실제로는 skill-embedding 서비스에 직접 구현됨 + +## 준비된 모델 구조 + +``` +/home/admin/ivada_project/onnx_models/ +├── multilingual-MiniLM-L12-v2/ # 임베딩 모델 (기존) +│ ├── model.onnx (449MB) +│ └── tokenizer 파일들 +└── korean-sentiment-kcelectra/ # 감정 모델 (신규) + ├── model.onnx (488MB) + ├── model_info.json + └── tokenizer 파일들 +``` + +## 다음 단계 (로컬 개발자 작업) + +### 1. skill-embedding 서비스 수정 + +새 엔드포인트 추가 예시: +```python +# /app/emotion.py (신규) +class ONNXEmotionClassifier: + def __init__(self, model_dir="/models/onnx/korean-sentiment-kcelectra"): + # ONNX 세션 초기화 + # 토크나이저 로드 + pass + + def predict(self, text): + # 11개 감정 분류 + pass + + def map_to_basic_emotions(self, text): + # 11개 → 5개 기본 감정 매핑 + pass + +# /app/main.py에 추가 +@app.post("/emotion") +async def analyze_emotion(request: TextRequest): + emotions = classifier.predict(request.text) + return {"emotions": emotions} +``` + +### 2. rb10508_micro 수정 + +```python +# app/core/emotion/base.py +async def analyze_basic_emotions(text: str) -> List[float]: + """skill-embedding 서비스 호출""" + response = await http_client.post( + "http://skill-embedding:8015/emotion", + json={"text": text} + ) + return response.json()["emotions"] +``` + +### 3. 11개 → 5개 감정 매핑 규칙 + +```python +mapping = { + 'joy': ['기쁨(행복한)', '고마운', '설레는(기대하는)', '사랑하는', '즐거운(신나는)'], + 'sadness': ['슬픔(우울한)', '힘듦(지침)'], + 'anger': ['짜증남'], + 'fear': ['걱정스러운(불안한)'], + 'neutral': ['일상적인', '생각이 많은'] +} +``` + +## 교훈 + +1. **문서의 정확성**: 트러블슈팅 문서는 실제 구현과 일치해야 함 +2. **기존 서비스 활용**: skill-embedding 서비스가 이미 ONNX 처리 기능을 갖추고 있어 재사용 가능 +3. **모델 선정 기준**: 라이센스, 성능, 검증도, 크기를 종합적으로 고려 +4. **ONNX 변환 이점**: PyTorch 의존성 제거로 경량화 달성 + +## 성과 + +- 한국어 감정 분류 모델 ONNX 변환 완료 +- 11개 세밀한 감정 분류 가능 +- skill-embedding 서비스와 통합 준비 완료 +- rb10508_micro의 임시 균등 분포 코드 대체 가능 \ No newline at end of file