Xây dựng stack tìm kiếm AI riêng tư với SearXNG và LLM cục bộ
Một dự án mã nguồn mở mới kết hợp công cụ tìm kiếm siêu dữ liệu SearXNG với Ollama để cung cấp câu trả lời AI có trích dẫn mà không gửi truy vấn đến các máy chủ bên ngoài.
Bài được dịch tự động từ bản gốc tiếng Anh.
Một nhà phát triển đã ra mắt PrivaSearch, một công cụ mã nguồn mở tổng hợp kết quả tìm kiếm web thành câu trả lời do AI tạo ra trong khi vẫn giữ toàn bộ dữ liệu ở dạng cục bộ. Được công bố vào ngày 8 tháng 11 năm 2026, dự án sử dụng SearXNG cho việc tìm kiếm siêu dữ liệu (metasearch) và Ollama cho suy luận mô hình ngôn ngữ lớn, đảm bảo rằng các truy vấn của người dùng không bao giờ rời khỏi môi trường tự lưu trữ (self-hosted).
Điều gì đã xảy ra
PrivaSearch được xây dựng dưới dạng một stack Docker gồm bốn container chạy trên một mạng nội bộ duy nhất. Kiến trúc này tách biệt frontend, nơi phục vụ giao diện React qua nginx, khỏi các thành phần backend. Lớp API, được viết bằng Node.js và Express, điều phối giao tiếp giữa giao diện người dùng, công cụ tìm kiếm siêu dữ liệu SearXNG và LLM cục bộ được phục vụ bởi Ollama. Chỉ có frontend mới mở một cổng host, thường là 8080, trong khi các dịch vụ khác vẫn không thể truy cập từ bên ngoài mạng Docker.
Hệ thống tách biệt quy trình tìm kiếm khỏi quá trình tạo câu trả lời. Khi người dùng gửi một truy vấn, trình duyệt trước tiên sẽ yêu cầu kết quả phân trang từ SearXNG. Sau đó, nó gửi các kết quả hàng đầu đến API, nơi xây dựng một prompt cho LLM cục bộ. Mô hình sẽ stream một câu trả lời tổng hợp trở lại phía client, kèm theo trích dẫn nguồn bằng số trong ngoặc vuông. Sự tách biệt này cho phép người dùng tạo lại câu trả lời với số lượng nguồn khác nhau mà không cần phải truy vấn lại các công cụ tìm kiếm web.
Để duy trì tính riêng tư nghiêm ngặt, dự án tối thiểu hóa các phụ thuộc và kiểm soát việc lưu trữ dữ liệu. API chỉ dựa vào Express và khả năng fetch tích hợp sẵn của Node. Các truy vấn và kết quả chỉ tồn tại trong bộ nhớ tiến trình trong suốt thời gian xử lý yêu cầu và không được lưu trên đĩa. Dữ liệu bền vững duy nhất bao gồm trọng số của mô hình và cấu hình SearXNG. Các tính năng tùy chọn như tóm tắt trang và tra cứu IP địa lý bị vô hiệu hóa theo mặc định để ngăn chặn các yêu cầu outbound bổ sung.
Chi tiết chính
- Stack chạy bốn container: frontend (nginx/React), API (Node/Express), SearXNG và Ollama trên một mạng Docker nội bộ.
- Tìm kiếm và tạo câu trả lời là hai bước riêng biệt, cho phép người dùng điều chỉnh số lượng nguồn mà không cần chạy lại tìm kiếm ban đầu.
- System prompt hạn chế LLM chỉ sử dụng các kết quả được cung cấp, trích dẫn các tuyên bố bằng
[n]và tránh kiến thức bên ngoài. - Nhiệt độ (temperature) mặc định được đặt ở mức 0.2 để đảm bảo tính nhất quán về mặt thực tế, và mô hình được giữ thường trú trong 30 phút để giảm thời gian tải.
- Có thể sử dụng các đường hầm Tor hoặc VPN tùy chọn để che giấu IP của máy chủ khỏi các công cụ tìm kiếm upstream, với Gluetun cung cấp cơ chế kill switch cho tùy chọn VPN.
- Mô hình mặc định là
qwen2.5:1.5b, yêu cầu khoảng 1 GB RAM và cung cấp câu trả lời ấm áp (warm answers) trong khoảng 8 giây trên CPU.
Bối cảnh
Retrieval-Augmented Generation (RAG) là một kỹ thuật mà trong đó mô hình AI trả lời các câu hỏi bằng cách sử dụng các tài liệu ngoại vi cụ thể thay vì chỉ dựa vào dữ liệu huấn luyện của nó. Trong thiết lập này, SearXNG đóng vai trò là công cụ truy xuất, lấy kết quả web trực tiếp. Sau đó, Ollama xử lý các kết quả này để tạo ra một bản tóm tắt mạch lạc. Bằng cách chạy cả hai thành phần cục bộ, người dùng tránh được việc gửi các từ khóa tìm kiếm nhạy cảm đến các nhà cung cấp AI của bên thứ ba.
SearXNG là một công cụ tìm kiếm siêu dữ liệu tôn trọng quyền riêng tư, tổng hợp kết quả từ nhiều nhà cung cấp như Google và Bing mà không theo dõi người dùng. Ollama là một công cụ đơn giản hóa việc chạy các mô hình ngôn ngữ lớn trên phần cứng cục bộ. Việc kết hợp chúng cho phép trải nghiệm tìm kiếm hiện đại và thông minh nhưng vẫn nằm dưới sự kiểm soát hoàn toàn của người dùng, giải quyết những lo ngại ngày càng tăng về rò rỉ dữ liệu trong các dịch vụ AI dựa trên đám mây.
Tại sao điều này quan trọng
Đối với các đội ngũ tự lưu trữ hạ tầng của mình, việc duy trì quyền riêng tư trong khi áp dụng các công cụ AI là một thách thức đáng kể. Các API AI công cộng thường ghi nhật ký truy vấn để huấn luyện hoặc cải thiện, điều này có thể vi phạm các chính sách tuân thủ nội bộ hoặc làm lộ thông tin độc quyền. PrivaSearch chứng minh rằng có thể nhận được các câu trả lời tổng hợp có trích dẫn mà không hy sinh quyền chủ quyền dữ liệu. Cách tiếp cận này đặc biệt liên quan đến các tổ chức xử lý dữ liệu khách hàng nhạy cảm hoặc tài sản trí tuệ.
Kiến trúc này cũng nhấn mạnh tầm quan trọng của việc tối thiểu hóa các phụ thuộc trong các dự án chú trọng bảo mật. Bằng cách dựa vào các khả năng tích hợp sẵn của Node và tránh các framework nặng nề, bề mặt tấn công được giảm thiểu. Điều này làm cho mã nguồn dễ dàng hơn để kiểm toán và bảo trì, một yếu tố quan trọng đối với các quản trị viên hệ thống (sysadmin) cần tin tưởng vào phần mềm họ triển khai. Việc xử lý rõ ràng các trường hợp biên (edge cases), chẳng hạn như lỗi mô hình hoặc kết quả trống, đảm bảo trải nghiệm người dùng đáng tin cậy ngay cả khi các thành phần chịu áp lực.
Hơn nữa, các tính năng tunneling tùy chọn giải quyết khoảng trống về quyền riêng tư metadata. Ngay cả khi nội dung truy vấn an toàn, địa chỉ IP thực hiện yêu cầu có thể tiết lộ danh tính tổ chức. Định tuyến lưu lượng truy cập qua Tor hoặc VPN với kill switch đảm bảo rằng các công cụ tìm kiếm upstream chỉ thấy lưu lượng ẩn danh. Mức độ chi tiết này cho thấy sự hiểu biết trưởng thành về các mối đe dọa quyền riêng tư vượt ra ngoài việc mã hóa nội dung đơn thuần.
Bạn có thể làm gì
- Triển khai stack bằng Docker Compose bằng cách chạy
npm run setupvàdocker compose up -dđể thử nghiệm quy trình tìm kiếm AI cục bộ. - Điều chỉnh cài đặt
OLLAMA_KEEP_ALIVEđể cân bằng giữa tốc độ phản hồi và mức sử dụng bộ nhớ dựa trên năng lực của máy chủ của bạn. - Kích hoạt các tùy chọn Tor hoặc VPN nếu việc che giấu IP của máy chủ khỏi các công cụ tìm kiếm là yêu cầu trong mô hình mối đe dọa (threat model) của bạn.
- Xem xét tệp
prompt.jsđể hiểu cách hệ thống ràng buộc LLM, và sửa đổi nó nếu bạn cần các phong cách trích dẫn hoặc hành vi khác. - Vô hiệu hóa các tính năng tùy chọn như
ALLOW_PAGE_FETCHvàSHOW_LOCATIONtrong cấu hình để đảm bảo không có yêu cầu outbound bất ngờ nào xảy ra. - Giám sát mức sử dụng tài nguyên khi chuyển sang các mô hình lớn hơn như
llama3.1:8b, vì chúng cung cấp câu trả lời tốt hơn nhưng đòi hỏi sức mạnh CPU và thời gian xử lý đáng kể hơn.



