Skip to content
/ Hand Public

Hand (Have a nice day) : 갤럭시 워치의 생체 데이터를 기반으로 사용자의 심리 상태를 24시간 모니터링하고 AI 기반 맞춤형 완화 솔루션을 제공하는 선제적 정신 건강 관리 플랫폼

Notifications You must be signed in to change notification settings

Spinichi/Hand

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HAND - Have A Nice Day 👋

갤럭시 워치 기반 24시간 실시간 심리 모니터링 시스템

프로젝트 정보

  • 프로젝트명: HAND - Have A Nice Day
  • 기간: 2025.10 ~ 2025.11 (7주)
  • : 7명

📌 프로젝트 소개

HAND는 갤럭시 워치를 활용하여 사용자의 심리 상태를 24시간 모니터링하고, 실시간으로 이상 징후를 감지하여 적절한 완화법을 제안하는 서비스입니다.

핵심 기능

  • 🔍 실시간 이상치 감지
  • 📊 매일 자정 오늘의 점수 계산 (0-100점)
  • 💆 완화법 제안 (심호흡, 안전지대 연습)
  • 👥 그룹 관리 (관리자 대시보드)

팀원 소개

이름 역할
이희준 팀장, 인프라 및 IoT
남여경 프론트엔드 및 디자인
김동현 프론트엔드
김성민 백엔드
진성범 백엔드
김민선 IoT 및 프론트엔드
왕주영 AI 총괄

사용 예시

메인 페이지

사용 영상


🛠️ 기술 스택

Backend

  • Java 25
  • Spring Boot 3.x
  • Spring Cloud Gateway
  • Gradle
  • MySQL, MongoDB

Frontend

  • Android (Kotlin)
  • Wear OS (Galaxy Watch)

AI

  • Python 3.10, FastAPI
  • Weaviate (Vector DB)
  • KcELECTRA (감정 분류 모델)
  • GMS Embedding API (GPT-4 Embedding)
  • MLflow (실험 관리)

DevOps

  • Jenkins
  • Docker
  • Nginx
  • Prometheus + Grafana

🤖 AI 핵심 기능

1. 📘 감정 분석 (Emotion Classification)

사용자가 작성한 하루 다이어리 텍스트를 기반으로 감정 점수와 6가지 감정 확률을 분석합니다.

  • 모델: KcELECTRA 기반 커스텀 감정 분류 모델
  • 감정 라벨: 기쁨 / 당황 / 분노 / 불안 / 상처 / 슬픔
  • 감정별 확률 계산 후 가중치를 적용하여 0~100 감정 점수 산출
  • 전처리: URL 제거, 이모지 제거, 텍스트 정규화 등

2. ✏️ AI 기반 텍스트 요약

다이어리 텍스트를 두 형태로 요약해 제공합니다.

✔️ 짧은 요약 (20글자 내, ~한 날로 끝남)

  • 사용자에게 직접 보여주는 요약
  • 사건 중심으로 감정 톤을 극도로 압축

✔️ 긴 요약 (길이 제한 없음)

  • 내부 분석용 요약
  • 사건/감정/맥락을 모두 담은 상세 요약
  • 보고서 생성과 조언 생성을 위한 기반 데이터로 사용

3. 🩺 주간 심리·생체 보고서 생성

다음 데이터를 종합해 전문가 스타일의 주간 분석 리포트를 생성합니다.

  • 입력: 다이어리 요약들(long/short), 감정 점수 변화, Galaxy Watch 기반 생체 데이터(baseline, anomalies), 사용자 정보(age, gender, job 등)
  • 출력:
    • 감정 패턴 분석
    • 생체 스트레스 지표 해석
    • 감정–생체 반응 상관성 분석
    • 개인 특성 기반 코멘트
    • 주의 필요한 부분 / 회복 신호
  • 항목별 글자 수 조건을 맞춘 정제된 보고서

4. 💬 조언 생성 (Advice Generation)

서버는 사용자 및 관리자(팀장)에게 각각 맞춤 조언을 제공합니다.

✔️ 일간 조언 (daily_advice)

  • 오늘의 다이어리 내용을 기반으로 2줄 내외 조언 생성

