Bế tắc tài liệu lúc 2 giờ 15 sáng
Lúc đó là 2 giờ 15 sáng, và tôi đang nhìn chằm chằm vào lỗi 504 Gateway Timeout trên một bản triển khai cũ (legacy). Tôi biết chắc mình đã sửa đúng lỗi này sáu tháng trước.
Tôi thậm chí còn nhớ mình đã viết lại các thiết lập bộ đệm (buffer) cụ thể của Nginx để giải quyết nó. Nhưng khi tìm kiếm trong 1.200 tệp Markdown của mình cho từ khóa “Nginx timeout”, kết quả trả về hàng tá thông tin không liên quan, và lệnh grep cũng thất bại vì có lẽ tôi đã dùng từ “latency” (độ trễ) thay vì “timeout” trong ghi chú ban đầu. Cơ sở tri thức cá nhân của tôi đã trở thành một “nhà kho kỹ thuật số”—đầy giá trị nhưng không thể nào tìm thấy thứ mình cần.
Sự ức chế này là lý do tại sao tìm kiếm ngữ nghĩa (semantic search) đang trở nên thiết yếu. Các công cụ như Notion AI hay Obsidian Copilot tìm kiếm thông tin dựa trên ý định thay vì chỉ khớp các ký tự. Tuy nhiên, việc đưa tài sản trí tuệ riêng tư của bạn lên đám mây của bên thứ ba là một rủi ro lớn về quyền riêng tư. Tôi muốn trí thông minh của một Mô hình ngôn ngữ lớn (LLM) mà không bị rò rỉ dữ liệu. Cuộc tìm kiếm quyền riêng tư đó đã dẫn tôi đến với Khoj.
Tại sao công cụ tìm kiếm hiện tại của bạn cảm thấy không hiệu quả
Tìm kiếm tiêu chuẩn hoạt động theo nghĩa đen. Nếu bạn tìm kiếm “hiệu suất cơ sở dữ liệu”, một công cụ cơ bản sẽ bỏ qua ghi chú có tiêu đề “Scaling Postgres Queries” chỉ vì các ký tự không khớp. Cách tiếp cận cứng nhắc này buộc bạn phải nhớ chính xác cách mình đã diễn đạt một ý tưởng từ nhiều tháng trước.
Tìm kiếm ngữ nghĩa hoạt động khác biệt bằng cách sử dụng vector embeddings. Hãy coi nó như một bản đồ toán học của ngôn ngữ nhân loại.
Nó chuyển đổi văn bản của bạn thành một chuỗi số (một vector) đại diện cho ý nghĩa của nó. Khi bạn hỏi, “Làm thế nào để trang web của tôi nhanh hơn?”, hệ thống sẽ tìm các ghi chú có khoảng cách toán học “gần” với khái niệm đó, hiển thị các tài liệu về bộ nhớ đệm (caching), CDN hoặc nén hình ảnh. Khoj quản lý quá trình xử lý chuyên sâu này ngay tại cục bộ, cho phép bạn truy vấn các tệp PDF, kho ghi chú Markdown và thậm chí cả kho lưu trữ GitHub bằng ngôn ngữ tự nhiên.
Khoj: Trợ lý AI ưu tiên quyền riêng tư
Khoj là một trợ lý AI mã nguồn mở được thiết kế để chạy trên phần cứng của riêng bạn. Nó làm được nhiều việc hơn là chỉ tìm kiếm; nó có thể tóm tắt các bài nghiên cứu dài, trò chuyện với các ghi chú của bạn để tìm ra những điểm mâu thuẫn và thậm chí tạo nội dung mới dựa trên phong cách viết của bạn. Sử dụng Docker để triển khai Khoj đảm bảo hệ thống của bạn có tính di động và tách biệt với phần còn lại của hệ điều hành.
Yêu cầu phần cứng
- Docker & Docker Compose: Đảm bảo bạn đang chạy phiên bản mới nhất.
- RAM: Tối thiểu 8GB, nhưng khuyến nghị 16GB nếu bạn dự định chạy các LLM cục bộ.
- Lưu trữ: Ít nhất 10GB dung lượng trống cho cơ sở dữ liệu vector và trọng số mô hình (model weights).
- Lựa chọn mô hình: Sử dụng OpenAI API key để có tốc độ nhanh, hoặc một instance Ollama để sử dụng ngoại tuyến 100% cục bộ.
Triển khai Khoj với Docker
Tôi thích sử dụng Docker Compose vì nó giúp việc thiết lập có thể lặp lại và dễ dàng cập nhật. Chúng ta cần cấu hình container Khoj để nó có thể thấy các tệp cục bộ của bạn trong khi vẫn giữ cấu hình được lưu trữ lâu dài. Đây là tệp docker-compose.yml đáng tin cậy để bạn bắt đầu.
version: '3.8'
services:
khoj:
image: khoj/khoj:latest
container_name: khoj
volumes:
- ./khoj_config:/home/khoj/.khoj
- /home/user/my_notes:/home/khoj/data:ro
ports:
- "42110:42110"
environment:
- KHOJ_DOMAIN=localhost
restart: unless-stopped
Hãy chú ý kỹ đến phần ánh xạ volume: /home/user/my_notes:/home/khoj/data:ro. Thay thế đường dẫn đầu tiên bằng vị trí thực tế của kho lưu trữ Obsidian hoặc thư mục PDF của bạn. Tôi khuyên bạn nên sử dụng cờ :ro (read-only – chỉ đọc). Điều này đảm bảo AI có thể đọc và lập chỉ mục các suy nghĩ của bạn mà không có rủi ro vô tình sửa đổi hoặc xóa các tệp gốc.
Khởi chạy Instance
Mở terminal của bạn và chạy:
docker-compose up -d
Sau khi container khởi tạo xong, hãy mở trình duyệt và truy cập http://localhost:42110. Trong lần chạy đầu tiên, Khoj sẽ bắt đầu lập chỉ mục các tệp của bạn. Nếu bạn có một thư viện lớn hơn 2.000 tệp, hãy chuẩn bị tinh thần rằng quá trình này sẽ mất khoảng 15 đến 30 phút để nó xây dựng bản đồ toán học cho dữ liệu của bạn.
Kết nối cơ sở tri thức của bạn
Bên trong giao diện web, hãy đi tới phần cài đặt “Content Sources”. Đây là nơi bạn tinh chỉnh những gì Khoj thực sự tìm kiếm. Bạn có thể liên kết các thư mục cục bộ, các kho lưu trữ GitHub cụ thể hoặc thậm chí kết nối không gian làm việc Notion nếu bạn vẫn đang trong quá trình chuyển đổi khỏi đám mây.
Để giữ trải nghiệm hoàn toàn cục bộ, hãy trỏ Khoj tới một Ollama instance. Thiết lập này đảm bảo dữ liệu của bạn không bao giờ rời khỏi mạng nội bộ. Trong phần cài đặt, hãy thay đổi nhà cung cấp mô hình thành “Ollama” và đặt URL thành http://host.docker.internal:11434. Điều này cho phép container Docker giao tiếp với dịch vụ Ollama đang chạy trên máy chủ của bạn.
Tối ưu hóa mức độ liên quan của tìm kiếm
Kết quả tìm kiếm ban đầu của tôi bị nhiễu bởi các thư mục .git và node_modules. Để khắc phục điều này, hãy tạo một tệp .khojignore trong thư mục dữ liệu của bạn. Giống như .gitignore, tệp này cho AI biết thư mục nào cần bỏ qua. Việc loại trừ các tệp log và thư mục phụ thuộc giúp cơ sở dữ liệu vector gọn nhẹ hơn và cải thiện đáng kể tốc độ tìm kiếm.
Hiệu suất và Quản lý tài nguyên
Chạy AI cục bộ có thể gây áp lực lên CPU. Nếu quạt tản nhiệt của bạn quay quá to hoặc hệ thống có cảm giác chậm chạp, bạn có thể giới hạn mức tiêu thụ tài nguyên của Docker trong tệp compose:
deploy:
resources:
limits:
cpus: '4'
memory: 6G
Từ góc độ bảo mật, kiến trúc này là một thắng lợi lớn. Ngay cả khi bạn chọn sử dụng mô hình OpenAI cho giao diện trò chuyện, phần “Truy xuất” (Retrieval) của RAG (Retrieval-Augmented Generation) vẫn diễn ra trên máy của bạn. Chỉ những đoạn văn bản nhỏ, có liên quan mới được gửi đến LLM dưới dạng ngữ cảnh, thay vì toàn bộ thư viện của bạn. Nếu bạn sử dụng Ollama, quyền riêng tư của bạn là tuyệt đối.
Lời kết
Đến 3 giờ sáng, instance Khoj cục bộ của tôi đã được lập chỉ mục đầy đủ. Tôi hỏi: “Tôi đã sửa lỗi Nginx proxy timeout như thế nào?” và nó ngay lập tức hiển thị chính xác cấu hình proxy_read_timeout mà tôi đã chôn vùi trong một thư mục dự án từ năm ngoái. Không còn phải cuộn chuột vô tận. Không còn phải đoán mò.
Chuyển sang hệ thống tìm kiếm ngữ nghĩa là một sự thay đổi cơ bản trong cách bạn tương tác với dữ liệu của chính mình. Nó biến một đống ghi chú tĩnh thành một “bộ não thứ hai” có tính tương tác và thực sự hiểu bạn. Nếu bạn coi trọng quyền riêng tư và thời gian của mình, hãy ngừng nhấn CTRL+F và bắt đầu xây dựng công cụ tìm kiếm AI cục bộ của riêng bạn.

