Spaces:
Runtime error
title: Emotion Chatbot
emoji: ๐ค
colorFrom: indigo
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
๐ค ์ผ๊ธฐ ๊ธฐ๋ฐ ๊ฐ์ ๋ถ์ ๋ฐ ์ฝํ ์ธ ์ถ์ฒ ์น
ํ๋ฃจ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ ์ฐ๋ ๋น์ ์ ์ผ๊ธฐ, ๊ทธ ์์ ์จ๊ฒจ์ง ์ง์ง ๊ฐ์ ์ ๋ฌด์์ผ๊น์? ์ด ํ๋ก์ ํธ๋ AI๋ฅผ ํตํด ๋น์ ์ ๊ธ์ ์ดํดํ๊ณ , ๊ฐ์ ์ ๋ชฐ์ ํ๊ฑฐ๋ ํน์ ์๋ก์ด ํ๋ ฅ์ด ํ์ํ ๋ ๋ง์ถคํ ์ฝํ ์ธ ๋ฅผ ์ถ์ฒํด์ฃผ๋ ๋น์ ๋ง์ ๊ฐ์ฑ ๋น์์ ๋๋ค.
๐ ๋ผ์ด๋ธ ๋ฐ๋ชจ (Live Demo)
๐ https://huggingface.co/spaces/koons/emotion-chatbot (์ ์ฃผ์๋ ์ค์ ๋ฐฐํฌ๋ Space ID ๊ธฐ์ค์ ๋๋ค.)
โจ ํต์ฌ ๊ธฐ๋ฅ
๐ค ํ ์คํธ ์ ๊ฐ์ ํ์: klue/roberta-base ๋ชจ๋ธ์ ํ๊ตญ์ด '๊ฐ์ฑ๋ํ ๋ง๋ญ์น' ๋ฐ์ดํฐ๋ก ๋ฏธ์ธ์กฐ์ ํ์ฌ, ์ผ๊ธฐ ์์ ๋ด๊ธด ๋ณตํฉ์ ์ธ ๊ฐ์ ์ 85% ์ด์์ ์ ํ๋๋ก ๋ถ์ํฉ๋๋ค.
๐ญ ๊ฐ์ฑ ๋ง์ถค ํ๋ ์ด์ : ๋ถ์๋ ๊ฐ์ ์ ๋ ๊น์ด ์๋ฏธํ๊ณ ์ถ์ ๋(์์ฉ)์ ์๋ก์ด ๊ธฐ๋ถ์ผ๋ก ์ ํํ๊ณ ์ถ์ ๋(์ ํ), ๋ ๊ฐ์ง ์๋๋ฆฌ์ค์ ๋ง์ถฐ ์ํ, ์์ , ์ฑ ์ ์ถ์ฒํฉ๋๋ค.
๐ ๋๋ง์ ๊ฐ์ ๊ธฐ๋ก ๋ณด๊ด: ์์ฑํ๋ ์ผ๊ธฐ์ AI์ ๊ฐ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ (localStorage)์ ์ ์ฅํ์ฌ, ๊ณผ๊ฑฐ์ ๊ฐ์ ํ๋ฆ์ ์ธ์ ๋ ์ง ๋ค์ ๋์๋ณผ ์ ์์ต๋๋ค.
๐ป ์ง๊ด์ ์ธ ๋ฐ์ํ UI: Flask์ JavaScript๋ก ๊ตฌ์ถ๋ ๊ฐ๊ฒฐํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ, ์ด๋ค ๊ธฐ๊ธฐ์์๋ ํธ์ํ๊ฒ ๊ฐ์ ์ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
โ๏ธ ๊ธฐ์ ์คํ ๋ฐ ์ํคํ ์ฒ
| ๊ตฌ๋ถ | ๊ธฐ์ |
|---|---|
| Backend | python, Flask, Gunicorn |
| Frontend | HTML, CSS, JavaScript |
| AI / Data | PyTorch, Hugging Face Transformers, Scikit-learn, Pandas |
| Deployment | Docker, GitHub Actions, Hugging Face Spaces |
| Version Control | Git, GitHub, Git LFS |
Git Push (main ๋ธ๋์น) โ GitHub Actions (CI/CD ํธ๋ฆฌ๊ฑฐ) โ Dockerfile ๋น๋ โ Hugging Face Spaces (์๋ ๋ฐฐํฌ ๋ฐ ์๋น)
๐ ์์ํ๊ธฐ: ๋ก์ปฌ ํ๊ฒฝ ์ค์ ๋ฐ ์คํ (Getting Started)
Python 3.10 ์ด ํ๋ก์ ํธ๋ ๋ ๋ฆฝ๋ ๊ฐ์ํ๊ฒฝ์์ ์คํํ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ๊ถ์ฅํฉ๋๋ค. ๊ฐ์ํ๊ฒฝ์ PC์ ๋ค๋ฅธ ํ์ด์ฌ ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํด์ฃผ๋ '๋ ๋ฆฝ๋ ์์ ๊ณต๊ฐ'์ ๋๋ค.
๐ ๋ฐฉ๋ฒ 1: Anaconda ์ฌ์ฉ (๊ฐ์ฅ ์์ ์ ์ธ ๋ฐฉ๋ฒ)
AI/ML ํ๋ก์ ํธ์ ํ์ํ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ์ฅ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ Anaconda ์ฌ์ฉ์ ์ถ์ฒํฉ๋๋ค.
# 1. GitHub์์ ํ๋ก์ ํธ ๋ณต์
git clone [https://github.com/kootaeng2/Emotion-Chatbot-App.git](https://github.com/kootaeng2/Emotion-Chatbot-App.git)
cd Emotion-Chatbot-App
2. ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น (Anaconda ๊ถ์ฅ)
# Anaconda ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ
conda create -n sentiment_env python=3.10
conda activate sentiment_env
# ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น (PyTorch ๋จผ์ , ์ดํ requirements.txt)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 2. 'sentiment_env'๋ผ๋ ์ด๋ฆ์ผ๋ก Python 3.10 Conda ๊ฐ์ํ๊ฒฝ ์์ฑ
conda create -n sentiment_env python=3.10
# 3. ์๋ก ๋ง๋ ๊ฐ์ํ๊ฒฝ ํ์ฑํ
conda activate sentiment_env
# 4. ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น (PyTorch ๋จผ์ , ์ดํ requirements.txt)
pip install torch torchvision torchaudio --index-url [https://download.pytorch.org/whl/cu118](https://download.pytorch.org/whl/cu118)
pip install -r requirements.txt
python scripts/train_model.py
4. ์น ์ ํ๋ฆฌ์ผ์ด์
์คํ
Bash
python src/app.py
์๋ฒ๊ฐ ์คํ๋๋ฉด, ์น ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ http://127.0.0.1:5000 ์ ์
๋ ฅํ์ฌ ์ ์ํ์ธ์.
๐ ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ
Emotion-Chatbot-App/
โ
โโโ .github/
โ โโโ workflows/
โ โโโ sync-to-hub.yml # GitHub Actions ์๋ ๋ฐฐํฌ ์ํฌํ๋ก์ฐ
โ
โโโ korean-emotion-classifier-final/ # ์ถ๋ก (Inference)์ฉ ์ต์ข
AI ๋ชจ๋ธ
โ
โโโ notebooks/
โ โโโ 1_explore_data.py # ๋ฐ์ดํฐ ํ์์ฉ ๋
ธํธ๋ถ
โ
โโโ scripts/
โ โโโ train_model.py # AI ๋ชจ๋ธ ํ๋ จ ์คํฌ๋ฆฝํธ
โ
โโโ src/
โ โโโ app.py # Flask ์น ์๋ฒ ์คํ ํ์ผ
โ โโโ emotion_engine.py # ๊ฐ์ ๋ถ์ ์์ง ๋ชจ๋
โ โโโ recommender.py # ์ฝํ
์ธ ์ถ์ฒ ๋ชจ๋
โ โโโ static/ # CSS, Frontend JS ๋ฑ ์ ์ ํ์ผ
โ โโโ templates/ # HTML ํ
ํ๋ฆฟ ํ์ผ
โโโ emotion_homepage.html # ํํ์ด์ง
โ
โโโ Dockerfile # Hugging Face ๋ฐฐํฌ์ฉ Docker ์ค์
โโโ README.md # ํ๋ก์ ํธ ์ค๋ช
์
โโโ requirements.txt # ํ์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก
๐งโโ๏ธ ์ฃผ์ ๊ฐ๋ฐ ๋์ ๊ณผ์ ๋ฐ ํด๊ฒฐ ๊ณผ์ (Troubleshooting Journey) ์ด ํ๋ก์ ํธ์ ๊ฐ์ฅ ํฐ ์ฑ๊ณผ๋ ๋จ์ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด, ์ค์ ์๋น์ค ๋ฐฐํฌ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ณต์กํ๊ณ ๊น์ด ์๋ ๋ฌธ์ ๋ค์ ์ฒด๊ณ์ ์ผ๋ก ํด๊ฒฐํ ๊ฒฝํ์ ๋๋ค.
์์ธ ๋ถ๋ช ์ OS ๋ ๋ฒจ ์ค๋ฅ ํด๊ฒฐ (stat: ... not NoneType):
๋ฌธ์ : ๋ก์ปฌ Windows ํ๊ฒฝ์์ transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ผ์ ๋ก๋ํ์ง ๋ชปํ๋ ์์ธ ๋ถ๋ช ์ OS ์์ค ์ค๋ฅ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์.
ํด๊ฒฐ: venv์ ๋ถ์์ ์ฑ์ ์์ฌํ๊ณ Anaconda ํ๊ฒฝ์ผ๋ก ์ด์ ํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ํต์ ํ์ผ๋ฉฐ, Windows์ Linux์ ๊ฒฝ๋ก ์ฐจ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ ๋ฐ ๊ฒฝ๋ก ๊ตฌ๋ถ์ ์ ๊ทํ๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์ต์ข ํด๊ฒฐ. ์ด๋ฅผ ํตํด ์ด์์ฒด์ ๊ฐ ํธํ์ฑ์ ๋ํ ๊น์ ์ดํด๋ฅผ ์ป์.
๋์ฉ๋ AI ๋ชจ๋ธ์ ๋ฒ์ ๊ด๋ฆฌ (Git LFS & History Rewriting):
๋ฌธ์ : 1GB๊ฐ ๋๋ AI ๋ชจ๋ธ ๋ฐ ํ๋ จ ๋ถ์ฐ๋ฌผ ํ์ผ๋ก ์ธํด git push ์ ํ์์์(408) ๋ฐ GitHub ์ฉ๋ ์ ํ(GH001) ์ค๋ฅ ๋ฐ์.
ํด๊ฒฐ: Git LFS๋ฅผ ๋์ ํ์ฌ ๋์ฉ๋ ํ์ผ์ ๊ด๋ฆฌํ๊ณ , ๊ณผ๊ฑฐ ํ์คํ ๋ฆฌ์ ๋จ์ ๋ถํ์ํ ๋์ฉ๋ ํ์ผ์ ํ์ ์ git filter-repo ๋ช ๋ น์ด๋ก ์์ ํ ์ ๊ฑฐ. ์ต์ข ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์ง์๋์ ์ ์ฅ์๋ฅผ ์ด๊ธฐํํ๊ณ ๊นจ๋ํ ๋ฒ์ ๋ง ํธ์ํ๋ ๊ณผ๊ฐํ ๊ฒฐ์ ์ ํตํด ๊ทผ๋ณธ ์์ธ์ ํด๊ฒฐ.
ํด๋ผ์ฐ๋ ์๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ (CI/CD):
๋ฌธ์ : Hugging Face Space ๋ฐฐํฌ ๊ณผ์ ์์ ๊ตฌ์ ์ธ์ฆ ๋ฐฉ์ ์ค๋ฅ, requirements.txt ๋๋ฝ, Python ๋ชจ๋ ํ์ ๊ฒฝ๋ก ๋ฌธ์ (ModuleNotFoundError), Flask ํ ํ๋ฆฟ ๊ฒฝ๋ก ๋ฌธ์ (TemplateNotFound) ๋ฑ ๋ค์ํ ๋ฐํ์ ์ค๋ฅ ๋ฐ์.
ํด๊ฒฐ:
Dockerfile์ ์์ฑํ์ฌ ์ด๋ค ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์คํ๋ ์ ์๋ ํ์คํ๋ ํ๊ฒฝ์ ๊ตฌ์ถ.
GitHub Actions ์ํฌํ๋ก์ฐ๋ฅผ ์ต์ ๊ณต์ Action(huggingface/sync-to-hub)์ผ๋ก ์์ ํ์ฌ ์ธ์ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ.
์๋ฒ ํ๊ฒฝ์์์ Python ์ํฌํธ ๋ฐฉ์์ ์ดํดํ๊ณ **์๋ ๊ฒฝ๋ก ์ํฌํธ(relative import)**๋ฅผ ์ ์ฉํ์ฌ ๋ชจ๋ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ.
Flask์ ๋์ ์๋ฆฌ์ ๋ง์ถฐ templates ํด๋๋ฅผ src ๋ด๋ถ๋ก ์ฌ๋ฐฐ์นํ์ฌ ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ๋ฐํ์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ณ ๋ฐฐํฌ์ ์ฑ๊ณต.
ํด๊ฒฐ: gunicorn์ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ , Python์ **์๋ ๊ฒฝ๋ก ์ํฌํธ(relative import)**๋ฅผ ์ ์ฉํ์ฌ ๋ชจ๋ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ. ๋ํ Flask์ ๊ธฐ๋ณธ ๊ท์น์ ๋ง๊ฒ templates ๋ฐ static ํด๋๋ฅผ app.py๊ฐ ์๋ src ํด๋ ๋ด๋ถ๋ก ์ฌ๋ฐฐ์นํ์ฌ ๋ฌธ์ ๋ฅผ ์ต์ข ํด๊ฒฐ.