✔️ 개인용 주간 조언 (private_advice)

  • 주간 보고서 + 유사 상담 기록을 기반으로 조언

✔️ 관리자용 주간 조언 (manager_advice)

  • 팀원의 상태 보고서 기반으로 관리자만 할 수 있는 톤의 조언을 추천

5. 🔍 RAG 기반 유사 상담 사례 검색

Weaviate 벡터 DB를 활용하여 과거 상담 기록에서 유사한 상황을 탐색합니다.

  • Hybrid Search (BM25 + Vector)
  • 입력: 감정 요약 및 사용자 정보(나이, 직업, 질병력 등), 일일 다이어리 요약 합본
  • 단일 상담/멀티턴 상담 모두 검색
  • 조언 생성 시 참고 자료로 활용

6. 🧠 벡터 임베딩 시스템

  • GMS Embedding API 사용 (GPT-3 Embedding)
  • 텍스트 → 벡터 변환
  • 조언/요약/리포트 등 모든 텍스트를 vector로 저장해 RAG 활용

7. 🗄️ Weaviate 벡터 DB 연동

다음 목적의 벡터를 저장/조회합니다.

  • 조언 데이터 저장 (SingleCounsel, MultiCounsel)
  • 저장 조건: 생성된 조언이 8 종류의 평가 기준 점수 평균 0.7 이상일 때만 저장

8. 📊 조언 품질 평가 시스템 (RAGAS-like + ARES)

조언의 품질을 자동으로 평가하여 0~1 스코어로 측정합니다.

포함된 평가 지표:

  • Answer Relevancy (답변 관련성)
  • Faithfulness (왜곡 없음)
  • Context Relevancy (문맥 적합도)
  • Empathy (공감도)
  • Safety (안전성)
  • Actionability (실행 가능성)
  • ARES 7개 항목 (helpfulness, coherence, groundedness, safety 등)

모든 평가는 GMS 모델로 수행하고 MLflow에 자동 기록됩니다.

9. 📑 MLflow 자동 기록 (MLOps)

  • 모든 조언 평가 metric을 MLflow에 기록
  • 실험 관리 / 모델 품질 추적
  • mlruns 디렉토리 자동 관리

📁 프로젝트 구조

시스템 아키텍처 상세도: exec/Architecture.png

S13P31A106/
├── backend/                # Spring Boot Backend
│   ├── src/main/
│   │   ├── java/com/finger/hand_backend/
│   │   └── resources/
│   │       └── application.yml
│   ├── Dockerfile
│   └── build.gradle
│
├── frontend/
│   ├── app/                # Android 앱
│   │   ├── src/main/java/com/hand/hand/
│   │   ├── google-services.json
│   │   └── build.gradle.kts
│   └── wear/               # Wear OS 앱
│       └── src/main/kotlin/com/hand/wear/
│
├── ai/                     # AI Server (FastAPI)
│   ├── FastAPI/
│   │   ├── app/
│   │   │   ├── api/
│   │   │   │   ├── route.py           # 엔드포인트 라우팅
│   │   │   │   └── weav.py            # Weaviate 연결 모듈
│   │   │   ├── core/
│   │   │   │   └── vector_embedding.py # GPT Embedding 3 + GMS 요청
│   │   │   ├── models/
│   │   │   │   └── schemas.py         # Pydantic 스키마
│   │   │   └── services/
│   │   │       ├── advice.py          # 관리자 조언 생성
│   │   │       ├── emotion_classify.py# 감정 분석
│   │   │       ├── report.py          # 주간 보고서 생성
│   │   │       └── summary.py         # 요약 기능 모듈
│   │   ├── main.py                    # FastAPI 앱 진입점
│   │   └── model_loader.py            # KcELECTRA 모델 로더
│   │
│   ├── Classifier_Model/              # 감정 분류 모델 (KcELECTRA)
│   │   ├── config.json
│   │   ├── model.safetensors          # 감정 분석 핵심 파라미터
│   │   ├── tokenizer.json             # 토큰화 핵심 파일
│   │   └── README.md
│   │
│   ├── Pretraining/                   # 사전학습 및 파인튜닝
│   │   └── KcELECTRA_shortsentence_finetuning.ipynb
│   │
│   ├── Quantization/                  # 모델 경량화/양자화 실험
│   │   └── KcELECTRA_Quantization.ipynb
│   │
│   ├── vector_db_settings/            # Weaviate 벡터DB 설정
│   │   ├── db_setting.py
│   │   ├── docker-compose.yml
│   │   ├── insert.ipynb
│   │   ├── total_kor_counsel_bot.jsonl
│   │   └── total_kor_multiturn_counsel_bot.jsonl
│   │
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── mlflow.db                      # MLflow 로컬 DB
│   └── requirements.txt
│
├── Jenkinsfile             # CI/CD 파이프라인
└── README.md

