File size: 7,473 Bytes
362d070
 
 
 
 
 
 
 
 
e2dbbb7
 
1868c8e
e9b7abe
 
7714815
e850536
39c894a
e850536
 
 
96f5b39
39c894a
1e4a71d
e850536
 
 
96f5b39
39c894a
e2dbbb7
e850536
39c894a
e850536
39c894a
 
 
e850536
39c894a
e850536
96f5b39
bc937e7
 
 
 
 
 
 
 
 
 
e850536
e2dbbb7
e850536
39c894a
 
e850536
 
bc937e7
39c894a
e2dbbb7
bc937e7
39c894a
bc937e7
e850536
bc937e7
e850536
60734f8
bc937e7
 
39c894a
e2dbbb7
1e4a71d
39c894a
1e4a71d
 
 
e850536
1e4a71d
39c894a
e850536
bc937e7
 
39c894a
bc937e7
 
e850536
bc937e7
 
e2dbbb7
e850536
39c894a
e850536
39c894a
 
 
e850536
39c894a
 
ce5dbc0
39c894a
e850536
93470d4
f0a1766
39c894a
1e4a71d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c620306
1e4a71d
 
c620306
1e4a71d
f0a1766
e2dbbb7
e850536
 
1e4a71d
 
 
 
 
 
 
 
 
 
39c894a
1e4a71d
39c894a
1e4a71d
39c894a
1e4a71d
39c894a
1e4a71d
39c894a
1e4a71d
e850536
1e4a71d
e850536
1e4a71d
e850536
1e4a71d
e850536
c98f885
ce5dbc0
2b2a1e4
ce5dbc0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
---
title: Emotion Chatbot
emoji: ๐Ÿค—
colorFrom: indigo
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
---


# ๐Ÿค– ์ผ๊ธฐ ๊ธฐ๋ฐ˜ ๊ฐ์ • ๋ถ„์„ ๋ฐ ์ฝ˜ํ…์ธ  ์ถ”์ฒœ ์›น
> ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ ์“ฐ๋Š” ๋‹น์‹ ์˜ ์ผ๊ธฐ, ๊ทธ ์†์— ์ˆจ๊ฒจ์ง„ ์ง„์งœ ๊ฐ์ •์€ ๋ฌด์—‡์ผ๊นŒ์š”?
> ์ด ํ”„๋กœ์ ํŠธ๋Š” AI๋ฅผ ํ†ตํ•ด ๋‹น์‹ ์˜ ๊ธ€์„ ์ดํ•ดํ•˜๊ณ , ๊ฐ์ •์— ๋ชฐ์ž…ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ์ƒˆ๋กœ์šด ํ™œ๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ ๋งž์ถคํ˜• ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๋‹น์‹ ๋งŒ์˜ ๊ฐ์„ฑ ๋น„์„œ์ž…๋‹ˆ๋‹ค.


<br>

<br>

## ๐Ÿš€ ๋ผ์ด๋ธŒ ๋ฐ๋ชจ (Live Demo)
๐Ÿ‘‰ https://huggingface.co/spaces/koons/emotion-chatbot
(์œ„ ์ฃผ์†Œ๋Š” ์‹ค์ œ ๋ฐฐํฌ๋œ Space ID ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.)

<br>

# โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ
๐Ÿค– ํ…์ŠคํŠธ ์† ๊ฐ์ • ํƒ์ƒ‰: klue/roberta-base ๋ชจ๋ธ์„ ํ•œ๊ตญ์–ด '๊ฐ์„ฑ๋Œ€ํ™” ๋ง๋ญ‰์น˜' ๋ฐ์ดํ„ฐ๋กœ ๋ฏธ์„ธ์กฐ์ •ํ•˜์—ฌ, ์ผ๊ธฐ ์†์— ๋‹ด๊ธด ๋ณตํ•ฉ์ ์ธ ๊ฐ์ •์„ 85% ์ด์ƒ์˜ ์ •ํ™•๋„๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽญ ๊ฐ์„ฑ ๋งž์ถค ํ๋ ˆ์ด์…˜: ๋ถ„์„๋œ ๊ฐ์ •์„ ๋” ๊นŠ์ด ์Œ๋ฏธํ•˜๊ณ  ์‹ถ์„ ๋•Œ(์ˆ˜์šฉ)์™€ ์ƒˆ๋กœ์šด ๊ธฐ๋ถ„์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ(์ „ํ™˜), ๋‘ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž์ถฐ ์˜ํ™”, ์Œ์•…, ์ฑ…์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“” ๋‚˜๋งŒ์˜ ๊ฐ์ • ๊ธฐ๋ก ๋ณด๊ด€: ์ž‘์„ฑํ–ˆ๋˜ ์ผ๊ธฐ์™€ AI์˜ ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ธŒ๋ผ์šฐ์ €(localStorage)์— ์ €์žฅํ•˜์—ฌ, ๊ณผ๊ฑฐ์˜ ๊ฐ์ • ํ๋ฆ„์„ ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ๋Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์ง๊ด€์ ์ธ ๋ฐ˜์‘ํ˜• UI: Flask์™€ JavaScript๋กœ ๊ตฌ์ถ•๋œ ๊ฐ„๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ์–ด๋–ค ๊ธฐ๊ธฐ์—์„œ๋„ ํŽธ์•ˆํ•˜๊ฒŒ ๊ฐ์ •์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<br>

# โš™๏ธ ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ์•„ํ‚คํ…์ฒ˜
| ๊ตฌ๋ถ„ | ๊ธฐ์ˆ  |
| :--- | :--- |
| **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 |



<br>


Git Push (main ๋ธŒ๋žœ์น˜) โ†’ GitHub Actions (CI/CD ํŠธ๋ฆฌ๊ฑฐ) โ†’ Dockerfile ๋นŒ๋“œ โ†’ Hugging Face Spaces (์ž๋™ ๋ฐฐํฌ ๋ฐ ์„œ๋น™)

<br>

## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ: ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์‹คํ–‰ (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 ์„ ์ž…๋ ฅํ•˜์—ฌ ์ ‘์†ํ•˜์„ธ์š”.
```
<br>

# ๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ
```
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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก
```

<br>

๐Ÿง—โ€โ™‚๏ธ ์ฃผ์š” ๊ฐœ๋ฐœ ๋„์ „ ๊ณผ์ œ ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ • (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 ํด๋” ๋‚ด๋ถ€๋กœ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ตœ์ข… ํ•ด๊ฒฐ.