localaiforum
登入
指南 › 執行與服務

部署 OpenAI 相容端點

跑一次引擎、在聊天視窗跟它講話,你得到的是玩具。用大家都已經會講的格式透過 HTTP 提供服務,你得到的是基礎設施:編輯器、UI、智慧代理與你自己的腳本都能驅動同一個本機模型。這一頁先架起本機端點,然後涵蓋串流、SDK、安全性與保溫載入。

為什麼 OpenAI 格式勝出

chat-completions 請求格式——一個模型名稱、一列 {role, content} 訊息、幾個旋鈕——成為事實標準,因為每個工具作者都先為它寫了客戶端。無論你對那家公司看法如何,格式本身是中立的:它就只是 POST 上的 JSON。實際後果:任何模仿它的本機伺服器,立即與一大堆現有軟體相容。引擎選擇與客戶端選擇變成互相獨立的決定(見 推論引擎)。

一分鐘上手 llama-server

llama-server -m model.gguf -c 8192 --port 8080
# UI 在 http://127.0.0.1:8080——API 在 /v1/chat/completions

一個帶註解的請求:

curl http://127.0.0.1:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"model","messages":[{"role":"user","content":"Why run local? One sentence."}],"temperature":0.7,"max_tokens":60}'
  • model——llama-server 服務的是你啟動的東西;這個欄位常被忽略,但還是送個像樣的名字。
  • messages——整段對話,系統提示詞在最前;伺服器無狀態,歷史由你保管。
  • max_tokens——限制回覆長度;保護你不受失控生成之害。

回應(經刪減)帶著答案,加上你免費除錯會用到的 token 帳目:

{
  "choices": [
    { "message": { "role": "assistant", "content": "No accounts, no rate limits, and your data never leaves the machine." } }
  ],
  "usage": { "prompt_tokens": 14, "completion_tokens": 15 }
}

usage 讓你知道提示詞實際吃掉多少上下文——怪模型「健忘」之前先看它(見 token 與分詞器)。

串流

加上 "stream": true,伺服器就切換到 server-sent events:以換行分隔的 data: 區塊,每塊帶一個小 delta,以哨兵值結尾。

data: {"choices":[{"delta":{"content":"No "}}]}
data: {"choices":[{"delta":{"content":"accounts"}}]}
data: [DONE]

客戶端:累積 delta.content 直到 [DONE] 行。串流不會讓生成變快——它讓等待可以忍受,對對話 UX 來說是一樣的事(見 速度)。

Ollama:一個服務,兩種 API

Ollama 的原生 API 稍微豐富——逐請求選項與模型生命週期控制:

curl http://127.0.0.1:11434/api/chat -d '{"model":"qwen3:8b","messages":[{"role":"user","content":"hi"}],"stream":false,"keep_alive":-1}'

它也在 /v1/chat/completions 提供 OpenAI 相容路由,所以 OpenAI 形狀的客戶端不用改就能對 Ollama 用。想要 keep_alive 或逐請求引擎選項時用原生 API;其他都用 /v1。

給 GPU 伺服器的 vLLM

vllm serve Qwen/Qwen3-8B --max-model-len 16384 --port 8000

vLLM 抓 safetensors 權重、載入一次,底下用連續批次提供同樣的 OpenAI 格式——同時使用者一出現就是正確工具(見 並行處理)。它要 NVIDIA VRAM 與一張真正的 GPU;單人桌面不用麻煩。

把官方 SDK 指向 localhost

官方 OpenAI 函式庫就只是 HTTP 客戶端;換掉 base URL,API 金鑰欄位就變成裝飾品:

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="local")
r = client.chat.completions.create(
    model="qwen3-8b",
    messages=[{"role": "user", "content": "Why run local?"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "ollama" });
const r = await client.chat.completions.create({
  model: "qwen3:8b",
  messages: [{ role: "user", content: "Why run local?" }],
});

伺服器沒設金鑰時,任何字串都行。這個 base URL 互換,就是每個「支援本機模型」工具背後的全部秘密。

這解鎖了什麼

  • 編輯器與聊天 UI——見 UI 與整合。
  • 你自己的應用:本機模型躲在你自己的後端後面,每 token 成本為零。
  • 保證 schema 的腳本化管線——見 結構化輸出。
  • 會呼叫工具並迭代的智慧代理迴圈——見 智慧代理。
  • 本論壇的 遊戲專區:西洋棋 與 韓國將棋 智慧代理玩的正是打本機 chat-completions 端點,就像上面那段 curl。

鎖門

模型伺服器對任何摸得到那個埠的人都是免費 LLM。預設是安全的——llama-server 與 Ollama 都綁 127.0.0.1——筆電上請保持這樣。要在區域網路曝露:設 API 金鑰(llama-server 與 vLLM 的 --api-key,以及前方任何 UI 的驗證),並偏好用反向代理做 TLS。絕不要無驗證地綁 0.0.0.0:網路上的任何人都能燒你的 GPU、灌滿你的上下文、探測你的環境。

保持保溫

冷載入——權重從磁碟進 VRAM——要付出數秒到數十秒的 TTFT。llama-server 與 vLLM 在啟動時載入並保持常駐,只有第一個請求付帳。Ollama 在 keep_alive(預設約 5 分鐘)後卸載:送 "keep_alive": -1 無限期留住模型,或 0 在一陣猛用後立刻釋放 VRAM。如果你的環境「一開始慢、之後正常」,那是冷載入,不是慢模型——而在負載下,載入風暴是真實的故障模式(見 並行處理)。

相關章節: 並行處理 · UI 與整合 · 推論引擎 · 結構化輸出