Nội dung chính của bài viết
– Tóm tắt nhanh các bước tích hợp LLM self‑hosted (Llama 3, Mistral) vào n8n.
– Những vấn đề thực tế mà mình và các khách hàng thường gặp khi muốn chạy AI trên server riêng.
– Giải pháp tổng quan bằng sơ đồ text‑art, kèm hướng dẫn chi tiết từng bước (cài Ollama / vLLM, cấu hình n8n, gọi API).
– Template quy trình mẫu, bảng chi phí thực tế và so sánh số liệu “trước – sau”.
– Các lỗi phổ biến, cách khắc phục và chiến lược scale lớn.
– FAQ và lời kêu gọi hành động.
1. Tóm tắt nội dung chính
- Mục tiêu: Cho phép n8n gọi mô hình LLM tự host (Llama 3, Mistral) qua Ollama hoặc vLLM, không phụ thuộc vào dịch vụ đám mây bên ngoài.
- Công cụ: n8n (Docker), Ollama hoặc vLLM (Python), Docker‑Compose, PostgreSQL (n8n DB).
- Quy trình: 1️⃣ Cài Ollama/vLLM → 2️⃣ Đưa mô hình vào → 3️⃣ Expose API → 4️⃣ Tạo node HTTP Request trong n8n → 5️⃣ Xây workflow tự động.
- Kết quả: Giảm chi phí 60 % so với OpenAI, thời gian phản hồi < 500 ms cho câu hỏi ngắn, khả năng tùy chỉnh prompt nội bộ.
2. Vấn đề thật mà mình và khách hay gặp mỗi ngày
- Chi phí API AI leo thang – Một dự án marketing automation của công ty X dùng GPT‑4, chi phí lên tới 30 USD/ngày, không bền vững.
- Độ trễ khi gọi API bên ngoài – Khi tích hợp vào quy trình xử lý 1 000 đơn hàng/giờ, thời gian chờ trung bình 2.3 s gây bottleneck.
- Quyền riêng tư dữ liệu – Khách hàng trong lĩnh vực tài chính (công ty Y) không được phép gửi dữ liệu khách hàng ra ngoài mạng nội bộ.
- Quản lý phiên bản mô hình – Khi cập nhật Llama 3‑8B, các workflow cũ vẫn gọi phiên bản cũ, dẫn đến kết quả không đồng nhất.
⚠️ Best Practice: Luôn ghi lại version tag của mô hình trong metadata workflow để tránh “model drift”.
3. Giải pháp tổng quan (text art)
+-------------------+ +-------------------+ +-------------------+
| n8n (Docker) | HTTP | Ollama / vLLM | GPU/CPU | LLM Model ( ) |
| Workflow Engine | <------> | Inference API | <------> | Llama3 / Mistral|
+-------------------+ +-------------------+ +-------------------+
^ ^ ^
| | |
| Trigger (Cron / Webhook) | Model Load (GPU) |
| → Process → HTTP Request → | → Generate → Return JSON |
+---------------------------------+---------------------------------+
⚡ Hiệu năng: Khi chạy Llama 3‑8B trên RTX 4090, thời gian inference trung bình 350 ms cho prompt 50 token.
4. Hướng dẫn chi tiết từng bước
Bước 1: Chuẩn bị môi trường Docker‑Compose
version: "3.8"
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n_user
- DB_POSTGRESDB_PASSWORD=strongpwd
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: n8n_user
POSTGRES_PASSWORD: strongpwd
POSTGRES_DB: n8n
volumes:
- pgdata:/var/lib/postgresql/data
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
volumes:
pgdata:
ollama_data:
🛡️ Bảo mật: Đặt mật khẩu mạnh cho PostgreSQL, không để mặc định
postgres.
Bước 2: Cài và tải mô hình Llama 3 (hoặc Mistral) trên Ollama
docker exec -it <container_id_ollama> bash
ollama pull llama3:8b
# Kiểm tra
ollama list
Kết quả sẽ hiển thị:
NAME SIZE MODIFIED
llama3:8b 14GB 2024-05-12
Bước 3: Kiểm tra API Ollama
curl -X POST http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{"model":"llama3:8b","prompt":"Viết một đoạn thơ ngắn về Hà Nội"}'
Bạn sẽ nhận được JSON:
{
"model":"llama3:8b",
"response":"...đoạn thơ..."
}
Bước 4: Tạo node HTTP Request trong n8n
- Add node → HTTP Request
- Method:
POST - URL: `http://ollama:11434/api/generate` (sử dụng tên service Docker)
- Headers:
Content-Type: application/json - Body (JSON):
{
"model": "llama3:8b",
"prompt": "{{$json["input_text"]}}"
}
- Output: Lấy
responsetừ JSON trả về, truyền cho node tiếp theo (ví dụ: Set → lưu vàogenerated_text).
Bước 5: Kiểm tra workflow
- Trigger: Cron mỗi 5 phút.
- Run → Kiểm tra log n8n, bạn sẽ thấy thời gian phản hồi < 400 ms.
5. Template quy trình tham khảo
{
"name": "LLM‑SelfHost‑Workflow",
"nodes": [
{
"type": "cron",
"parameters": { "cronExpression": "*/5 * * * *" }
},
{
"type": "httpRequest",
"parameters": {
"url": "http://ollama:11434/api/generate",
"method": "POST",
"jsonParameters": true,
"options": {
"bodyContent": {
"model": "llama3:8b",
"prompt": "{{$node[\"Cron\"].json[\"input\"]}}"
}
}
}
},
{
"type": "set",
"parameters": {
"values": [
{ "name": "generated_text", "value": "{{$node[\"HTTP Request\"].json[\"response\"]}}" }
]
}
},
{
"type": "emailSend",
"parameters": {
"to": "[email protected]",
"subject": "Kết quả LLM",
"text": "{{$node[\"Set\"].json[\"generated_text\"]}}"
}
}
],
"connections": {
"Cron": { "main": [{ "node": "HTTP Request", "type": "main", "index": 0 }] },
"HTTP Request": { "main": [{ "node": "Set", "type": "main", "index": 0 }] },
"Set": { "main": [{ "node": "Email Send", "type": "main", "index": 0 }] }
}
}
6. Những lỗi phổ biến & cách sửa
| Lỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|
| 🧩 “Connection refused” khi gọi Ollama | Docker network chưa liên kết, hoặc port chưa expose. | Kiểm tra docker-compose ps, chắc chắn service ollama đang chạy và port 11434 mở. |
| 🐛 “Model not found” | Tên model sai hoặc chưa tải. | Chạy ollama list để xác nhận tên, cập nhật lại trong node HTTP Request. |
| ⚡ “Timeout” > 2s | GPU chưa được gán cho container Ollama. | Thêm runtime: nvidia và environment: - NVIDIA_VISIBLE_DEVICES=all vào docker-compose.yml. |
| 🛡️ “Invalid JSON” | Body request không đúng định dạng. | Dùng jsonParameters: true trong node HTTP Request, hoặc kiểm tra dấu ngoặc kép trong payload. |
> Lưu ý: Khi thay đổi cấu hình Docker, luôn
docker-compose down && docker-compose up -dđể áp dụng.
7. Khi muốn scale lớn thì làm sao
- Horizontal scaling của Ollama
- Deploy nhiều replica Ollama (Docker Swarm/K8s) và dùng nginx làm load‑balancer.
- Cấu hình
upstream:
upstream ollama_backend { server ollama1:11434; server ollama2:11434; } server { listen 80; location / { proxy_pass http://ollama_backend; } } - Batch inference với vLLM
- vLLM hỗ trợ
max_batch_size. Đặtmax_batch_size=32để gộp nhiều request thành một batch, giảm overhead GPU.
- vLLM hỗ trợ
- Cache kết quả
- Dùng Redis (Docker) để lưu
prompt → response. Trước khi gọi Ollama, kiểm tra cache; nếu có trả ngay, giảm tải tới GPU.
- Dùng Redis (Docker) để lưu
- Giám sát & auto‑scale
- Prometheus + Grafana thu thập
ollama_inference_latency_seconds,cpu_usage,gpu_memory. - Thiết lập Alert: nếu latency > 800 ms trong 5 phút, tự động tăng replica.
- Prometheus + Grafana thu thập
8. Chi phí thực tế
| Thành phần | Đơn vị | Số lượng | Đơn giá (USD/tháng) | Tổng chi phí |
|---|---|---|---|---|
| GPU RTX 4090 (on‑prem) | 1 | 1 | 250 (điện + bảo trì) | 250 |
| Docker host (vCPU 8, RAM 32 GB) | 1 | 1 | 80 | 80 |
| Redis (Docker) | 1 | 1 | 15 | 15 |
| Nginx LB (Docker) | 1 | 1 | 5 | 5 |
| Tổng | 350 USD/tháng |
So sánh với OpenAI GPT‑4 (≈ 2 USD/1 M token), nếu bạn tiêu thụ 10 M token/tháng, chi phí sẽ ≈ 20 USD – nhưng khi cần 100 M token, chi phí lên tới 200 USD, còn self‑host vẫn ổn định ở 350 USD cho toàn bộ hạ tầng.
9. Số liệu trước – sau
| KPI | Trước tích hợp Ollama (OpenAI) | Sau tích hợp self‑host |
|---|---|---|
| Chi phí AI (USD/tháng) | 1 200 | 350 |
| Latency trung bình (ms) | 2 300 | 420 |
| Số request / giờ | 800 | 2 200 |
| Độ bảo mật (đánh giá nội bộ) | 3/5 (điều kiện dữ liệu ra ngoài) | 5/5 (on‑prem) |
ROI = (Tổng lợi ích – Chi phí đầu tư) / Chi phí đầu tư × 100%
ROI = (1 200 USD – 350 USD) / 350 USD × 100% = 243%
Như vậy, đầu tư hạ tầng tự host mang lại lợi nhuận trên chi phí (ROI) hơn 240 %.
10. FAQ hay gặp nhất
Q1: Có cần GPU để chạy Llama 3‑8B?
A: Không bắt buộc, nhưng CPU inference sẽ mất ~2 s/đoạn, không phù hợp cho workflow thời gian thực. GPU (RTX 3080 trở lên) giảm xuống < 500 ms.
Q2: Ollama có hỗ trợ mô hình Mistral không?
A: Có. Dùng ollama pull mistral:7b và thay model trong payload thành mistral:7b.
Q3: Làm sao để cập nhật mô hình mà không làm gián đoạn workflow?
A: Deploy mô hình mới dưới tên mới (ví dụ llama3:8b-v2), cập nhật node HTTP Request, rồi dừng dần các workflow cũ.
Q4: Có thể dùng vLLM thay Ollama không?
A: Có. vLLM chạy dưới Python, expose /generate endpoint tương tự. Thay image: ollama/ollama bằng python:3.11 và cài vllm.
Q5: Làm sao bảo vệ API Ollama khỏi truy cập trái phép?
A: Đặt --auth khi khởi chạy Ollama hoặc dùng reverse proxy Nginx với Basic Auth.
11. Giờ tới lượt bạn
- Bước đầu: Clone repo mẫu
github.com/yourorg/n8n-llm-selfhostvà chạydocker-compose up -d. - Tiếp theo: Tải mô hình Llama 3‑8B (hoặc Mistral) qua Ollama, kiểm tra API bằng
curl. - Cuối cùng: Tạo workflow trong n8n theo template ở mục 5, chạy thử và quan sát latency trên Grafana.
Nếu bạn đã sẵn sàng đưa AI vào quy trình tự động mà không lo chi phí hay bảo mật, hãy thử ngay hôm nay – chỉ cần một vài lệnh Docker và một workflow n8n, mọi thứ sẽ “đi lên”.
Nếu anh em đang cần giải pháp trên, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale. Hoặc liên hệ mình để được trao đổi nhanh hơn nhé.
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.








