Cách Sử Dụng LLM Cục Bộ Làm API

INEZA Felin-Michel

INEZA Felin-Michel

26 tháng 5 2026

Cách Sử Dụng LLM Cục Bộ Làm API

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

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.

button

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.

  1. 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ến BASE_URL với giá trị http://localhost:11434/v1. Thêm API_KEY với giá trị ollama. Lưu lại.
  2. Sao chép môi trường OpenAI hiện có của bạn, đổi tên thành Production, giữ BASE_URLhttps://api.openai.com/v1API_KEY là khóa được lưu trữ của bạn.
  3. 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ằng Bearer {{API_KEY}}. URL yêu cầu sẽ trở thành {{BASE_URL}}/chat/completions.
  4. 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 định choices[0].message.content không trống, và khẳng định usage.total_tokens > 0. Lưu kịch bản.
  5. Chạy kịch bản với môi trường Local. Chuyển đổi dropdown môi trường sang Production. 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

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ộ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:

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.

button

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API