Local AI không tự sạch dấu vết

Local AI không tự sạch dấu vết

Chạy AI y tế trên máy riêng nghe an toàn, nhưng privacy chỉ là bước đầu. Đây là playbook ra quyết định trước khi bạn đem model local vào môi trường nhạy cảm.

"Chạy local là xong privacy rồi mà?"

Nếu mình được một ly cà phê cho mỗi lần nghe câu này trong team AI, chắc giờ đã mở quán cạnh văn phòng. Niềm tin phổ biến là: dữ liệu nhạy cảm không ra cloud, vậy hệ thống đã an toàn. Nghe hợp lý. Đặc biệt khi bạn dựng được một healthcare AI assistant bằng MedGemma, Ollama và Open WebUI ngay trên máy cá nhân: chat với model y tế, upload ảnh X-ray, không gửi dữ liệu lên dịch vụ ngoài.

Nhưng đây là chỗ cần bật đèn pin điều tra: local deployment không phải kết luận vô tội, nó chỉ là hiện trường mới. Bạn vẫn phải kiểm tra model, máy chạy, log, quyền truy cập, phiên bản dữ liệu, và cả cách người dùng hiểu output.

Sau bài này, mình muốn bạn đổi một cách nghĩ: đừng hỏi “local hay cloud an toàn hơn?”, hãy hỏi mình kiểm soát được dấu vết nào, và còn mù ở đâu?

Sơ đồ minh họa cho bài Local AI không tự sạch dấu vết

Sơ đồ tóm tắt ý chính của bài viết.

Mục tiêu thật: kiểm soát rủi ro, không phải khoe chạy được model

MedGemma là model y tế mở của Google, có thể xử lý văn bản và hình ảnh y khoa. Ollama giúp kéo và chạy model local. Open WebUI cho bạn giao diện kiểu chat để tương tác với model.

Stack này rất đáng thử, nhất là khi dữ liệu healthcare thuộc nhóm nhạy cảm: bệnh án, ảnh chụp, mô tả triệu chứng, thông tin định danh. Với nhiều team, gửi những thứ đó lên cloud AI service là không thể vì privacy hoặc compliance.

Nhưng tutorial gốc có một câu rất quan trọng: MedGemma là developer model, không phải medical device. Nghĩa là nó phù hợp cho học, prototype, research; không dùng trực tiếp để chẩn đoán, điều trị, hay quyết định quản lý bệnh nhân.

Nói thẳng ra thì: nếu bạn để bác sĩ, điều dưỡng, nhân viên vận hành, hoặc người dùng cuối hiểu nhầm output của model là kết luận y khoa, bạn đang biến một prototype thành rủi ro sản phẩm.

Playbook này dành cho builder: dựng được là bước một; quyết định triển khai thế nào mới là phần khó.

Checklist trước khi cài: 5 dấu vân tay phải soi

Trước khi gõ lệnh, mình sẽ rà 5 câu hỏi này:

  1. Dữ liệu có rời khỏi máy không?

Không chỉ model inference. Kiểm tra cả telemetry, crash report, plugin, browser extension, reverse proxy, file upload tạm.

  1. Model có được phép làm việc bạn định giao không?

MedGemma có năng lực y tế, nhưng không đồng nghĩa được dùng như thiết bị y tế. Với lĩnh vực nhạy cảm, phạm vi sử dụng phải viết rõ.

  1. Máy chạy có đủ tài nguyên không?

27B mà thiếu RAM/VRAM thì hệ thống chậm, treo, hoặc fail giữa chừng. Bài về Cosmos cũng nhắc một bài học tương tự: trước khi mơ chạy checkpoint lớn, hãy kiểm tra runtime, GPU, CUDA, memory, disk.

  1. Ai được xem lịch sử chat và ảnh upload?

Local không có nghĩa là riêng tư nếu cả team dùng chung máy, hoặc Open WebUI lưu history không được phân quyền đúng.

  1. Có audit trail không?

