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

text
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

bash
# 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

bash
# 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

bash
# 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

bash
curl http://localhost:11434/api/tags

🤖 Phần 3: Cài đặt LocalAI (Xử lý file)

Tạo cấu hình LocalAI

bash
# 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

bash
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

bash
# 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

  1. Truy cập http://192.168.3.6:3000

  2. Đăng ký tài khoản admin đầu tiên

  3. Đă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

bash
# 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

bash
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

bash
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

  1. Đăng nhập Open WebUI với tài khoản admin

  2. Vào Admin Panel (⚙️) → Settings → Web Search

  3. 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
  1. 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)

  1. Truy cập NPM tại http://192.168.3.5:81

  2. Thêm Proxy Host mới với các thông số:

Tab Details:

  • Domain Namesai.huancoc.com (hoặc domain bạn muốn)

  • Schemehttp

  • Forward Hostname/IP192.168.3.6

  • Forward Port3000

Tab Advanced:
Thêm cấu hình WebSocket:

nginx
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

  1. Vào Admin Panel (⚙️) → Settings → Models

  2. Tìm model llama3.2:3b và nhấn để chỉnh sửa

  3. Trong Advanced Parameters, set Context Length = 8192 hoặc 16384

  4. Nhấn Save

Cấu hình Knowledge Base (đọc PDF)

  1. Vào Workspace → Knowledge

  2. Nhấn + Create a Knowledge Base

  3. Đặt tên (VD: “Tài liệu kỹ thuật”)

  4. Kéo thả file PDF vào để upload

  5. 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

bash
# 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

  1. Tạo chat mới

  2. Chọn model (VD: llama3.2:3b)

  3. Bật Web Search (biểu tượng bên cạnh nút gửi)

  4. Nhập câu hỏi cần thông tin cập nhật:

    text
    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

  1. Tạo chat mới

  2. Nhấn biểu tượng kẹp giấy bên cạnh ô nhập tin nhắn

  3. Chọn file PDF

  4. Nhập câu hỏi về nội dung file

Cách 2: Sử dụng Knowledge Base

  1. Vào Workspace → Knowledge → chọn kho kiến thức đã tạo

  2. Trong chat, gõ ký tự # và chọn kho kiến thức

  3. Đặ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

bash
# 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

bash
# 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.

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *