moodtown은 사용자의 일기를 AI가 분석해 7가지 감정의 주민 캐릭터로 시각화하고,
감정 기반의 마을을 성장·변화·반응시키는 인터랙티브 감정 다이어리 플랫폼입니다.
ID: ososo
PW: moodtown
👉🏻 입력되어 있는 일기 샘플을 통해 moodtown의 동작을 확인해 볼 수 있습니다.
moodtown은 **AI 감정 분석 + 감정 의인화 + 게임화(Gamification)**를 결합한 감정 일기 플랫폼입니다.
moodtown은 단순한 일기 앱을 넘어서, 감정을 시각화하고 게임화 요소를 통해 사용자의 감정 표현과 자기 이해를 돕습니다. 지나치기 쉬운 감정을 돌아보고 나의 마음을 알아갈 수 있도록 설계되었습니다.
- 감정의 시각화: 추상적인 감정을 구체적인 캐릭터와 게임 요소로 표현
- 게임화를 통한 동기 부여: 일기 작성이 재미있고 지속 가능하도록 게임 요소 추가
- AI 기반 정확한 분석: GPT-4o-mini를 활용한 정확한 감정 분석 및 자연스러운 대화 생성
- 자기 이해 도움: 감정 패턴 파악 및 유사한 과거 일기 찾기를 통한 자기 탐색
일기를 작성하면 자동으로 다음 과정이 진행됩니다:
- 🖥️ AI 감정 분석 (GPT-4o-mini): 일기 텍스트를 분석하여 7가지 감정에 대한 점수 산출
- 🌈 감정 주민 7명이 대화: 감정 분석 결과를 바탕으로 GPT가 주민들의 대화 생성
- 🌳 행복 나무 성장: 긍정적인 감정이 쌓이면 나무가 자라나고 열매가 열림
- 💧 스트레스 우물 변화: 부정적인 감정이 쌓이면 우물에 물이 차오름
- 💌 감정 편지 생성: 특별한 상황에 주민이 편지를 보냄
- ☁️ 마을 하늘 변화: 가장 높은 감정에 따라 마을 하늘 색이 변화
사용자의 감정 상태가 마을 곳곳에 반영되며, 자기 이해와 감정 탐색을 돕습니다.
![]() ▸ 로그인 |
![]() ▸ 마을 입구 |
![]() ▸ 마을 전체 |
각 감정마다 고유한 캐릭터가 있으며, 각 주민은 고유한 색상, 성격, 말투를 가지고 있습니다.
| 캐릭터 | 감정 | 설명 | 색상 |
|---|---|---|---|
| 빨강이 | 분노 | 화남, 짜증, 불평불만 | 빨강 |
| 주황이 | 부끄러움 | 수줍음, 자책, 창피함 | 주황 |
| 노랑이 | 기쁨 | 즐거움, 행복, 신남 | 노랑 |
| 초록이 | 사랑 | 따뜻함, 애정, 우정 | 초록 |
| 파랑이 | 슬픔 | 우울, 무기력함, 속상함 | 파랑 |
| 남색이 | 두려움 | 불안함, 걱정, 초조함 | 남색 |
| 보라 | 놀람 | 충격, 신기함, 호기심 | 보라 |
- 고유한 성격: 각 주민은 일기에 대한 반응도 다릅니다
- 스토리텔링 대화: GPT-4o-mini가 주민의 말투·성격을 반영해 자연스러운 대화 생성
- 채팅 기능: 사용자는 자동 생성된 답변을 통해 주민과 채팅하며 대화할 수 있습니다
| 유형 | 역할 | 정확도 | 마을 시스템에 반영 여부 | 속도 |
|---|---|---|---|---|
| 딥러닝 모델 | 참고용 감정 분류 | 보통 (63.90%) | ❌ | 빠름 |
| GPT-4o-mini | 실제 감정 분석 | 높음 | ✔ | 보통 |
GPT-4o-mini가 실제 마을 시스템에 사용되는 감정 분석 모델입니다. 문맥 이해 능력이 뛰어나 '부끄러움/놀람' 같은 다의적 감정도 상황에 따라 정확히 해석할 수 있습니다.
**딥러닝 모델(transformers)**은 참고용으로만 제공됩니다. 한국어 감정 데이터셋의 한계로 정확도가 63% 수준이라 실제 시스템에는 사용하지 않습니다.
-
7가지 감정 점수 분석
- 일기 텍스트를 기반으로 7가지 감정(기쁨, 사랑, 놀람, 두려움, 분노, 부끄러움, 슬픔)에 대한 점수 산출
- 각 감정은 0~100점으로 표시되며, 여러 감정이 동시에 존재할 수 있음
- 감정 점수의 총합이 100이 되도록 정규화
-
문맥 기반 극성 분석
- 놀람과 부끄러움은 문맥에 따라 긍정/부정으로 구분됩니다
- Rule-based 분석: 키워드 패턴 매칭
- GPT 기반 분석: 문맥 이해
- 두 결과를 결합하여 최종 극성 결정
- 결정된 극성은 행복 나무/스트레스 우물에 반영됨
-
딥러닝 모델 (참고용)
- KLUE-RoBERTa 기반 Transformers 모델
- 정확도 63.90% (참고용으로만 제공)
- 실제 마을 시스템에는 GPT-4o-mini 분석 결과 사용
마을 분위기 시스템으로, 사용자의 감정 상태가 마을의 하늘 색에 반영됩니다.
- 하루 일기에서 가장 비중이 높은 감정을 확인
- 해당 감정의 고유 색상으로 하늘 색이 부드럽게 변화
- 감정 변화가 시각적으로 느껴지도록 하는 연출 시스템
- 기쁨(노랑): 따뜻한 노란 하늘
- 슬픔(파랑): 푸른빛 하늘
- 분노(빨강): 붉은 빛 하늘
- 사랑(초록): 부드러운 연두색 톤
- 두려움(남색): 어두운 남색 톤
- 놀람(보라): 보라빛 하늘
- 부끄러움(주황): 따뜻한 주황색 톤
EmotionSky.jsx컴포넌트에서 애니메이션 처리- CSS keyframes 기반의 부드러운 색상 전환
transform속성 사용으로 성능 최적화
긍정적인 감정이 쌓일수록 자라는 나무입니다. 긍정적인 감정 표현을 장려하기 위한 보상 시스템입니다.
다음 감정들이 행복 나무의 성장에 기여합니다:
- 기쁨: 즐거움, 행복, 신남
- 사랑: 애정, 우정, 따뜻함
- 놀람 (긍정적): 기쁜 소식, 반가운 소식 등
- 부끄러움 (긍정적): 설레는 감정, 좋아하는 사람에 대한 부끄러움 등
보너스 규칙: 하루에 긍정 감정만 있으면 보너스 성장도 25점이 추가됩니다.
| 단계 | 필요 점수 | 설명 |
|---|---|---|
| 씨앗 | 0 이상 | 초기 상태 |
| 새싹 | 40 이상 | 작은 새싹이 돋아남 |
| 묘목 | 100 이상 | 작은 나무로 성장 |
| 중간 나무 | 220 이상 | 중간 크기 나무 |
| 큰 나무 | 380 이상 | 큰 나무로 성장 |
| 행복 열매 생성 | 600 도달 | 완전히 자라서 열매가 열림 |
- 나무가 완전히 자라면 열매가 열립니다
- 열매가 열리면 "행복 열매" 개수가 증가합니다
- 열매가 열릴 때마다 축하 편지가 전송됩니다
- 열매가 열리면 스트레스 우물의 물이 30점 줄어듭니다
- 열매 생성 후 나무의 상태는 씨앗 상태로 돌아갑니다
부정적인 감정이 쌓일수록 물이 차오르는 우물입니다. 부정적 감정을 쉽게 파악하게 하는 경고/관리 장치입니다.
다음 감정들이 스트레스 우물에 물을 채웁니다:
- 분노: 화남, 짜증, 불평불만
- 슬픔: 우울함, 무기력함, 속상함
- 두려움: 불안함, 걱정, 초조함
- 놀람 (부정적): 충격, 실망, 황당함 등
- 부끄러움 (부정적): 창피함, 수치심, 민망함 등
보너스 규칙: 하루에 부정 감정만 있으면 물이 25점 더 차오릅니다.
- 긍정 감정만 있을 경우: 물이 30점 줄어듭니다
- 즉, 순수 긍정 일기를 작성하면 스트레스가 감소합니다
- 행복 열매가 맺힌 경우: 물이 30점 줄어듭니다
이러한 특별 규칙들은 우물이 너무 자주 차오르지 않도록 하는 완충 역할을 함과 동시에, 긍정적인 감정에 대한 보상을 더욱 강화합니다.
- 물이 100%에 도달하면 "넘침" 상태가 됩니다
- 넘치면 주민들이 위로하는 편지를 자동으로 전송합니다
- 물이 넘친 후 "우물 비우기" 버튼을 누르면 우물이 초기화됩니다
각각 다른 감정을 나타내는 무지개 주민들이 일기 내용에 대해 대화를 나누는 공간입니다.
- 감정 분석 결과 확인: 일기의 감정 분석 결과를 확인할 수 있습니다
- 주민 대화: 일기의 내용과 감정 분석 결과를 토대로 주민들이 이야기를 나눕니다
- GPT-4o-mini가 각 주민의 고유한 성격과 말투를 반영하여 자연스러운 대화 생성
- 채팅 기능: 사용자는 주민들과 실시간으로 채팅하며 상호작용할 수 있습니다
- 각 주민이 자신의 감정 스타일에 맞게 자연스러운 반말로 응답
- 일기 내용을 참고하여 맥락에 맞는 대화 제공
- 주민별로 다른 관점과 톤의 답변 제공
- 주요 감정 (score > 0): 자신의 감정을 주로 표현하며 적극적으로 참여
- 반응 감정 (score = 0): 다른 감정들에게 반응만 (위로, 동조, 반박 등)
대화 생성 시 감정 점수 기반 우선순위를 적용해, 실제 감정 분포와 일관된 스토리텔링을 유지합니다.
- 감정 분석 결과 확인
- 주요 감정과 반응 감정 결정
- GPT-4o-mini가 각 주민의 특성을 반영한 대화 생성
- 대화를 데이터베이스에 저장
- 하루의 일기에 대한 대화가 한 번 생성되면 저장되며, 일기가 수정되면 재생성됩니다
마을의 무지개 주민들이 사용자에게 보내는 편지입니다. 사용자에게 위로, 격려, 공감의 메시지를 제공하며 주민과의 소통을 더욱 체감하게 합니다.
- 편지 이벤트를 통해 사용자가 더 일기를 적극적으로 쓰도록 동기를 부여
- 감정 변화에 대한 즉각적 피드백(보상/위로)
- 주민과의 소통을 더욱 체감하게 함
| 편지 종류 | 조건 | 보낸 주민 | 설명 |
|---|---|---|---|
| 감정 편지 | 특정 감정 ≥ 70% | 해당 감정 주민 | 특정 감정이 매우 강할 때 해당 주민이 편지 전송 |
| 축하 편지 | 열매 생성 | 기쁨·사랑 계열 주민 | 행복 나무에 열매가 맺히면 축하 편지 전송 |
| 위로 편지 | 우물 넘침 | 슬픔·두려움·분노 계열 주민 | 스트레스 우물이 넘치면 위로 편지 전송 |
- 편지 내용은 GPT-4o-mini가 생성합니다
- 각 주민의 성격과 말투가 반영됩니다
- 위로 편지의 경우, 단순히 우물 넘침 이벤트만 발생하면 간혹 부정적인 감정에 대한 패널티처럼 보일 수 있으므로 이를 방지하기 위해 사용자에게 위로와 격려의 메시지를 제공합니다
일기 작성 및 관리 기능입니다.
- 날짜별 일기 작성 및 관리: 특정 날짜에 일기 작성, 수정, 삭제 가능
- 원하는 날짜를 선택해서 일기를 작성할 수 있습니다
- 과거 날짜에도 일기를 작성할 수 있습니다
- 감정 분석: 딥러닝 모델 또는 GPT-4o-mini를 이용한 감정 분석
- 일기 작성 시 자동으로 감정 분석이 진행됩니다
- 딥러닝 모델 분석 결과는 참고용으로 제공됩니다
- GPT-4o-mini 분석 결과가 실제 마을 시스템에 반영됩니다
- 일기를 수정하면 감정 분석이 다시 진행되며, 그에 따라 마을 상태도 함께 변합니다
- 일기를 삭제하면 해당 날짜의 감정 점수가 마을 시스템에서 제거됩니다
- 일기 수정 시 와글와글 광장의 대화가 자동으로 재생성됩니다
일기 아카이브, 다양한 통계, 감정 캘린더, 유사한 일기 찾기 등의 기능을 제공합니다.
- 날짜를 선택하면 해당 날짜의 일기와 감정 분석 결과 확인 가능
- 하루에 가장 비중이 많은 감정 주민의 색을 캘린더에 표시하여 날짜별 주요 감정 시각화
- 한눈에 감정 패턴을 확인할 수 있습니다
- 한 달간의 감정 비율을 도넛 그래프로 나타냅니다
- 감정별 비중을 한눈에 파악할 수 있습니다
- 일주일간의 긍정/부정 지수를 선 그래프로 나타냅니다
- 감정 기복을 파악할 수 있습니다
- 각 감정의 평균 점수를 표시합니다
- 어떤 감정이 가장 많이 나타나는지 확인할 수 있습니다
- 요일별 일기 작성 빈도를 분석하여 언제 일기를 가장 많이 쓰는지 파악할 수 있습니다
- 일기 쓰기 빈도 현황을 통계로 제공합니다
- 한 달동안/일주일동안 일기를 며칠 작성했는지 계산
- 끊기지 않고 연속으로 며칠째 일기를 쓰고 있는지 계산
- 동기 부여에 도움이 됩니다
-
Sentence Transformer 모델 기반으로 선택한 일기와 유사한 감정/내용의 과거 일기 검색
-
텍스트 유사도: 텍스트가 가장 유사한 일기 1개 제공
-
감정 유사도: 감정 비율이 가장 유사한 일기 1개 제공
-
두 가지 기준을 독립적으로 제공하여 다양한 관점에서 유사 일기 탐색 가능
- 내용이 비슷한 일기를 통해 비슷한 상황에서 감정이 어떻게 달라졌는지 확인
- 감정 비율이 비슷한 일기를 통해 어떤 상황에서 비슷한 감정을 느끼는지 확인
→ 사용자의 감정 패턴 파악과 자기 이해를 돕습니다.
참고: 마을 사무소는 무조건 서비스 사용 당시 날짜(오늘)을 기준으로 통계를 제공합니다. 사용자는 과거의 날짜를 자유롭게 선택하여 마을에 입장해해 일기를 작성할 수 있고, 이로 인한 통계 표시 혼란을 방지하기 위함입니다.
사용자 작성 → 프론트엔드 → 백엔드 API
↓
GPT-4o-mini 감정 분석
↓
감정 점수 + 극성(polarity) 산출
↓
PostgreSQL 저장
↓
나무/우물 상태 업데이트
↓
대화 생성 (GPT)
↓
대화 저장 (DB)
↓
편지 생성 (필요시)
↓
응답 반환
- 텍스트 전처리: 일기 텍스트를 정제하여 분석 준비
- GPT-4o-mini 분석: 시스템 프롬프트로 7가지 감정 점수 요청 (0~100점)
- 하이브리드 극성 판단: 놀람/부끄러움의 경우 Rule-based 키워드 분석과 GPT 기반 문맥 분석을 결합하여 긍정/부정 판단
- 점수 정규화: 7가지 감정 점수의 총합이 100이 되도록 정규화
- 결과 반환: JSON 형식으로 감정 점수 및 극성 반환
- 감정 점수 분석: 0점 초과 감정 확인
- 주민 선정: 주요 감정(score > 0)과 반응 감정(score = 0) 분류
- GPT 프롬프트 구성: 일기 내용, 주민의 성격·말투, 역할 규칙 포함
- 대화 생성: GPT가 각 주민의 특성을 반영한 자연스러운 대화 생성
- DB 저장: 생성된 대화를 JSONB 형식으로
plaza_conversations테이블에 저장
moodtown은 두 가지 딥러닝 기반 모델을 활용하여 감정 분석과 유사 일기 검색 기능을 제공합니다.
사용자가 작성한 일기의 감정을 분류하기 위해 KLUE-RoBERTa-base를 기반으로 한
Transformers 딥러닝 모델을 직접 학습하여 사용했습니다.
이 모델은 참고용 감정 분류 결과를 제공하며, 실제 마을 시스템의 감정 점수는 GPT-4o-mini가 생성한 결과를 사용합니다.
- moodtown-emotion-model
- 기반 모델: KLUE-RoBERTa-base
- 모델 타입: RobertaForSequenceClassification
- 감정 라벨: 5개 (기쁨, 당황, 분노, 불안, 슬픔)
- 입력 길이: 최대 128 토큰
- 출처: AI Hub 감성 대화 말뭉치
- 사용 샘플 수: 총 51,628개 (HS01 발화만 사용)
- 라벨 매핑:
- E10~E19 → 분노
- E20~E29 → 슬픔
- E30~E39 → 불안
- E40~E59 → 당황/상처 (통합)
- 원래 데이터는 E40
E49->당황, E5059->상처로 되어 있으나, 모델의 분류 정확도를 위해 두 라벨을 통합했습니다.
- 원래 데이터는 E40
- E60~E69 → 기쁨
- Train/Validation = 90% / 10%
- Batch size = 32 (gradient accumulation 2 → 효과적 batch size 64)
- Learning rate = 2e-5
- Optimizer = AdamW
- Scheduler = Cosine Annealing + Warmup
- Epochs = 2
- Label smoothing = 0.1
- FP16 사용
- Validation Accuracy: 63.90%
- Validation Loss: 1.0781
혼동행렬을 통해 확인할 수 있듯이, '당황' 감정이 다른 감정(불안·슬픔·분노 등)과 혼동되는 경우가 특히 많이 발생했습니다.
이는 데이터셋의 라벨 구조상 부정적인 감정이 세분화되어 있고, 감정 간 표현이 서로 겹치는 특성이 있어 정확도 향상에 구조적인 한계가 있었기 때문입니다.
- 기쁨 → 기쁨
- 분노 → 분노
- 슬픔 → 슬픔
- 불안 → 두려움
- 당황 → 놀람 & 부끄러움으로 분리 (키워드 기반)
- 사랑 → 기쁨 점수 기반 재분배
모델 로드 실패 시 키워드 기반 감정 분석으로 자동 대체됩니다.
moodtown의 “유사한 일기 찾기” 기능은
Sentence Transformer 기반 딥러닝 모델을 이용하여 구현되었습니다.
이 모델은 사전학습(pretrained) 모델을 그대로 활용하며,
추가 학습(fine-tuning)은 진행하지 않았습니다.
- 기반 모델: jhgan/ko-sbert-sts
- 모델 타입: Sentence Transformer
- 특징: 한국어 특화, 문맥 의미 기반 임베딩
- 텍스트 유사도
- 일기 내용을 임베딩 후 코사인 유사도 계산
- 감정 유사도
- 저장된 7가지 감정 점수를 벡터화하여 코사인 유사도 계산
- 두 기준을 독립적으로 제공
- 내용이 가장 비슷한 일기 1개
- 감정 비율이 가장 비슷한 일기 1개
이를 통해 사용자는 상황 기반 유사성과 감정 기반 유사성을 각각 확인할 수 있습니다.
| 모델 | 유형 | 학습 여부 | 사용 목적 |
|---|---|---|---|
| 감정 분류 모델 | 딥러닝 (Transformer) | ✔ 직접 학습 | 참고용 감정 분류 |
| Sentence Transformer | 딥러닝 (Pretrained) | ✖ 학습 안 함(사전 학습) | 유사 일기 검색 |
- 역할: UI 구축을 위한 JavaScript 라이브러리
- 사용처: 페이지 렌더링, 상태 관리, 컴포넌트 기반 UI 구성
- 역할: 프론트엔드 개발 서버 및 번들러
- 사용처: 빠른 개발 환경 제공(HMR), 프로덕션 빌드 생성
- 역할: 스타일링 및 애니메이션
- 사용처: 반응형 UI, 주민/하늘/마을 애니메이션 구현
- 역할: Python 기반 REST API 서버
- 사용처: 인증, 일기 CRUD, 감정 분석 요청 처리, 나무/우물/대화 로직 관리
- 역할: 관계형 데이터베이스
- 사용처: 사용자, 일기, 감정 점수, 대화, 편지, 나무·우물 상태 등 데이터 저장
(JSONB로 구조화된 감정 점수/대화 저장)
- 역할: LLM 기반 텍스트 분석/생성
- 사용처: 일기 감정 분석, 감정 주민 대화 생성, 이벤트 편지 생성
- flask-cors: CORS 설정
- psycopg2-binary: PostgreSQL 연동
- gunicorn: 배포용 WSGI 서버
- python-dotenv: 환경변수 로딩
- openai: GPT API 호출
- 역할: KLUE-RoBERTa 기반 감정 분류 모델 실행
- 사용처: 참고용 감정 분석 결과 제공
- 역할: 문장 임베딩 생성 모델
- 사용처: 마을 사무소의 “유사한 일기 찾기” 기능
- torch: 딥러닝 모델 실행 환경
- joblib: 모델 저장/로딩
- matplotlib / seaborn: 학습 시각화
- 역할: 프론트엔드 호스팅
- 사용처: React 앱 프로덕션 배포
- 역할: 백엔드 서버 및 PostgreSQL 호스팅
- 사용처: Flask API + DB 통합 배포 환경 제공
- Python 3.8 이상
- Node.js 18 이상
- PostgreSQL 데이터베이스
- OpenAI API 키
cd backend
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activatepip install -r requirements.txt.env 파일을 backend/ 폴더에 생성하고 다음 내용을 입력하세요:
# 데이터베이스
DATABASE_URL=postgresql://user:password@host:port/database
# OpenAI API
OPENAI_API_KEY=your-openai-api-key
# 세션 시크릿
SECRET_KEY=your-secret-key
# 프론트엔드 URL (개발 환경)
FRONTEND_URL=http://localhost:5173
# 환경 설정
ENVIRONMENT=developmentpython -c "from db import init_db; init_db()"python app.py개발 서버는 기본적으로 http://localhost:5000에서 실행됩니다.
cd frontend
npm installnpm run dev개발 서버는 기본적으로 http://localhost:5173에서 실행됩니다.
npm run build빌드된 파일은 dist/ 폴더에 생성됩니다.
moodtown/
├── backend/ # Flask 백엔드
│ ├── api/ # API 라우트
│ │ ├── __init__.py
│ │ ├── auth.py # 인증 관련 API
│ │ ├── chat.py # 채팅/대화 API
│ │ ├── diary.py # 일기 관련 API
│ │ ├── letters.py # 편지 관련 API
│ │ ├── middleware.py # 미들웨어
│ │ ├── routes.py # 라우트 설정
│ │ ├── tree.py # 행복 나무 API
│ │ └── well.py # 스트레스 우물 API
│ ├── services/ # 비즈니스 로직
│ │ ├── __init__.py
│ │ ├── conversation.py # 대화 생성 서비스
│ │ ├── diary_similarity.py # 유사 일기 검색 서비스
│ │ ├── emotion_gpt.py # GPT 기반 감정 분석
│ │ ├── emotion_ml.py # ML 기반 감정 분석
│ │ ├── letter_generator.py # 편지 생성 서비스
│ │ ├── models/ # 학습된 딥러닝/머신러닝 모델
│ │ │ └── moodtown_emotion_model/ # Transformers 감정 분석 모델
│ │ │ └── (Sentence Transformer 모델은 사전 학습된 모델을 사용하므로 별도 모델 파일 없음)
│ │ └── train_emotion.ipynb # 감정 분석 모델 학습 스크립트 (Jupyter Notebook) - Google Colab에서 학습 진행
│ ├── core/ # 공통 모듈
│ │ ├── __init__.py
│ │ └── common.py # 공통 유틸리티
│ ├── app.py # Flask 애플리케이션 진입점
│ ├── characters.json # 감정 주민 캐릭터 설정
│ ├── db.py # 데이터베이스 연결 및 초기화
│ ├── Procfile # Railway 배포 설정
│ ├── pyrightconfig.json # Python 타입 체크 설정
│ ├── railway.json # Railway 배포 설정
│ ├── requirements.txt # Python 의존성
│ └── runtime.txt # Python 런타임 버전
├── frontend/ # React 프론트엔드
│ ├── public/ # 정적 파일
│ ├── src/
│ │ ├── assets/ # 이미지 및 아이콘
│ │ │ ├── characters/ # 감정 주민 캐릭터 이미지
│ │ │ └── icons/ # 아이콘
│ │ ├── components/ # 재사용 컴포넌트
│ │ │ ├── EmotionSky.css
│ │ │ ├── EmotionSky.jsx
│ │ │ ├── FloatingResidents.css
│ │ │ ├── FloatingResidents.jsx
│ │ │ ├── ResidentsIntro.css
│ │ │ └── ResidentsIntro.jsx
│ │ ├── pages/ # 페이지 컴포넌트
│ │ │ ├── Guide.css / Guide.jsx
│ │ │ ├── Home.css / Home.jsx
│ │ │ ├── Login.css / Login.jsx
│ │ │ ├── Mailbox.css / Mailbox.jsx
│ │ │ ├── Office.css / Office.jsx
│ │ │ ├── Plaza.css / Plaza.jsx
│ │ │ ├── Tree.css / Tree.jsx
│ │ │ ├── Village.css / Village.jsx
│ │ │ ├── Well.css / Well.jsx
│ │ │ └── WriteDiary.css / WriteDiary.jsx
│ │ ├── style/ # 전역 스타일
│ │ │ └── globals.css
│ │ ├── utils/ # 유틸리티 함수
│ │ │ ├── api.js # API 호출 함수
│ │ │ ├── dateUtils.js # 날짜 유틸리티
│ │ │ ├── diaryCache.js # 일기 캐시 관리
│ │ │ ├── emotionColorMap.js # 감정 색상 매핑
│ │ │ ├── emotionUtils.js # 감정 관련 유틸리티
│ │ │ ├── mailboxUtils.js # 편지함 유틸리티
│ │ │ ├── storage.js # 로컬 스토리지 관리
│ │ │ ├── treeUtils.js # 행복 나무 유틸리티
│ │ │ └── wellUtils.js # 스트레스 우물 유틸리티
│ │ ├── App.css
│ │ ├── App.jsx # 메인 앱 컴포넌트
│ │ ├── index.css
│ │ └── main.jsx # React 진입점
│ ├── eslint.config.js # ESLint 설정
│ ├── index.html # HTML 템플릿
│ ├── package.json # Node.js 의존성
│ ├── vercel.json # Vercel 배포 설정
│ └── vite.config.js # Vite 빌드 설정
├── docs/ # 문서
│ ├── ARCHITECTURE.md # 시스템 아키텍처
│ ├── BACKEND.md # 백엔드 가이드
│ ├── FEATURES.md # 주요 기능 설명
│ ├── FRONTEND.md # 프론트엔드 가이드
│ └── ML_MODELS.md # 딥러닝/머신러닝 모델 설명
├── screenshots/ # 스크린샷 이미지
├── LICENSE # MIT 라이선스
└── README.md # 프로젝트 README
This project is licensed under the MIT License
자세한 내용은 LICENSE 파일을 참고해주세요.
이 프로젝트는 다음 외부 리소스를 기반으로 개발되었습니다:
| 리소스 | 설명 | 링크 |
|---|---|---|
| AI Hub – 감성 대화 말뭉치 | 감정 분류 딥러닝 모델 학습에 사용한 한국어 감성 대화 데이터 | https://aihub.or.kr/aihubdata/data/view.do?dataSetSn=86 |
| 리소스 | 설명 | 링크 |
|---|---|---|
| OpenAI GPT-4o-mini | 감정 분석, 주민 대화 생성, 편지 생성에 사용된 LLM | https://platform.openai.com/docs/models/gpt-4o-mini |
| KLUE/RoBERTa-base | 일기 감정 분석을 위한 moodtown-emotion-model 파인튜닝 기반 모델 | (https://huggingface.co/klue/roberta-base) |
| jhgan/ko-sbert-sts | 유사 일기 검색을 위한 사전학습 Sentence Transformer 모델 | https://huggingface.co/jhgan/ko-sbert-sts |
| 리소스 | 설명 | 링크 |
|---|---|---|
| HuggingFace Transformers Docs | 감정 분류 모델 구현 참고 | https://huggingface.co/docs/transformers/index |
| Sentence-Transformers Docs | 유사도 계산 및 임베딩 적용 참고 | https://sbert.net/ |
| OpenAI API Reference | GPT 기반 분석 및 텍스트 생성 기능 구현 참고 | https://platform.openai.com/docs/api-reference/introduction |
moodtown은 다양한 기능을 통합한 프로젝트이지만, 개발 과정에서 여러 기술적·환경적 한계가 존재했습니다.
LLM 특성상 같은 입력에도 미세하게 다른 감정 점수를 출력할 수 있어 일관성을 완전히 보장하기 어렵습니다.
개선 방향: temperature 고정, 프롬프트 강화, GPT 결과를 딥러닝 모델 예측과 결합
구현 시간과 리소스의 부족으로 풍부한 인터랙션과 애니메이션을 충분히 반영하지 못했습니다.
개선 방향: 감정 변화에 따른 동적 애니메이션 추가, WebGL/Canvas 기반 그래픽 요소 적용
현재 버전에서는 기본 성격 기반의 고정형 대화만 제공됩니다.
개선 방향: 사용자 감정 통계 기반 adaptive character 모델 설계, 사용자 성향 프로필을 반영한 주민 톤 변화
AI Hub 감성대화말뭉치를 기반으로 학습한 모델은 약 63%의 정확도를 보였습니다. 주요 원인:
- 데이터셋 라벨 구조의 모호성: '당황'과 '상처' 라벨의 경계가 모호
- 도메인 차이: 데이터셋은 구어체 발화, moodtown은 문어체 일기 텍스트
- 학습 환경 제약: Google Colab의 GPU 사용 시간 제한으로 하이퍼파라미터 실험 제한
개선 방향: 자체 일기 기반 데이터셋 수집, 도메인 적응 기법 도입, 장시간 학습 및 하이퍼파라미터 실험 수행
moodtown은 개인 프로젝트지만, 아이디어 제안이나 버그 제보, 코드 기여는 언제든지 환영합니다.
- 버그 제보, 개선 제안, 문서 오타 등은 GitHub Issues로 등록해 주세요.
간단한 수정(PR)도 환영합니다.
- 이 레포지토리를 fork 합니다.
- 새로운 브랜치를 만듭니다.
예)feat/add-some-feature,fix/bug-... - 변경사항을 커밋하고, PR을 생성합니다.
- PR 설명에 변경 이유와 내용을 간단히 적어 주세요.














