Skip to content

bearivh/moodtown

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

moodtown!

moodtown은 사용자의 일기를 AI가 분석해 7가지 감정의 주민 캐릭터로 시각화하고,
감정 기반의 마을을 성장·변화·반응시키는 인터랙티브 감정 다이어리 플랫폼입니다.

배포 링크

☘️ Go to moodtown!

시연 영상

시연 영상 보기

테스트 계정

ID: ososo
PW: moodtown

👉🏻 입력되어 있는 일기 샘플을 통해 moodtown의 동작을 확인해 볼 수 있습니다.


목차


1. 프로젝트 소개

moodtown은 **AI 감정 분석 + 감정 의인화 + 게임화(Gamification)**를 결합한 감정 일기 플랫폼입니다.

1-1. 프로젝트 개요

moodtown은 단순한 일기 앱을 넘어서, 감정을 시각화하고 게임화 요소를 통해 사용자의 감정 표현과 자기 이해를 돕습니다. 지나치기 쉬운 감정을 돌아보고 나의 마음을 알아갈 수 있도록 설계되었습니다.

1-2. 핵심 가치

  • 감정의 시각화: 추상적인 감정을 구체적인 캐릭터와 게임 요소로 표현
  • 게임화를 통한 동기 부여: 일기 작성이 재미있고 지속 가능하도록 게임 요소 추가
  • AI 기반 정확한 분석: GPT-4o-mini를 활용한 정확한 감정 분석 및 자연스러운 대화 생성
  • 자기 이해 도움: 감정 패턴 파악 및 유사한 과거 일기 찾기를 통한 자기 탐색

1-3. 작동 흐름

일기를 작성하면 자동으로 다음 과정이 진행됩니다:

  1. 🖥️ AI 감정 분석 (GPT-4o-mini): 일기 텍스트를 분석하여 7가지 감정에 대한 점수 산출
  2. 🌈 감정 주민 7명이 대화: 감정 분석 결과를 바탕으로 GPT가 주민들의 대화 생성
  3. 🌳 행복 나무 성장: 긍정적인 감정이 쌓이면 나무가 자라나고 열매가 열림
  4. 💧 스트레스 우물 변화: 부정적인 감정이 쌓이면 우물에 물이 차오름
  5. 💌 감정 편지 생성: 특별한 상황에 주민이 편지를 보냄
  6. ☁️ 마을 하늘 변화: 가장 높은 감정에 따라 마을 하늘 색이 변화

사용자의 감정 상태가 마을 곳곳에 반영되며, 자기 이해와 감정 탐색을 돕습니다.


2. 주요 기능

기본 화면


▸ 로그인

▸ 마을 입구

▸ 마을 전체

2-1. 무지개 주민

각 감정마다 고유한 캐릭터가 있으며, 각 주민은 고유한 색상, 성격, 말투를 가지고 있습니다.

캐릭터 감정 설명 색상
빨강이 분노 화남, 짜증, 불평불만 빨강
주황이 부끄러움 수줍음, 자책, 창피함 주황
노랑이 기쁨 즐거움, 행복, 신남 노랑
초록이 사랑 따뜻함, 애정, 우정 초록
파랑이 슬픔 우울, 무기력함, 속상함 파랑
남색이 두려움 불안함, 걱정, 초조함 남색
보라 놀람 충격, 신기함, 호기심 보라

무지개 주민

특징

  • 고유한 성격: 각 주민은 일기에 대한 반응도 다릅니다
  • 스토리텔링 대화: GPT-4o-mini가 주민의 말투·성격을 반영해 자연스러운 대화 생성
  • 채팅 기능: 사용자는 자동 생성된 답변을 통해 주민과 채팅하며 대화할 수 있습니다

2-2. 감정 분석 시스템

분석 방식 비교

유형 역할 정확도 마을 시스템에 반영 여부 속도
딥러닝 모델 참고용 감정 분류 보통 (63.90%) 빠름
GPT-4o-mini 실제 감정 분석 높음 보통

실제 사용 방식

GPT-4o-mini가 실제 마을 시스템에 사용되는 감정 분석 모델입니다. 문맥 이해 능력이 뛰어나 '부끄러움/놀람' 같은 다의적 감정도 상황에 따라 정확히 해석할 수 있습니다.

**딥러닝 모델(transformers)**은 참고용으로만 제공됩니다. 한국어 감정 데이터셋의 한계로 정확도가 63% 수준이라 실제 시스템에는 사용하지 않습니다.


