KLUE/RoBERTa-Large ๊ธฐ๋ฐ Intent Classification (48 classes) + NER (6 entities)์ ํ์ฉํ ๋ ์คํ ๋ ์๋ ์๋ต ์์คํ
๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์ค์๊ฐ์ผ๋ก ์ดํดํ๊ณ , ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ + SQL DB ๊ธฐ๋ฐ ์ ํํ ์๋ต์ ์์ฑํ๋ ์ฑ๋ด ์๋ฃจ์
๋ ์คํ ๋ ๋ฐ ์๋น์ค ์ ์ข ์ ๋ฐ๋ณต์ ์ธ ๊ณ ๊ฐ ๋ฌธ์(๋ฉ๋ด, ์์ ์๊ฐ, ๊ฒฐ์ ๋ฐฉ๋ฒ ๋ฑ)๋ฅผ AI๋ก ์๋ํํ์ฌ 24/7 ๊ณ ๊ฐ ์๋๋ฅผ ์คํํ๋ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ฑ๋ด ์์คํ ์ ๋๋ค.
| ํญ๋ชฉ | ์ฑ๋ฅ | ๋น๊ณ |
|---|---|---|
| Intent Classification | Accuracy 97.7% | KLUE/RoBERTa-Large |
| NER Model | F1-Score 99.5% | Macro-averaged |
| ์๋ต ์๊ฐ | < 1์ด | Intent + NER + Search + DB |
| ๋ฐ์ดํฐ์ | 2,856 samples | 48 intents, 6 entity types |
| ๋์ ์ฒ๋ฆฌ | ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ง์ | Gunicorn multi-worker |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ User Interface โ
โ (Web UI / REST API / WebSocket) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Nginx (Reverse Proxy) โ
โ - Rate Limiting (100 req/m)โ
โ - SSL/TLS Termination โ
โ - Load Balancing โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Flask Application Server โ
โ (Gunicorn 4 workers) โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโผโโโโโ โโโโโโโโผโโโโโโโ โโโโโโโโผโโโโโโโ
โ Intent โ โ NER Model โ โ Redis โ
โClassifierโ โ(Token Class)โ โ Cache โ
โ 48 cls โ โ 6 entities โ โ โ
โโโโโโฌโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโฌโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Hybrid Search Engine โ
โ - BM25 (40%) โ
โ - Sentence-BERT (60%) โ
โ - Cosine Similarity โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ SQL Database (MySQL) โ
โ - Menus Table โ
โ - Business Info โ
โ - Conversation Logs โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Response Generator โ
โ - Slot Filling โ
โ - Template Engine โ
โ - TTS Integration โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Output โ
โ (JSON/Text) โ
โโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Monitoring Stack โ
โ Prometheus โ Metrics Collection โ
โ Grafana โ Real-time Dashboards โ
โ Node Exporter โ System Metrics โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Intent Classification - 48๊ฐ ์ธ๋ถํ๋ ์๋ ๋ถ๋ฅ
๐ ๋ฉ๋ด (11๊ฐ): ์นดํ
๊ณ ๋ฆฌ, ๊ฐ๊ฒฉ, ์ต์
, ์ธ๊ธฐ/์ถ์ฒ, ํ ์ธ, ์ ๋ฉ๋ด ๋ฑ
๐ ์ฃผ๋ฌธ/๊ฒฐ์ (5๊ฐ): ์ฃผ๋ฌธ ๋ฐฉ์, ๊ฒฐ์ ์๋จ, ๊ฐ๋ณ ๊ฒฐ์ ๋ฑ
๐ ์์
์ ๋ณด (6๊ฐ): ์์
์๊ฐ, ํด๋ฌด์ผ, ๋ธ๋ ์ดํฌ ํ์, ํน์ ์์ผ ๋ฑ
๐ ๋ฐฐ๋ฌ (3๊ฐ): ๋ฐฐ๋ฌ ์ง์ญ, ๋ฐฐ๋ฌ๋น, ์ต์ ์ฃผ๋ฌธ ๊ธ์ก
๐ ์์ค (7๊ฐ): ์ฃผ์, ์ฃผ์ฐจ, ์ข์, ๋จ์ฒด์, ํ
๋ผ์ค ๋ฑ
๐ ํํ (8๊ฐ): ๋ฉค๋ฒ์ญ, ํฌ์ธํธ, ์ฟ ํฐ, ์ด๋ฒคํธ ๋ฑ
๐ ๊ธฐํ (8๊ฐ): ๊ฐ์ฌ, ์ธ์ฌ, Fallback ๋ฑ
Named Entity Recognition - 6๊ฐ ์ํฐํฐ ์ถ์ถ
{
"MENU": ["๋ก๋ณถ์ด", "๊น๋ฐฅ"], # B-MENU, I-MENU
"PAYMENT": ["์นด๋", "์ ๋กํ์ด"], # B-PAYMENT, I-PAYMENT
"DAY": ["์์์ผ"] # B-DAY
}
# ํค์๋ + ์๋ฏธ ์ ์ฌ๋ ๊ฒฐํฉ
final_score = 0.4 * BM25_score + 0.6 * SBERT_score
| Category | Technology | Version |
|---|---|---|
| Framework | PyTorch | 2.7.0 (CUDA 12.4) |
| Transformers | Hugging Face | 4.57.1 |
| Pre-trained Model | KLUE/RoBERTa-Large | 1024 hidden, 24 layers |
| Search | Sentence-BERT | paraphrase-multilingual-MiniLM-L12-v2 |
| Evaluation | seqeval, scikit-learn | 1.2.2, 1.2.0 |
| Experiment Tracking | W&B | 0.15+ |
| Category | Technology | Purpose |
|---|---|---|
| Web Server | Flask 2.0+ | REST API |
| WSGI | Gunicorn | Production server (4 workers) |
| Database | MySQL 8.0 | Data storage |
| Cache | Redis 7.0 | Response caching |
| Proxy | Nginx | Rate limiting, SSL/TLS |
| Container | Docker 24.0+ | Containerization |
Beaver_ARS/
โ
โโโ ๐ README.md # ํ๋ก์ ํธ ๋ฌธ์
โโโ ๐ DATA_GUIDE.md # ๋ฐ์ดํฐ์
๊ฐ์ด๋
โโโ ๐ requirements.txt # Python ์์กด์ฑ
โโโ ๐ train.sh # ์๋ํ๋ ํ์ต ์คํฌ๋ฆฝํธ
โโโ ๐ train_quick.py # ๋น ๋ฅธ ํ์ต ์คํฌ๋ฆฝํธ
โโโ ๐ docker-compose.yml # ๋ฉํฐ ์ปจํ
์ด๋ ์ค์
โโโ ๐ Dockerfile # ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ ์
โโโ ๐ gunicorn_config.py # WSGI ์๋ฒ ์ค์
โโโ ๐ deploy.sh # ํ๋ก๋์
๋ฐฐํฌ ์คํฌ๋ฆฝํธ
โโโ ๐ rollback.sh # ๋กค๋ฐฑ ์คํฌ๋ฆฝํธ
โ
โโโ ๐ data/ # ๋ฐ์ดํฐ์
โ โโโ train/
โ โ โโโ intent_data.csv # Intent ํ์ต ๋ฐ์ดํฐ (2,824 samples)
โ โ โโโ ner_data.conll # NER ํ์ต ๋ฐ์ดํฐ (CoNLL format)
โ โโโ sample/ # ์ํ ๋ฐ์ดํฐ
โ โโโ processed/ # ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ (์๋ ์์ฑ)
โ
โโโ ๐ src/ # ์์ค ์ฝ๋
โ โโโ intent_mapping.py # Intent ๋ผ๋ฒจ ๋งคํ
โ โโโ intent_training.py # Intent ๋ถ๋ฅ ํ์ต
โ โโโ intent_inference.py # Intent ์ถ๋ก
โ โโโ intent_evaluation.py # Intent ํ๊ฐ
โ โโโ ner_training.py # NER ํ์ต
โ โโโ ner_evaluation.py # NER ํ๊ฐ
โ โโโ response_templates.py # ์๋ต ํ
ํ๋ฆฟ
โ โโโ main_ars_system.py # ํตํฉ ARS ์์คํ
(๋ฉ์ธ)
โ โโโ web_server.py # Flask ์น ์๋ฒ
โ โโโ main_system.py # ์์คํ
์ํธ๋ฆฌํฌ์ธํธ
โ
โโโ ๐ models/ # ํ์ต๋ ๋ชจ๋ธ
โ โโโ intent_classifier/ # Intent ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ ner_model/ # NER ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ
โโโ ๐ templates/ # HTML ํ
ํ๋ฆฟ
โ โโโ index.html # ์น UI
โ
โโโ ๐ static/ # ์ ์ ํ์ผ
โ โโโ css/
โ โโโ js/
โ โโโ audio/ # TTS ์ค๋์ค ํ์ผ
โ
โโโ ๐ config/ # ์ค์ ํ์ผ
โ โโโ config.yaml # ์ ํ๋ฆฌ์ผ์ด์
์ค์
โ โโโ database.yaml # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
โ
โโโ ๐ database/ # DB ์ด๊ธฐํ
โ โโโ init.sql # ์คํค๋ง ๋ฐ ์ด๊ธฐ ๋ฐ์ดํฐ
โ โโโ my.cnf # MySQL ์ค์
โ
โโโ ๐ nginx/ # Nginx ์ค์
โ โโโ nginx.conf # ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
โ
โโโ ๐ monitoring/ # ๋ชจ๋ํฐ๋ง
โ โโโ prometheus.yml # Prometheus ์ค์
โ โโโ grafana/ # Grafana ๋์๋ณด๋
โ
โโโ ๐ logs/ # ๋ก๊ทธ ํ์ผ (์๋ ์์ฑ)
โ โโโ YYYY-MM-DD/
โ
โโโ ๐ tests/ # ํ
์คํธ ์ฝ๋
โ โโโ test_intent_classification.py
โ โโโ test_ner_model.py
โ โโโ test_api_endpoints.py
โ
โโโ ๐ scripts/ # ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โ โโโ data_preprocessing.py
โ
โโโ ๐ docs/ # ์์ธ ๋ฌธ์
โ โโโ ARCHITECTURE.md
โ โโโ API_REFERENCE.md
โ โโโ DEPLOYMENT.md
โ
โโโ ๐ .github/ # CI/CD
โโโ workflows/
โโโ ci-cd.yml # GitHub Actions
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/SynapseSmith/Beaver_ARS.git
cd Beaver_ARS
# ๊ฐ์ํ๊ฒฝ ์์ฑ (๊ถ์ฅ)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
๋ฐ์ดํฐ๋ data/train/ ๋๋ ํ ๋ฆฌ์ ์ค๋น๋์ด ์์ต๋๋ค:
intent_data.csv: 2,856๊ฐ Intent ์ํner_data.conll: 2,170์ค NER ๋ผ๋ฒจ๋ง ๋ฐ์ดํฐ์์ธํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ DATA_GUIDE.md๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฑฐ๋, ์ง์ ํ์ตํ ์ ์์ต๋๋ค:
# ์๋ํ๋ ํ์ต ํ์ดํ๋ผ์ธ (๊ถ์ฅ)
chmod +x train.sh
./train.sh
# ๋๋ ๋น ๋ฅธ ํ์ต (์ํ ๋ฐ์ดํฐ)
python train_quick.py
# Flask ๊ฐ๋ฐ ์๋ฒ ์คํ
cd src
python web_server.py
# ๋ธ๋ผ์ฐ์ ์์ ์ ์
# http://localhost:5000
curl -X POST http://localhost:5000/chat \
-H "Content-Type: application/json" \
-d '{"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"}'
train.sh)./train.sh
7๋จ๊ณ ์๋ ์คํ:
| ํ๋ผ๋ฏธํฐ | Intent | NER |
|---|---|---|
| Model | KLUE/RoBERTa-Large | KLUE/RoBERTa-Large |
| Epochs | 50 | 30 |
| Batch Size | 16 | 16 |
| Learning Rate | 5e-5 | 2e-5 |
| Gradient Accumulation | 4 | 4 |
| Effective Batch | 64 | 32 |
# W&B ๋ก๊ทธ์ธ
wandb login
# ํ์ต ์ค ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
# https://wandb.ai/your-team/beaver-ars
# ์ ์ฒด ์คํ ์คํ (App + MySQL + Redis + Nginx + Prometheus + Grafana)
docker-compose up -d
# ๋ก๊ทธ ํ์ธ
docker-compose logs -f app
# ์ค์ง
docker-compose down
# ์ด๋ฏธ์ง ๋น๋
docker build -t beaver-ars:latest .
# ์ปจํ
์ด๋ ์คํ
docker run -p 5000:5000 beaver-ars:latest
# ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์คํ
chmod +x deploy.sh
./deploy.sh
# ๋กค๋ฐฑ (๋ฌธ์ ๋ฐ์ ์)
./rollback.sh
Endpoint: POST /chat
Request:
{
"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"
}
Response:
{
"response": "๋ก๋ณถ์ด์ ๊ฐ๊ฒฉ์ 5,000์์
๋๋ค.",
"intent": "ํน์ ์ํ ๋ฐ ๊ฐ๊ฒฉ ์๋ด",
"intent_id": 1,
"confidence": 0.98,
"entities": {
"MENU": ["๋ก๋ณถ์ด"]
},
"response_time_ms": 850
}
Endpoint: GET /health
Response:
{
"status": "healthy",
"model_loaded": true,
"db_connected": true,
"uptime_seconds": 3600
}
Endpoint: GET /metrics
# ์์คํ
๋ฉํธ๋ฆญ ์์ง
# - ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ
# - API ํธ์ถ ์นด์ดํธ
# - ์๋ฌ ๋ฐ์๋ฅ
# - ๋ชจ๋ธ ๋ก๋ฉ ์ํ
| Metric | Value |
|---|---|
| Accuracy | 97.7% |
| Weighted F1-Score | 97.7% |
| Eval Loss | 0.153 |
| Model | KLUE/RoBERTa-Large |
ํ์ต ๋ฐ์ดํฐ:
| Entity Type | Precision | Recall | F1-Score | Support |
|---|---|---|---|---|
| MENU | 98.9% | 100.0% | 99.5% | 70 |
| PAYMENT | 100.0% | 100.0% | 100.0% | 5 |
| DAY | 100.0% | 100.0% | 100.0% | 17 |
| Macro Avg | 98.9% | 100.0% | 99.5% | 92 |
โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโ
โ ํญ๋ชฉ โ ์ฑ๋ฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโค
โ Intent ๋ถ๋ฅ โ 97.7% Accuracy โ
โ NER ์ถ์ถ โ 99.5% F1-Score โ
โ ํ์ต ๋ฐ์ดํฐ โ 2,856 samples โ
โ ์ง์ Intent โ 48 classes โ
โ ์ง์ Entity โ 6 types (MENU/DAY) โ
โ GPU (ํ์ต) โ RTX 5090 32GB โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโ
๋ฌธ์ : WordPiece ํ ํฌ๋์ด์ ์๋ธํ ํฐ ๋ถ์ผ์น
ํด๊ฒฐ: offset_mapping ๊ธฐ๋ฐ ์ฒซ ์๋ธํ ํฐ๋ง ํ๊น
๊ฒฐ๊ณผ: NER F1-Score 99.5% ๋ฌ์ฑ
๋ฌธ์ : ๋จ์ผ ๊ฒ์ ๋ฐฉ์์ ํ๊ณ
ํด๊ฒฐ: BM25(ํค์๋) + SBERT(์๋ฏธ) ๊ฒฐํฉ (4:6 ๊ฐ์ค์น)
๊ฒฐ๊ณผ: ์ ํ๋์ ์ ์ฐ์ฑ ๋ชจ๋ ํ๋ณด
๋ฌธ์ : ๋์ฉ๋ ๋ชจ๋ธ ํ์ต ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
ํด๊ฒฐ: Gradient Accumulation (4 steps) ์ ์ฉ
๊ฒฐ๊ณผ: Batch 16์ผ๋ก Effective Batch 64 ํจ๊ณผ
๋ฌธ์ : ํฌ๊ด์ Intent๋ก ์ ํ๋ ์ ํ
ํด๊ฒฐ: ๋ฉ๋ด/์์
/๋ฐฐ๋ฌ/์์ค/ํํ ๋ฑ 48๊ฐ๋ก ์ธ๋ถํ
๊ฒฐ๊ณผ: ๋๋ฉ์ธ๋ณ ์ ๋ฐํ ์๋ต ์์ฑ ๊ฐ๋ฅ
KLUE/RoBERTa-Large ๊ธฐ๋ฐ Intent Classification (48 classes) + NER (6 entities)์ ํ์ฉํ ๋ ์คํ ๋ ์๋ ์๋ต ์์คํ
๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์ค์๊ฐ์ผ๋ก ์ดํดํ๊ณ , ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ + SQL DB ๊ธฐ๋ฐ ์ ํํ ์๋ต์ ์์ฑํ๋ ์ฑ๋ด ์๋ฃจ์
๋ ์คํ ๋ ๋ฐ ์๋น์ค ์ ์ข ์ ๋ฐ๋ณต์ ์ธ ๊ณ ๊ฐ ๋ฌธ์(๋ฉ๋ด, ์์ ์๊ฐ, ๊ฒฐ์ ๋ฐฉ๋ฒ ๋ฑ)๋ฅผ AI๋ก ์๋ํํ์ฌ 24/7 ๊ณ ๊ฐ ์๋๋ฅผ ์คํํ๋ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ฑ๋ด ์์คํ ์ ๋๋ค.
| ํญ๋ชฉ | ์ฑ๋ฅ | ๋น๊ณ |
|---|---|---|
| Intent Classification | Accuracy 97.7% | KLUE/RoBERTa-Large |
| NER Model | F1-Score 99.5% | Macro-averaged |
| ์๋ต ์๊ฐ | < 1์ด | Intent + NER + Search + DB |
| ๋ฐ์ดํฐ์ | 2,856 samples | 48 intents, 6 entity types |
| ๋์ ์ฒ๋ฆฌ | ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ง์ | Gunicorn multi-worker |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ User Interface โ
โ (Web UI / REST API / WebSocket) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Nginx (Reverse Proxy) โ
โ - Rate Limiting (100 req/m)โ
โ - SSL/TLS Termination โ
โ - Load Balancing โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Flask Application Server โ
โ (Gunicorn 4 workers) โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโผโโโโโ โโโโโโโโผโโโโโโโ โโโโโโโโผโโโโโโโ
โ Intent โ โ NER Model โ โ Redis โ
โClassifierโ โ(Token Class)โ โ Cache โ
โ 48 cls โ โ 6 entities โ โ โ
โโโโโโฌโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโฌโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Hybrid Search Engine โ
โ - BM25 (40%) โ
โ - Sentence-BERT (60%) โ
โ - Cosine Similarity โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ SQL Database (MySQL) โ
โ - Menus Table โ
โ - Business Info โ
โ - Conversation Logs โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Response Generator โ
โ - Slot Filling โ
โ - Template Engine โ
โ - TTS Integration โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Output โ
โ (JSON/Text) โ
โโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Monitoring Stack โ
โ Prometheus โ Metrics Collection โ
โ Grafana โ Real-time Dashboards โ
โ Node Exporter โ System Metrics โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Intent Classification - 48๊ฐ ์ธ๋ถํ๋ ์๋ ๋ถ๋ฅ
๐ ๋ฉ๋ด (11๊ฐ): ์นดํ
๊ณ ๋ฆฌ, ๊ฐ๊ฒฉ, ์ต์
, ์ธ๊ธฐ/์ถ์ฒ, ํ ์ธ, ์ ๋ฉ๋ด ๋ฑ
๐ ์ฃผ๋ฌธ/๊ฒฐ์ (5๊ฐ): ์ฃผ๋ฌธ ๋ฐฉ์, ๊ฒฐ์ ์๋จ, ๊ฐ๋ณ ๊ฒฐ์ ๋ฑ
๐ ์์
์ ๋ณด (6๊ฐ): ์์
์๊ฐ, ํด๋ฌด์ผ, ๋ธ๋ ์ดํฌ ํ์, ํน์ ์์ผ ๋ฑ
๐ ๋ฐฐ๋ฌ (3๊ฐ): ๋ฐฐ๋ฌ ์ง์ญ, ๋ฐฐ๋ฌ๋น, ์ต์ ์ฃผ๋ฌธ ๊ธ์ก
๐ ์์ค (7๊ฐ): ์ฃผ์, ์ฃผ์ฐจ, ์ข์, ๋จ์ฒด์, ํ
๋ผ์ค ๋ฑ
๐ ํํ (8๊ฐ): ๋ฉค๋ฒ์ญ, ํฌ์ธํธ, ์ฟ ํฐ, ์ด๋ฒคํธ ๋ฑ
๐ ๊ธฐํ (8๊ฐ): ๊ฐ์ฌ, ์ธ์ฌ, Fallback ๋ฑ
Named Entity Recognition - 6๊ฐ ์ํฐํฐ ์ถ์ถ
{
"MENU": ["๋ก๋ณถ์ด", "๊น๋ฐฅ"], # B-MENU, I-MENU
"PAYMENT": ["์นด๋", "์ ๋กํ์ด"], # B-PAYMENT, I-PAYMENT
"DAY": ["์์์ผ"] # B-DAY
}
# ํค์๋ + ์๋ฏธ ์ ์ฌ๋ ๊ฒฐํฉ
final_score = 0.4 * BM25_score + 0.6 * SBERT_score
| Category | Technology | Version |
|---|---|---|
| Framework | PyTorch | 2.7.0 (CUDA 12.4) |
| Transformers | Hugging Face | 4.57.1 |
| Pre-trained Model | KLUE/RoBERTa-Large | 1024 hidden, 24 layers |
| Search | Sentence-BERT | paraphrase-multilingual-MiniLM-L12-v2 |
| Evaluation | seqeval, scikit-learn | 1.2.2, 1.2.0 |
| Experiment Tracking | W&B | 0.15+ |
| Category | Technology | Purpose |
|---|---|---|
| Web Server | Flask 2.0+ | REST API |
| WSGI | Gunicorn | Production server (4 workers) |
| Database | MySQL 8.0 | Data storage |
| Cache | Redis 7.0 | Response caching |
| Proxy | Nginx | Rate limiting, SSL/TLS |
| Container | Docker 24.0+ | Containerization |
Beaver_ARS/
โ
โโโ ๐ README.md # ํ๋ก์ ํธ ๋ฌธ์
โโโ ๐ DATA_GUIDE.md # ๋ฐ์ดํฐ์
๊ฐ์ด๋
โโโ ๐ requirements.txt # Python ์์กด์ฑ
โโโ ๐ train.sh # ์๋ํ๋ ํ์ต ์คํฌ๋ฆฝํธ
โโโ ๐ train_quick.py # ๋น ๋ฅธ ํ์ต ์คํฌ๋ฆฝํธ
โโโ ๐ docker-compose.yml # ๋ฉํฐ ์ปจํ
์ด๋ ์ค์
โโโ ๐ Dockerfile # ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ ์
โโโ ๐ gunicorn_config.py # WSGI ์๋ฒ ์ค์
โโโ ๐ deploy.sh # ํ๋ก๋์
๋ฐฐํฌ ์คํฌ๋ฆฝํธ
โโโ ๐ rollback.sh # ๋กค๋ฐฑ ์คํฌ๋ฆฝํธ
โ
โโโ ๐ data/ # ๋ฐ์ดํฐ์
โ โโโ train/
โ โ โโโ intent_data.csv # Intent ํ์ต ๋ฐ์ดํฐ (2,824 samples)
โ โ โโโ ner_data.conll # NER ํ์ต ๋ฐ์ดํฐ (CoNLL format)
โ โโโ sample/ # ์ํ ๋ฐ์ดํฐ
โ โโโ processed/ # ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ (์๋ ์์ฑ)
โ
โโโ ๐ src/ # ์์ค ์ฝ๋
โ โโโ intent_mapping.py # Intent ๋ผ๋ฒจ ๋งคํ
โ โโโ intent_training.py # Intent ๋ถ๋ฅ ํ์ต
โ โโโ intent_inference.py # Intent ์ถ๋ก
โ โโโ intent_evaluation.py # Intent ํ๊ฐ
โ โโโ ner_training.py # NER ํ์ต
โ โโโ ner_evaluation.py # NER ํ๊ฐ
โ โโโ response_templates.py # ์๋ต ํ
ํ๋ฆฟ
โ โโโ main_ars_system.py # ํตํฉ ARS ์์คํ
(๋ฉ์ธ)
โ โโโ web_server.py # Flask ์น ์๋ฒ
โ โโโ main_system.py # ์์คํ
์ํธ๋ฆฌํฌ์ธํธ
โ
โโโ ๐ models/ # ํ์ต๋ ๋ชจ๋ธ
โ โโโ intent_classifier/ # Intent ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ โโโ ner_model/ # NER ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ
โ
โโโ ๐ templates/ # HTML ํ
ํ๋ฆฟ
โ โโโ index.html # ์น UI
โ
โโโ ๐ static/ # ์ ์ ํ์ผ
โ โโโ css/
โ โโโ js/
โ โโโ audio/ # TTS ์ค๋์ค ํ์ผ
โ
โโโ ๐ config/ # ์ค์ ํ์ผ
โ โโโ config.yaml # ์ ํ๋ฆฌ์ผ์ด์
์ค์
โ โโโ database.yaml # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
โ
โโโ ๐ database/ # DB ์ด๊ธฐํ
โ โโโ init.sql # ์คํค๋ง ๋ฐ ์ด๊ธฐ ๋ฐ์ดํฐ
โ โโโ my.cnf # MySQL ์ค์
โ
โโโ ๐ nginx/ # Nginx ์ค์
โ โโโ nginx.conf # ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
โ
โโโ ๐ monitoring/ # ๋ชจ๋ํฐ๋ง
โ โโโ prometheus.yml # Prometheus ์ค์
โ โโโ grafana/ # Grafana ๋์๋ณด๋
โ
โโโ ๐ logs/ # ๋ก๊ทธ ํ์ผ (์๋ ์์ฑ)
โ โโโ YYYY-MM-DD/
โ
โโโ ๐ tests/ # ํ
์คํธ ์ฝ๋
โ โโโ test_intent_classification.py
โ โโโ test_ner_model.py
โ โโโ test_api_endpoints.py
โ
โโโ ๐ scripts/ # ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โ โโโ data_preprocessing.py
โ
โโโ ๐ docs/ # ์์ธ ๋ฌธ์
โ โโโ ARCHITECTURE.md
โ โโโ API_REFERENCE.md
โ โโโ DEPLOYMENT.md
โ
โโโ ๐ .github/ # CI/CD
โโโ workflows/
โโโ ci-cd.yml # GitHub Actions
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/SynapseSmith/Beaver_ARS.git
cd Beaver_ARS
# ๊ฐ์ํ๊ฒฝ ์์ฑ (๊ถ์ฅ)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
๋ฐ์ดํฐ๋ data/train/ ๋๋ ํ ๋ฆฌ์ ์ค๋น๋์ด ์์ต๋๋ค:
intent_data.csv: 2,856๊ฐ Intent ์ํner_data.conll: 2,170์ค NER ๋ผ๋ฒจ๋ง ๋ฐ์ดํฐ์์ธํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ DATA_GUIDE.md๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฑฐ๋, ์ง์ ํ์ตํ ์ ์์ต๋๋ค:
# ์๋ํ๋ ํ์ต ํ์ดํ๋ผ์ธ (๊ถ์ฅ)
chmod +x train.sh
./train.sh
# ๋๋ ๋น ๋ฅธ ํ์ต (์ํ ๋ฐ์ดํฐ)
python train_quick.py
# Flask ๊ฐ๋ฐ ์๋ฒ ์คํ
cd src
python web_server.py
# ๋ธ๋ผ์ฐ์ ์์ ์ ์
# http://localhost:5000
curl -X POST http://localhost:5000/chat \
-H "Content-Type: application/json" \
-d '{"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"}'
train.sh)./train.sh
7๋จ๊ณ ์๋ ์คํ:
| ํ๋ผ๋ฏธํฐ | Intent | NER |
|---|---|---|
| Model | KLUE/RoBERTa-Large | KLUE/RoBERTa-Large |
| Epochs | 50 | 30 |
| Batch Size | 16 | 16 |
| Learning Rate | 5e-5 | 2e-5 |
| Gradient Accumulation | 4 | 4 |
| Effective Batch | 64 | 32 |
# W&B ๋ก๊ทธ์ธ
wandb login
# ํ์ต ์ค ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
# https://wandb.ai/your-team/beaver-ars
# ์ ์ฒด ์คํ ์คํ (App + MySQL + Redis + Nginx + Prometheus + Grafana)
docker-compose up -d
# ๋ก๊ทธ ํ์ธ
docker-compose logs -f app
# ์ค์ง
docker-compose down
# ์ด๋ฏธ์ง ๋น๋
docker build -t beaver-ars:latest .
# ์ปจํ
์ด๋ ์คํ
docker run -p 5000:5000 beaver-ars:latest
# ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์คํ
chmod +x deploy.sh
./deploy.sh
# ๋กค๋ฐฑ (๋ฌธ์ ๋ฐ์ ์)
./rollback.sh
Endpoint: POST /chat
Request:
{
"text": "๋ก๋ณถ์ด ๊ฐ๊ฒฉ์ด ์ผ๋ง์์?"
}
Response:
{
"response": "๋ก๋ณถ์ด์ ๊ฐ๊ฒฉ์ 5,000์์
๋๋ค.",
"intent": "ํน์ ์ํ ๋ฐ ๊ฐ๊ฒฉ ์๋ด",
"intent_id": 1,
"confidence": 0.98,
"entities": {
"MENU": ["๋ก๋ณถ์ด"]
},
"response_time_ms": 850
}
Endpoint: GET /health
Response:
{
"status": "healthy",
"model_loaded": true,
"db_connected": true,
"uptime_seconds": 3600
}
Endpoint: GET /metrics
# ์์คํ
๋ฉํธ๋ฆญ ์์ง
# - ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ
# - API ํธ์ถ ์นด์ดํธ
# - ์๋ฌ ๋ฐ์๋ฅ
# - ๋ชจ๋ธ ๋ก๋ฉ ์ํ
| Metric | Value |
|---|---|
| Accuracy | 97.7% |
| Weighted F1-Score | 97.7% |
| Eval Loss | 0.153 |
| Model | KLUE/RoBERTa-Large |
ํ์ต ๋ฐ์ดํฐ:
| Entity Type | Precision | Recall | F1-Score | Support |
|---|---|---|---|---|
| MENU | 98.9% | 100.0% | 99.5% | 70 |
| PAYMENT | 100.0% | 100.0% | 100.0% | 5 |
| DAY | 100.0% | 100.0% | 100.0% | 17 |
| Macro Avg | 98.9% | 100.0% | 99.5% | 92 |
โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโ
โ ํญ๋ชฉ โ ์ฑ๋ฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโค
โ Intent ๋ถ๋ฅ โ 97.7% Accuracy โ
โ NER ์ถ์ถ โ 99.5% F1-Score โ
โ ํ์ต ๋ฐ์ดํฐ โ 2,856 samples โ
โ ์ง์ Intent โ 48 classes โ
โ ์ง์ Entity โ 6 types (MENU/DAY) โ
โ GPU (ํ์ต) โ RTX 5090 32GB โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโ
๋ฌธ์ : WordPiece ํ ํฌ๋์ด์ ์๋ธํ ํฐ ๋ถ์ผ์น
ํด๊ฒฐ: offset_mapping ๊ธฐ๋ฐ ์ฒซ ์๋ธํ ํฐ๋ง ํ๊น
๊ฒฐ๊ณผ: NER F1-Score 99.5% ๋ฌ์ฑ
๋ฌธ์ : ๋จ์ผ ๊ฒ์ ๋ฐฉ์์ ํ๊ณ
ํด๊ฒฐ: BM25(ํค์๋) + SBERT(์๋ฏธ) ๊ฒฐํฉ (4:6 ๊ฐ์ค์น)
๊ฒฐ๊ณผ: ์ ํ๋์ ์ ์ฐ์ฑ ๋ชจ๋ ํ๋ณด
๋ฌธ์ : ๋์ฉ๋ ๋ชจ๋ธ ํ์ต ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
ํด๊ฒฐ: Gradient Accumulation (4 steps) ์ ์ฉ
๊ฒฐ๊ณผ: Batch 16์ผ๋ก Effective Batch 64 ํจ๊ณผ
๋ฌธ์ : ํฌ๊ด์ Intent๋ก ์ ํ๋ ์ ํ
ํด๊ฒฐ: ๋ฉ๋ด/์์
/๋ฐฐ๋ฌ/์์ค/ํํ ๋ฑ 48๊ฐ๋ก ์ธ๋ถํ
๊ฒฐ๊ณผ: ๋๋ฉ์ธ๋ณ ์ ๋ฐํ ์๋ต ์์ฑ ๊ฐ๋ฅ