Một thách thức kỹ thuật cốt lõi khi triển khai AI trong doanh nghiệp: Data Privacy. Tổ chức không thể đẩy email khiếu nại khách hàng, hợp đồng NDA hay dữ liệu CRM nội bộ qua các API công khai của OpenAI hay Anthropic. Rủi ro Compliance là có thực và rất cụ thể.
Bên cạnh đó, chi phí “token burn” cho các tác vụ automation chạy 24/7 tăng tuyến tính theo lượng request – không có giới hạn trên khi workload scale.
Giải pháp: Air-Gapped AI – tự host n8n và Local LLM (Ollama) hoàn toàn trên server của doanh nghiệp.
Bài này là hướng dẫn cài đặt từ A-Z: Docker Compose, cấu hình Agent, Memory, Tools, và RAG.
1. Kiến Trúc Hệ Thống
n8n không phải một Autonomous Agent framework như LangGraph hay AutoGen. Đây là nền tảng Agentic Workflow: LLM tự quyết định gọi Tool nào trong tập Tools đã định nghĩa sẵn, thay vì chạy chuỗi bước cứng nhắc. Bước tiến đáng kể so với automation thông thường, nhưng không có khả năng tự plan hay spawn sub-agent.
Ví dụ luồng thực tế:
- Nhận Email khiếu nại từ khách hàng qua IMAP.
- AI Agent đọc Email, quyết định gọi Tool Search CRM để tìm danh tính người gửi.
- AI Agent gọi Tool Query Vector DB để lục tìm chính sách bảo hành mới nhất của công ty.
- AI Agent tự động soạn phản hồi (Reply) và gọi Tool Send Email để trả lời. Hoặc tự tạo Ticket trên Jira.
graph TD
subgraph s1 ["Kích hoạt (Triggers)"]
A[Email/Webhook Input]
Schedule[Lịch trình định kỳ]
end
subgraph s2 ["n8n Workflow Engine (Air-Gapped)"]
B{AI Agent Node}
subgraph s3 ["Công cụ thực thi (Tools)"]
T1[Search CRM Tool]
T2[Query Vector DB Tool]
T3[Send Email Tool]
end
B -->|Gọi Tool 1| T1
B -->|Gọi Tool 2| T2
B -->|Gọi Tool 3| T3
end
subgraph s4 ["Hạ tầng LLM (Local)"]
D[Ollama - Qwen/Llama 3]
end
A -->|Trigger| B
Schedule -->|Trigger| B
B <-->|ReAct Prompting & Suy luận| D
style B fill:#3b82f6,stroke:#1d4ed8,stroke-width:2px,color:#fff
style D fill:#10b981,stroke:#047857,stroke-width:2px,color:#fff
Lưu ý: Với Local LLM 7B/8B, Tool-Calling loop không ổn định như sơ đồ này. Model nhỏ hay gọi sai Tool hoặc bỏ reasoning step. Với task production quan trọng, nên dùng model ≥13B (Mixtral 8x7B, Llama 3 70B).
2. System Settings & Docker Compose
Khuyến nghị dùng Docker Compose để đóng gói n8n, Database và Ollama vào chung một Internal Network, đảm bảo dữ liệu không đi ra ngoài và dễ tái triển khai.
Yêu cầu Server: VPS Linux (Ubuntu 24.04), tối thiểu 16GB RAM. Nếu chạy LLM mạnh cần GPU (Nvidia T4/A10G).
Tạo tệp docker-compose.yml:
# Yêu cầu Docker Compose V2 (Docker 23+). Không cần field 'version'.
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=n8n_secure_password
- POSTGRES_DB=n8n
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
networks:
- ai-network
n8n:
image: docker.n8n.io/n8nio/n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_secure_password
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- ai-network
ollama:
image: ollama/ollama:latest
restart: unless-stopped
ports:
- "11434:11434"
environment:
# Cho phép container khác trong network kết nối tới Ollama
- OLLAMA_HOST=0.0.0.0
volumes:
- ollama_data:/root/.ollama
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:11434/api/tags || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# Bỏ comment block dưới nếu VPS có Nvidia GPU
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
networks:
- ai-network
volumes:
db_data:
n8n_data:
ollama_data:
networks:
ai-network:
driver: bridge
Chạy cụm Docker (yêu cầu Docker Compose V2):
docker compose up -d
Khi các container đã ở trạng thái Up, tải (pull) Model AI vào container Ollama:
# Dùng pull thay vì run để tải model mà không mở interactive shell
docker exec -it ollama ollama pull llama3:8b
# Hoặc dùng qwen2.5:7b cho ngữ cảnh code/tiếng Việt tốt hơn.
3. Cấu Hình AI Agent trong n8n
Truy cập n8n tại http://<IP_VPS>:5678 và thực hiện các bước sau.
3.1 Kết Nối Ollama làm Language Model
Trong node AI Agent, mục Chat Model, bấm “Add” và chọn node Ollama Chat Model.
Tạo Credential mới, ở trường Base URL điền:
http://ollama:11434
Do n8n và Ollama cùng nằm trên Docker network ai-network, kết nối đi hoàn toàn nội bộ qua Bridge Network – không đi ra Internet public. Đây là ưu điểm bảo mật cốt lõi của kiến trúc này.
Lưu ý: Nếu Ollama và n8n chạy trên host khác nhau (không cùng Docker Compose), thay bằng http://host.docker.internal:11434.
3.2 Memory Node & System Prompt Engineering
Kéo node AI Agent vào Workflow. Trong mục Memory, chọn loại phù hợp với use case:
- Simple Memory: Lưu context trong RAM của execution hiện tại. Phù hợp cho chatbot tương tác nhiều turn liên tiếp trong cùng một session. Không phù hợp cho workflow trigger từng sự kiện rời rạc (mỗi email đến là một trigger mới – context bị reset hoàn toàn sau mỗi lần).
- Postgres Memory (khuyến nghị cho production): Lưu conversation history vào database, tồn tại xuyên suốt các lần trigger. Dùng service
postgresđã có trong Docker Compose ở Section 2 – không cần thêm hạ tầng.
Chọn model là llama3:8b (hoặc model đã pull).
Các model Local (7B/8B) có xu hướng Hallucination cao hơn cloud model khi gọi Tools. Để giảm thiểu, áp dụng đồng thời 3 kỹ thuật:
- System Prompt chặt chẽ – đóng khung hành vi tuyệt đối
- Temperature thấp – đặt
temperature: 0trong node config để giảm ngẫu nhiên - Output validation – thêm node
IfhoặcCodesau Agent để kiểm tra format trả về trước khi gọi action
Bạn là Trợ lý Hỗ trợ Khách hàng nội bộ của công ty Nick Nguyen.
Nhiệm vụ của bạn là đọc yêu cầu, và SỬ DỤNG TOOLS ĐỂ TÌM KIẾM THÔNG TIN.
Tuyệt đối KHÔNG tự bịa ra chính sách, giá cả, hoặc thông tin khách hàng nếu không tìm thấy trong Tool.
Nếu có lỗi khi gọi Tool, hãy báo cáo lại nguyên nhân gốc rễ.
Luôn trả lời bằng ngôn ngữ mà khách hàng sử dụng ở Input.
3.3 Cấp phát Execution Tools cho Agent
Một Agent không có Tools chỉ là Text-Generation đơn thuần. Để kích hoạt Agentic Workflow, kết nối các Tool node vào AI Agent qua connection point “AI Tool”:
- HTTP Request Tool: Cho phép Agent tự gọi API của Hubspot/Jira.
- Calculator Tool: Cho Agent tính toán báo giá từ số liệu đã trích xuất.
- Code Tool (JavaScript): Cho Agent chạy micro-scripts để xử lý RegExp hoặc format chuỗi.
Lưu ý: Để model nhỏ gọi đúng Tool, trường Name và Description của mỗi Tool phải cực kỳ chi tiết. Ví dụ: đừng đặt tên là Search_CRM, hãy dùng Fetch_Client_Profile_Using_Email_Parameter. LLM đọc Description để quyết định gọi Tool nào – mô tả mơ hồ dẫn đến gọi sai hoặc bỏ qua Tool.
3.4 Tích Hợp Vector Store (RAG)
Thay vì nhồi toàn bộ tài liệu vào Prompt (Context Window của Local LLM rất giới hạn), kết nối AI Agent sang Vector Store (Qdrant hoặc Pinecone). Khi khách hỏi “Chính sách hoàn tiền của công ty là gì?”, Agent sẽ tự động query Vector Database, trích xuất đúng các đoạn liên quan nhất, và soạn phản hồi email dựa trên nội dung đó.
4. Giới Hạn & Khi Nào Cần Nâng Cấp
n8n phù hợp khi bài toán có cấu trúc rõ ràng với LLM reasoning: trigger xác định, tool pool cố định (dưới 15-20 tools), task không cần nhiều bước reasoning phức tạp liên tiếp. Các use case như support email automation, RAG Q&A nội bộ, ticket triage đều nằm trong vùng phù hợp.
Cần xem xét framework khác (LangGraph, CrewAI, AutoGen) khi:
- Task yêu cầu multi-agent: một AI manager điều phối nhiều sub-agent chuyên biệt
- Workflow cần loop phức tạp và recursive – agent phải tự đánh giá lại kết quả và thử chiến lược khác
- Cần stateful planning dài hạn vượt khỏi conversation history đơn giản
- Tool pool lớn, cần dynamic tool discovery thay vì hard-code từng node
Một kiến trúc hybrid phổ biến: dùng LangGraph (Python) làm reasoning engine, và n8n làm orchestration layer – trigger sự kiện, kết nối SaaS, human-in-the-loop approval, và logging.
5. Bài Toán Chi Phí & Lời Kết
Với setup trên, chi phí infra là cố định theo tier VPS – không phải per-token billing. Ví dụ: Hetzner CPX41 (8 vCPU, 16GB RAM) ~$23/tháng; Vultr 16GB ~$80/tháng. Cần scale compute (RAM/CPU/GPU) khi tải tăng cao – nhưng vẫn không tốn thêm chi phí API cho mỗi request.
Ngược lại, nếu dựng trên OpenAI gpt-4o hay Anthropic Claude 3.5, một đợt spike traffic hoặc luồng data lớn có thể tích lũy vài trăm đô la trong một ngày – chưa kể rủi ro Metadata khách hàng bị chuyển qua hạ tầng cloud của bên thứ ba.
Tự chủ hệ sinh thái AI nội bộ (Air-Gapped AI) cho phép tổ chức kiểm soát hoàn toàn data pathway lõi, đồng thời tận dụng sức mạnh tự động hóa của AI. Chỉ chuyển dịch lên Cloud AI API khi đội kỹ thuật đã đánh giá đầy đủ Trade-Off giữa chi phí và Data Compliance.
Nếu bạn muốn tìm hiểu thêm về cách Agentic AI thay đổi quy trình phát triển phần mềm, xem thêm bài: Agentic AI trong Phát Triển Phần Mềm.