繁中 ▾
取得 API 金鑰

Python 中的 Ollama API,然後是託管端點

使用 Ollama API Python 客戶端大約需要十行程式碼:安裝套件、啟動伺服器並呼叫聊天。本教程涵蓋這些內容,然後展示如何透過變更環境變數讓相同的程式碼在託管的 OpenAI 相容端點上運作。

更新

發光的蛇形光線從桌面機箱盤旋而上至伺服器雲端,顯示 Python 將本地程式碼移至託管環境
聊天視窗透過發光的線纜同時連線到本地電腦與雲端伺服器

無需信用卡。註冊後,點擊一次即可領取 $0.50 免費測試額度(每人限領一次)。

取得 API 金鑰

重點摘要

  • 執行 `pip install ollama`,在連接埠 11434 啟動 Ollama 伺服器,並使用你已拉取的模型呼叫 `ollama.chat`。
  • 串流輸出設定為 `stream=True`,它會產生包含 `message.content` 的區塊。
  • 處理缺失模型的 ResponseError 和伺服器停止時的 ConnectionError。
  • 要使用託管服務,請切換至 OpenAI SDK,並透過環境變數設定 base URL、金鑰與模型。

設定 Python 客戶端

首先安裝 Ollama 本身,啟動它,並從終端機拉取一個模型:ollama pull llama3。伺服器監聽在 http://localhost:11434。然後在虛擬環境中安裝 Python 套件:

python -m venv .venv
source .venv/bin/activate
pip install ollama openai

ollama 套件會與 Ollama 的 /api 原生路由進行通訊。openai 套件則用於本教程的第二部分,其目標為託管端點。如果你在編寫程式碼前偏好使用視覺化工具,請參閱 使用 Ollama 與圖形使用者介面 的說明。

在終端機中執行 ollama list 來檢查安裝。如果你的模型出現在那裡,Python 就會找到它。如果稍後出現連線錯誤,伺服器可能沒有運行。

你的第一個對話請求

以下是 ollama API Python 基礎的一次性程式碼片段:包含系統訊息、使用者訊息以及兩個選項。

import ollama

resp = ollama.chat(
    model="llama3",
    messages=[
        {"role": "system", "content": "Answer in one short paragraph."},
        {"role": "user", "content": "What is a context window?"},
    ],
    options={"temperature": 0.4, "num_ctx": 8192},
)
print(resp["message"]["content"])

回覆是一個類似字典的物件;文字位於 message.content 中。在 options 中你可以設定生成參數。temperature 控制隨機性,num_ctx 設定該次呼叫的上下文長度。除非你提高它,否則 Ollama 預設為相當小的上下文,這會讓貼上長文件的人感到驚訝,因為他們得到的答案會忽略開頭。

對於多輪聊天,保持一個訊息列表並自行附加每個回覆。Ollama 與大多數聊天 API 一樣,在呼叫之間是無狀態的。

串流回應

沒有串流輸出時,你需要等待完整的答案。使用 stream=True 時,函式會返回一個生成器,你可以隨著資料到達列印片段:

import ollama

for part in ollama.chat(
    model="llama3",
    messages=[{"role": "user", "content": "Explain recursion with a cooking analogy."}],
    stream=True,
):
    print(part["message"]["content"], end="", flush=True)

每個部分都包含一個小的 message.content。最後一個部分的 done 設為 true,並包含計時與 token 計數。對於網頁應用程式,請透過伺服器發送事件或 websocket 將這些片段轉發至瀏覽器。

你實際會遇到的錯誤

兩種故障涵蓋了大多數初學者的問題。

import ollama

try:
    ollama.chat(model="llama3", messages=[{"role": "user", "content": "hi"}])
except ollama.ResponseError as exc:
    if exc.status_code == 404:
        print("Model missing. Run: ollama pull llama3")
    else:
        raise
except ConnectionError:
    print("Cannot reach Ollama. Is the server running on port 11434?")

來自 ResponseError 的 404 表示模型名稱與你拉取的模型不符。名稱包含標籤,因此 llama3 和 llama3:70b 是不同的模型。連線錯誤表示伺服器未啟動,或者你處於容器內,其中 localhost 指向容器而非主機。在這種情況下,請傳遞具有正確主機的客戶端:ollama.Client(host="http://host.docker.internal:11434")。

更多模式收錄於 常見 Ollama API 錯誤。

相同的程式碼,託管端點

