Mở đầu: Câu chuyện thực tế từ dự án RAG của tôi

Năm 2024, tôi nhận được một dự án xây dựng hệ thống RAG (Retrieval-Augmented Generation) cho một doanh nghiệp thương mại điện tử quy mô vừa tại Việt Nam. Yêu cầu đặt ra là xử lý hàng ngàn tài liệu sản phẩm, hỗ trợ khách hàng 24/7 bằng tiếng Việt, và quan trọng nhất — phải đảm bảo dữ liệu không bao giờ rời khỏi hạ tầng của doanh nghiệp. Ban đầu, tôi thử nghiệm với các API cloud như GPT-4 và Claude. Kết quả rất ấn tượng về chất lượng, nhưng chi phí khiến khách hàng phải suy nghĩ lại. Với khoảng 50,000 yêu cầu mỗi ngày, chi phí API cloud lên tới hơn $2,000/tháng — gấp 5 lần ngân sách dự kiến. Đó là lúc tôi quyết định triển khai Ollama để chạy mô hình ngôn ngữ lớn (LLM) ngay trên server nội bộ. Kết quả sau 3 tháng triển khai: chi phí vận hành giảm 85%, độ trễ trung bình chỉ 120ms, và khách hàng hoàn toàn yên tâm vì dữ liệu được xử lý trong trung tâm dữ liệu của họ. Bài viết này sẽ chia sẻ toàn bộ quy trình từ cài đặt, cấu hình, đến tối ưu hóa và những bài học xương máu tôi đã rút ra trong quá trình triển khai.

Ollama là gì và tại sao nên dùng nó?

Ollama là một công cụ mã nguồn mở cho phép chạy các mô hình ngôn ngữ lớn (LLM) như Llama 2, Mistral, Code Llama trực tiếp trên máy tính cục bộ của bạn. Điểm mạnh của Ollama nằm ở sự đơn giản — bạn không cần phải hiểu sâu về Docker, Kubernetes hay fine-tuning model; chỉ cần vài câu lệnh là có thể khởi chạy một API server hoàn chỉnh. Với những ai cần sự linh hoạt giữa chạy local và cloud, đăng ký HolySheheep AI là giải pháp lai ghép tối ưu — có thể chuyển đổi giữa inference local và cloud một cách liền mạch, với chi phí chỉ từ $0.42/MTok cho DeepSeek V3.2.

Yêu cầu hệ thống tối thiểu

Trước khi bắt đầu, hãy đảm bảo hệ thống của bạn đáp ứng các yêu cầu cơ bản:

Phần 1: Cài đặt Ollama

Cài đặt trên macOS

Đối với người dùng macOS, quá trình cài đặt đơn giản nhất:
# Tải và cài đặt qua Homebrew
brew install ollama

Hoặc tải trực tiếp từ trang chủ

https://ollama.com/download

Khởi động dịch vụ Ollama

brew services start ollama

Cài đặt trên Linux

# Tải script cài đặt
curl -fsSL https://ollama.com/install.sh | sh

Khởi động daemon

sudo systemctl enable ollama sudo systemctl start ollama

Kiểm tra phiên bản

ollama --version

Cài đặt trên Windows (WSL2)

# Mở WSL2 terminal và chạy
wsl

Cài đặt trong WSL2

curl -fsSL https://ollama.com/install.sh | sh

Xác minh cài đặt

ollama list

Phần 2: Tải và quản lý mô hình

Danh sách mô hình được hỗ trợ

Ollama hỗ trợ hàng chục mô hình phổ biến. Dưới đây là các mô hình tôi hay sử dụng trong thực tế:
# Llama 2 - Phù hợp cho hầu hết use case, cân bằng giữa chất lượng và tốc độ
ollama pull llama2:7b

Mistral - Mạnh về lập trình và reasoning

ollama pull mistral:7b

Code Llama - Tối ưu cho viết code

ollama pull codellama:7b

Phi (Microsoft) - Nhẹ, nhanh, tiết kiệm tài nguyên

ollama pull phi:2.7b

Llama 3 - Phiên bản mới nhất với hiệu suất cải thiện

ollama pull llama3:8b

Vicuna - Tốt cho chatbot

ollama pull vicuna:13b

