Giới thiệu
Bài viết này sẽ hướng dẫn bạn xây dựng một hệ thống chatbot hoàn chỉnh có khả năng đọc và phân tích tài liệu PDF, đồng thời tra cứu thông tin internet theo thời gian thực. Hệ thống sử dụng Ollama làm nền tảng model ngôn ngữ, LocalAI để xử lý file, Open WebUI làm giao diện chat hiện đại, và SearXNG để tìm kiếm web.
📋 Kiến trúc hệ thống
Trình duyệt người dùng
│
▼
Domain (ai.huancoc.com) - Qua Nginx Proxy Manager (có xác thực)
│
▼
Open WebUI (Port 3000) - Giao diện chat chính
│
┌───┴──────────────────────────────────────┐
│ │
▼ ▼
Ollama (Port 11434) - Chạy model ngôn ngữ LocalAI (Port 8085/v1) - API OpenAI-compatible
│ │
└──────────────────────────────────────────┘
│
▼
SearXNG (Port 8080) - Tìm kiếm web
🖥️ Phần 1: Chuẩn bị môi trường
Yêu cầu cấu hình
-
CPU: 24 luồng (khuyến nghị)
-
RAM: 32GB (tối thiểu 16GB)
-
Storage: 100GB SSD
-
OS: Ubuntu 22.04/24.04
Cài đặt Docker và Docker Compose
# Cập nhật hệ thống sudo apt update && sudo apt upgrade -y # Cài đặt Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Thêm user vào group docker sudo usermod -aG docker $USER newgrp docker # Cài đặt Docker Compose Plugin sudo apt install docker-compose-plugin -y # Kiểm tra cài đặt docker --version docker compose version
🦙 Phần 2: Cài đặt và cấu hình Ollama
Cài đặt Ollama
# Cài đặt Ollama curl -fsSL https://ollama.com/install.sh | sh # Cấu hình Ollama lắng nghe trên tất cả interface sudo mkdir -p /etc/systemd/system/ollama.service.d sudo tee /etc/systemd/system/ollama.service.d/override.conf << 'EOF' [Service] Environment="OLLAMA_HOST=0.0.0.0" EOF # Khởi động lại dịch vụ sudo systemctl daemon-reload sudo systemctl restart ollama sudo systemctl enable ollama # Kiểm tra trạng thái sudo systemctl status ollama
Pull các model cần thiết
# Model chat đa năng (3B, context 128K) ollama pull llama3.2:3b # Model embedding cho xử lý tài liệu ollama pull nomic-embed-text # Model nhẹ hơn (tùy chọn) ollama pull phi3:mini ollama pull gemma2:2b
Kiểm tra Ollama hoạt động
curl http://localhost:11434/api/tags
🤖 Phần 3: Cài đặt LocalAI (Xử lý file)
Tạo cấu hình LocalAI
# Tạo thư mục làm việc mkdir -p ~/localai && cd ~/localai # Tạo file docker-compose.yml cat > docker-compose.yml << 'EOF' version: '3.8' services: localai: image: quay.io/go-skynet/local-ai:latest container_name: localai restart: unless-stopped ports: - "8085:8080" volumes: - ./models:/models - ./images:/tmp/generated/images environment: - THREADS=4 - CONTEXT_SIZE=8192 - DEBUG=true - MODELS_PATH=/models - STREAMING=true EOF
Khởi chạy LocalAI
docker compose up -d docker logs localai --tail 20
🌐 Phần 4: Cài đặt Open WebUI (Giao diện chat)
Tạo volume và chạy container
# Tạo volume lưu dữ liệu docker volume create open-webui-data # Chạy Open WebUI docker run -d \ --name open-webui \ --restart unless-stopped \ -p 3000:8080 \ -v open-webui-data:/app/backend/data \ -e OLLAMA_BASE_URL=http://192.168.3.6:11434 \ -e OPENAI_API_BASE_URL=http://192.168.3.6:8085/v1 \ -e OPENAI_API_KEY=your_username:your_password \ -e WEBUI_AUTH=true \ -e ENABLE_WEBSOCKET_SUPPORT=true \ ghcr.io/open-webui/open-webui:main
Thiết lập tài khoản admin
-
Truy cập
http://192.168.3.6:3000 -
Đăng ký tài khoản admin đầu tiên
-
Đăng nhập và vào Admin Panel để cấu hình
🔍 Phần 5: Cài đặt SearXNG (Tìm kiếm web)
Tạo cấu hình SearXNG
# Tạo thư mục làm việc mkdir -p ~/searxng && cd ~/searxng mkdir -p searxng # Tạo file settings.yml cat > searxng/settings.yml << 'EOF' use_default_settings: true server: bind_address: "0.0.0.0" port: 8080 secret_key: "your-secret-key-change-this" image_proxy: true ui: static_use_hash: true search: safe_search: 0 formats: - html - json outgoing: request_timeout: 5.0 max_request_size: 25 redis: url: redis://redis:6379/0 EOF # Tạo file limiter.toml cat > searxng/limiter.toml << 'EOF' [botdetection.ip_limit] link_token = false [botdetection.ip_lists] block_ip = [] pass_ip = [] EOF
Tạo docker-compose cho SearXNG
cat > docker-compose.yml << 'EOF' version: '3.7' services: redis: container_name: searxng-redis image: redis:alpine command: redis-server --save "" --appendonly "no" networks: - searxng-net tmpfs: - /var/lib/redis restart: unless-stopped searxng: container_name: searxng image: searxng/searxng:latest networks: - searxng-net ports: - "8080:8080" volumes: - ./searxng:/etc/searxng:rw environment: - SEARXNG_BASE_URL=http://192.168.3.6:8080/ depends_on: - redis cap_drop: - ALL cap_add: - CHOWN - SETGID - SETUID - DAC_OVERRIDE restart: unless-stopped networks: searxng-net: driver: bridge EOF
Khởi chạy SearXNG
docker compose up -d docker ps | grep searxng
🔗 Phần 6: Kết nối Open WebUI với SearXNG
Cấu hình Web Search trong Open WebUI
-
Đăng nhập Open WebUI với tài khoản admin
-
Vào Admin Panel (⚙️) → Settings → Web Search
-
Cấu hình:
| Mục | Giá trị |
|---|---|
| Enable Web Search | ✅ Bật |
| Search Engine | SearXNG |
| SearXNG Base URL | http://192.168.3.6:8080 |
| Số kết quả | 5 |
| Bypass Embedding and Retrieval | ❌ TẮT |
| Bypass Web Loader | ❌ TẮT |
| Trust Proxy Environment | ✅ BẬT |
-
Nhấn Save
🔒 Phần 7: Cấu hình Nginx Proxy Manager (Domain và SSL)
Trên máy chủ NPM (192.168.3.5)
-
Truy cập NPM tại
http://192.168.3.5:81 -
Thêm Proxy Host mới với các thông số:
Tab Details:
-
Domain Names:
ai.huancoc.com(hoặc domain bạn muốn) -
Scheme:
http -
Forward Hostname/IP:
192.168.3.6 -
Forward Port:
3000
Tab Advanced:
Thêm cấu hình WebSocket:
location / { proxy_pass http://192.168.3.6:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Tab SSL:
-
Chọn Request a new SSL Certificate
-
Bật Force SSL và HTTP/2 Support
-
Nhấn Save
📝 Phần 8: Cấu hình model cho đọc tài liệu
Tăng Context Length cho model
-
Vào Admin Panel (⚙️) → Settings → Models
-
Tìm model
llama3.2:3bvà nhấn để chỉnh sửa -
Trong Advanced Parameters, set Context Length =
8192hoặc16384 -
Nhấn Save
Cấu hình Knowledge Base (đọc PDF)
-
Vào Workspace → Knowledge
-
Nhấn + Create a Knowledge Base
-
Đặt tên (VD: “Tài liệu kỹ thuật”)
-
Kéo thả file PDF vào để upload
-
Chờ hệ thống xử lý và tạo vector database
🎯 Phần 9: Sử dụng hệ thống
Chat thông thường
# Mở trình duyệt và truy cập https://ai.huancoc.com # Đăng nhập và tạo chat mới # Chọn model và bắt đầu hỏi
Tra cứu internet
-
Tạo chat mới
-
Chọn model (VD:
llama3.2:3b) -
Bật Web Search (biểu tượng bên cạnh nút gửi)
-
Nhập câu hỏi cần thông tin cập nhật:
thời tiết Hà Nội hôm nay thế nào?
Đọc và phân tích PDF
Cách 1: Upload trực tiếp vào chat
-
Tạo chat mới
-
Nhấn biểu tượng kẹp giấy bên cạnh ô nhập tin nhắn
-
Chọn file PDF
-
Nhập câu hỏi về nội dung file
Cách 2: Sử dụng Knowledge Base
-
Vào Workspace → Knowledge → chọn kho kiến thức đã tạo
-
Trong chat, gõ ký tự
#và chọn kho kiến thức -
Đặt câu hỏi
🛠️ Phần 10: Quản lý và bảo trì
Các lệnh quản lý thường dùng
# Xem logs docker logs open-webui --tail 50 docker logs searxng --tail 20 docker logs localai --tail 20 # Restart container docker restart open-webui docker restart searxng docker restart localai # Cập nhật Open WebUI docker stop open-webui docker rm open-webui docker run -d ... (chạy lại với image mới nhất)
Backup dữ liệu
# Backup volume Open WebUI docker run --rm -v open-webui-data:/data -v $(pwd):/backup alpine tar czf /backup/open-webui-backup-$(date +%Y%m%d).tar.gz -C /data . # Backup cấu hình SearXNG tar -czf searxng-backup-$(date +%Y%m%d).tar.gz ~/searxng/
⚠️ Xử lý sự cố thường gặp
Lỗi “Unexpected token ‘d’, data: …”
-
Nguyên nhân: Thiếu cấu hình WebSocket trên NPM
-
Khắc phục: Thêm cấu hình WebSocket vào Nginx (xem Phần 7)
Lỗi “Web search not working”
-
Nguyên nhân: Chưa bật Web Search trong từng chat
-
Khắc phục: Luôn bật toggle Web Search trước khi gửi tin nhắn
Model trả lời thông tin cũ
-
Nguyên nhân: Context Length quá nhỏ
-
Khắc phục: Tăng Context Length lên 8192 hoặc 16384 (Phần 8)
Lỗi kết nối đến Ollama
-
Nguyên nhân: Ollama chưa cấu hình listen 0.0.0.0
-
Khắc phục: Kiểm tra và cấu hình override.conf (Phần 2)
📚 Tổng kết
Bạn đã xây dựng thành công một hệ thống chatbot hoàn chỉnh với các tính năng:
-
✅ Chat với nhiều model ngôn ngữ khác nhau
-
✅ Đọc và phân tích file PDF
-
✅ Tra cứu thông tin internet thời gian thực
-
✅ Giao diện web hiện đại, hỗ trợ đa người dùng
-
✅ Bảo mật với xác thực đăng nhập
-
✅ SSL qua domain tùy chỉnh
Hệ thống này hoàn toàn miễn phí, chạy trên cơ sở hạ tầng của bạn, đảm bảo quyền riêng tư và bảo mật dữ liệu.