From 54804e4fed3e5c2d718b60f84cc0cb7ea1d8392a Mon Sep 17 00:00:00 2001 From: happybell80 Date: Thu, 2 Oct 2025 14:58:02 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EA=B0=90=EC=A0=95=20DB=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 20251002_emotion_db_storage_fix.md: 해결 완료 항목 정리 - 20251002_emotion_system_todo.md: 미구현 항목 분리 - 긴 문서를 2개로 분할 (각 50줄 이내) --- ..._감정_분석_시스템_구현_계획.md | 95 ------- .../20251002_emotion_db_storage_fix.md | 42 +++ .../20251002_emotion_system_implementation.md | 253 ------------------ .../20251002_emotion_system_todo.md | 47 ++++ 4 files changed, 89 insertions(+), 348 deletions(-) delete mode 100644 ideas/250916_로빙_감정_분석_시스템_구현_계획.md create mode 100644 troubleshooting/20251002_emotion_db_storage_fix.md delete mode 100644 troubleshooting/20251002_emotion_system_implementation.md create mode 100644 troubleshooting/20251002_emotion_system_todo.md diff --git a/ideas/250916_로빙_감정_분석_시스템_구현_계획.md b/ideas/250916_로빙_감정_분석_시스템_구현_계획.md deleted file mode 100644 index be1693b..0000000 --- a/ideas/250916_로빙_감정_분석_시스템_구현_계획.md +++ /dev/null @@ -1,95 +0,0 @@ -# 로빙 감정 분석 시스템 구현 계획 - -> 사용자의 사양(7개 감정, klue/bert-base, Temperature Scaling, ONNX 추론)을 전제로, 로빙이 감정 그래프를 생성하고 제공하기 위한 구현 순서와 운영 항목을 정리한 문서입니다. - ---- - -## 1. 목표와 범위 - -로빙은 한국어 텍스트 입력을 받아 7개 감정(fear, surprise, anger, sadness, neutral, happiness, disgust) 확률을 산출하고, 보정된 확률 기반의 시계열 그래프와 요약 리포트를 제공합니다. 실시간 대화형(배치 1)과 비동기 배치(8–32) 처리를 모두 지원합니다. - -**[현재 프로젝트 상태]** app/core/emotion/base.py에 9개 감정 임시 균등값만 존재. EMOTION_TEMPERATURE 변수 있으나 스케일링 미적용. ONNX 추론 미통합. emotion_readings 테이블 없음. /v1/emotion/* API 엔드포인트 미구현 (test_endpoint.py의 /emotion만 존재). - -## 2. 모델 파이프라인 - -* **입력 전처리:** `klue/bert-base` 토크나이저 사용, 최대 길이 128로 고정, 잘림 규칙 명시. -* **추론 모델:** 7개 클래스 단일 라벨 분류기. 원시 로짓(logits)을 산출. -* **확률 보정:** Temperature Scaling `Softmax(z/T)`으로 확률 보정. -* **후처리:** - * 최댓값 확률과 엔트로피 계산. - * 임계값(기본 τ=0.45) 미만은 `unknown`으로 강등. -* **버저닝:** `model_version`과 `temperature` 값을 쌍으로 관리. 모델 교체 시 T를 반드시 재추정. - -## 3. Temperature Scaling 운용 - -* **학습:** 검증 세트(validation set)로만 T 값을 추정 (L-BFGS-B 알고리즘, 목적 함수 NLL, 보조 지표 ECE). -* **관리:** 배포 구성 파일에 모델 버전별 T 값을 기록. 모델 교체 시 재보정 필수. -* **품질 기준:** 보정 전 대비 NLL 및 ECE 감소를 최소 기준으로 삼음. - -## 4. ONNX 변환 및 추론 최적화 - -* **변환:** `transformers optimum` 또는 `onnx export` 사용 (opset 17, 동적 축 지정). -* **실행:** ONNX Runtime, 그래프 최적화 `ORT_ENABLE_ALL`, 스레드 수 고정. -* **양자화 (선택):** 동적 양자화 적용 후 정밀도, 지연, ECE 재점검. -* **지연 관리:** 실시간 p95 지연 목표 수립 (예: 40–80ms on CPU, 10–20ms on GPU). - -## 5. 저장 스키마 - -`emotion_readings` 테이블에 다음 항목을 저장합니다. - -* `user_id`, `source`, `ts`, `text_hash` -* `model_version`, `temperature` -* `logits[7]`, `probs[7]` -* `top_label`, `top_p`, `entropy`, `meta` - -**주요 인덱스:** -* `(user_id, ts)` 복합 인덱스 -* `meta` GIN 인덱스 - -> **참고:** 원문 텍스트는 별도 저장소에 암호화하여 저장하고, 본 테이블에는 해시값만 유지합니다. - -## 6. 서비스 API - -* `POST /v1/emotion/infer`: 단건 추론. 보정 확률, 라벨, 엔트로피, `top_p`, `model_version`, `temperature`, `ts` 반환. -* `POST /v1/emotion/infer:batch`: 최대 128건 배치 처리. 서버 내부에서 마이크로배칭 및 캐시 적용. -* `GET /v1/emotion/timeseries`: 기간 및 빈도(`bin=1h` 등)별 평균 확률, 지배 라벨, 평균 엔트로피 반환. - -## 7. 시각화 설계 - -* **지배 라벨 타임라인:** 시간축에 최댓값 라벨을 색상 구간으로 표시. EMA(α=0.2) 또는 이동평균을 적용하여 진동 완화. -* **확률 시계열:** 7개 라벨의 확률을 선 그래프로 표시. 기본적으로 상위 2–3개만 강조하고 나머지는 토글로 제어. -* **분포 그래프:** 일/시간대별 스택 영역 차트로 감정 비중 요약. -* **불확실성 표현:** 엔트로피가 높을수록 그래프의 음영 또는 투명도를 조절하여 시각적으로 표현. -* **Slack 연동:** 최근 24시간 요약 텍스트(상위 라벨, 평균 엔트로피 등)와 함께 정적 PNG 그래프 또는 대시보드 링크를 제공. - -## 8. 운영 및 모니터링 - -* **모델 건전성:** 주간 혼동 행렬, 라벨별 평균 확률, ECE, NLL 트래킹. -* **데이터 분포:** 사용자별 라벨 분포가 전체 대비 과도하게 치우치면 점검 알림. -* **성능:** p95 추론 지연, 큐 대기 시간, 배치 처리량 모니터링. -* **알림 정책:** 부정 라벨 비중이 지속적으로 상승하거나 엔트로피가 급증하는 구간을 탐지. 단, 알림은 사용자 동의 범위 내에서만 제안형으로 표시. - -## 9. 보안과 프라이버시 - -* **원문 보호:** 원문은 암호화하여 저장하거나 비식별화 처리 후 해시만 유지. -* **삭제 권리:** 사용자가 기간을 지정하여 데이터를 삭제할 수 있는 API 지원. -* **접근 제어:** 본인과 관리자만 열람 가능하도록 스코프 분리. 감사 로그는 최소한으로 기록. - -## 10. 배포 체크리스트 - -- [ ] 검증 세트 분리 및 T 추정 완료 -- [ ] ONNX와 PyTorch 결과의 최대 오차 검증 -- [ ] 보정 전후 NLL·ECE 비교 리포트 산출 -- [ ] 지연 시간 목표(p95) 만족 여부 확인 -- [ ] Slack 메시지 규격 및 이미지 렌더러 동작 확인 -- [ ] 모델 버전, T, 임계값 τ 설정이 구성 서버에 반영되었는지 점검 - -## 11. 1주 구현 순서 (예시) - -* **1일차:** 모델 가중치 확정, 검증 세트 준비, T 추정. -* **2일차:** ONNX 변환 및 추론 엔진 래퍼, 단건 API 구현. -* **3일차:** 배치 API, 저장 스키마 및 리포지토리 구현. -* **4일차:** 시계열 집계 로직, EMA 적용, 그래프 렌더러 구현. -* **5일차:** Slack 요약 카드, PNG 업로드, 권한 및 로깅 적용. -* **6일차:** 품질 대시보드 구축 (ECE, NLL, 혼동 행렬). -* **7일차:** 부하/지연 테스트, 문서화 및 운영 기준 수립. diff --git a/troubleshooting/20251002_emotion_db_storage_fix.md b/troubleshooting/20251002_emotion_db_storage_fix.md new file mode 100644 index 0000000..9101721 --- /dev/null +++ b/troubleshooting/20251002_emotion_db_storage_fix.md @@ -0,0 +1,42 @@ +# 감정 DB 저장 문제 해결 (완료) + +**작성일**: 2025-10-02 14:13~14:30 +**문서 커밋**: +- 1e0596b (13:54:17): EmotionState 에러 해결 전략 추가 +- 251cc6d (14:30시경): 7감정 모델로 문서 업데이트 +**코드 커밋**: ba1edb1 (14:13:38): emotion_llm.py 7감정 구조 변경 +**해결자**: Claude & happybell80 +**문제**: Slack 대화 시 감정 분석은 되지만 emotion_readings 테이블에 저장 안 됨 +**원인**: rb8001/app/llm/emotion_llm.py:159-181에서 save_emotion_reading() 호출 누락 + +## 해결 내역 + +### 1. DB 연결 설정 +- **테이블**: emotion_readings +- **DB**: robeing_metrics (51123 서버) +- **.env 추가**: METRICS_DATABASE_URL 환경변수 + +### 2. EmotionState 구조 변경 (완료) +**문제 위치**: +- emotion_llm.py (line 35, 67, 80-83, 89) - EmotionState 생성 오류 4곳 +- emotion/base.py (line 16-23) - 6개 인자 필요했음 + +**해결**: +- create_default_emotion_state() 함수 추가 +- 6필드 구조 → 4필드로 단순화 (emotion_dist, entropy, dominant, confidence) +- EMOTIONS 7개: fear, surprise, anger, sadness, neutral, happiness, disgust + +### 3. DB 저장 코드 추가 (완료) +- 파일: emotion_llm.py:159-181 +- 함수: generate_response_with_emotion() 내부 +- 추가: save_emotion_reading(emotion_data) 호출 + + +## 현황 +- emotion_readings 테이블: TimescaleDB 하이퍼테이블, 5개 인덱스 +- 기존 데이터: 3건 (2025-10-02 12:21~12:27 테스트) +- 에러 로그: 339회 "Failed to save emotion reading" + +## 검증 필요 +- 배포 후 Slack 대화 시 실제 저장 확인 +- user_id UUID 변환 정상 작동 확인 \ No newline at end of file diff --git a/troubleshooting/20251002_emotion_system_implementation.md b/troubleshooting/20251002_emotion_system_implementation.md deleted file mode 100644 index b4c997d..0000000 --- a/troubleshooting/20251002_emotion_system_implementation.md +++ /dev/null @@ -1,253 +0,0 @@ -# 감정 시스템 구현 문서 (rb8001) - -**작성일**: 2025-10-02 -**작성자**: Claude & happybell80 -**목적**: rb8001의 균등분포 감정 분석을 실제 모델 추론 + 시계열 저장/집계로 전환 - -## 사용자 관점 시나리오 - -### 시나리오 1: 감정 기반 대화 조절 -- **상황**: 사용자가 "프로젝트 실패해서 너무 짜증나" 입력 -- **동작**: 로빙이 분노/좌절 감지 → 공감적이고 차분한 톤으로 응답 조절 -- **효과**: 평소보다 조심스럽게 대안 제시, 비판적 피드백 자제 -- **구현 요구사항**: 감정 분석 API + LLM 프롬프트 동적 조절 - -### 시나리오 2: 장기 감정 패턴 리포트 -- **상황**: 매주 금요일 자동 리포트 -- **동작**: "이번 주 당신의 감정 변화" 시각화 제공 -- **예시**: "월요일 불안 70% → 수요일 기쁨 60% → 금요일 만족 80%" -- **효과**: 번아웃 예방, 정신건강 관리 지원 -- **구현 요구사항**: TimescaleDB 시계열 저장 + time_bucket 집계 쿼리 - -### 시나리오 3: 팀 감정 온도계 -- **상황**: Slack 채널 전체 대화 모니터링 -- **동작**: 실시간 "팀 분위기 지표" 계산 및 제공 -- **효과**: 부정 감정 임계치 초과 시 매니저 알림, 회의 전 팀 감정 브리핑 -- **구현 요구사항**: 채널별 감정 집계 + 임계치 알림 시스템 - -### 시나리오별 요구사항 -- **시나리오 1**: 문장 단건 추론 API, LLM 톤 조절 규칙 (rb8001/app/llm/llm_service.py:119) -- **시나리오 2**: 사용자별 시계열 저장, time_bucket 집계, 요약 API -- **시나리오 3**: 채널/워크스페이스 집계, 임계치 알림, 관리자 요약 API - -## ✅ 최종 구현 완료 (2025-10-02) - -### 핵심 기능 -- ✅ **균등분포 제거**: 실제 ONNX 모델 사용 (aihub-7emotions-v1) -- ✅ **skill-embedding 연동**: HTTP API로 감정 분석 서비스 호출 -- ✅ **DB 저장**: emotion_readings 테이블에 실시간 데이터 저장 (3건 확인) -- ✅ **API 정상 작동**: /v1/emotion/infer 엔드포인트 200 OK - -### 감정 분석 검증 결과 -- 화난 텍스트: sadness 90% (우울/좌절 감지) -- 기쁜 텍스트: happiness 99% (기쁨 감지) -- 분노 텍스트: anger 68.8% (분노 감지) - -### 아키텍처 -- **경량화**: rb8001은 HTTP 클라이언트만, ONNX는 skill-embedding에서 처리 -- **비동기**: asyncio 기반, FastAPI event loop 충돌 해결 -- **폴백**: skill-embedding 장애 시 균등분포 반환 - -### 수정한 파일 -- rb8001/app/router/emotion_endpoint.py: EmotionClassifier 초기화, predict_async 사용 -- rb8001/app/core/emotion/base.py: async 함수로 변경, EmotionClassifier 연동 -- rb8001/app/core/emotion/emotion_classifier.py: skill-embedding HTTP 호출 -- rb8001/app/state/database.py: JSONB 저장 시 json.dumps() 사용 -- rb8001/tests/test_emotion_system.py: async 테스트 수정 -- rb8001/main.py: emotion_router include (line 48-50) - -### DB 현황 -emotion_readings 테이블: 3건 -- 12:27:10 | happiness (90.6%) -- 12:22:56 | happiness (99.2%) -- 12:21:57 | anger (68.8%) - -### 구현 완료 항목 -- ✅ rb8001/app/core/emotion/emotion_classifier.py (skill-embedding 호출) -- ✅ ONNX 모델은 skill-embedding이 처리 -- ✅ emotion_readings 테이블 (51123 서버에서 생성 완료) -- ✅ /v1/emotion/* API 엔드포인트 (구현 완료) -- ✅ asyncio event loop 충돌 수정 -- ✅ JSONB 타입 캐스팅 - -### 미구현 항목 (다음 단계) -- ⏳ LLM 톤 조절: emotion_llm.py 연동 (rb8001/app/llm/llm_service.py:133) -- ⏳ 시계열 집계: TimescaleDB time_bucket 쿼리 -- ⏳ 팀 감정 지표: 채널별/회사별 집계 - -### 활용 가능 시나리오 -- **시나리오 1** (즉시 가능): 감정 기반 대화 톤 자동 조절 -- **시나리오 2-3** (개발 필요): 주간 리포트, 팀 감정 모니터링 - -### ONNX 모델 현황 -- **모델 위치** (51124 서버): /home/admin/ivada_project/onnx_models/aihub-7emotions/ -- **모델 파일**: model.onnx (442MB), BERT 기반 7클래스 감정 분류 -- **레이블**: fear, surprise, anger, sadness, neutral, happiness, disgust -- **토크나이저**: vocab.txt, tokenizer.json 포함 -- **학습 코드** (51124): /home/admin/ivada_project/training_emotion/train_korean_emotion.py -- **처리 방식**: skill-embedding 서비스가 ONNX 모델 처리, rb8001은 HTTP API 호출만 - -## 데이터 모델 설계 - -### emotion_readings 테이블 -필수 컬럼: -- user_id (UUID) - 사용자 감정 -- company_id (UUID) - 회사별 집계용 -- robeing_id (VARCHAR) - 로빙의 감정 상태 (예: 'rb8001') -- emotion_type (VARCHAR) - 'user' | 'robeing' -- created_at (TIMESTAMPTZ) -- probs (JSONB) -- entropy (FLOAT) -- top_label (TEXT) -- top_p (FLOAT) -- model_version (TEXT) -- meta (JSONB) -- text_hash (VARCHAR) - 원문 미저장, 해시만 - -저장 위치: -- robeing_metrics DB (별도 DB 권장) -- TimescaleDB 하이퍼테이블 적용 -- 51123 서버에서 CREATE TABLE 및 create_hypertable() 직접 실행 -- 인덱스: (user_id, created_at), (company_id, created_at), (robeing_id, created_at) - -### TimescaleDB 참조 -- 설치/활성화: DOCS/troubleshooting/250714_system_metrics_implementation.md -- time_bucket 쿼리: frontend-base/backend/metrics_database.py:103 -- asyncpg interval 이슈: DOCS/troubleshooting/250715_metrics_graph_timebucket_error.md - -## API 스펙 - -### POST /v1/emotion/infer -- 입력: text, user_id -- 출력: {probs, entropy, top_label, top_p, model_version} -- 저장: emotion_readings 삽입 - -### GET /v1/emotion/timeseries -- 쿼리: user_id, start, end, bucket -- 출력: bucket별 집계 결과 - -### GET /v1/emotion/team-insight -- 쿼리: channel_id, workspace_id, 기간 -- 출력: 팀 감정 지표 - -## 통합 포인트 - -### 감정 분석 삽입 -- rb8001/app/llm/emotion_llm.py:25 - emotion_classifier.py 호출로 대체 -- rb8001/app/core/emotion/base.py:46, 51 - 실제 분석 로직으로 교체 - -### LLM 톤 조절 -- rb8001/app/llm/llm_service.py:133 - 주석 블록 재활성화 -- 감정 기반 프롬프트 조절 로직 추가 - -### 저장 계층 -- DB 접근: rb8001/app/state/database.py 활용 또는 신규 emotion DB 클라이언트 파일 생성 -- robeing_metrics DB 연결 (51123 서버에서 CREATE TABLE 직접 실행) -- 비동기 저장 큐 고려 - -### 권한 -- user_id는 JWT sub(UUID) -- robeing-gateway/app/main.py:23 검증 로직 존재 - -## 구현 참조 패턴 - -### 키워드 매칭 로직 -- 정규식 기반 의도 분류: rb8001/app/brain/decision_engine.py:69, 116 -- 키워드·정규식 혼합 파싱: rb8001/app/skills/email_integration.py:214, 226-239, 245-258 - -### DB 연결 패턴 -- asyncpg 풀: frontend-base/backend/metrics_database.py:12, 23 -- asyncpg 단건: robeing-monitor/app/api/monitor.py:139, 208 -- asyncpg 단건: skill-email/services/naverworks_provider.py:38 -- asyncpg 단건: rb8001/app/services/coldmail_filter.py:159, 183, 225 -- psycopg2 동기: rb8001/app/skills/news_posting_skill.py:35-37 -- SQLAlchemy Async: robeing-gateway/app/database.py:22-36 - -### API 라우트 패턴 -- rb8001 메인 라우트: rb8001/main.py:344 (@app.post("/api/slack/events")) -- rb8001 스케줄 테스트: rb8001/main.py:356 (@app.post("/api/schedule/test-news")) -- 인증 의존성 주입: rb8001/app/auth.py:61 (get_current_user), 66-75 (JWT decode) -- 게이트웨이 검증: robeing-gateway/app/main.py:41 (get_verified_user), 228-232 (Authorization 포워딩) - -### 시계열 집계 패턴 -- TimescaleDB 설치: DOCS/troubleshooting/250714_system_metrics_implementation.md:18-29 -- time_bucket 쿼리: frontend-base/backend/metrics_database.py:103 -- asyncpg interval 이슈: DOCS/troubleshooting/250715_metrics_graph_timebucket_error.md:28, 57, 85, 112-113 - -### 데이터 모델 참조 -- emotion_readings 스키마: DOCS/ideas/emotion_graph_implementation.md:215, 232 -- emotion 스키마: DOCS/ideas/250916_로빙_감정_분석_시스템_구현_계획.md:11 -- rb_news 테이블 예시: rb8001/scripts/create_rb_news_table.sql:8, 56, 77 - -### 팀/주간 집계 메타 -- 채널 식별: rb8001/app/skills/news_posting_skill.py:214, 467 -- JSONB 메타 패턴: DOCS/ideas/emotion_graph_implementation.md:235, 259 - -## 작업 순서 (완료) - -1. ✅ skill-embedding 서비스에 감정 분석 추가: - - emotion_service.py: ONNX 모델 로드 및 추론 - - routers/emotion.py: API 엔드포인트 (/emotion) - - main.py: 라우터 include -2. ✅ rb8001에서 skill-embedding 호출: - - emotion_classifier.py: HTTP 클라이언트로 skill-embedding 호출 - - 환경변수: SKILL_EMBEDDING_URL=http://localhost:8515 -3. ✅ DB 스키마 준비: 51123 서버에서 robeing_metrics DB에 emotion_readings 테이블 생성 -4. ✅ DB 클라이언트: rb8001/app/state/database.py 활용 -5. ✅ API 라우터 생성: rb8001/app/router/emotion_endpoint.py 생성 후 main.py에 include -6. ✅ asyncio event loop 충돌 수정: 모든 감정 함수를 async로 변경 -7. ✅ JSONB 타입 캐스팅: json.dumps()로 변환 후 저장 -8. ⏳ EmotionAwareLLM 연결: rb8001/app/llm/emotion_llm.py:25 (미구현) -9. ⏳ LLMService 톤 조절: rb8001/app/llm/llm_service.py:133 (미구현) -10. ⏳ 집계 쿼리 구현: time_bucket 기반 (미구현) - -## 모니터링/성능 - -### 추론 지연 -- rb10508_micro/app/core/emotion/monitoring.py 패턴 참고 - -### 저장 압력 -- TTL/압축은 TimescaleDB 정책으로 설정 - -## 개발 원칙 -- 한 파일 최대 500줄 제한 -- 기능별 파일 분리 (라우터, 서비스, 모델) -- main.py는 라우터 include만, 직접 엔드포인트 정의 금지 - -## 리스크/롤백 - -### 모델 미가용 -- 균등분포 폴백 허용 - -### DB 장애 -- 저장 실패해도 응답 생성 지속 (비동기 큐) - -## 테스트 결과 - -### 성공한 테스트 -- ✅ API 정상 작동: /v1/emotion/infer 200 OK -- ✅ DB 저장: emotion_readings 테이블에 3건 저장 확인 -- ✅ 감정 분석 정확도: - - 화난 텍스트 → sadness 90% - - 기쁜 텍스트 → happiness 99% - - 분노 텍스트 → anger 68.8% -- ✅ 균등분포 제거: 실제 모델 추론 값 사용 - -### 수정한 문제 -- ✅ asyncio event loop 충돌 (new_event_loop 제거) -- ✅ JSONB 저장 오류 (json.dumps 추가) -- ✅ 테스트 코드 비동기 함수 호출 - -## 교훈 - -### 기술적 교훈 -1. **마이크로서비스 아키텍처**: rb8001 경량화를 위해 ONNX 모델을 skill-embedding으로 분리 -2. **asyncio 주의**: FastAPI는 이미 event loop 내에서 실행 중, new_event_loop() 사용 금지 -3. **JSONB 타입**: asyncpg는 dict를 자동 변환하지 않음, json.dumps() 필요 -4. **폴백 전략**: 외부 서비스 장애 대비 균등분포 폴백 구현 - -### 설계 교훈 -1. **문서와 실제 코드 불일치**: 문서를 무조건 신뢰하지 말고 실제 코드 확인 필수 -2. **추측 금지**: "아마", "것 같다" 대신 직접 확인 -3. **한 파일 500줄 제한**: 기능별 파일 분리로 유지보수성 향상 -4. **테스트 중요성**: 실제 API는 작동해도 테스트 코드가 틀릴 수 있음 diff --git a/troubleshooting/20251002_emotion_system_todo.md b/troubleshooting/20251002_emotion_system_todo.md new file mode 100644 index 0000000..05380aa --- /dev/null +++ b/troubleshooting/20251002_emotion_system_todo.md @@ -0,0 +1,47 @@ +# 감정 시스템 미구현 항목 + +**작성일**: 2025-10-02 +**목적**: 감정 시스템 완성을 위한 남은 작업 + +## 구현 필요 (우선순위) + +### 1. LLM 톤 조절 ⏳ +- **위치**: rb8001/app/llm/llm_service.py:133 +- **내용**: 감정 상태에 따른 프롬프트 동적 조절 +- **예시**: anger 감지 시 → 공감적 톤으로 응답 + +### 2. Temperature Scaling ⚠️ +- **공식**: Softmax(z/T)로 확률 보정 +- **T값 추정**: 검증 세트로 L-BFGS-B 알고리즘 적용 +- **목적**: 과신(overconfidence) 보정 + +### 3. 배치 API ⚠️ +- **엔드포인트**: POST /v1/emotion/infer:batch +- **용량**: 최대 128건 +- **용도**: 대량 텍스트 일괄 처리 + +### 4. 임계값 처리 ⚠️ +- **조건**: 최고 확률 < 0.45 +- **처리**: "unknown" 라벨로 변경 +- **목적**: 애매한 감정 필터링 + +### 5. 시각화 ⚠️ +- **그래프 유형**: + - 시계열 선 그래프 (7개 감정) + - 일/시간대별 스택 차트 +- **출력**: PNG 생성 → Slack 전송 +- **라이브러리**: matplotlib 또는 plotly + +### 6. 시계열 집계 ⏳ +- **쿼리**: TimescaleDB time_bucket +- **집계 단위**: 1h, 6h, 1d, 1w +- **참고**: frontend-base/backend/metrics_database.py:103 + +## 검증 필요 +- [ ] ONNX vs PyTorch 오차 검증 +- [ ] p95 지연 시간 측정 +- [ ] NLL/ECE 보정 효과 측정 + +## 참고 자료 +- ONNX 모델: `/home/admin/ivada_project/onnx_models/aihub-7emotions/model.onnx` [51124 서버] +- skill-embedding API: http://localhost:8515/emotion \ No newline at end of file