Việc phụ thuộc hoàn toàn vào các API đám mây (như OpenAI hay Anthropic) mang lại nhiều rủi ro lớn cho các ứng dụng doanh nghiệp: rò rỉ dữ liệu nội bộ nhạy cảm, chi phí sử dụng tăng vọt theo số lượng token đầu vào, và rủi ro ngừng hoạt động khi mất kết nối mạng Internet.
Giải pháp toàn diện là Cục bộ hóa AI (Local LLM) — chạy trực tiếp các mô hình ngôn ngữ lớn nguồn mở ngay trên máy tính của bạn. Bài học này sẽ giúp bạn làm chủ Ollama — công cụ tối ưu hóa và đóng gói mô hình AI local hàng đầu hiện nay. Chúng ta sẽ cùng tìm hiểu cách thiết lập mô hình, cơ chế tự động tối ưu hóa phần cứng, và tự tay lập trình ứng dụng Chat Client stream chữ thời gian thực hoàn toàn offline.
13.1 Vì sao cần chạy LLM cục bộ (Local LLM)?
Sự bùng nổ của các mô hình nguồn mở chất lượng cao (như Llama 3 của Meta, Gemma của Google, Mistral của Pháp) đã thay đổi hoàn toàn cuộc chơi. Giờ đây, chỉ với một máy tính cá nhân tầm trung, bạn đã có thể sở hữu một trợ lý AI mạnh mẽ hoạt động độc lập.
Các ưu điểm vượt trội khi cục bộ hóa AI:
- Bảo mật dữ liệu tuyệt đối: Mọi thông tin trò chuyện, tài liệu doanh nghiệp hay mã nguồn bảo mật chỉ chạy trong RAM của máy tính cục bộ. Không một byte dữ liệu nào bị gửi lên các máy chủ bên ngoài.
- Hoàn toàn miễn phí: Không còn nỗi lo về hóa đơn thanh toán API cuối tháng. Bạn có thể cho mô hình suy luận hàng triệu token mỗi ngày hoàn toàn miễn phí.
- Không phụ thuộc mạng: Hoạt động ổn định ở những khu vực không có sóng Internet hoặc trên các hệ thống mạng nội bộ cô lập (Intranet).
13.2 Giới thiệu Ollama & Quản lý mô hình
Trong quá khứ, việc tự cấu hình để chạy một mô hình AI cục bộ là cực kỳ phức tạp: bạn phải cài đặt driver đồ họa CUDA, thư viện PyTorch, tải các file trọng số hàng chục GB và viết code C++ để biên dịch.
Ollama xuất hiện và thay đổi hoàn toàn điều đó. Nó đóng gói tất cả các thư viện suy luận tối ưu nhất (như llama.cpp) vào một ứng dụng chạy nền gọn nhẹ duy nhất.
Ollama tự động phát hiện phần cứng hệ thống để kích hoạt các công nghệ tăng tốc tối ưu:
- Trên macOS: Tự động tích hợp thư viện Metal Performance Shaders (MPS) để tận dụng tối đa sức mạnh của GPU Apple Silicon (chip M1/M2/M3/M4).
- Trên Windows/Linux: Tận dụng thư viện NVIDIA CUDA cho card đồ họa RTX chuyên dụng.
Quy tắc ước lượng bộ nhớ:
- Mô hình 8B lượng tử hóa 4-bit (khoảng 4.7 GB) cần tối thiểu 8GB RAM/VRAM trống.
- Mô hình 70B lượng tử hóa 4-bit (khoảng 40 GB) cần tối thiểu 48GB RAM/VRAM trống.
- FP32 (32-bit): $\approx 32.00$ GB.
- FP16 (16-bit): $\approx 16.00$ GB.
- INT8 (8-bit): $\approx 8.00$ GB.
- INT4 (4-bit): $\approx 4.00$ GB.
Các câu lệnh quản lý Ollama CLI kinh điển:
# Tải về và chạy trực tiếp mô hình Llama 3
ollama run llama3
# Chỉ tải mô hình về đĩa cứng mà chưa chạy
ollama pull gemma2
# Liệt kê danh sách các mô hình đã lưu cục bộ
ollama list
# Xóa bỏ một mô hình để giải phóng ổ cứng
ollama rm llama3
13.3 Tích hợp API Ollama vào ứng dụng Python & JS
Khi khởi động, Ollama tự động mở một REST API nội bộ chạy cục bộ tại cổng mạng mặc định:
http://localhost:11434.
Endpoint chính để gửi yêu cầu chat là /api/chat. Đặc biệt, Ollama hỗ trợ cơ chế truyền dữ
liệu Server-Sent Events (Streaming): trả về từng token ngay khi mô hình vừa tính toán
xong thay vì bắt người dùng đợi toàn bộ câu trả lời dài (sẽ mất vài giây).
Cấu trúc một yêu cầu API gửi lên Ollama dạng JSON:
{
"model": "llama3",
"messages": [
{ "role": "user", "content": "Tại sao bầu trời màu xanh?" }
],
"stream": true
}
{"message": {"content": "Bầu"}, "done": false}
{"message": {"content": " trời"}, "done": false}
{"message": {"content": " xanh"}, "done": false}
{"message": {"content": ""}, "done": true}
Vòng lặp for line in response trong code trên đọc từng dòng, trích xuất
content rồi ghi thẳng ra console — không hề gộp chuỗi trong bộ nhớ trước. Ghép tuần tự các
chunk: "Bầu" → "Bầu trời" → "Bầu trời xanh" — đúng bằng câu trả
lời đầy đủ, và dòng cuối cùng (done: true, nội dung rỗng) chỉ là tín hiệu báo kết thúc
stream chứ không mang thêm chữ nào.
13.4 Dự án thực hành bài 13: Ứng dụng AI Chat offline chạy 100% trên máy khách
Dự án thực hành của bài học này là tự viết một script ứng dụng Python local_chat.py để giao
tiếp trực tiếp với dịch vụ Ollama cục bộ.
Chương trình sẽ gọi API endpoint http://localhost:11434/api/chat với cấu hình
"stream": True. Chúng ta sẽ sử dụng thư viện chuẩn của Python để đọc luồng dữ liệu stream nhị
phân (binary stream) trả về từ Ollama, phân tích các dòng JSON thô, trích xuất ký tự chữ sinh ra và in
trực tiếp lập tức ra màn hình console bằng hàm ghi không đệm dòng sys.stdout.write.
import urllib.request
import json
import sys
def stream_local_chat(prompt, model_name="llama3"):
url = "http://localhost:11434/api/chat"
# Thiết lập payload gửi lên API Ollama local
payload = {
"model": model_name,
"messages": [
{"role": "user", "content": prompt}
],
"stream": True # Bật chế độ stream để nhận chữ chạy dần
}
# Chuyển đổi dữ liệu sang định dạng JSON và mã hóa nhị phân
data = json.dumps(payload).encode("utf-8")
# Tạo request gửi đi
req = urllib.request.Request(
url,
data=data,
headers={"Content-Type": "application/json"}
)
print(f"\n[AI - Model: {model_name} đang suy luận]: ", end="")
sys.stdout.flush()
try:
# Thực hiện gọi API
with urllib.request.urlopen(req) as response:
# Đọc dữ liệu trả về theo từng dòng stream (Server-Sent Events)
for line in response:
if line:
# Giải mã dòng dữ liệu JSON thô nhận được
decoded_line = line.decode("utf-8").strip()
json_data = json.loads(decoded_line)
# Trích xuất nội dung chữ được sinh ra
chunk = json_data.get("message", {}).get("content", "")
# Ghi trực tiếp ra console không tạo dòng mới
sys.stdout.write(chunk)
sys.stdout.flush()
print("\n")
except urllib.error.URLError as e:
print(f"\n[Lỗi kết nối] Không thể kết nối tới Ollama tại {url}.")
print("Vui lòng kiểm tra chắc chắn rằng ứng dụng Ollama đã được khởi động và chạy nền trên máy của bạn.")
except Exception as e:
print(f"\n[Lỗi hệ thống]: {str(e)}")
if __name__ == "__main__":
print("=== Trình kiểm tra kết nối API Ollama Cục Bộ ===")
# Câu hỏi thử nghiệm gửi tới mô hình offline
test_prompt = "Hãy giải thích ngắn gọn trong 1 câu tại sao bầu trời có màu xanh."
# Gọi hàm thực thi stream
stream_local_chat(prompt=test_prompt, model_name="llama3")
Tóm tắt bài học & Cầu nối kiến thức
- Đạt được: Chạy mô hình ngôn ngữ lớn offline 100% trên máy cá nhân bằng Ollama.
- Đạt được: Quản lý hiệu quả tài nguyên RAM/VRAM và giao tiếp API cục bộ với các ứng dụng bên ngoài.
Cầu nối bài tiếp theo: Chạy được mô hình offline, làm sao để nạp hàng ngàn trang tài liệu PDF nội bộ cho mô hình trả lời? Câu trả lời chính là kiến trúc RAG (Retrieval-Augmented Generation) cơ bản ở Bài số 14.
Tải file code thực hành minh họa bài học
File Python local_chat.py — mã nguồn gọi API Ollama cục bộ và stream phản hồi trực tiếp ra
console Terminal không đệm dòng (chạy python local_chat.py):
📖 Tài liệu tham khảo
- Ollama Official Website — Trang chủ chính thức để tải về và xem tài liệu API của Ollama
- llama.cpp GitHub — Thư viện C++ cốt lõi tối ưu hóa suy luận mô hình AI cục bộ trên CPU/GPU dân dụng (Georgi Gerganov)
- QLoRA: Efficient Finetuning of Quantized LLMs — Bài báo khoa học chứng minh tính hiệu quả của mô hình lượng tử hóa 4-bit (Dettmers et al., 2023)
Bình luận