주요 기능

  1. 7가지 감정 점수 분석

    • 일기 텍스트를 기반으로 7가지 감정(기쁨, 사랑, 놀람, 두려움, 분노, 부끄러움, 슬픔)에 대한 점수 산출
    • 각 감정은 0~100점으로 표시되며, 여러 감정이 동시에 존재할 수 있음
    • 감정 점수의 총합이 100이 되도록 정규화
  2. 문맥 기반 극성 분석

    • 놀람과 부끄러움은 문맥에 따라 긍정/부정으로 구분됩니다
    • Rule-based 분석: 키워드 패턴 매칭
    • GPT 기반 분석: 문맥 이해
    • 두 결과를 결합하여 최종 극성 결정
    • 결정된 극성은 행복 나무/스트레스 우물에 반영됨
  3. 딥러닝 모델 (참고용)

    • KLUE-RoBERTa 기반 Transformers 모델
    • 정확도 63.90% (참고용으로만 제공)
    • 실제 마을 시스템에는 GPT-4o-mini 분석 결과 사용


2-3. 마을 하늘

마을 분위기 시스템으로, 사용자의 감정 상태가 마을의 하늘 색에 반영됩니다.

작동 메커니즘

  • 하루 일기에서 가장 비중이 높은 감정을 확인
  • 해당 감정의 고유 색상으로 하늘 색이 부드럽게 변화
  • 감정 변화가 시각적으로 느껴지도록 하는 연출 시스템

감정별 색상

  • 기쁨(노랑): 따뜻한 노란 하늘
  • 슬픔(파랑): 푸른빛 하늘
  • 분노(빨강): 붉은 빛 하늘
  • 사랑(초록): 부드러운 연두색 톤
  • 두려움(남색): 어두운 남색 톤
  • 놀람(보라): 보라빛 하늘
  • 부끄러움(주황): 따뜻한 주황색 톤

구현

  • EmotionSky.jsx 컴포넌트에서 애니메이션 처리
  • CSS keyframes 기반의 부드러운 색상 전환
  • transform 속성 사용으로 성능 최적화

2-4. 🌳 행복 나무

긍정적인 감정이 쌓일수록 자라는 나무입니다. 긍정적인 감정 표현을 장려하기 위한 보상 시스템입니다.

성장 기여 감정

다음 감정들이 행복 나무의 성장에 기여합니다:

  • 기쁨: 즐거움, 행복, 신남
  • 사랑: 애정, 우정, 따뜻함
  • 놀람 (긍정적): 기쁜 소식, 반가운 소식 등
  • 부끄러움 (긍정적): 설레는 감정, 좋아하는 사람에 대한 부끄러움 등

보너스 규칙: 하루에 긍정 감정만 있으면 보너스 성장도 25점이 추가됩니다.

성장 단계

단계 필요 점수 설명
씨앗 0 이상 초기 상태
새싹 40 이상 작은 새싹이 돋아남
묘목 100 이상 작은 나무로 성장
중간 나무 220 이상 중간 크기 나무
큰 나무 380 이상 큰 나무로 성장
행복 열매 생성 600 도달 완전히 자라서 열매가 열림

열매 시스템

  • 나무가 완전히 자라면 열매가 열립니다
  • 열매가 열리면 "행복 열매" 개수가 증가합니다
  • 열매가 열릴 때마다 축하 편지가 전송됩니다
  • 열매가 열리면 스트레스 우물의 물이 30점 줄어듭니다
  • 열매 생성 후 나무의 상태는 씨앗 상태로 돌아갑니다

tree


2-5. 💧 스트레스 우물

부정적인 감정이 쌓일수록 물이 차오르는 우물입니다. 부정적 감정을 쉽게 파악하게 하는 경고/관리 장치입니다.

물을 채우는 감정

다음 감정들이 스트레스 우물에 물을 채웁니다:

  • 분노: 화남, 짜증, 불평불만
  • 슬픔: 우울함, 무기력함, 속상함
  • 두려움: 불안함, 걱정, 초조함
  • 놀람 (부정적): 충격, 실망, 황당함 등
  • 부끄러움 (부정적): 창피함, 수치심, 민망함 등

보너스 규칙: 하루에 부정 감정만 있으면 물이 25점 더 차오릅니다.

특별 규칙 (물 감소)

  • 긍정 감정만 있을 경우: 물이 30점 줄어듭니다
    • 즉, 순수 긍정 일기를 작성하면 스트레스가 감소합니다
  • 행복 열매가 맺힌 경우: 물이 30점 줄어듭니다