本地模型受你的記憶體和速度限制。當腳本必須在伺服器上運行、處理許多並行作業或使用更大的上下文視窗時,託管端點更容易。訣竅是針對 OpenAI SDK 編寫程式,並將 base URL、金鑰和模型視為配置:

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.ollamansfw.com/v1"),
    api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

def ask(prompt, history=None):
    messages = (history or []) + [{"role": "user", "content": prompt}]
    out = ""
    for chunk in client.chat.completions.create(model=MODEL, messages=messages, stream=True):
        if chunk.choices and chunk.choices[0].delta.content:
            piece = chunk.choices[0].delta.content
            out += piece
            print(piece, end="", flush=True)
    return out

ask("Explain recursion with a cooking analogy.")

對於本地 Ollama,設定 LLM_BASE_URL=http://localhost:11434/v1,LLM_API_KEY=ollama(任何非空字串在那裡都會被接受)和 LLM_MODEL=llama3。對於託管 API,使用上述預設值、你的真實金鑰和模型 uncensored。程式碼中的其他內容不會改變。

在 API 金鑰頁面 取得金鑰。新帳戶可以一鍵領取 $0.50 試用額度,無需付款,有效期為 7 天。該模型來自獨立供應商的開放權重模型,經過調整以在法律允許的成人使用中無內容拒絕地回答。它僅限文字,並非任何大型實驗室的官方 API。

並行執行許多提示詞

一台機器上的本地模型通常一次處理一個請求,所以迴圈是串行的。託管端點允許並行請求,這使批次工作快得多。將工作程序數量保持在你的金鑰限制之下:完整金鑰為 8 個並行請求,試用金鑰為 2 個。

from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI

client = OpenAI(base_url="https://api.ollamansfw.com/v1", api_key="YOUR_KEY")

def summarize(text):
    r = client.chat.completions.create(
        model="uncensored",
        messages=[{"role": "user", "content": "Summarize in one line: " + text}],
        max_tokens=60,
    )
    return r.choices[0].message.content

docs = ["first text", "second text", "third text"]
with ThreadPoolExecutor(max_workers=6) as pool:
    results = list(pool.map(summarize, docs))
print(results)

六個工作程序在 8 的限制之下留有餘地。如果工作程序收到 429,OpenAI SDK 預設會重試幾次,但請為長時間運行添加你自己的退避機制。還要記住,每個串流請求都會佔用其槽位直到串流結束,所以不要在相同的試用金鑰上混合長時間的串流聊天和大型批次。

需要規劃的差異

  • 沒有僅限本地的選項。 num_ctx 和 keep_alive 在託管端沒有意義。上下文視窗為 100,000 token,包含提示詞和完成內容。
  • 速率限制。 完整金鑰允許 8 個並行請求和每分鐘 300 個請求;試用金鑰允許 2 個和 60 個。超過此限制你會收到 429 並帶有 rate_limited 或 concurrency。暫停後重試;在臨時超載時,回應會帶有 Retry-After: 5。
  • 成本。 輸入為每 1M token $0.15,輸出為每 1M token $0.50。發送 2,000 個提示詞的腳本,每個提示詞包含 600 個輸入 token 和 400 個輸出 token,花費 2,000 x (600 x $0.15 + 400 x $0.50) / 1M = 2,000 x $0.00029 = $0.58。
  • 計費。 預付額度,從 $20 到 $500,使用加密貨幣支付(TRC20 上的 USDT 或 Base 上的 USDC)。失敗或被拒絕的請求不會收費。

若要並排查看端點,請閱讀 我們的 API 定價說明 或 文件。

問答

我如何從 Python 呼叫 Ollama?

安裝 ollama 套件,啟動伺服器,拉取模型,然後使用模型名稱和訊息列表呼叫 ollama.chat。

我可以在 Ollama 中使用 OpenAI Python SDK 嗎?

是的。將 base_url 設為 http://localhost:11434/v1 並使用任何非空的 API 金鑰;Ollama 在此提供 OpenAI 相容的介面層。

我如何在 Python 中串流輸出 Ollama 的輸出?

將 stream=True 傳遞給 ollama.chat 並迴圈遍歷返回的區塊,從每個區塊列印 message.content。

切換到託管端點時會有什麼變化?

Base URL、API 金鑰和模型名稱。num_ctx 等本地選項不適用,你應該處理 429 速率限制回應。