# 🚀 Hướng Dẫn Chạy & Test Chatbot ML Service ## Yêu cầu - Python 3.12 đã cài đầy đủ dependencies (`pip install -r requirements.txt`) - Trained models đã đặt trong `saved_models/` - scikit-learn >= 1.6.1 (phải khớp version đã train model) --- ## Bước 1: Khởi động Server Mở **Terminal 1** (dùng làm server): ```powershell cd "c:\Users\Acer\Downloads\Wanderlust\chatbot-ml-service" $env:PYTHONPATH = "."; python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` > ⚠️ **Lưu ý cú pháp PowerShell:** Phải dùng dấu `;` giữa `$env:PYTHONPATH = "."` và `python ...` > Nếu viết trên 2 dòng riêng cũng được: > ```powershell > $env:PYTHONPATH = "." > python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 > ``` **Chạy nhanh không cần LLM** (khuyến nghị, ít RAM hơn): ```powershell cd "c:\Users\Acer\Downloads\Wanderlust\chatbot-ml-service" $env:PYTHONPATH = "."; $env:USE_LLM_GENERATOR = "false"; $env:CHATBOT_ML_SERVICE_API_KEY = "REDACTED_SECRET_PLACEHOLDER"; $env:ENABLE_SWAGGER_DOCS = "false"; python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` **Chờ đến khi thấy dòng:** ``` All models loaded successfully! INFO: Uvicorn running on http://0.0.0.0:8000 ``` > ⚠️ Nếu bật LLM (`USE_LLM_GENERATOR=true`), lần đầu chạy sẽ tải base model SeaLLMs-v3-7B-Chat (~14GB) từ HuggingFace. Yêu cầu GPU ≥6GB VRAM. > Nếu LLM fail (DLL error, thiếu CUDA), service vẫn chạy bình thường với template-based responses. --- ## Bước 2: Test API Mở **Terminal 2** (KHÁC terminal server) và chạy: ### 2.1. Health Check ```powershell Invoke-RestMethod -Uri "http://localhost:8000/health" -Method GET | ConvertTo-Json -Depth 5 ``` ### 2.2. Test Chat (tiếng Việt) ```powershell $body = @{ text = "Tôi muốn đi du lịch Đà Nẵng 3 ngày 2 đêm" language = "vi" } | ConvertTo-Json -Depth 3 Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Headers @{"X-ML-Service-Key"="REDACTED_SECRET_PLACEHOLDER"} -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 ``` ### 2.3. Test Chat (English) ```powershell $body = @{ text = "I want to travel to Ha Long Bay for 5 days" language = "en" } | ConvertTo-Json -Depth 3 Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Headers @{"X-ML-Service-Key"="REDACTED_SECRET_PLACEHOLDER"} -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 ``` ### 2.4. Test Recommend ```powershell $body = @{ tags = @("beach", "nature") interests = @("swimming", "hiking") budget_per_day = 1500000 top_k = 3 } | ConvertTo-Json -Depth 3 Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Headers @{"X-ML-Service-Key"="REDACTED_SECRET_PLACEHOLDER"} -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 ``` ### 2.5. Test các câu hỏi khác ```powershell # Hỏi về ẩm thực $body = '{"text": "Đà Nẵng có món gì ngon?", "language": "vi"}' Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Headers @{"X-ML-Service-Key"="REDACTED_SECRET_PLACEHOLDER"} -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 # Hỏi về ngân sách $body = '{"text": "Tôi có 5 triệu đi Nha Trang 3 ngày được không?", "language": "vi"}' Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Headers @{"X-ML-Service-Key"="REDACTED_SECRET_PLACEHOLDER"} -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 # Greeting $body = '{"text": "Xin chào!", "language": "vi"}' Invoke-RestMethod -Uri "http://localhost:8000/api/predict" -Method POST -Body $body -ContentType "application/json" | ConvertTo-Json -Depth 5 ``` --- ## Bước 3: Test bằng trình duyệt Mở trình duyệt, truy cập: - **Health**: http://localhost:8000/health - **API Docs (Swagger)**: chỉ có khi set `ENABLE_SWAGGER_DOCS=true` - **ReDoc**: chỉ có khi set `ENABLE_SWAGGER_DOCS=true` > Nếu bật docs để debug local, vẫn cần dùng header `X-ML-Service-Key` khi gọi các `/api/*` endpoints. --- ## Bước 4: Dừng Server Quay lại **Terminal 1** (terminal đang chạy server), nhấn `Ctrl + C`. --- ## Troubleshooting ### Lỗi "No module named 'app'" → Đảm bảo đã `cd` vào đúng thư mục `chatbot-ml-service` VÀ set `$env:PYTHONPATH = "."` → Hai lệnh phải cách nhau bằng dấu `;` hoặc viết trên 2 dòng riêng. → ❌ Sai: `$env:PYTHONPATH = "." python -m uvicorn ...` (thiếu dấu `;`) → ✅ Đúng: `$env:PYTHONPATH = "."; python -m uvicorn ...` ### Lỗi "idf vector is not fitted" / InconsistentVersionWarning (scikit-learn) → Model đã train bằng scikit-learn 1.6.1, cần cài đúng version: `pip install "scikit-learn>=1.6.1"` → Nếu muốn retrain lại model với version hiện tại: ```powershell $env:PYTHONPATH = "."; python -c "import os, json; from app.models.intent_classifier.model import IntentClassifier; f=open('app/data/datasets/intent_train.json','r',encoding='utf-8'); data=json.load(f); f.close(); clf=IntentClassifier(); clf.train([d['text'] for d in data],[d['intent'] for d in data]); clf.save('saved_models/intent_classifier.joblib'); print('Done!')" ``` ### LLM không load được (DLL error / CUDA error) → Service vẫn chạy bình thường, chỉ dùng template responses thay vì LLM. → Kiểm tra CUDA: `python -c "import torch; print(torch.cuda.is_available())"` → Khuyến nghị tắt LLM nếu không cần: set `$env:USE_LLM_GENERATOR = "false"` trước khi chạy. ### Port 8000 đã bị chiếm → Đổi port: `python -m uvicorn app.main:app --host 0.0.0.0 --port 8001` → Hoặc kill process cũ: ```powershell Get-NetTCPConnection -LocalPort 8000 -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force } ``` ### Muốn chạy không cần LLM (nhanh hơn, ít RAM) → Set biến môi trường trước khi chạy: `$env:USE_LLM_GENERATOR = "false"` → Hoặc tạo file `.env` trong thư mục `chatbot-ml-service` với nội dung: `USE_LLM_GENERATOR=false`