Ứng dụng dịch thuật AI hỗ trợ English ↔ Vietnamese và 33 ngôn ngữ, powered by AngelSlim/Hy-MT1.5-1.8B-1.25bit.
translation-app/
├── frontend/ ← Frontend (HTML/CSS/JS)
│ ├── index.html
│ ├── css/style.css
│ ├── js/
│ │ ├── app.js # Main controller (Mediator)
│ │ ├── api-client.js # API facade
│ │ └── language-selector.js # Language picker (Observer)
│ ├── nginx.conf # Nginx config (proxy to backend)
│ └── Dockerfile # Nginx container
├── backend/ ← Backend (FastAPI + Python)
│ ├── app/
│ │ ├── main.py # FastAPI entry + Composition Root
│ │ ├── config.py # Settings (pydantic-settings)
│ │ ├── core/
│ │ │ ├── model_manager.py # Singleton model loader
│ │ │ ├── prompt_builder.py # Strategy + Factory patterns
│ │ │ └── language_registry.py # Repository (33 languages)
│ │ ├── schemas/
│ │ │ └── translation.py # DTO (Pydantic models)
│ │ ├── services/
│ │ │ └── translation_service.py
│ │ └── api/
│ │ └── routes.py # REST endpoints
│ ├── requirements.txt
│ └── Dockerfile
├── docker-compose.yml
├── .env.example
└── README.md
| Pattern | Component | Purpose |
|---|---|---|
| Singleton | ModelManager | Single model instance in memory |
| Strategy | PromptBuilder | ZH↔XX vs XX↔XX prompt templates |
| Factory | PromptBuilderFactory | Auto-select prompt strategy |
| Repository | LanguageRegistry | Centralized language catalog |
| DTO | schemas/ | Clean data transfer objects |
| Facade | ApiClient (JS) | Simplified API interface |
| Mediator | TranslationApp (JS) | UI coordination |
| DI | main.py | Composition Root |
| Yêu cầu | Chi tiết |
|---|---|
| Python | 3.11 trở lên |
| RAM | Tối thiểu 4GB (khuyến nghị 8GB+) |
| Disk | ~2GB trống (model ~440MB + dependencies) |
| GPU | NVIDIA GPU + CUDA (khuyến nghị, không bắt buộc) |
| Docker | Docker Engine 24+ & Docker Compose v2 (nếu chạy Docker) |
Bước 1 — Clone project và tạo file .env:
cd translation-app
cp .env.example .env
Bước 2 — Chỉnh sửa .env nếu cần (xem Cấu hình Environment bên dưới).
Bước 3 — Build và chạy cả 2 services:
# Chạy foreground (xem log trực tiếp)
docker compose up --build
# Hoặc chạy background (detached mode)
docker compose up --build -d
⏳ Lần đầu chạy sẽ mất thời gian vì Docker cần:
- Build image Python + cài dependencies (~3-5 phút)
- Download model từ HuggingFace (~440MB)
- Load model vào bộ nhớ
Bước 4 — Truy cập ứng dụng:
| Service | URL | Mô tả |
|---|---|---|
| Frontend | http://localhost:3000 | Giao diện dịch thuật |
| Backend API | http://localhost:8000/docs | Swagger API docs |
| Health Check | http://localhost:8000/api/v1/health | Kiểm tra backend |
Dừng ứng dụng:
docker compose down # Dừng containers
docker compose down -v # Dừng + xóa volume cache model
Xem logs:
docker compose logs -f backend # Log backend (model loading, requests)
docker compose logs -f frontend # Log nginx
Nếu máy có GPU NVIDIA, mở docker-compose.yml và uncomment phần deploy:
backend:
# ...
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
Yêu cầu đã cài NVIDIA Container Toolkit.
# Di chuyển vào thư mục backend
cd translation-app/backend
# Tạo virtual environment
python3 -m venv venv
# Kích hoạt virtual environment
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# Cài đặt dependencies
pip install -r requirements.txt
# Tạo file .env từ template (ở thư mục gốc)
cp ../.env.example .env
Hoặc tạo file .env trong thư mục backend/ với nội dung:
MODEL_NAME=AngelSlim/Hy-MT1.5-1.8B-1.25bit
MODEL_DEVICE=auto
CORS_ORIGINS=*
# Chạy development server (có auto-reload khi sửa code)
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
⏳ Lần đầu chạy, server sẽ tự động download model từ HuggingFace (~440MB). Sau khi download xong, model được cache tại
~/.cache/huggingface/. Các lần chạy sau sẽ load trực tiếp từ cache (nhanh hơn).
Khi thấy log Model loaded successfully, backend đã sẵn sàng.
# Mở terminal mới, di chuyển vào thư mục frontend
cd translation-app/frontend
# Chạy simple HTTP server
python3 -m http.server 3000
Các biến môi trường trong file .env:
| Biến | Mặc định | Mô tả |
|---|---|---|
MODEL_NAME | AngelSlim/Hy-MT1.5-1.8B-1.25bit | Tên model trên HuggingFace |
MODEL_DEVICE | auto | Device: auto, cpu, cuda, cuda:0 |
MODEL_MAX_NEW_TOKENS | 2048 | Số token tối đa model sinh ra |
MODEL_TOP_K | 20 | Top-K sampling |
MODEL_TOP_P | 0.6 | Top-P (nucleus) sampling |
MODEL_TEMPERATURE | 0.7 | Nhiệt độ sampling |
MODEL_REPETITION_PENALTY | 1.05 | Phạt lặp từ |
CORS_ORIGINS | * | Allowed origins (CORS) |
BACKEND_PORT | 8000 | Port backend (Docker) |
FRONTEND_PORT | 3000 | Port frontend (Docker) |
Lưu ý: Nếu chỉ có CPU, đặt
MODEL_DEVICE=cpu. Dịch sẽ chậm hơn (~10-30s/request) nhưng vẫn hoạt động.
| Vấn đề | Giải pháp |
|---|---|
CUDA out of memory | Đặt MODEL_DEVICE=cpu trong .env |
| Model download chậm/timeout | Dùng mirror: HF_ENDPOINT=https://hf-mirror.com |
| Frontend hiện "Offline" | Kiểm tra backend đã chạy chưa, port 8000 có đúng không |
ModuleNotFoundError | Kiểm tra đã activate venv và pip install -r requirements.txt |
| Docker build fail | Kiểm tra Docker version: docker --version (cần 24+) |
| Port đã bị chiếm | Đổi port trong .env: BACKEND_PORT=8001 |
| Method | Endpoint | Description |
|---|---|---|
POST | /api/v1/translate | Dịch văn bản |
GET | /api/v1/languages | Danh sách ngôn ngữ |
GET | /api/v1/model/status | Trạng thái model |
GET | /api/v1/health | Health check |
curl -X POST http://localhost:8000/api/v1/translate \
-H "Content-Type: application/json" \
-d '{
"source_text": "Hello, how are you?",
"source_language": "en",
"target_language": "vi"
}'
Ứng dụng dịch thuật AI hỗ trợ English ↔ Vietnamese và 33 ngôn ngữ, powered by AngelSlim/Hy-MT1.5-1.8B-1.25bit.
translation-app/
├── frontend/ ← Frontend (HTML/CSS/JS)
│ ├── index.html
│ ├── css/style.css
│ ├── js/
│ │ ├── app.js # Main controller (Mediator)
│ │ ├── api-client.js # API facade
│ │ └── language-selector.js # Language picker (Observer)
│ ├── nginx.conf # Nginx config (proxy to backend)
│ └── Dockerfile # Nginx container
├── backend/ ← Backend (FastAPI + Python)
│ ├── app/
│ │ ├── main.py # FastAPI entry + Composition Root
│ │ ├── config.py # Settings (pydantic-settings)
│ │ ├── core/
│ │ │ ├── model_manager.py # Singleton model loader
│ │ │ ├── prompt_builder.py # Strategy + Factory patterns
│ │ │ └── language_registry.py # Repository (33 languages)
│ │ ├── schemas/
│ │ │ └── translation.py # DTO (Pydantic models)
│ │ ├── services/
│ │ │ └── translation_service.py
│ │ └── api/
│ │ └── routes.py # REST endpoints
│ ├── requirements.txt
│ └── Dockerfile
├── docker-compose.yml
├── .env.example
└── README.md
| Pattern | Component | Purpose |
|---|---|---|
| Singleton | ModelManager | Single model instance in memory |
| Strategy | PromptBuilder | ZH↔XX vs XX↔XX prompt templates |
| Factory | PromptBuilderFactory | Auto-select prompt strategy |
| Repository | LanguageRegistry | Centralized language catalog |
| DTO | schemas/ | Clean data transfer objects |
| Facade | ApiClient (JS) | Simplified API interface |
| Mediator | TranslationApp (JS) | UI coordination |
| DI | main.py | Composition Root |
| Yêu cầu | Chi tiết |
|---|---|
| Python | 3.11 trở lên |
| RAM | Tối thiểu 4GB (khuyến nghị 8GB+) |
| Disk | ~2GB trống (model ~440MB + dependencies) |
| GPU | NVIDIA GPU + CUDA (khuyến nghị, không bắt buộc) |
| Docker | Docker Engine 24+ & Docker Compose v2 (nếu chạy Docker) |
Bước 1 — Clone project và tạo file .env:
cd translation-app
cp .env.example .env
Bước 2 — Chỉnh sửa .env nếu cần (xem Cấu hình Environment bên dưới).
Bước 3 — Build và chạy cả 2 services:
# Chạy foreground (xem log trực tiếp)
docker compose up --build
# Hoặc chạy background (detached mode)
docker compose up --build -d
⏳ Lần đầu chạy sẽ mất thời gian vì Docker cần:
- Build image Python + cài dependencies (~3-5 phút)
- Download model từ HuggingFace (~440MB)
- Load model vào bộ nhớ
Bước 4 — Truy cập ứng dụng:
| Service | URL | Mô tả |
|---|---|---|
| Frontend | http://localhost:3000 | Giao diện dịch thuật |
| Backend API | http://localhost:8000/docs | Swagger API docs |
| Health Check | http://localhost:8000/api/v1/health | Kiểm tra backend |
Dừng ứng dụng:
docker compose down # Dừng containers
docker compose down -v # Dừng + xóa volume cache model
Xem logs:
docker compose logs -f backend # Log backend (model loading, requests)
docker compose logs -f frontend # Log nginx
Nếu máy có GPU NVIDIA, mở docker-compose.yml và uncomment phần deploy:
backend:
# ...
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
Yêu cầu đã cài NVIDIA Container Toolkit.
# Di chuyển vào thư mục backend
cd translation-app/backend
# Tạo virtual environment
python3 -m venv venv
# Kích hoạt virtual environment
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# Cài đặt dependencies
pip install -r requirements.txt
# Tạo file .env từ template (ở thư mục gốc)
cp ../.env.example .env
Hoặc tạo file .env trong thư mục backend/ với nội dung:
MODEL_NAME=AngelSlim/Hy-MT1.5-1.8B-1.25bit
MODEL_DEVICE=auto
CORS_ORIGINS=*
# Chạy development server (có auto-reload khi sửa code)
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
⏳ Lần đầu chạy, server sẽ tự động download model từ HuggingFace (~440MB). Sau khi download xong, model được cache tại
~/.cache/huggingface/. Các lần chạy sau sẽ load trực tiếp từ cache (nhanh hơn).
Khi thấy log Model loaded successfully, backend đã sẵn sàng.
# Mở terminal mới, di chuyển vào thư mục frontend
cd translation-app/frontend
# Chạy simple HTTP server
python3 -m http.server 3000
Các biến môi trường trong file .env:
| Biến | Mặc định | Mô tả |
|---|---|---|
MODEL_NAME | AngelSlim/Hy-MT1.5-1.8B-1.25bit | Tên model trên HuggingFace |
MODEL_DEVICE | auto | Device: auto, cpu, cuda, cuda:0 |
MODEL_MAX_NEW_TOKENS | 2048 | Số token tối đa model sinh ra |
MODEL_TOP_K | 20 | Top-K sampling |
MODEL_TOP_P | 0.6 | Top-P (nucleus) sampling |
MODEL_TEMPERATURE | 0.7 | Nhiệt độ sampling |
MODEL_REPETITION_PENALTY | 1.05 | Phạt lặp từ |
CORS_ORIGINS | * | Allowed origins (CORS) |
BACKEND_PORT | 8000 | Port backend (Docker) |
FRONTEND_PORT | 3000 | Port frontend (Docker) |
Lưu ý: Nếu chỉ có CPU, đặt
MODEL_DEVICE=cpu. Dịch sẽ chậm hơn (~10-30s/request) nhưng vẫn hoạt động.
| Vấn đề | Giải pháp |
|---|---|
CUDA out of memory | Đặt MODEL_DEVICE=cpu trong .env |
| Model download chậm/timeout | Dùng mirror: HF_ENDPOINT=https://hf-mirror.com |
| Frontend hiện "Offline" | Kiểm tra backend đã chạy chưa, port 8000 có đúng không |
ModuleNotFoundError | Kiểm tra đã activate venv và pip install -r requirements.txt |
| Docker build fail | Kiểm tra Docker version: docker --version (cần 24+) |
| Port đã bị chiếm | Đổi port trong .env: BACKEND_PORT=8001 |
| Method | Endpoint | Description |
|---|---|---|
POST | /api/v1/translate | Dịch văn bản |
GET | /api/v1/languages | Danh sách ngôn ngữ |
GET | /api/v1/model/status | Trạng thái model |
GET | /api/v1/health | Health check |
curl -X POST http://localhost:8000/api/v1/translate \
-H "Content-Type: application/json" \
-d '{
"source_text": "Hello, how are you?",
"source_language": "en",
"target_language": "vi"
}'