Máy tính xách tay của bạn có thể chạy một mô hình 70B tham số phía sau cùng một endpoint có hình dạng OpenAI mà bạn triển khai trong sản xuất. Chỉ cần đổi một URL cơ sở và mã của bạn vẫn hoạt động. Thay đổi duy nhất đó mở khóa khả năng phát triển ngoại tuyến, chi phí mỗi token bằng 0 và một đường dẫn riêng tư cho dữ liệu được quy định, đó là lý do tại sao Hacker News đã thúc đẩy bài viết “AI cục bộ cần trở thành chuẩn mực” từ 633 lên 1.760 điểm chỉ trong một ngày. Bài viết dưới đây sẽ chỉ cho bạn cách chọn một runtime, hiển thị endpoint, trỏ client của bạn tới đó và kiểm tra toàn bộ luồng với Apidog trước khi triển khai bất kỳ thay đổi nào lên một mô hình được lưu trữ.
TL;DR
Bạn có thể chạy một API LLM cục bộ trên máy tính xách tay của mình với Ollama, vLLM hoặc llama.cpp, và mỗi công cụ này đều hiển thị một endpoint REST tương thích với OpenAI. Thay đổi base_url thành http://localhost:11434/v1 trong client OpenAI hiện có của bạn và cùng một mã sẽ chạy với Llama 3.3, DeepSeek V4 hoặc Qwen 3.6 mà không cần viết lại. Thực hiện toàn bộ quy trình từ Apidog để các bài kiểm tra kịch bản của bạn giữ nguyên tính nhất quán giữa các môi trường cục bộ và được lưu trữ.
Giới thiệu
Ngăn xếp API LLM cục bộ đã chuyển từ một công cụ nghiên cứu thành một công cụ sử dụng hàng ngày chỉ trong mười tám tháng. Apple đã trang bị 128 GB bộ nhớ hợp nhất trên M3 Max. Ollama đạt một triệu lượt tải xuống hàng tuần. vLLM đã vượt mốc 30.000 sao trên GitHub. Tuy nhiên, sự thay đổi lớn nhất là về mặt xã hội. Mọi runtime chính hiện nay đều hỗ trợ định dạng /v1/chat/completions của OpenAI. Bạn không còn phải duy trì hai đường dẫn client nữa. Cùng một lệnh gọi SDK có thể truy cập localhost hoặc api.openai.com dựa trên một biến môi trường duy nhất.
Điều đó quan trọng đối với các nhà phát triển API vì các công cụ hiện có của bạn vẫn hoạt động. Các mẫu yêu cầu của bạn trong Apidog trỏ đến https://api.openai.com/v1/chat/completions. Thay đổi biến URL cơ sở, nhấn Gửi và bạn sẽ nhận được cùng một JSON từ một mô hình đang chạy trên GPU của riêng bạn. Không có schema mới. Không có luồng xác thực mới. Nếu bạn đã theo dõi chi phí API theo tính năng, bạn có thể thử nghiệm A/B một mô hình cục bộ so với một mô hình được lưu trữ và theo dõi chi phí giảm trong khi độ trễ tăng nhẹ.
Hướng dẫn này sẽ trình bày về lựa chọn runtime, thiết lập máy chủ, kết nối client, kiểm tra kịch bản, các đánh đổi lượng tử hóa và bảng so sánh chi phí-độ trễ cho bốn mô hình hiện tại. Các mẫu mã được kiểm tra với Ollama 0.6 và vLLM 0.7 trên macOS 15.4 và Ubuntu 24.04. Để biết thêm về các tùy chọn rộng hơn, hãy xem Các LLM cục bộ tốt nhất năm 2026. Các tài liệu tham khảo bên ngoài cho mỗi tuyên bố nằm ở cuối bài.
Tại sao LLM cục bộ lại hợp lý đối với nhà phát triển API
Bạn triển khai mã gọi một LLM. Bạn cũng gỡ lỗi mã đó trên máy bay, tại các hội nghị với Wi-Fi kém, và trong mạng lưới khách hàng chặn truy cập ra ngoài đến *.openai.com. Một API LLM cục bộ cung cấp cho bạn một môi trường phát triển giống với môi trường sản xuất mà không phụ thuộc vào mạng.
Câu chuyện về quyền riêng tư là điều được nhấn mạnh nhất. HIPAA, GDPR và Đạo luật AI của EU đều coi các lời nhắc (prompt) là dữ liệu người dùng ngay khi chúng bao gồm hồ sơ bệnh nhân, hợp đồng hoặc các định danh sinh trắc học. Việc gửi payload đó đến một endpoint được lưu trữ tạo ra mối quan hệ xử lý dữ liệu mà bạn phải tài liệu hóa, kiểm toán và gia hạn. Một mô hình không bao giờ rời khỏi phần cứng của bạn sẽ bỏ qua hoàn toàn các thủ tục giấy tờ đó. Hướng dẫn năm 2024 của Ban Bảo vệ Dữ liệu Châu Âu về xử lý AI lưu ý rằng suy luận trên thiết bị loại bỏ hầu hết các nghĩa vụ chuyển giao xuyên biên giới theo Điều 44.
Chi phí tăng theo hướng ngược lại. Một nhóm chạy 50 triệu token lời nhắc mỗi ngày thông qua GPT-5.5 Instant phải trả khoảng 250 đô la mỗi ngày với 5 đô la cho mỗi triệu token. Cùng khối lượng đó trên một máy M3 Max studio 4.500 đô la sẽ khấu hao về 0 sau mười tám ngày sử dụng toàn bộ, bỏ qua chi phí điện. Bạn có thể đọc phân tích chi tiết về các con số đó trong Cách sử dụng GPT-5.5 Instant và áp dụng phép tính tương tự cho khối lượng công việc của riêng bạn.
Lý do thứ ba là tính xác định. Các mô hình được lưu trữ thay đổi trọng số mà bạn không biết. Trang ngừng hoạt động mô hình của OpenAI liệt kê mười một lần ngừng hoạt động snapshot trong mười hai tháng qua. Một mô hình cục bộ là một tệp trên đĩa. Nó tạo ra cùng một logits hôm nay và trong ba năm tới. Sự ổn định đó rất quan trọng khi bộ kiểm thử hồi quy của bạn phụ thuộc vào đầu ra của LLM. Endpoint tương thích với OpenAI đã thay đổi cuộc chơi vì bạn không còn phải trả phí tích hợp cho sự ổn định đó nữa. SDK bạn đã sử dụng vẫn hoạt động.
Ba runtime cung cấp endpoint tương thích OpenAI
Bốn runtime chiếm ưu thế trong không gian API LLM cục bộ vào năm 2026. Ba trong số đó cung cấp một máy chủ REST tương thích OpenAI ngay từ đầu. Runtime thứ tư, llama.cpp, cung cấp một máy chủ như một phần của tệp nhị phân llama-server của nó. Hãy chọn theo khối lượng công việc, không phải theo độ phổ biến.
Ollama
Ollama là cách dễ dàng nhất để bắt đầu. Một tệp nhị phân, một CLI, một máy chủ HTTP trên cổng 11434. Nó nhắm đến các nhà phát triển chạy một mô hình duy nhất trên một máy và xử lý việc tải xuống mô hình, lượng tử hóa GGUF và tạo khuôn mẫu lời nhắc cho bạn.

