toolkitbox

~/ / AI 文章 / 在 VPS 上跑本機 LLM / 在自己的程式中呼叫本機模型:Ollama 的結構化輸出與 OpenAI-compatible API

在自己的程式中呼叫本機模型:Ollama 的結構化輸出與 OpenAI-compatible API

Ollama 在你的伺服器上跑起來之後,你自己的程式碼還需要兩樣東西:一是取得固定格式回答的方法,二是讓原本就支援 OpenAI API 的函式庫連上這台伺服器的方法。Ollama 的文件兩者都有說明。本文整理結構化輸出頁面與 OpenAI 相容性頁面的內容,並指出文件中標示為不支援的部分。

發布: · 約 5 分鐘讀完 · 已於 2026-10-26 對照 Ollama 官方文件確認。各版本支援的功能會有變動,請以最新文件為準。

呼叫同一台伺服器的兩種方式

Ollama 有自己的 API,文件中的範例是以 POST 送到 http://localhost:11434/api/chat。它也在 /v1/ 之下提供 OpenAI-compatible API,因此現有的 OpenAI 用戶端只要更改 base URL 就能連上。

項目Native APIOpenAI-compatible API
基底位址http://localhost:11434/api/chathttp://localhost:11434/v1/
API 金鑰範例中未提及api_key='ollama',頁面註明為必填但會被忽略
結構化輸出欄位formatresponse_format

API 金鑰這一列取自文件中的本機伺服器範例。至於雲端,頁面顯示的是 base_url https://ollama.com/v1,並搭配你的 Ollama 帳號所取得的 API 金鑰,屬於不同的情況。

結構化輸出:format 欄位

format 欄位用來限制回應。它可以接受字串 json(表示一般的 JSON),也可以接受 JSON schema 物件。在文件的 cURL 範例中,請求主體有四個欄位:model、messages、設為 false 的 stream,以及 format。範例中的 schema 包含 type、properties 與 required。

format 的值依文件所述的效果
"json"模型以一般的 JSON 回答
JSON schema 物件回應會被限制在該 schema 之內
  • 文件指出,最好同時在提示詞中以字串形式附上 JSON schema,以便讓模型的回應有所依據。
  • 文件也提到,可以調低 temperature(例如設為 0),以得到較具確定性的結果。
  • 在 Python 與 JavaScript 中,文件建議用 Pydantic 或 Zod 來定義 schema,這樣之後也能重複用於驗證。
  • 視覺模型同樣接受 format 參數。文件中的視覺範例會將圖片與 schema 一起傳入。
  • 依該頁面所述,Ollama 的雲端目前不支援結構化輸出。

在依賴某個 schema 之前,請先檢查它。下方的 JSON Schema Validator 可以告訴你 schema 本身是否有效,以及範例回答是否符合它。

檢查你要送出的 schema

有錯誤的 schema 可能要等到第一個請求送到模型時才出問題。請貼上 schema 與你預期的 JSON 範例,看看兩者是否一致。

試試看: JSON Schema Validator

對於所支援的關鍵字,遵循 JSON Schema Draft 2020-12。$ref 只會讀取同一份 schema 內的目標。

所有處理都在你的瀏覽器中執行。schema 與資料都不會被上傳。

OpenAI-compatible 端點

端點頁面列出的功能列為不支援的項目
/v1/chat/completions聊天、串流、JSON mode、可重現的輸出、視覺、tools、推理控制logprobs、tool_choice、logit_bias、user、n;圖片 URL(請改用 base64)
/v1/completions文字補全、串流、JSON mode、可重現的輸出logprobs、best_of、echo、logit_bias、user、n
/v1/models列出與取得模型未列出
/v1/embeddings字串或字串陣列的輸入、編碼格式、維度token 陣列、user
/v1/responses串流、function-calling 的 tools、推理摘要具狀態的請求:previous_response_id、conversation、truncation
  • 在聊天端點上,頁面將下列請求欄位列為支援項目:response_format、tools、stream、stream_options、seed、stop、temperature、top_p、max_tokens、frequency_penalty 與 presence_penalty。
  • 頁面指出,結構化輸出可透過 OpenAI-compatible API 的 response_format 使用。
  • 如果你的程式碼用到了「不支援」欄中的欄位,請修改程式碼,而不要指望伺服器會直接忽略它。文件沒有說明各個不支援欄位會如何處理,只有 speech 例外:不支援的值會回傳 400 錯誤。

tools 與工具定義的格式

Native API 與 OpenAI-compatible 的聊天端點都接受 tools。如果你是以 OpenAI 的格式描述工具,可以在送出之前,用本站的 Tool Definition Checker 依該格式檢查名稱、說明與參數 schema。

回答仍然不是有效 JSON 時

限制輸出的目的是讓你得到有效的 JSON,但你的程式碼仍可能收到來自其他模型、舊版本,或未帶 format 的請求所產生的文字。下方的工具可以修復常見的問題,例如程式碼區塊標記、結尾多餘的逗號與錯誤的引號,並在修復會改變原意時提出警告。

試試看: LLM JSON Repair

縮排

只會套用有唯一明確答案的修正。其他情況會回報位置,而不是用猜的。

所有處理都在你的瀏覽器中執行,貼上的文字不會被上傳。

關於存取的說明

文件中的本機範例指出,API 金鑰為必填但會被忽略。以下是我們的解讀,並非文件中的說法:這把金鑰並不保護伺服器,因此請讓 Ollama 維持預設位址;如果其他機器必須連上它,請在前面加上驗證機制。

資料來源

接著閱讀