이러한 특별 규칙들은 우물이 너무 자주 차오르지 않도록 하는 완충 역할을 함과 동시에, 긍정적인 감정에 대한 보상을 더욱 강화합니다.

넘침 상태

  • 물이 100%에 도달하면 "넘침" 상태가 됩니다
  • 넘치면 주민들이 위로하는 편지를 자동으로 전송합니다
  • 물이 넘친 후 "우물 비우기" 버튼을 누르면 우물이 초기화됩니다


2-6. 🏛️ 와글와글 광장

각각 다른 감정을 나타내는 무지개 주민들이 일기 내용에 대해 대화를 나누는 공간입니다.

기본 기능

  • 감정 분석 결과 확인: 일기의 감정 분석 결과를 확인할 수 있습니다
  • 주민 대화: 일기의 내용과 감정 분석 결과를 토대로 주민들이 이야기를 나눕니다
    • GPT-4o-mini가 각 주민의 고유한 성격과 말투를 반영하여 자연스러운 대화 생성
  • 채팅 기능: 사용자는 주민들과 실시간으로 채팅하며 상호작용할 수 있습니다
    • 각 주민이 자신의 감정 스타일에 맞게 자연스러운 반말로 응답
    • 일기 내용을 참고하여 맥락에 맞는 대화 제공
    • 주민별로 다른 관점과 톤의 답변 제공

대화 생성 메커니즘

참여 규칙

  • 주요 감정 (score > 0): 자신의 감정을 주로 표현하며 적극적으로 참여
  • 반응 감정 (score = 0): 다른 감정들에게 반응만 (위로, 동조, 반박 등)

대화 생성 시 감정 점수 기반 우선순위를 적용해, 실제 감정 분포와 일관된 스토리텔링을 유지합니다.

대화 생성 및 저장

  1. 감정 분석 결과 확인
  2. 주요 감정과 반응 감정 결정
  3. GPT-4o-mini가 각 주민의 특성을 반영한 대화 생성
  4. 대화를 데이터베이스에 저장
  5. 하루의 일기에 대한 대화가 한 번 생성되면 저장되며, 일기가 수정되면 재생성됩니다

plaza


2-7. 📬 감정 우체통 및 편지 시스템

마을의 무지개 주민들이 사용자에게 보내는 편지입니다. 사용자에게 위로, 격려, 공감의 메시지를 제공하며 주민과의 소통을 더욱 체감하게 합니다.

컨셉 및 목적

  • 편지 이벤트를 통해 사용자가 더 일기를 적극적으로 쓰도록 동기를 부여
  • 감정 변화에 대한 즉각적 피드백(보상/위로)
  • 주민과의 소통을 더욱 체감하게 함

편지 종류

편지 종류 조건 보낸 주민 설명
감정 편지 특정 감정 ≥ 70% 해당 감정 주민 특정 감정이 매우 강할 때 해당 주민이 편지 전송
축하 편지 열매 생성 기쁨·사랑 계열 주민 행복 나무에 열매가 맺히면 축하 편지 전송
위로 편지 우물 넘침 슬픔·두려움·분노 계열 주민 스트레스 우물이 넘치면 위로 편지 전송

편지 생성

  • 편지 내용은 GPT-4o-mini가 생성합니다
  • 각 주민의 성격과 말투가 반영됩니다
  • 위로 편지의 경우, 단순히 우물 넘침 이벤트만 발생하면 간혹 부정적인 감정에 대한 패널티처럼 보일 수 있으므로 이를 방지하기 위해 사용자에게 위로와 격려의 메시지를 제공합니다

letter


2-8. 📝 일기 작성

일기 작성 및 관리 기능입니다.

기본 기능

  • 날짜별 일기 작성 및 관리: 특정 날짜에 일기 작성, 수정, 삭제 가능
    • 원하는 날짜를 선택해서 일기를 작성할 수 있습니다
    • 과거 날짜에도 일기를 작성할 수 있습니다
  • 감정 분석: 딥러닝 모델 또는 GPT-4o-mini를 이용한 감정 분석
    • 일기 작성 시 자동으로 감정 분석이 진행됩니다
    • 딥러닝 모델 분석 결과는 참고용으로 제공됩니다
    • GPT-4o-mini 분석 결과가 실제 마을 시스템에 반영됩니다