## install on macOS
brew install ollama
ollama serve &
ollama pull llama3.3:70b-instruct-q4_K_M
ollama run llama3.3:70b-instruct-q4_K_M
Khi ollama serve đã hoạt động, endpoint tương thích OpenAI nằm ở http://localhost:11434/v1. Nó hỗ trợ trò chuyện, nhúng (embeddings) và streaming. Mức thông lượng tối đa trên M3 Max với mô hình 70B Q4_K_M là khoảng 12 token mỗi giây. Các mô hình nhỏ hơn đạt 80 đến 120 token mỗi giây. Ollama là lựa chọn phù hợp cho phát triển một người dùng, trình diễn và các CI runner.
vLLM
vLLM là một tùy chọn cấp độ sản xuất. Nó sử dụng PagedAttention và phân lô liên tục để đẩy thông lượng cao hơn hai đến bốn lần so với các runner thông thường. Theo mặc định, nó hoạt động trên cổng 8000 và hiển thị API tương thích OpenAI tại /v1. Bạn có thể đọc chi tiết kiến trúc trong bài báo vLLM tại tài liệu tham khảo Kwon et al. SOSP 2023 bên dưới.

pip install vllm
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--port 8000 \
--gpu-memory-utilization 0.9 \
--max-model-len 8192
Trên một H100 duy nhất, vLLM phục vụ Llama 3.3 70B với tốc độ khoảng 2.400 token mỗi giây trên các yêu cầu đồng thời. Nó cần một GPU CUDA hoặc card AMD ROCm đời mới và không chạy trên Apple Silicon, điều này khiến nó không phải là lựa chọn phù hợp cho máy tính xách tay mà là lựa chọn phù hợp cho các cụm phát triển dùng chung.
llama.cpp
llama.cpp là runtime C++ đã khởi đầu hệ sinh thái GGUF. Nó chạy trên mọi thiết bị từ Raspberry Pi 5 đến các dàn máy dual-RTX-5090. Tệp nhị phân llama-server của nó hỗ trợ định dạng OpenAI trên /v1/chat/completions.

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j LLAMA_METAL=1
./llama-server -m models/llama-3.3-70b-q4_k_m.gguf \
--port 8080 --host 0.0.0.0 -c 8192 -ngl 99
Cờ -ngl 99 chuyển tất cả các lớp sang GPU. llama.cpp mang lại cho bạn quyền kiểm soát tối đa đối với lượng tử hóa, phân lô và ánh xạ bộ nhớ. Đây là lựa chọn phù hợp khi bạn cần đưa một mô hình vào VRAM 16 GB hoặc kiểm tra phần cứng độc lạ.
LM Studio và Jan tích hợp llama.cpp vào một giao diện người dùng đồ họa (GUI) và cũng hiển thị một endpoint OpenAI trên một cổng có thể cấu hình. Chúng hữu ích cho những người dùng không chuyên về kỹ thuật trong nhóm của bạn, những người cần kiểm tra các lời nhắc mà không cần sử dụng terminal.
Một kiểm tra Python đơn giản để xác minh endpoint hoạt động:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
model="llama3.3:70b-instruct-q4_K_M",
messages=[{"role": "user", "content": "Reply with the word OK only."}],
)
print(resp.choices[0].message.content)
Nếu bạn thấy OK, runtime, cổng và hợp đồng SDK đều khớp. Bạn đã sẵn sàng kết nối endpoint vào bộ công cụ của mình.
Kiểm tra LLM cục bộ của bạn với Apidog
Một API LLM cục bộ chỉ hữu ích nếu bộ kiểm thử của bạn có thể truy cập nó theo cùng một cách mà nó truy cập môi trường sản xuất. Apidog xử lý điều này bằng các biến môi trường trên mẫu yêu cầu, nghĩa là một dự án có thể bao gồm cả hai mục tiêu.