Kiểm tra mô hình đã tải

# Liệt kê tất cả mô hình đã tải
ollama list

Xem thông tin chi tiết một mô hình

ollama show llama2:7b

Xóa mô hình không cần thiết

ollama rm llama2:13b

Phần 3: Khởi chạy API Server

Đây là phần quan trọng nhất — biến Ollama thành một API server để tích hợp vào ứng dụng của bạn.

Chạy với cổng mặc định

# Khởi chạy server trên cổng 11434 (mặc định)
ollama serve

Kiểm tra server đang chạy

curl http://localhost:11434/api/tags

Thay đổi cổng và cấu hình nâng cao

# Chạy trên cổng tùy chỉnh
OLLAMA_HOST=0.0.0.0:11435 ollama serve

Cấu hình số GPU sử dụng

OLLAMA_NUM_GPU=2 ollama serve

Giới hạn bộ nhớ sử dụng (GB)

OLLAMA_MAX_VRAM=16 ollama serve

Cho phép CORS (cần thiết cho ứng dụng web)

OLLAMA_ORIGINS="*" ollama serve

Phần 4: Tích hợp API với ứng dụng

Sử dụng Python với thư viện OpenAI-compatible

Ollama cung cấp API tương thích với OpenAI, giúp việc chuyển đổi giữa local và cloud trở nên dễ dàng:
from openai import OpenAI

Kết nối tới Ollama local

client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" # Ollama không cần API key thực sự ) response = client.chat.completions.create( model="llama2:7b", messages=[ {"role": "system", "content": "Bạn là trợ lý hỗ trợ khách hàng thương mại điện tử tiếng Việt."}, {"role": "user", "content": "Chính sách đổi trả của cửa hàng như thế nào?"} ], temperature=0.7, max_tokens=500 ) print(response.choices[0].message.content)

Chuyển đổi linh hoạt giữa Local và Cloud

Trong thực tế, tôi thường kết hợp cả hai: dùng Ollama cho các tác vụ nội bộ, và HolySheheep AI cho các tác vụ phức tạp hơn cần mô hình mạnh hơn:
import os

class LLMClient:
    def __init__(self):
        # Ưu tiên local cho tác vụ thông thường
        self.local_client = OpenAI(
            base_url="http://localhost:11434/v1",
            api_key="ollama"
        )
        
        # Cloud cho tác vụ phức tạp
        self.cloud_client = OpenAI(
            base_url="https://api.holysheep.ai/v1",
            api_key=os.getenv("HOLYSHEEP_API_KEY")  # Key từ HolySheheep AI
        )
    
    def chat(self, message, use_cloud=False):
        client = self.cloud_client if use_cloud else self.local_client
        model = "gpt-4.1" if use_cloud else "llama2:7b"
        
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": message}]
        )
        return response.choices[0].message.content

Sử dụng

llm = LLMClient()

Tác vụ đơn giản - dùng local (miễn phí)

result = llm.chat("Địa chỉ cửa hàng ở đâu?")

Tác vụ phức tạp - dùng cloud ($0.42/MTok cho DeepSeek V3.2)

complex_result = llm.chat("Phân tích xu hướng mua sắm Tết 2024", use_cloud=True)

Tích hợp với LangChain

Với các dự án RAG phức tạp, LangChain là lựa chọn phổ biến:
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.embeddings import OllamaEmbeddings

Khởi tạo LLM

llm = Ollama(model="mistral:7b", base_url="http://localhost:11434")

Khởi tạo embeddings cho RAG

embeddings = OllamaEmbeddings( model="nomic-embed-text", base_url="http://localhost:11434" )

Tạo vector store

vectorstore = Chroma( persist_directory="./chroma_db", embedding_function=embeddings )

Tạo chain

qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever() )

Truy vấn

result = qa_chain.invoke("Sản phẩm nào đang giảm giá?") print(result["result"])

Phần 5: Tối ưu hóa hiệu suất

Cấu hình GPU cho NVIDIA

# Kiểm tra GPU đang sử dụng
nvidia-smi

Ép buộc sử dụng GPU NVIDIA

CUDA_VISIBLE_DEVICES=0 ollama serve

Hoặc với nhiều GPU