일기 수정 및 삭제

  • 일기를 수정하면 감정 분석이 다시 진행되며, 그에 따라 마을 상태도 함께 변합니다
  • 일기를 삭제하면 해당 날짜의 감정 점수가 마을 시스템에서 제거됩니다
  • 일기 수정 시 와글와글 광장의 대화가 자동으로 재생성됩니다

일기 쓰기


2-9. 🏠 마을사무소

일기 아카이브, 다양한 통계, 감정 캘린더, 유사한 일기 찾기 등의 기능을 제공합니다.

주요 기능

감정 캘린더

  • 날짜를 선택하면 해당 날짜의 일기와 감정 분석 결과 확인 가능
  • 하루에 가장 비중이 많은 감정 주민의 색을 캘린더에 표시하여 날짜별 주요 감정 시각화
  • 한눈에 감정 패턴을 확인할 수 있습니다

이번 달 감정 통계

  • 한 달간의 감정 비율을 도넛 그래프로 나타냅니다
  • 감정별 비중을 한눈에 파악할 수 있습니다

주간 긍정/부정 추이

  • 일주일간의 긍정/부정 지수를 선 그래프로 나타냅니다
  • 감정 기복을 파악할 수 있습니다

감정별 평균 점수

  • 각 감정의 평균 점수를 표시합니다
  • 어떤 감정이 가장 많이 나타나는지 확인할 수 있습니다

요일별 작성 패턴

  • 요일별 일기 작성 빈도를 분석하여 언제 일기를 가장 많이 쓰는지 파악할 수 있습니다

연속 일기 작성 / 일기 작성 활동도

  • 일기 쓰기 빈도 현황을 통계로 제공합니다
  • 한 달동안/일주일동안 일기를 며칠 작성했는지 계산
  • 끊기지 않고 연속으로 며칠째 일기를 쓰고 있는지 계산
  • 동기 부여에 도움이 됩니다

유사한 일기 찾기

  • Sentence Transformer 모델 기반으로 선택한 일기와 유사한 감정/내용의 과거 일기 검색

  • 텍스트 유사도: 텍스트가 가장 유사한 일기 1개 제공

  • 감정 유사도: 감정 비율이 가장 유사한 일기 1개 제공

  • 두 가지 기준을 독립적으로 제공하여 다양한 관점에서 유사 일기 탐색 가능

    • 내용이 비슷한 일기를 통해 비슷한 상황에서 감정이 어떻게 달라졌는지 확인
    • 감정 비율이 비슷한 일기를 통해 어떤 상황에서 비슷한 감정을 느끼는지 확인

    → 사용자의 감정 패턴 파악과 자기 이해를 돕습니다.

참고: 마을 사무소는 무조건 서비스 사용 당시 날짜(오늘)을 기준으로 통계를 제공합니다. 사용자는 과거의 날짜를 자유롭게 선택하여 마을에 입장해해 일기를 작성할 수 있고, 이로 인한 통계 표시 혼란을 방지하기 위함입니다.

office1 office2


3. 시스템 아키텍처

시스템 구조 다이어그램

architecture


데이터 플로우

data-flow


일기 저장 플로우

사용자 작성 → 프론트엔드 → 백엔드 API
                      ↓
              GPT-4o-mini 감정 분석
                      ↓
              감정 점수 + 극성(polarity) 산출
                      ↓
              PostgreSQL 저장
                      ↓
              나무/우물 상태 업데이트
                      ↓
              대화 생성 (GPT)
                      ↓
              대화 저장 (DB)
                      ↓
              편지 생성 (필요시)
                      ↓
              응답 반환

감정 분석 프로세스

  1. 텍스트 전처리: 일기 텍스트를 정제하여 분석 준비
  2. GPT-4o-mini 분석: 시스템 프롬프트로 7가지 감정 점수 요청 (0~100점)
  3. 하이브리드 극성 판단: 놀람/부끄러움의 경우 Rule-based 키워드 분석과 GPT 기반 문맥 분석을 결합하여 긍정/부정 판단
  4. 점수 정규화: 7가지 감정 점수의 총합이 100이 되도록 정규화
  5. 결과 반환: JSON 형식으로 감정 점수 및 극성 반환

