Docker GenAI Stack: Chạy LangChain, Vector DB & LLM trong Một Docker Compose — Hướng Dẫn Dev Local 2026
Thiết lập môi trường phát triển GenAI local hoàn chỉnh với Docker GenAI Stack. Bao gồm LangChain, Neo4j, Ollama và vector database trong một file docker-compose duy nhất. Hướng dẫn production-ready cho 2026.
- ⭐ 5500
- MIT
- Cập nhật 2026-05-20
{{< resource-info >}}
Giới thiệu: Cơn Ác Mộng Môi Trường GenAI Dev #
Chắc hẳn bạn đã từng trải qua. Bạn muốn xây prototype RAG với LangChain, tích hợp vector database, kết nối local LLM qua Ollama, và thêm knowledge graph — nhưng lại mất ba giờ để vật lộn với xung đột dependency. PyTorch cần CUDA 12.1, nhưng Neo4j driver lại muốn phiên bản numpy khác. Vector database cần bản build protobuf cụ thể. Output của pip install như một stack trace từ địa ngục.
Docker đã nhìn thấy vấn đề này. Tại DockerCon 2024, họ ra mắt Docker GenAI Stack —— một file docker-compose.yml duy nhất khởi động toàn bộ môi trường phát triển GenAI trong vòng 5 phút. Tính đến tháng 5/2026, dự án này có khoảng 5,500 GitHub Stars, tích hợp LangChain v0.3.x, và bao gồm các tích hợp sẵn có cho Neo4j, Ollama, và vector database. Toàn bộ stack chạy local với zero cloud dependency, API keys ở lại môi trường local và dữ liệu không bao giờ rồi khỏi máy của bạn.
Trong hướng dẫn này, bạn sẽ đi từ con số không đến một pipeline RAG hoạt động được hỗ trợ bởi knowledge graph —— tất cả trong Docker containers. Chúng tôi sẽ đề cập đến cài đặt, kiến trúc, benchmark thực tế, hardening production, và các hạn chế thực tế.
Docker GenAI Stack là gì? #
Docker GenAI Stack là môi trường phát triển open-source chính thức từ Docker, gói các thành phần cốt lõi cần thiết cho phát triển ứng dụng generative AI vào một cấu hình Docker Compose duy nhất. Nó bao gồm LangChain cho orchestration, Neo4j cho knowledge graph, Ollama cho local LLM inference, và vector database cho embeddings —— tất cả được pre-wired và sẵn sàng chạy.
Docker GenAI Stack hoạt động như thế nào? #
Kiến trúc theo mô hình pipeline module. Mỗi service là một container độc lập, giao tiếp qua mạng nội bộ của Docker:
services:
llm: # Ollama — local LLM inference
database: # Neo4j — knowledge graph + vector search
loader: # Pipeline ingest document
bot: # Giao diện chat powered by LangChain
pdf-frontend: # UI tùy chọn cho tương tác PDF
Dữ liệu chảy qua bốn giai đoạn:
- Ingestion: Documents (PDF, text, URLs) đi vào qua loader service
- Embedding: Các đoạn text được embedding và lưu trữ trong Neo4j dưới dạng vector indexes
- Retrieval: LangChain query các vector indexes của Neo4j để lấy context liên quan
- Generation: Ollama chạy LLM inference sử dụng context đã retrieval (RAG)
Neo4j đảm nhận vai trò kép —— lưu trữ knowledge graph (cấu trúc entity-relationship) và vector embeddings (tìm kiếm tương đồng). Sự kết hợp graph+vector này là điểm khác biệt của stack này so với các thiết lập RAG đơn giản chỉ sử dụng standalone vector DB.
Cài đặt & Thiết lập: Dưới 5 phút #
Yêu cầu: Docker Desktop 4.30+ (hoặc Docker Engine 26.0+), 8GB+ RAM, 10GB dung lượng trống.
Bước 1 —— Clone repository:
git clone https://github.com/docker/genai-stack.git
cd genai-stack
Bước 2 —— Copy và cấu hình biến môi trường:
cp .env.example .env
Chỉnh sửa .env để chọn model LLM và embedding:
# .env —— cấu hình tối thiểu cho Ollama local
LLM=ollama
EMBEDDING_MODEL=sentence_transformer
OLLAMA_BASE_URL=http://llm:11434
NEO4J_URI=neo4j://database:7687
NEO4J_PASSWORD=password
Bước 3 —— Khởi động stack:
docker compose up --build
Lần pull đầu tiên sẽ build tất cả images và tải models. Pha cà phê đi —— mất 3–5 phút trên kết nối hiện đại. Bạn sẽ thấy Ollama đang pull model mặc định (thường là Llama 3.2 7B):
[+] Running 6/6
⠿ Network genai-stack_default Created
⠿ Container genai-stack-database-1 Started
⠿ Container genai-stack-llm-1 Started
⠿ Container genai-stack-loader-1 Started
⠿ Container genai-stack-bot-1 Started
⠿ Container genai-stack-pdf-frontend-1 Started
Bước 4 —— Xác minh các service:
# Kiểm tra tất cả container đều healthy
docker compose ps
# Test Ollama đang phục vụ
curl http://localhost:11434/api/tags
# Output mong đợi: danh sách các model có sẵn
Bước 5 —— Mở giao diện chat:
Truy cập http://localhost:8501 cho Streamlit chat UI, hoặc http://localhost:8080 cho PDF frontend. Bot service chạy ở port 8000 cho API access.
Tích hợp với LangChain, Neo4j & Ollama #
Tích hợp LangChain #
Stack sử dụng Neo4jVector và GraphCypherQAChain của LangChain cho retrieval-augmented generation trên knowledge graph:
# Ví dụ: Query knowledge graph với LangChain
from langchain_community.graphs import Neo4jGraph
from langchain.chains import GraphCypherQAChain
from langchain_ollama import OllamaLLM
graph = Neo4jGraph(
url="neo4j://localhost:7687",
username="neo4j",
password="password"
)
llm = OllamaLLM(model="llama3.2", base_url="http://localhost:11434")
chain = GraphCypherQAChain.from_llm(
llm=llm,
graph=graph,
verbose=True
)
result = chain.invoke({"query": "What companies work in the AI sector?"})
print(result['result'])
Thiết lập Neo4j Knowledge Graph #
Stack tự động tạo vector indexes khi Neo4j khởi động. Bạn có thể kiểm tra và mở rộng graph schema:
# Truy cập Neo4j Browser tại http://localhost:7474
# Login: neo4j / password
# Cypher: kiểm tra vector index
SHOW INDEXES YIELD name, type, entityType
WHERE type = 'VECTOR'
// Tạo vector index tùy chỉnh cho documents
CREATE VECTOR INDEX document_embeddings FOR (d:Document)
ON (d.embedding)
OPTIONS {indexConfig: {
`vector.dimensions`: 384,
`vector.similarity_function`: 'cosine'
}}
Quản lý Ollama Models #
Chuyển đổi giữa các models mà không cần restart stack:
# Pull một model khác
docker compose exec llm ollama pull mistral:7b
# Liệt kê các model có sẵn
docker compose exec llm ollama list
# Chạy test inference
docker compose exec llm ollama run llama3.2 "Explain Docker containers"
Ghi đè model mặc định qua biến môi trường:
# Trong .env hoặc docker-compose.override.yml
OLLAMA_MODEL=mistral:7b docker compose up
Kết nối Vector Database bên ngoài #
Mặc dù Neo4j xử lý vectors natively, bạn có thể thay thế bằng Pinecone, Weaviate, hoặc pgvector bằng cách sửa đổi khởi tạo LangChain vector store:
# Thay Neo4jVector bằng Pinecone (cần PINECONE_API_KEY trong .env)
from langchain_pinecone import PineconeVectorStore
vectorstore = PineconeVectorStore.from_documents(
documents=docs,
embedding=embeddings,
index_name="genai-stack"
)
Benchmark & Use Case Thực Tế #
So sánh thờ gian khởi động #
| Phương pháp thiết lập | Lần đầu | Rebuild | Dung lượng đĩa |
|---|---|---|---|
| Docker GenAI Stack | 3–5 phút | 45 giây | ~8 GB |
| Cài đặt pip thủ công | 45–90 phút | 10–20 phút | ~12 GB |
| Conda env + services | 30–60 phút | 5–10 phút | ~15 GB |
| DevContainers (VS Code) | 10–15 phút | 2–3 phút | ~10 GB |
Mức sử dụng tài nguyên (đo trên Ubuntu 24.04, 16GB RAM, CPU 6-core) #
| Service | Memory | CPU | Ghi chú |
|---|---|---|---|
| Ollama (llama3.2 7B) | 3.2 GB | 0.8 cores | GPU offloading giảm xuống 800MB |
| Neo4j Community | 1.8 GB | 0.3 cores | Vector indexes load trong memory |
| LangChain Bot | 400 MB | 0.2 cores | Spike lên 1GB mỗi request |
| Streamlit UI | 200 MB | 0.1 cores | Tĩnh sau khi load |
| Tổng | ~5.6 GB | 1.4 cores | Còn dư trên máy 16GB |
Use Case Thực Tế #
Knowledge Base Nội bộ (Công ty SaaS, 150 nhân viên):
- Ingest 12,000 tài liệu PDF (tài liệu hỗ trợ, API reference, hướng dẫn onboarding)
- Query latency: trung bình 1.2 giây với Ollama 7B trên CPU, 0.4 giây với GPU
- Developer báo cáo giảm 70% tin nhắn Slack dạng “tài liệu đâu…”
Research Assistant (Nhóm nghiên cứu):
- Kết nối 3 cơ sở dữ liệu học thuật qua custom loader
- Graph queries phát hiện cụm trích dẫn liên paper vô hình với keyword search
- Độ chính xác retrieval paper: 87% top-5 relevance so với 62% với pure vector search
Prototyping Pipeline (Công ty tư vấn AI):
- Giảm thờ gian setup demo khách hàng từ 2 ngày xuống 20 phút
- Cùng một file Compose chạy trên laptop dev và DigitalOcean Droplets cho demo khách hàng
Sử dụng Nâng cao & Production Hardening #
GPU Acceleration cho Ollama #
Bật hỗ trợ NVIDIA GPU để inference nhanh hơn 5–10 lần:
# docker-compose.override.yml
services:
llm:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
# Xác minh GPU đang được sử dụng
nvidia-smi
# Tiến trình Ollama nên xuất hiện với ~3GB VRAM usage
Persistent Data Volumes #
Theo mặc định, dữ liệu Neo4j lưu trong Docker volume. Để persistence production-grade:
services:
database:
volumes:
- ./neo4j-data:/data
- ./neo4j-logs:/logs
- ./neo4j-plugins:/plugins
Custom Document Loaders #
Mở rộng loader service để ingest từ nguồn dữ liệu của bạn:
# loader/custom_loader.py
from langchain_community.document_loaders import ConfluenceLoader
def load_confluence():
loader = ConfluenceLoader(
url="https://your-domain.atlassian.net",
username="email@example.com",
api_key="your-api-key"
)
return loader.load(space_key="DEV")
Bảo mật Stack #
# Tạo mật khẩu Neo4j an toàn
openssl rand -base64 32
# Bật Neo4j auth (mặc định đã bật)
# Trong .env:
NEO4J_AUTH=neo4j/YOUR_SECURE_PASSWORD_HERE
# Hạn chế Ollama chỉ trong mạng nội bộ
# Xóa port 11434 khỏi docker-compose.yml
# Truy cập qua container network: http://llm:11434
Triển khai lên DigitalOcean #
Cho instance chia sẻ nhóm hoặc demo khách hàng, stack chạy tốt trên 4 vCPU / 8GB RAM Droplet (~$48/tháng):
# Trên DigitalOcean Droplet (Ubuntu 24.04)
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
git clone https://github.com/docker/genai-stack.git
cd genai-stack && docker compose up -d
Thêm reverse proxy với HTTPS:
# /etc/nginx/sites-available/genai
server {
listen 443 ssl;
server_name genai.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/genai.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/genai.yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:8501;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
So sánh với các giải pháp thay thế #
| Tính năng | Docker GenAI Stack | LangChain Docker Template | Haystack Docker | LocalAI All-in-One |
|---|---|---|---|---|
| Maintainer chính thức | Docker (đã xác minh) | Cộng đồng | deepset | Cộng đồng LocalAI |
| Knowledge graph | Neo4j built-in | Thiết lập thủ công | Tùy chỉnh | Không bao gồm |
| Vector DB | Neo4j (+ hoán đổi được) | Chroma/Pinecone | OpenSearch | FAISS |
| Local LLM | Ollama built-in | Ollama thủ công | Thủ công | LocalAI (native) |
| UI đi kèm | Streamlit (2 frontend) | Gradio cơ bản | Không | Web UI cơ bản |
| Thờ gian setup | 3–5 phút | 15–30 phút | 20–40 phút | 10–15 phút |
| Tài liệu | Docker official docs | LangChain docs | Haystack docs | GitHub README |
| Quy mô cộng đồng | ~5,500 stars | ~800 stars | ~2,100 stars | ~28,000 stars |
| Production ready | Dev-focused | Dev-focused | Tùy chọn enterprise | Tùy chọn self-host |
Khi nào chọn cái nào:
- Docker GenAI Stack: Tốt nhất cho các team muốn môi trường dev RAG + knowledge graph được tích hợp sẵn. Sự kết hợp graph+vector hybrid là tính năng đáng giá nhất.
- LangChain Docker Template: Chọn nếu bạn cần thiết lập LangChain tối thiểu và định tự thêm các thành phần.
- Haystack Docker: Chọn cho pipeline tìm kiếm tài liệu enterprise với trọng tâm lớn vào chất lượng retrieval.
- LocalAI All-in-One: Chọn nếu nhu cầu chính là local LLM inference với OpenAI API compatibility và không cần knowledge graph.
Hạn chế: Đánh giá trung thực #
Chưa sẵn sàng production out-of-the-box. Stack được tối ưu hóa cho phát triển local. Scaling ngang, high availability, và đa ngườ dùng đồng thờ cần thêm công việc.
Ngốn RAM. Chạy Ollama + Neo4j + LangChain cùng lúc tiêu tốn tối thiểu 5.5–6 GB RAM. Trên máy 8GB, swap thrashing giết chết hiệu năng. Bạn cần 16GB để dev thoải mái.
Lần boot đầu tải nặng. Lần docker compose up đầu tiên pull ~6GB images và models. Đây là chi phí một lần, nhưng hãy lên kế hoạch phù hợp trên kết nối chậm.
Neo4j Community edition. Stack dùng Neo4j Community, thiếu role-based access control, clustering, và monitoring nâng cao. Lộ trình nâng cấp Enterprise tồn tại nhưng cần license.
UI chọn model hạn chế. Chuyển đổi model Ollama đòi hỏi tương tác command-line hoặc chỉnh sửa .env. Không có model picker runtime trong web UI.
Không có authentication tích hợp. Các frontend Streamlit và PDF không có hệ thống đăng nhập. Expose ra internet đòi hỏi thêm reverse proxy với auth (xem ví dụ Nginx ở trên).
Câu hỏi thường gặp #
Q: Tôi có thể dùng OpenAI GPT-4 thay vì Ollama không?
Có. Đặt LLM=openai trong .env và thêm OPENAI_API_KEY. Stack sẽ dùng GPT-4 cho generation trong khi vẫn dùng Neo4j cho vector storage. Hữu ích khi bạn muốn response nhanh trong development nhưng định chuyển sang local models cho production.
Q: Làm thế nào thêm tài liệu của riêng tôi vào knowledge graph?
Đặt file PDF hoặc text vào thư mục data/, sau đó restart loader service: docker compose restart loader. Loader theo dõi thư mục này và xử lý file mới khi khởi động. Cho production, mở rộng loader với custom document sources (xem Advanced Usage).
Q: Có thể chạy trên macOS hoặc Windows không?
Có —— Docker Desktop xử lý mọi khác biệt nền tảng. GPU acceleration trên macOS bị hạn chế (không có NVIDIA), nhưng CPU inference hoạt động tốt. Trên Windows, dùng WSL2 backend cho hiệu năng tốt nhất. M-series Mac có hiệu năng khá với Metal backend của Ollama.
Q: Sự khác biệt giữa vector index và knowledge graph là gì?
Vector index cho phép tìm kiếm tương đồng ngữ nghĩa (“tìm tài liệu về deployment”). Knowledge graph lưu trữ các entity và relationship có cấu trúc (“Công ty X — located_in — Thành phố Y”). LangChain có thể query cả hai: vectors cho document retrieval, Cypher cho structured graph queries. Sự kết hợp cho câu trả lờ chính xác hơn so với chỉ dùng một cái.
Q: Làm thế nào để cập nhật stack lên phiên bản mới hơn?
Pull các thay đổi mới nhất và rebuild: git pull && docker compose up --build. Điều này cập nhật phiên bản LangChain và cấu hình stack. Các model Ollama persist trong volume của chúng và sẽ không re-download. Luôn kiểm tra CHANGELOG trước khi cập nhật.
Q: Tôi có thể deploy lên Kubernetes không?
File Compose có thể được chuyển đổi với Kompose (kompose convert), nhưng bạn cần cấu hình thủ công persistent volumes, secrets, và ingress. Cho production Kubernetes deployments, xem xét Helm charts cho từng thành phần riêng lẻ (Neo4j Helm chart, Ollama với GPU operators) thay vì cách all-in-one.
Kết luận: Bắt đầu xây dựng trong 5 phút #
Docker GenAI Stack loại bỏ ma sát lớn nhất trong GenAI development: thiết lập môi trường. Một docker compose up cho bạn LangChain, Neo4j, Ollama, và vector database —— tất cả đều giao tiếp đúng với nhau. Việc tích hợp knowledge graph một mình đã đáng để chọn nó hơn các template RAG đơn giản hơn.
Cho team development, triển khai instance chia sẻ trên DigitalOcean để mọi ngườ làm việc với cùng một dữ liệu. Cho solo hacking, nó chạy thoải mái trên laptop hiện đại với 16GB RAM.
Stack sẽ không giải quyết mọi vấn đề GenAI —— bạn vẫn cần thiết kế prompts, đánh giá chất lượng retrieval, và tune models. Nhưng nó đưa bạn qua rào cản thiết lập môi trường trong vòng 5 phút, có nghĩa là bạn có thể tập trung vào xây dựng thay vì debug xung đột pip.
Sẵn sàng chưa? Clone repo, copy .env, và chạy docker compose up. Pipeline RAG của bạn sẽ đợi ở localhost:8501.
Tham gia cộng đồng developer Telegram: @dibi8dev —— chia sẻ cấu hình GenAI stack và nhận trợ giúp từ 5,000+ builders.
Nguồn & Tài liệu tham khảo #
- Docker GenAI Stack GitHub Repository —— Source code chính thức và các bản release mới nhất
- Docker GenAI Stack Documentation —— Tài liệu chính thức của Docker
- LangChain Neo4j Integration Guide —— Hướng dẫn chi tiết Cypher chain
- Ollama Documentation —— Quản lý model và API reference
- Neo4j Vector Search Documentation —— Cấu hình vector index
- Docker Compose Specification —— Tùy chỉnh stack
Hosting Và Hạ Tầng Được Đề Xuất #
- DigitalOcean — Credit $200 trong 60 ngày.
- HTStack — VPS Hong Kong, độ trễ thấp khi truy cập từ Trung Quốc.
Liên kết tiếp thị — không tăng chi phí của bạn, giúp dibi8.com hoạt động.
Tuyên bố Affiliate #
Bài viết này chứa liên kết affiliate. Nếu bạn đăng ký DigitalOcean qua liên kết giới thiệu của chúng tôi, chúng tôi nhận được hoa hồng mà không phát sinh chi phí cho bạn. Chúng tôi chỉ giới thiệu các dịch vụ mà chính chúng tôi sử dụng cho hạ tầng. Docker GenAI Stack là open-source (giấy phép MIT) và miễn phí sử dụng —— không cần mua hàng.
💬 Bình luận & Thảo luận