📦 포팅 매뉴얼

1. GitLab 소스 클론 및 빌드 방법 수동 포팅 순서

1.1 사용한 JVM, 캠퍼슬, WAS 등의 종류와 설정값, 버전 기재

Backend (Spring Boot)

  • Java: OpenJDK 25 (Eclipse Temurin)
  • Build Tool: Gradle 9.2.0
  • Spring Boot: 3.5.7
  • WAS: Embedded Tomcat (Spring Boot)
    • Port: 8080
    • Context Path: /api/v1

AI Server (FastAPI)

  • Python: 3.10-slim
  • Framework: FastAPI 0.120.0
  • ASGI Server: Uvicorn 0.38.0
  • Port: 8000

Frontend (Android)

  • Kotlin: JVM Target 11
  • Android SDK:
    • compileSdk: 36
    • minSdk: 24
    • targetSdk: 36
  • Gradle: 8.x (Kotlin DSL)

Wear OS

  • Wear OS API: 34+
  • Health Services: 1.1.0

1.2 빌드 시 사용되는 환경 변수 등의 내용 상세 기재

Backend 환경변수 (.env)

# Database (MySQL)
DB_HOST=localhost
DB_PORT=3306
DB_NAME=hand_db
DB_USERNAME=your_db_user
DB_PASSWORD=your_db_password

# MongoDB
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DB=hand_mongo
MONGO_USERNAME=your_mongo_user
MONGO_PASSWORD=your_mongo_password

# GMS API (SSAFY OpenAI)
GMS_API_KEY=your_gms_api_key

AI Server 환경변수 (.env)

# Weaviate Vector DB
WEAVIATE_HOST=weaviate
WEAVIATE_PORT=8080
WEAVIATE_GRPC_PORT=50051

# CORS
CORS_ORIGINS=https://gatewaytohand.store

# OpenAI API (Optional - for LangChain)
OPENAI_API_KEY=your_openai_api_key

# LangSmith (Optional - for monitoring)
LANGSMITH_API_KEY=your_langsmith_api_key

Frontend 환경변수 (build.gradle.kts)

// GMS API 설정
buildConfigField("String", "GMS_BASE_URL", "\"https://gms.ssafy.io/gmsapi/api.openai.com/\"")
buildConfigField("String", "GMS_API_KEY", "\"your_gms_api_key\"")

Jenkins 환경변수

# Docker Registry
REGISTRY_PORT=5000
REGISTRY_PRIVATE_IP=private_ip
REGISTRY_PUBLIC_IP=public_ip

# Server IPs
BACKEND_SERVER_IP=server2_ip
AI_SERVER_IP=server3_ip

# GitLab
GITLAB_WEBHOOK_TOKEN=your_webhook_token

1.3 배포 시 특이사항 기재

Backend 배포

  1. Docker Multi-stage Build 사용 (build + runtime 분리)
  2. FCM Service Account 키 필요 (firebase-service-account.json)
  3. Jenkins에서 자동 빌드/배포 (dev 브랜치 push 시)
  4. Health Check: /actuator/health

AI Server 배포

  1. Weaviate Vector DB와 함께 docker-compose로 배포
  2. 모델 로딩 시 Warm-up 수행 (약 10-15초 소요)
  3. GPU 사용 시 CUDA 11.2+ 필요 (torch==2.5.1)
  4. Health Check: Weaviate 서비스 정상 작동 확인 후 시작