대화 생성 프로세스

  1. 감정 점수 분석: 0점 초과 감정 확인
  2. 주민 선정: 주요 감정(score > 0)과 반응 감정(score = 0) 분류
  3. GPT 프롬프트 구성: 일기 내용, 주민의 성격·말투, 역할 규칙 포함
  4. 대화 생성: GPT가 각 주민의 특성을 반영한 자연스러운 대화 생성
  5. DB 저장: 생성된 대화를 JSONB 형식으로 plaza_conversations 테이블에 저장


4. 딥러닝 모델

moodtown은 두 가지 딥러닝 기반 모델을 활용하여 감정 분석과 유사 일기 검색 기능을 제공합니다.

4-1. 감정 분석 딥러닝 모델 (직접 학습)

사용자가 작성한 일기의 감정을 분류하기 위해 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 → 당황/상처 (통합)
      • 원래 데이터는 E40E49->당황, E5059->상처로 되어 있으나, 모델의 분류 정확도를 위해 두 라벨을 통합했습니다.
    • 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

Confusion Matrix

혼동행렬을 통해 확인할 수 있듯이, '당황' 감정이 다른 감정(불안·슬픔·분노 등)과 혼동되는 경우가 특히 많이 발생했습니다.

이는 데이터셋의 라벨 구조상 부정적인 감정이 세분화되어 있고, 감정 간 표현이 서로 겹치는 특성이 있어 정확도 향상에 구조적인 한계가 있었기 때문입니다.

서비스 라벨 매핑 (5 → 7 감정)

  • 기쁨 → 기쁨
  • 분노 → 분노
  • 슬픔 → 슬픔
  • 불안 → 두려움
  • 당황 → 놀람 & 부끄러움으로 분리 (키워드 기반)
  • 사랑 → 기쁨 점수 기반 재분배

Fallback

모델 로드 실패 시 키워드 기반 감정 분석으로 자동 대체됩니다.


4-2. 유사 일기 검색 모델 (사전학습 딥러닝 모델 활용)

moodtown의 “유사한 일기 찾기” 기능은
Sentence Transformer 기반 딥러닝 모델을 이용하여 구현되었습니다.

이 모델은 사전학습(pretrained) 모델을 그대로 활용하며,
추가 학습(fine-tuning)은 진행하지 않았습니다.

모델 정보

  • 기반 모델: jhgan/ko-sbert-sts
  • 모델 타입: Sentence Transformer
  • 특징: 한국어 특화, 문맥 의미 기반 임베딩

유사도 계산 방식

  1. 텍스트 유사도
    • 일기 내용을 임베딩 후 코사인 유사도 계산
  2. 감정 유사도
    • 저장된 7가지 감정 점수를 벡터화하여 코사인 유사도 계산
  3. 두 기준을 독립적으로 제공
    • 내용이 가장 비슷한 일기 1개
    • 감정 비율이 가장 비슷한 일기 1개

이를 통해 사용자는 상황 기반 유사성감정 기반 유사성을 각각 확인할 수 있습니다.


모델 유형 학습 여부 사용 목적
감정 분류 모델 딥러닝 (Transformer) ✔ 직접 학습 참고용 감정 분류
Sentence Transformer 딥러닝 (Pretrained) ✖ 학습 안 함(사전 학습) 유사 일기 검색

5. 사용 기술 스택

5-1. Frontend

React 19.2.0

  • 역할: UI 구축을 위한 JavaScript 라이브러리
  • 사용처: 페이지 렌더링, 상태 관리, 컴포넌트 기반 UI 구성

Vite (Rolldown 기반) 7.2.2

  • 역할: 프론트엔드 개발 서버 및 번들러
  • 사용처: 빠른 개발 환경 제공(HMR), 프로덕션 빌드 생성

CSS3

  • 역할: 스타일링 및 애니메이션
  • 사용처: 반응형 UI, 주민/하늘/마을 애니메이션 구현

5-2. Backend

Flask 3.1.2

  • 역할: Python 기반 REST API 서버
  • 사용처: 인증, 일기 CRUD, 감정 분석 요청 처리, 나무/우물/대화 로직 관리

PostgreSQL

  • 역할: 관계형 데이터베이스
  • 사용처: 사용자, 일기, 감정 점수, 대화, 편지, 나무·우물 상태 등 데이터 저장
    (JSONB로 구조화된 감정 점수/대화 저장)

OpenAI API (GPT-4o-mini)

  • 역할: LLM 기반 텍스트 분석/생성
  • 사용처: 일기 감정 분석, 감정 주민 대화 생성, 이벤트 편지 생성