Audit trail là dấu vết kiểm tra lại: ai hỏi gì, model trả lời gì, dùng phiên bản nào. Không có cái này, khi sự cố xảy ra bạn chỉ còn đoán.

Hình dung thế này: một phòng khám nội bộ thử AI để hỗ trợ đọc mô tả X-ray. Dữ liệu không lên cloud, nghe rất ổn. Nhưng ảnh upload vẫn nằm trong thư mục tạm, máy dùng chung tài khoản admin, prompt không ghi lại, model version thay đổi sau một lần pull. Khi có câu trả lời sai, không ai biết model nào đã nói gì. Hiện trường sạch quá mức cũng là một manh mối đáng ngờ.

Dựng bản thử trong một buổi, nhưng dựng như người có trách nhiệm

Mục tiêu của bản thử: chạy local, chat được, upload ảnh được nếu model hỗ trợ, và có ranh giới sử dụng rõ ràng.

1. Tạo hồ sơ môi trường

Trước khi cài, lưu lại thông tin máy. Việc này hơi khô, nhưng cứu bạn khi debug.

python --version
system_profiler SPHardwareDataType 2>/dev/null || lscpu
free -h 2>/dev/null || vm_stat
df -h

Nếu có GPU NVIDIA:

nvidia-smi

Ghi vào RUNBOOK.md:

## Local AI healthcare prototype
- Machine:
- OS:
- RAM:
- GPU/VRAM:
- Ollama version:
- Model:
- Intended use: research/prototype only
- Not allowed: diagnosis, treatment decision, patient management

Đây là việc nhiều team bỏ qua. Đến lúc performance tệ, mọi người tranh luận cảm tính.

2. Cài Ollama và kéo model

Ollama là runtime chạy model local — hiểu ngắn là lớp giúp bạn tải model và gọi nó qua máy mình.

ollama --version
ollama pull medgemma
ollama list

Nếu ollama pull medgemma báo không tìm thấy model, đừng vội sửa lung tung. Kiểm tra tên model hiện có trong registry của Ollama và tài liệu đi kèm. Một lỗi nhỏ ở tên model có thể khiến cả buổi biến thành cuộc truy tìm không cần thiết.

Chạy thử:

ollama run medgemma

Prompt thử nên có disclaimer:

You are a research assistant. Do not provide diagnosis or treatment. Explain uncertainty and recommend consulting qualified clinicians.

3. Cài Open WebUI bằng Docker

Docker là cách đóng gói app và dependencies để chạy ổn định hơn giữa các máy. Với prototype nội bộ, mình ưu tiên Docker vì dễ gỡ, dễ lặp lại.

docker run -d \
  -p 3000:8080 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

Mở:

http://localhost:3000

Nếu Open WebUI không thấy model, kiểm tra Ollama đang chạy và URL kết nối giữa WebUI với Ollama. Nếu port 3000 bị chiếm, đổi port ngoài:

docker run -d -p 3001:8080 ...

4. Khóa phạm vi trước khi mời người khác test

Đừng đợi có người dùng rồi mới viết nội quy. Tạo một system prompt mặc định:

This assistant is for research and prototyping only.
It must not make clinical diagnosis, treatment, or patient-management decisions.
When analyzing medical text or images, it should describe observations, uncertainty, and limitations.
It should recommend review by qualified healthcare professionals.

Thêm file USAGE_POLICY.md:

Allowed:
- Prototype workflow
- Compare prompts
- Research model behavior
- Summarize non-identifiable sample cases

Not allowed:
- Real diagnosis
- Treatment recommendation
- Autonomous triage
- Uploading identifiable patient data without approval

Điểm này giống bài toán Jamf AI Governance với Bedrock ở môi trường Mac: vấn đề không chỉ là app chạy ở đâu, mà là cấu hình nào được đẩy xuống thiết bị, ai kiểm soát provider, MCP server, observability và policy. Local mà mỗi máy một kiểu thì governance vỡ ngay từ đầu.

Ba lựa chọn triển khai: đừng chọn theo tiếng ồn