Quy trình này có năm bước.
- Mở dự án Apidog của bạn và tạo một môi trường mới có tên là
Local. Thêm một biếnBASE_URLvới giá trịhttp://localhost:11434/v1. ThêmAPI_KEYvới giá trịollama. Lưu lại. - Sao chép môi trường OpenAI hiện có của bạn, đổi tên thành
Production, giữBASE_URLlàhttps://api.openai.com/v1vàAPI_KEYlà khóa được lưu trữ của bạn. - Trong bất kỳ yêu cầu nào gọi một endpoint trò chuyện, hãy thay thế host đã được mã hóa cứng bằng
{{BASE_URL}}và tiêu đề xác thực bằngBearer {{API_KEY}}. URL yêu cầu sẽ trở thành{{BASE_URL}}/chat/completions. - Xây dựng một bài kiểm tra kịch bản để gửi yêu cầu, khẳng định
choices[0].message.role == "assistant", khẳng địnhchoices[0].message.contentkhông trống, và khẳng địnhusage.total_tokens > 0. Lưu kịch bản. - Chạy kịch bản với môi trường
Local. Chuyển đổi dropdown môi trường sangProduction. Chạy lại. Các khẳng định sẽ phải thành công cho cả hai.
Kịch bản tương tự cũng đóng vai trò là một smoke test cho các bản nâng cấp runtime. Sau khi thực hiện ollama pull trên một tag mới, hãy chạy lại kịch bản Local. Nếu hình dạng phản hồi bị lệch, bạn sẽ phát hiện ra trước khi bất kỳ mã ứng dụng nào chạm vào trọng số mới. Mẫu này cũng áp dụng cho kiểm thử các tác nhân AI gọi API nhiều bước.
Đối với việc sử dụng lập trình, OpenAI Python SDK chuyển đổi mục tiêu bằng một đối số từ khóa duy nhất:
import os
from openai import OpenAI
def get_client():
if os.getenv("ENV") == "local":
return OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
)
return OpenAI(api_key=os.environ["OPENAI_API_KEY"])
client = get_client()
response = client.chat.completions.create(
model=os.getenv("MODEL", "llama3.3:70b-instruct-q4_K_M"),
messages=[
{"role": "system", "content": "You are a JSON-only assistant."},
{"role": "user", "content": "Return {\"status\": \"ok\"}."},
],
response_format={"type": "json_object"},
)
print(response.choices[0].message.content)
Cú pháp JavaScript tương tự như sau:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: process.env.ENV === "local"
? "http://localhost:11434/v1"
: "https://api.openai.com/v1",
apiKey: process.env.ENV === "local" ? "ollama" : process.env.OPENAI_API_KEY,
});
const resp = await client.chat.completions.create({
model: process.env.MODEL || "llama3.3:70b-instruct-q4_K_M",
messages: [{ role: "user", content: "Say hi." }],
});
console.log(resp.choices[0].message.content);
Kết nối trình chạy kịch bản của Apidog vào CI của bạn bằng cách xuất dự án dưới dạng một bộ sưu tập apidog-cli và gọi apidog run trong GitHub Actions. Trình chạy sẽ trả về mã thoát khác 0 khi khẳng định thất bại, điều này sẽ làm lỗi bản dựng ngay khi hợp đồng cục bộ hoặc được lưu trữ bị lệch. Các kỹ sư QA có thể kết nối cùng một luồng vào các quy trình kiểm thử API hiện có.
Kỹ thuật nâng cao và mẹo chuyên nghiệp
Lượng tử hóa là đòn bẩy quyết định liệu một mô hình 70B có vừa với máy tính xách tay của bạn hay không. Định dạng GGUF lưu trữ trọng số ở 8, 6, 5, 4, 3 hoặc 2 bit trên mỗi tham số. Q4_K_M là mặc định có lý do. Nó mất 0.6 điểm phần trăm trên điểm chuẩn MMLU so với FP16 và thu nhỏ một mô hình 70B từ 140 GB xuống còn 40 GB. Q8 giữ bạn trong vòng 0.1 điểm so với FP16 nhưng tăng gấp đôi dung lượng đĩa và RAM. Q2_K tiết kiệm không gian nhưng sự suy giảm perplexity có thể nhìn thấy trong bất kỳ tác vụ nào có ngữ cảnh dài. Chọn Q4_K_M để trò chuyện, Q8 để tạo mã và Q5_K_M khi bạn có đủ RAM và muốn có một biên độ an toàn.
Việc giải phóng GPU thông qua cờ -ngl trong llama.cpp hoặc tùy chọn num_gpu trong Ollama kiểm soát số lượng lớp transformer nằm trên GPU. Hãy đặt nó càng cao càng tốt tùy theo VRAM của bạn. Mỗi lớp bị chuyển về CPU sẽ làm giảm thông lượng khoảng 30 phần trăm. Trên một card 24 GB, một mô hình 70B Q4 có thể chứa 40 trong số 80 lớp. Trên 48 GB, bạn có thể chứa toàn bộ ngăn xếp.
Ánh xạ bộ nhớ (mmap) được bật theo mặc định trong llama.cpp và Ollama. Nó cho phép hệ điều hành phân trang trọng số theo yêu cầu thay vì cấp phát toàn bộ mô hình khi khởi động. Hãy giữ nguyên cài đặt này trừ khi bạn đang chạy trong một container với giới hạn bộ nhớ nghiêm ngặt. Khi tắt mmap, độ trễ token đầu tiên giảm khoảng 200 ms nhưng việc sử dụng RAM tăng gấp đôi.
Phân lô (Batching) là siêu năng lực của vLLM. Gửi 32 yêu cầu đồng thời và vLLM nhóm chúng thành một lần xử lý GPU duy nhất. Thông lượng tăng gần như tuyến tính đến giới hạn tính toán của GPU. Đặt --max-num-seqs 64 cho máy tính xách tay có bộ nhớ CPU chia sẻ và --max-num-seqs 256 cho phần cứng lớp H100.
Phản hồi streaming giảm một nửa độ trễ cảm nhận. Đặt stream=True trong OpenAI SDK và máy chủ sẽ gửi các token ngay khi chúng được tạo. Byte đầu tiên đến trong 200 đến 500 ms thay vì chờ đợi hoàn tất toàn bộ. Mọi runtime trong hướng dẫn này đều hỗ trợ tính năng này.
Modelfile của Ollama cho phép bạn tích hợp lời nhắc hệ thống, nhiệt độ (temperature) và chuỗi dừng (stop sequences) vào một mô hình có tên để mã ứng dụng của bạn luôn gọn gàng. Chạy ollama create my-assistant -f Modelfile một lần và client của bạn sẽ trỏ đến my-assistant thay vì lặp lại lời nhắc hệ thống trên mỗi yêu cầu.
Những lỗi thường gặp
- Mã hóa cứng
http://localhost:11434trong mã sản xuất. Hãy sử dụng một biến môi trường. - Quên rằng các mô hình cục bộ không thực thi
max_tokens. Chúng sẽ vui vẻ tạo ra 4.096 token không mong muốn. Hãy đặt một chuỗi dừng. - Chạy Ollama và một runtime khác trên cùng một cổng. Cả hai đều mặc định sử dụng các cổng sạch, nhưng các cổng tùy chỉnh có thể xung đột một cách âm thầm.
- Bỏ qua tiêu đề
Authorization. Ollama bỏ qua nó, nhưng vLLM với--api-keysẽ từ chối các yêu cầu chưa được xác thực bằng mã 401. - Tải một mô hình Q4 và mong đợi chất lượng GPT-5.5 về toán học. Lượng tử hóa làm suy yếu khả năng suy luận nhanh nhất.
Cục bộ so với Được lưu trữ: Toán học về chi phí và độ trễ
Các con số dưới đây giả định một M3 Max với 128 GB bộ nhớ hợp nhất cho cục bộ, và giá công khai hiện tại cho các endpoint được lưu trữ. Thời gian đến token đầu tiên (TTFT) được đo khi "lạnh", không có phân lô, trên một lời nhắc 1.024 token.
| Mô hình | TTFT cục bộ | Thông lượng cục bộ | Tương đương được lưu trữ | Giá được lưu trữ | TTFT được lưu trữ |
|---|---|---|---|---|---|
| Llama 3.3 70B Q4_K_M | 1.2 s | 12 tok/s | GPT-5.5 Instant | $5 / $30 mỗi 1M | 200 ms |
| DeepSeek V4 67B Q4_K_M | 1.4 s | 10 tok/s | DeepSeek-Chat được lưu trữ | $0.55 / $2.20 mỗi 1M | 280 ms |
| Qwen 3.6 32B Q5_K_M | 0.7 s | 28 tok/s | Qwen-Max được lưu trữ | $1.60 / $6.40 mỗi 1M | 240 ms |
| Gemma 4 27B Q4_K_M | 0.5 s | 35 tok/s | Gemini 3 Flash | $0.35 / $1.05 mỗi 1M | 180 ms |
Cột được lưu trữ luôn thắng về độ trễ. Cột cục bộ thắng về chi phí ngay khi bạn vượt qua khoảng 10 triệu token mỗi ngày, và nó thắng về quyền riêng tư ngay từ yêu cầu đầu tiên. Đối với phát triển, bạn gần như luôn muốn cục bộ. Đối với sản xuất hướng tới người dùng, bạn gần như luôn muốn được lưu trữ, trừ khi phân loại dữ liệu của bạn cấm điều đó.
Một mẫu thực tế: chạy cục bộ trong vòng lặp phát triển nội bộ, chuyển sang được lưu trữ trong môi trường staging, giữ cả hai mục tiêu xanh trong CI. Các bài kiểm tra kịch bản Apidog từ phần trên hỗ trợ mẫu đó bằng một công tắc môi trường duy nhất. Để có các điểm chuẩn sâu hơn về từng mô hình, hãy xem Cách chạy DeepSeek V4 cục bộ và hướng dẫn sử dụng DeepSeek V4 gốc.
Các trường hợp sử dụng thực tế
Một nhóm tuân thủ fintech ở Singapore sử dụng Ollama trên máy tính xách tay của kỹ sư để soạn thảo các báo cáo hoạt động đáng ngờ. Các lời nhắc chứa số tài khoản và mẫu giao dịch không được phép rời khỏi quốc gia theo quy định của MAS. Endpoint được lưu trữ mà họ sử dụng trong sản xuất nhận được một phiên bản đã được ẩn danh của cùng lời nhắc đó. Các kịch bản Apidog khẳng định rằng công cụ ẩn danh chạy trên mọi yêu cầu trước khi nó rời khỏi localhost.
Một studio game ở Stockholm đào tạo các thực tập sinh thiết kế về kỹ thuật lời nhắc với một phiên bản Qwen 3.6 cục bộ. Miễn phí, ngoại tuyến và không thể làm rò rỉ cốt truyện trò chơi tiếp theo cho bên thứ ba. Cùng một dự án được triển khai với Gemini 3 Flash trong sản xuất chỉ với một thay đổi biến môi trường duy nhất. Họ tái sử dụng hướng dẫn API Gemini 3 Flash để kết nối sản xuất.
Một công ty khởi nghiệp y tế chạy vLLM trên một A100 thuê bên trong mạng lưới bệnh viện của khách hàng. Endpoint không bao giờ nhìn thấy DNS công khai. Các bài kiểm tra tích hợp của họ chạy từ một tác nhân Jenkins trong cùng VLAN chống lại cùng SDK OpenAI mà họ sử dụng cục bộ. Cùng một mã, ba mục tiêu triển khai, một bộ kịch bản.
Kết luận
Ngăn xếp API LLM cục bộ đã trưởng thành nhanh chóng. Bạn có thể chuyển lời nhắc của mình ra khỏi một endpoint được lưu trữ mà không cần viết lại client, các bài kiểm tra hoặc CI của bạn. Năm bước để biến điều đó thành hiện thực:
- Chọn Ollama cho máy tính xách tay, vLLM cho các cụm phát triển dùng chung, llama.cpp cho các ngân sách bộ nhớ eo hẹp.
- Hiển thị endpoint tương thích OpenAI và xác minh bằng một lệnh curl đơn giản.
- Di chuyển
base_urlvàapi_keyvào các biến môi trường để cùng một mã có thể truy cập cục bộ và được lưu trữ. - Xây dựng các bài kiểm tra kịch bản trong Apidog chạy giống hệt nhau trên cả hai môi trường.
- Xem xét bảng so sánh chi phí-độ trễ và chọn mục tiêu phù hợp cho mỗi khối lượng công việc.
Tín hiệu trên HN đã đẩy bài viết “AI cục bộ cần trở thành chuẩn mực” vượt quá 1.700 điểm là kết quả của sự trưởng thành này. Khi bề mặt API ổn định, mọi công cụ phát triển đều nhanh chóng thích nghi với nó. Tải xuống Apidog và trỏ một môi trường đến http://localhost:11434/v1 để xem vòng lặp này khép lại nhanh đến mức nào. Nếu bạn chưa chọn mô hình, hãy bắt đầu với Các LLM cục bộ tốt nhất năm 2026, và nếu bạn muốn tìm hiểu sâu hơn về việc kiểm thử các luồng tác nhân trên bất kỳ endpoint nào trong số này, hãy đọc Cách kiểm thử API tác nhân AI.