주요 라이브러리

  • flask-cors: CORS 설정
  • psycopg2-binary: PostgreSQL 연동
  • gunicorn: 배포용 WSGI 서버
  • python-dotenv: 환경변수 로딩
  • openai: GPT API 호출

5-3. Deep Learning

Transformers (HuggingFace)

  • 역할: KLUE-RoBERTa 기반 감정 분류 모델 실행
  • 사용처: 참고용 감정 분석 결과 제공

Sentence-Transformers

  • 역할: 문장 임베딩 생성 모델
  • 사용처: 마을 사무소의 “유사한 일기 찾기” 기능

기타 라이브러리

  • torch: 딥러닝 모델 실행 환경
  • joblib: 모델 저장/로딩
  • matplotlib / seaborn: 학습 시각화

5-4. 배포 플랫폼

Vercel

  • 역할: 프론트엔드 호스팅
  • 사용처: React 앱 프로덕션 배포

Railway

  • 역할: 백엔드 서버 및 PostgreSQL 호스팅
  • 사용처: Flask API + DB 통합 배포 환경 제공


6. 실행 방법

사전 요구사항

  • Python 3.8 이상
  • Node.js 18 이상
  • PostgreSQL 데이터베이스
  • OpenAI API 키

Backend 설정

1. 가상환경 생성 및 활성화

cd backend
python -m venv venv

# Windows
venv\Scripts\activate

# Linux/Mac
source venv/bin/activate

2. 의존성 설치

pip install -r requirements.txt

3. 환경 변수 설정

.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=development

4. 데이터베이스 초기화

python -c "from db import init_db; init_db()"

5. 서버 실행

python app.py

개발 서버는 기본적으로 http://localhost:5000에서 실행됩니다.


Frontend 설정

1. 의존성 설치

cd frontend
npm install

2. 개발 서버 실행

npm run dev

개발 서버는 기본적으로 http://localhost:5173에서 실행됩니다.

3. 프로덕션 빌드

npm run build

빌드된 파일은 dist/ 폴더에 생성됩니다.



7. 폴더 구조

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

AI 모델 / API

리소스 설명 링크
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은 다양한 기능을 통합한 프로젝트이지만, 개발 과정에서 여러 기술적·환경적 한계가 존재했습니다.

1. GPT 기반 감정 분석의 일관성

LLM 특성상 같은 입력에도 미세하게 다른 감정 점수를 출력할 수 있어 일관성을 완전히 보장하기 어렵습니다.

개선 방향: temperature 고정, 프롬프트 강화, GPT 결과를 딥러닝 모델 예측과 결합


2. 시각적 표현의 한계

구현 시간과 리소스의 부족으로 풍부한 인터랙션과 애니메이션을 충분히 반영하지 못했습니다.

개선 방향: 감정 변화에 따른 동적 애니메이션 추가, WebGL/Canvas 기반 그래픽 요소 적용


3. 주민 성격 개인화 미구현

현재 버전에서는 기본 성격 기반의 고정형 대화만 제공됩니다.

개선 방향: 사용자 감정 통계 기반 adaptive character 모델 설계, 사용자 성향 프로필을 반영한 주민 톤 변화


4. 딥러닝 감정 분석 모델의 성능 한계

AI Hub 감성대화말뭉치를 기반으로 학습한 모델은 약 63%의 정확도를 보였습니다. 주요 원인:

  • 데이터셋 라벨 구조의 모호성: '당황'과 '상처' 라벨의 경계가 모호
  • 도메인 차이: 데이터셋은 구어체 발화, moodtown은 문어체 일기 텍스트
  • 학습 환경 제약: Google Colab의 GPU 사용 시간 제한으로 하이퍼파라미터 실험 제한

개선 방향: 자체 일기 기반 데이터셋 수집, 도메인 적응 기법 도입, 장시간 학습 및 하이퍼파라미터 실험 수행


기여 가이드

moodtown은 개인 프로젝트지만, 아이디어 제안이나 버그 제보, 코드 기여는 언제든지 환영합니다.

이슈 제보

  • 버그 제보, 개선 제안, 문서 오타 등은 GitHub Issues로 등록해 주세요.

Pull Request

간단한 수정(PR)도 환영합니다.

  1. 이 레포지토리를 fork 합니다.
  2. 새로운 브랜치를 만듭니다.
    예) feat/add-some-feature, fix/bug-...
  3. 변경사항을 커밋하고, PR을 생성합니다.
  4. PR 설명에 변경 이유와 내용을 간단히 적어 주세요.

About

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published