| Hướng | Khi nên chọn | Rủi ro chính |
|---|---|---|
| Local laptop | Prototype, demo kín, dữ liệu mẫu | Khó quản lý quyền, log, cấu hình lệch giữa máy |
| Local server nội bộ | Team cần dùng chung, dữ liệu không ra ngoài | Cần vận hành uptime, storage, access control |
| Cloud trong boundary kiểm soát | Có sẵn AWS/Azure/GCP governance, cần scale | Phải xử lý privacy, region, policy, cost |

Cloud không tự xấu. Local không tự tốt. Với email routing trên Amazon Bedrock, bài toán là phân loại và ưu tiên thư theo phòng ban, mức khẩn cấp; thứ đáng học không phải “dùng Bedrock”, mà là hệ thống có workflow, routing, và severity assessment rõ. Với healthcare local AI cũng vậy: model chỉ là một thành phần trong quy trình.

Một ví dụ khác: semantic code search với Qdrant gặp “wrong-version problem” — vector index trả về code từ branch sai vì index tách khỏi checkout hiện tại. Bài học đem sang AI y tế: nếu model, prompt, guideline, hoặc dữ liệu mẫu không được versioning, câu trả lời nhìn có vẻ đúng nhưng thuộc “phiên bản thực tế” khác. Sai kiểu này rất khó bắt bằng mắt thường.

Những bẫy mình sẽ chặn trước

Bẫy 1: Tool calling không hỗ trợ nhưng vẫn bật.
Tool calling là khả năng model gọi công cụ/API thay vì chỉ trả lời chữ. Nếu model hoặc runtime không hỗ trợ, Open WebUI có thể báo lỗi kiểu model không support tools. Với prototype y tế, tắt tool trước; đừng thêm quyền hành khi bạn chưa kiểm soát được câu trả lời cơ bản.

Bẫy 2: Ảnh upload nhưng model lờ đi.
Không phải model nào trong stack cũng xử lý ảnh đúng cách qua mọi giao diện. Test bằng ảnh mẫu không nhạy cảm, hỏi model mô tả khả năng quan sát, rồi đối chiếu xem nó thật sự dùng ảnh hay chỉ đoán từ prompt.

Bẫy 3: Chạy model lớn để rồi không ai dùng nổi.
Model lớn có thể trả lời tốt hơn trong vài tình huống, nhưng nếu latency quá cao, người dùng sẽ copy dữ liệu sang công cụ khác. Lúc đó bạn thua ngay ở privacy.

Bẫy 4: Không có chế độ xóa dữ liệu.
Open WebUI có volume lưu dữ liệu. Bạn cần biết chat history, file upload, cache nằm ở đâu và xóa thế nào. Prototype cũng cần hygiene.

Nếu là mình, mình sẽ triển khai theo lộ trình này

Tuần đầu, mình chỉ chạy trên máy cô lập với dữ liệu giả hoặc đã khử định danh. Mục tiêu là kiểm tra model behavior, latency, upload ảnh, và prompt boundary.

Tuần hai, mình chuyển sang máy nội bộ có tài khoản riêng, bật log tối thiểu, ghi model version, prompt version, cấu hình Open WebUI. Không mở cho cả công ty.

Tuần ba, mình làm review với người có chuyên môn domain: không hỏi “model có hay không?”, mà hỏi “trường hợp nào output dễ gây hiểu nhầm?”. Đây mới là câu hỏi triển khai.

Quyết định sau cùng không phải local hay cloud. Quyết định là: rủi ro nào bạn đang giảm, rủi ro nào bạn đang chuyển chỗ, và rủi ro nào bạn chưa nhìn thấy.

Chạy AI nhạy cảm giống điều tra một vụ án nhỏ: đừng mừng vì không thấy dấu chân ngoài cửa; đôi khi dấu vân tay nằm ngay trên bàn phím.

---
Bụi Wire — nghiện đọc release notes lúc 2 giờ sáng

Nguồn tham khảo