CUDA_VISIBLE_DEVICES=0,1 ollama serve

Tối ưu batch processing

import concurrent.futures

def process_request(prompt):
    response = client.chat.completions.create(
        model="llama2:7b",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

Xử lý song song nhiều request

prompts = [f"Xử lý yêu cầu {i}" for i in range(10)] with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: results = list(executor.map(process_request, prompts))

Theo dõi tài nguyên sử dụng

# Script giám sát tài nguyên
import psutil
import time

def monitor_resources():
    while True:
        cpu_percent = psutil.cpu_percent(interval=1)
        memory = psutil.virtual_memory()
        gpu_memory = psutil.Process().memory_info().rss / 1024 / 1024 / 1024
        
        print(f"CPU: {cpu_percent}% | RAM: {memory.percent}% | "
              f"Used: {memory.used / 1024**3:.2f}GB")
        time.sleep(5)

if __name__ == "__main__":
    monitor_resources()

So sánh chi phí: Local vs Cloud

Dựa trên kinh nghiệm triển khai thực tế, đây là bảng so sánh chi phí cho một hệ thống xử lý 1 triệu token/tháng:
Phương ánChi phí/thángƯu điểmNhược điểm
Ollama Local (Llama 2 7B)$0 (sau đầu tư hardware)Không giới hạn request, privacy tuyệt đốiHardware đầu tư ban đầu, chất lượng thấp hơn
GPT-4.1 (HolySheheep AI)$8/MTok inputChất lượng cao nhấtChi phí cao cho volume lớn
Claude Sonnet 4.5 (HolySheheep AI)$15/MTokExcellent cho reasoningĐắt hơn GPT-4.1
DeepSeek V3.2 (HolySheheep AI)$0.42/MTokRẻ nhất, chất lượng tốtÍt nổi tiếng hơn
Gemini 2.5 Flash (HolySheheep AI)$2.50/MTokCân bằng giá/hiệu suấtContext window giới hạn
Chiến lược tối ưu của tôi: Dùng Ollama cho 80% tác vụ thông thường, HolySheheep AI với DeepSeek V3.2 ($0.42/MTok) cho 20% tác vụ phức tạp cần chất lượng cao. Cách này giúp tiết kiệm 85% chi phí so với dùng hoàn toàn GPT-4.

Lỗi thường gặp và cách khắc phục

Lỗi 1: CUDA not found / GPU không được nhận diện

Mô tả: Ollama không sử dụng được GPU, mọi thứ chạy trên CPU rất chậm. Nguyên nhân: Driver NVIDIA chưa được cài đặt hoặc CUDA Toolkit chưa tương thích. Khắc phục:
# Bước 1: Kiểm tra NVIDIA Driver
nvidia-smi

Nếu command not found, driver chưa cài

Bước 2: Cài đặt CUDA Toolkit

Tải từ https://developer.nvidia.com/cuda-downloads

Chọn đúng phiên bản cho hệ điều hành của bạn

Bước 3: Kiểm tra biến môi trường

echo $CUDA_HOME

Nếu trống, thêm vào ~/.bashrc hoặc ~/.zshrc

export CUDA_HOME=/usr/local/cuda export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

Bước 4: Khởi động lại Ollama

sudo systemctl restart ollama

Bước 5: Kiểm tra lại

ollama run llama2:7b

Gõ /show info để xem GPU usage

Lỗi 2: Out of Memory (OOM) khi load model

Mô tả: Server bị crash hoặc báo lỗi memory khi khởi chạy mô hình lớn. Nguyên nhân: Không đủ RAM/VRAM cho mô hình, hoặc có process khác chiếm dụng bộ nhớ. Khắc phục:
# Kiểm tra bộ nhớ hiện tại
free -h
nvidia-smi --query-gpu=memory.free,memory.total --format=csv

Giải pháp 1: Dùng mô hình nhẹ hơn

ollama pull llama2:7b # Thay vì 13b hoặc 70b

Giải pháp 2: Giới hạn VRAM sử dụng

OLLAMA_MAX_VRAM=12G ollama serve

Giải pháp 3: Tắt các process không cần thiết

sudo systemctl stop nginx # Nếu không dùng pkill -f chrome # Đóng