emotion-chatbot / README.md
taehoon222's picture
Update README.md
c620306
metadata
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 ํด๋” ๋‚ด๋ถ€๋กœ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ตœ์ข… ํ•ด๊ฒฐ.