Bối cảnh & Lý do
Kỹ sư, nhân viên hỗ trợ khách hàng và đội ngũ nhân sự liên tục yêu cầu một trợ lý nội bộ có khả năng tra cứu wiki riêng tư và các tài liệu đặc tả kiến trúc. Tuy nhiên, việc dán tài liệu nội bộ vào các chatbot SaaS công khai tiềm ẩn những rủi ro bảo mật khổng lồ. Bản vẽ thiết kế kiến trúc, mã nguồn và hồ sơ nhân viên rất dễ bị rò rỉ ra bên ngoài tường lửa của doanh nghiệp.
Tự xây dựng một hệ thống Retrieval-Augmented Generation (RAG) nội bộ từ con số 0 là một quá trình tốn nhiều thời gian. Bạn cần bộ phân tích cú pháp tài liệu (document parser), pipeline phân đoạn (chunking), cơ sở dữ liệu vector và một lớp xác thực phân quyền chi tiết. Phần lớn các giao diện mã nguồn mở hiện nay chỉ hỗ trợ duy nhất một tài khoản người dùng. Nếu thiếu tính năng phân quyền theo vai trò (RBAC), một lập trình viên tập sự hoặc đối tác bên ngoài có thể vô tình truy vấn được dữ liệu bảng lương.
AnythingLLM giải quyết triệt để bài toán đóng gói phức tạp này. Nền tảng tích hợp sẵn tính năng phân tích tài liệu (PDF, DOCX, CSV), lưu trữ vector cục bộ thông qua LanceDB và cơ chế phân quyền đa người dùng (multi-tenant) vào trong một container duy nhất. Bạn có thể trỏ nó tới Ollama, vLLM hoặc các API thương mại như Anthropic và OpenAI. Toàn bộ dữ liệu của bạn hoàn toàn nằm gọn trong đám mây riêng ảo (VPC) của chính mình.
Cài đặt
Đóng gói AnythingLLM vào container giúp việc nâng cấp diễn ra dễ dàng và cô lập các phân vùng lưu trữ (storage volume). Bạn sẽ cần một máy chủ cài sẵn Docker Engine 24.0 trở lên, Docker Compose và tối thiểu 4 GB RAM (khuyến nghị nâng cấp lên 8 GB hoặc nhiều hơn nếu chạy LLM cục bộ trên cùng máy chủ).
1. Tạo cấu trúc thư mục và phân vùng lưu trữ
AnythingLLM lưu trữ các bản ghi cơ sở dữ liệu SQLite, tệp tải lên thô và tệp vector LanceDB trong một mount volume duy nhất. Hãy tạo thư mục đó trên máy chủ của bạn:
sudo mkdir -p /opt/anythingllm/storage
cd /opt/anythingllm
sudo chown -R 1000:1000 storage
chmod -R 775 storage
2. Triển khai bằng Docker Compose
Docker Compose giúp quản lý các biến môi trường hiệu quả và cấu hình mạng máy chủ một cách gọn gàng. Hãy tạo tệp docker-compose.yml trong thư mục /opt/anythingllm:
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
restart: unless-stopped
ports:
- "3001:3001"
environment:
- SERVER_PORT=3001
- STORAGE_DIR=/app/server/storage
volumes:
- ./storage:/app/server/storage
extra_hosts:
- "host.docker.internal:host-gateway"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001/api/ping"]
interval: 30s
timeout: 10s
retries: 3
Hãy lưu ý cấu hình extra_hosts. Trên Linux, mục khai báo này cho phép container kết nối trực tiếp với các dịch vụ đang chạy trên host, chẳng hạn như một tiến trình Ollama đang lắng nghe trên cổng 11434.
Khởi chạy container ở chế độ chạy nền (background):
docker compose up -d
Theo dõi log khởi động để kiểm tra quá trình khởi tạo:
docker logs -f anythingllm
Sau khoảng 15 đến 30 giây, bạn sẽ thấy server bắt đầu lắng nghe trên cổng 3001.
Cấu hình
Mở đường dẫn http://<your-server-ip>:3001 trên trình duyệt để bắt đầu các bước thiết lập ban đầu.
1. Thiết lập tài khoản Admin và chế độ đa người dùng
Tạo tài khoản quản trị viên chính trong trình hướng dẫn ban đầu. Sau khi vào được dashboard, hãy điều hướng tới Settings > Security và kích hoạt Multi-user Mode. Thao tác này sẽ kích hoạt ba cấp độ phân quyền riêng biệt:
- Admin: Kiểm soát các tham số toàn cục, quản lý API token, cấu hình nhà cung cấp LLM và có quyền truy cập toàn bộ workspace.
- Manager: Quản lý tài liệu và prompt trong các workspace được chỉ định, nhưng không thể thay đổi cài đặt hệ thống toàn cục.
- Default User: Chỉ có thể chat trong các workspace mà admin chia sẻ trực tiếp với tài khoản của họ.
Các workspace tạo ra ranh giới cô lập nghiêm ngặt giữa các phòng ban. Ví dụ, bạn có thể tạo một workspace finance-restricted cho ban lãnh đạo và một workspace eng-onboarding cho các lập trình viên. Người dùng thông thường (Default User) không thể phát hiện hay truy vấn dữ liệu từ những workspace mà họ không được phân quyền.
2. Kết nối nhà cung cấp LLM và Embedding
AnythingLLM tách biệt mô hình hoàn thành văn bản (completion model) với mô hình nhúng (embedding model). Hãy truy cập vào Settings > AI Providers để thiết lập pipeline:
- Local Stack (Ollama): Đặt URL nhà cung cấp thành
http://host.docker.internal:11434. Đối với việc sinh văn bản, hãy chọnllama3.1:8bhoặcqwen2.5:7b. Đối với embedding, hãy chọnnomic-embed-text(768 chiều), mô hình này xử lý lập chỉ mục tài liệu với mức tiêu thụ CPU rất thấp. - Cloud API: Nhập API key của OpenAI, Anthropic hoặc Azure. Việc kết hợp
gpt-4o-mini($0.15 cho mỗi triệu token đầu vào) vớitext-embedding-3-smallmang lại tốc độ phản hồi truy vấn dưới một giây mà không gây tốn kém ngân sách đám mây.
3. Khởi tạo Workspace và nạp tài liệu
Tạo một workspace thử nghiệm có tên devops-runbooks. Trong phần cài đặt workspace, mở trình quản lý tài liệu và tải lên một tệp mẫu, ví dụ như một tài liệu runbook hạ tầng dài 20 trang (định dạng PDF hoặc Markdown). Nhấp vào Move to Workspace, sau đó chọn Save and Embed.
Dưới nền tảng, AnythingLLM sẽ phân tích cú pháp văn bản, chia nhỏ thành các đoạn (thường là 1.000 token kèm 200 token gối đầu nhau), tạo vector embedding và lưu trữ chúng vào LanceDB nằm tại /opt/anythingllm/storage/lancedb.
Kiểm thử & Giám sát
Không nên mở quyền truy cập hệ thống cho người dùng cuối khi chưa kiểm tra độ chính xác của quá trình truy xuất và thiết lập giới hạn tài nguyên.
1. Kiểm tra độ chính xác của Retrieval-Augmented Generation
Mở giao diện chat trong workspace bạn vừa tạo. AnythingLLM cung cấp hai chiến lược truy vấn riêng biệt:
- Query Mode: Trích xuất nghiêm ngặt. Mô hình chỉ trả lời dựa trên những trích đoạn đã tải lên. Nếu không có thông tin yêu cầu, nó sẽ từ chối trả lời thay vì tự bịa ra thông tin sai lệch (hallucination).
- Chat Mode: Ngữ cảnh hội thoại kết hợp. Mô hình sẽ kết hợp các đoạn trích xuất được với khối tri thức tổng quát đã được huấn luyện từ trước.
Chọn Query Mode và đặt một câu hỏi trọng tâm, ví dụ: “Mục tiêu điểm khôi phục (RPO) cho cụm Postgres chính của chúng ta là bao nhiêu?” Quan sát thẻ trích dẫn (citation pill) bên dưới câu trả lời. Thẻ này hiển thị đoạn văn bản khớp với truy vấn và điểm tương đồng vector từ LanceDB. Hãy hướng tới điểm tin cậy tương đồng trên 0.70 đối với tài liệu kỹ thuật.
2. Giám sát tình trạng container và tài nguyên
Việc phân tích các tệp PDF 50 MB hoặc tải lên hàng loạt tệp CSV sẽ khiến CPU và bộ nhớ RAM tăng đột biến trong thời gian ngắn. Giám sát mức sử dụng tài nguyên theo thời gian thực bằng Docker CLI:
docker stats anythingllm --no-stream
Ở trạng thái nhàn rỗi thông thường, AnythingLLM tiêu thụ khoảng 180 MB đến 250 MB RAM. Nếu việc xử lý tài liệu làm mức sử dụng tăng vượt quá giới hạn của máy chủ, hãy giới hạn tài nguyên bằng cách thêm khối deploy vào tệp docker-compose.yml của bạn:
deploy:
resources:
limits:
cpus: '2.0'
memory: 4096M
Áp dụng thay đổi bằng lệnh docker compose up -d.
3. Thiết lập quy trình sao lưu tự động
Vì LanceDB và SQLite lưu trữ toàn bộ dữ liệu ứng dụng trong thư mục ./storage, quá trình khôi phục sau thảm họa (disaster recovery) rất đơn giản. Hãy thêm một cron job chạy hàng đêm để sao lưu thư mục vào lúc 02:00 sáng:
0 2 * * * tar -czf /opt/backups/anythingllm-$(date +\%F).tar.gz -C /opt/anythingllm storage
Hãy định kỳ kiểm tra việc khôi phục bản lưu trữ trên máy chủ staging. Với các bản snapshot hợp lệ, bạn có thể khôi phục lại một workspace bị hỏng hoặc tệp cơ sở dữ liệu bị mất chỉ trong vòng chưa đầy hai phút.

