Thiết lập LLM "bí mật" với Ollama: Chạy AI tách biệt hoàn toàn cho dữ liệu nhạy cảm

Thiết lập LLM "bí mật" với Ollama: Chạy AI tách biệt hoàn toàn cho dữ liệu nhạy cảm

Chào các bạn, bạn có bao giờ tò mò làm sao để tận dụng sức mạnh của các mô hình AI ngôn ngữ lớn (LLM) như ChatGPT nhưng lại không muốn dữ liệu nhạy cảm của mình "bay" ra ngoài internet không? Nghe có vẻ "điệp viên 007" nhỉ? Hôm nay, chúng ta sẽ cùng khám phá một thủ thuật cực hay: tự tay thiết lập một LLM chạy cục bộ, thậm chí là trong môi trường "air-gapped" (cách ly hoàn toàn với mạng bên ngoài) bằng Ollama và Podman (hoặc Docker). Điều này cực kỳ hữu ích nếu bạn đang làm việc với dữ liệu mật, cần đảm bảo an toàn tuyệt đối. Cá nhân tôi còn dùng nó để xây dựng một chatbot "siêu điệp viên" có thể lục lọi tài liệu mật, và một trợ lý code thông minh tích hợp thẳng vào VS Code để hỗ trợ các dự án bí mật nữa cơ! À mà mách nhỏ nhé: hầu hết các lệnh Podman mà tôi dùng ở đây (trừ import/export volume) đều xài ngon lành với Docker, bạn chỉ cần thay "podman" bằng "docker" là được! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/IsolatedLLMSetup.png' alt='Mô hình LLM được cách ly, bảo mật cho dữ liệu nhạy cảm'>Bước đầu tiên để đưa LLM vào môi trường "cách ly" là làm sao cho chúng có thể "nhảy" vào được các container đã bị cô lập mạng. Bí kíp ở đây là chúng ta sẽ "xuất khẩu" (export) cái kho chứa LLM từ một container bình thường (có mạng) rồi "nhập khẩu" (import) nó vào Podman. Nghe có vẻ giống buôn lậu mô hình AI nhỉ? 😉 (À, đáng lẽ tôi có thể chỉ định cùng một volume cho cả container thường và container cách ly, nhưng để "chắc cú" hơn nữa, tôi thậm chí còn xuất cái volume này từ một máy riêng biệt cơ. Việc chuyển file volume đã xuất sang máy "air-gapped" thì chắc các bạn tự xử lý được rồi nhỉ, dễ òm à!) Để chuẩn bị "hàng" LLM của mình, đầu tiên, chúng ta sẽ dựng một container Ollama "chính chủ" từ Docker Hub: `podman run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama docker.io/ollama/ollama`. Xong xuôi cái container, giờ thì bạn muốn LLM nào cứ việc "kéo" về thôi. Tôi thường lượn lờ qua Thư viện Ollama (https://ollama.com/library) để tìm "em" ưng ý. Với mỗi "em" muốn có, bạn gõ lệnh này: `podman exec -it ollama ollama pull <tên LLM bạn muốn>`. Sau khi đã "tải" về đủ LLM mà mình mơ ước (nhưng đừng tham quá nhé, vì xuất/nhập volume khá là tốn thời gian đấy, nó to lắm!), tôi đã sẵn sàng "đóng gói" cái volume này và chuyển nó sang máy "cách ly": `podman volume export ollama --output ollama.tar`. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/OllamaModelLibrary.png' alt='Mô hình AI được kéo từ thư viện Ollama'> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/DataVolumeExport.png' alt='Xuất dữ liệu Volume từ Container'>Giờ đây, trên chiếc máy "cách ly" của chúng ta, bạn có thể tạo một volume mới tinh để chào đón "kho báu" LLM bằng lệnh: `podman volume create ollama`. Và việc cuối cùng là "thổi hồn" (hay nói đúng hơn là "đổ dữ liệu") vào cái volume vừa tạo này. Chúng ta sẽ dùng lệnh "nhập khẩu" thần thánh: `podman volume import ollama ollama.tar`. (Nhân tiện, việc xuất/nhập volume này cũng làm được trong Docker đó nha, nhưng mà hình như bạn cần có giấy phép Docker Desktop đang hoạt động, và tôi chỉ tìm thấy cách làm qua giao diện UI của Docker Desktop chứ không thấy lệnh CLI nào cả. Hơi bất tiện một chút!) <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd86fjvkcidwa66lgxg0v.png' alt='Màn hình Docker Desktop hiển thị quá trình nhập Volume'>Làm sao để cái container của chúng ta "ngồi" một mình một cõi, không thèm "giao du" với thế giới bên ngoài? Có vài cách lắm đó. Cách "dễ tính" nhất là dùng tùy chọn `--internal` khi tạo mạng. Nó giúp container của bạn "tách biệt" hoàn toàn với mạng máy chủ, nhưng vẫn cho phép các container khác trong cùng mạng đó "nói chuyện" với nhau. Đại khái là "nhà có nóc, sân có tường bao": `podman network create ollama-internal-network --internal`. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/InternalNetworkConcept.png' alt='Mô hình mạng nội bộ cách ly trong Podman'> Tuy nhiên, đời không như mơ, đôi khi bạn lại muốn "gọi điện" cho container từ bên ngoài giao diện console của Podman. Như trường hợp của tôi chẳng hạn, tôi cần trợ lý code trong VS Code hay giao diện chatbot phải "giao tiếp" được với container. Vì thế, tôi sẽ tạo mạng mà không dùng `--internal`, nhưng sau đó sẽ "siết chặt" các quy tắc tường lửa (firewall) bằng `iptables` ở cấp độ nhân hệ điều hành. Nói nôm na là "xây tường rào kỹ hơn"! Đầu tiên, cứ tạo mạng đã: `podman network create ollama-internal-network`. Tiếp theo, chúng ta cần tìm "địa chỉ nhà" (dải địa chỉ mạng) của mạng vừa tạo: `networkAddressSpace=$(podman network inspect ollama-internal-network --format '{{range .Subnets}}{{.Subnet}}{{end}}')`. Và giờ là lúc "treo biển cấm" bằng `iptables`. Trong trường hợp của tôi, tôi chỉ muốn ngăn container "chạy ra ngoài" mà thôi, nên tôi sẽ cấm tiệt mọi gói tin đi ra (tức là cấm đường "thoát" của mạng): `iptables -A OUTPUT -s $networkAddressSpace -j DROP`. Đấy, giờ thì container của bạn đã được "nhốt" an toàn rồi, không có gói tin nào "lọt" ra ngoài được đâu! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/IptablesFirewallRule.png' alt='Quy tắc iptables chặn kết nối ra ngoài'>Vậy là đã có mạng "cách ly" và volume chứa LLM "ngon lành cành đào", giờ thì chúng ta sẽ "dựng nhà" cho chú Ollama thôi: `podman run -d -v ollama:/root/.ollama -p 11434:11434 --network ollama-internal-network --name ollama-internal ollama/ollama`. Với mạng đã được "kiểm soát" chặt chẽ, container giờ đây sẽ không thể "nhòm ngó" thế giới bên ngoài được nữa. Dữ liệu của bạn cứ gọi là "kín như bưng"! An tâm rồi nhé! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/SecuredOllamaContainer.png' alt='Mô hình container Ollama đã được bảo mật'>Giờ thì đến màn "kiểm tra chất lượng" xem mọi thứ có hoạt động trơn tru không nào! Để xem volume có được nhập thành công và "gắn" vào container đúng chỗ chưa, bạn hãy "gõ cửa" container và chạy thử một LLM đã được lưu trong cache nhé. Ví dụ, tôi sẽ thử với `mistral`: `podman exec -it ollama-internal ollama run mistral`. Nếu mọi thứ ổn thỏa, bạn sẽ thấy `mistral` "lên tiếng" và sẵn sàng phục vụ rồi đó! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/OllamaTestRunSuccess.png' alt='Kết quả kiểm tra Ollama LLM thành công'>Vậy là chúng ta đã hoàn thành việc thiết lập một container Ollama cực kỳ bảo mật rồi đó! Giờ đây, bạn có thể thoải mái "nhồi nhét" các câu lệnh (prompts) chứa thông tin nhạy cảm vào các LLM mà không lo lắng gì cả. Hoặc bạn cũng có thể dùng nền tảng này để tạo ra một Trợ lý code "bí mật" hay một Chatbot "thông thái" với khả năng truy cập các tài liệu tuyệt mật. Thật tuyệt vời phải không nào? Hãy bắt đầu xây dựng "vũ khí" AI của riêng bạn đi thôi!

Lê Lân profile pictureLê Lân
Blog - letranglan.top | undefined