DOCS/troubleshooting/250808_claude_감정모델ONNX변환.md
happybell80 18ac5845b4 docs: 임베딩 서비스 포트 번호 수정 및 문서 업데이트
- skill-embedding 포트 8015 -> 8515로 수정
- 로빙 컨테이너 경량화 전략 문서 업데이트
- 함수형 프로그래밍 가이드라인 개선
- 트러블슈팅 문서들 오타 및 포맷 수정
2025-08-20 16:51:53 +09:00

4.3 KiB

한국어 감정 분류 모델 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 변환

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 클래스 구현됨
  • 포트 8515에서 실행 중

별도 유틸리티 파일 생성 불필요함을 확인.

오후 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 서비스 수정

새 엔드포인트 추가 예시:

# /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 수정

# app/core/emotion/base.py
async def analyze_basic_emotions(text: str) -> List[float]:
    """skill-embedding 서비스 호출"""
    response = await http_client.post(
        "http://skill-embedding:8515/emotion",
        json={"text": text}
    )
    return response.json()["emotions"]

3. 11개 → 5개 감정 매핑 규칙

mapping = {
    'joy': ['기쁨(행복한)', '고마운', '설레는(기대하는)', '사랑하는', '즐거운(신나는)'],
    'sadness': ['슬픔(우울한)', '힘듦(지침)'],
    'anger': ['짜증남'],
    'fear': ['걱정스러운(불안한)'],
    'neutral': ['일상적인', '생각이 많은']
}

교훈

  1. 문서의 정확성: 트러블슈팅 문서는 실제 구현과 일치해야 함
  2. 기존 서비스 활용: skill-embedding 서비스가 이미 ONNX 처리 기능을 갖추고 있어 재사용 가능
  3. 모델 선정 기준: 라이센스, 성능, 검증도, 크기를 종합적으로 고려
  4. ONNX 변환 이점: PyTorch 의존성 제거로 경량화 달성

성과

  • 한국어 감정 분류 모델 ONNX 변환 완료
  • 11개 세밀한 감정 분류 가능
  • skill-embedding 서비스와 통합 준비 완료
  • rb10508_micro의 임시 균등 분포 코드 대체 가능