Frontend 배포

  1. Firebase App Distribution으로 APK 배포
  2. google-services.json 파일 필요 (Firebase 설정)
  3. Release Notes 자동 생성 (커밋 해시, 빌드 번호 포함)

1.4 DB 접속 정보 등 프로젝트(ERD)에 활용되는 주요 계정 및 프로퍼티가 정의된 파일 목록

Backend 설정 파일

  • backend/src/main/resources/application.yml
    • MySQL, MongoDB 접속 정보
    • JWT Secret Key
    • GMS API 설정
    • AI Server URL 설정

환경 변수로 관리되는 민감 정보

# application.yml에서 환경변수 참조
spring:
  datasource:
    url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}

  data:
    mongodb:
      uri: mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/${MONGO_DB}

jwt:
  secret: "ZkR9mS2QvT7yP0aU1nW4eX6rL8oC5jB3hK9tV2pY0xF7dE1sZq"  # 배포 시 변경 필요

AI Server 설정

  • ai/docker-compose.yml: Weaviate 및 FastAPI 서비스 정의
  • ai/FastAPI/main.py: CORS 설정

Frontend 설정

  • frontend/app/google-services.json: Firebase 프로젝트 설정 (Git 미포함)
  • frontend/app/build.gradle.kts: GMS API 키 설정

2. 프론트엔드 외부 서비스 정보를 정리한 문서

2.1 소셜 인증, 결제, 이메일, 지도 등 외부 서비스 기재

Firebase Cloud Messaging (FCM)

  • 용도: 푸시 알림 (이상치 감지 시 알림 전송)
  • 필요 파일:
    • google-services.json (Android 앱)
    • firebase-service-account.json (Backend)
  • 설정 방법:
    1. Firebase Console에서 프로젝트 생성
    2. Android 앱 등록
    3. google-services.json 다운로드 → frontend/app/ 위치
    4. 서비스 계정 키 생성 → Backend src/main/resources/ 위치

GMS API (SSAFY OpenAI Proxy)

  • 용도: STT (Speech-to-Text) - 음성 일기 작성
  • Base URL: https://gms.ssafy.io/gmsapi/api.openai.com/v1/chat/completions
  • API Key: SSAFY에서 발급받은 팀별 API Key 사용
  • 사용 위치:
    • Backend: application.ymlgms.api.key
    • Frontend: build.gradle.ktsGMS_API_KEY

Weaviate Vector Database

  • 용도: RAG (Retrieval Augmented Generation) - AI 조언 생성
  • Version: 1.27.10
  • Port:
    • HTTP: 8080
    • gRPC: 50051
  • 설정: ai/docker-compose.yml

Google Play Services (Wearable)

  • 용도: Android 앱 ↔ Wear OS 통신
  • Library: com.google.android.gms:play-services-wearable:18.0.0
  • Protocol: Message API, Data API

3. DB 덤프 파일 최신본

3.1 DB 덤프 파일

프로젝트 제출 시 exec 폴더에 포함 예정

  • hand_db_dump.sql (MySQL)
  • hand_mongo_dump/ (MongoDB)

3.2 ERD 다이어그램

ERD는 별도 파일로 제공: exec/ERD.png

주요 테이블

  • users: 사용자 정보
  • organizations: 그룹(조직) 정보
  • measurements: 생체 데이터 (심박수, 스트레스 등)
  • anomaly_events: 이상치 감지 기록
  • relief_histories: 완화법 수행 기록
  • diaries: 일기 데이터
  • sleep_records: 수면 데이터

MongoDB Collections

  • diary_summaries: AI 일기 요약
  • weekly_reports: 주간 리포트
  • manager_advice: 관리자 조언

4. 시연 시나리오

별도 문서로 제공 예정 (exec/시연_시나리오.txt)


© 2025 FINGER Team. All rights reserved.

About

Hand (Have a nice day) : 갤럭시 워치의 생체 데이터를 기반으로 사용자의 심리 상태를 24시간 모니터링하고 AI 기반 맞춤형 완화 솔루션을 제공하는 선제적 정신 건강 관리 플랫폼

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •