2026年5月31日 星期日

Ollama 學習筆記 : 使用 OpenAI API 存取本地模型

在前一篇測試中, 我們使用 ollama 套件來呼叫 Ollama REST API 的 /api/chat 與 /api/generate 端點, 其參數格式與 OpenAI 的有些出入, 為了讓使用 OpenAI API 撰寫的 AI 應用程式可以不需要修改而能移植到存取本地模型的應用程式中, Ollama 內建了一個 OpenAI 相容轉接層, 提供 /v1/chat/completions 端點來處理此類請求. 本篇旨在測試此相容端點之用法. 

本系列全部測試文章索引參考 :  


關於 OpenAI API 用法參考 :


ollama 套件參數結構與 OpenAI API 參數結構之主要差異摘要如下 :
  • 核心參數 :
    極度相似但命名有別, model, messages, stream, role, content 這些核心參數是最基礎的對話欄位, Ollama 在設計時顯然參考了 OpenAI 的規範, 所以命名完全一樣. 
  • 進階參數 :
    OpenAI 格式直接把這些模型參數 (控制隨機性與生成長度等) 扁平地放在最外層; 而 Ollama 則將其打包在一個名為 "options" 的字典子欄位裡.
具體之差異對照如下表 :


 參數功能  OpenAI 格式  Ollama 格式
 參數擺放位置  直接平鋪在 JSON 的最外層  內層的 "options": { ... } 子字典中
 隨機性 (溫度)  "temperature": 0.7  "options": { "temperature": 0.7 }
 限制輸出字數  "max_tokens": 100  "options": { "num_predict": 100 }
 上下文記憶長度  "max_completion_tokens": 4096  "options": { "num_ctx": 4096 }
 核心採樣 (Top P)  "top_p": 0.9  "options": { "top_p": 0.9 }
 頻率懲罰 (避免重複)  "frequency_penalty": 1.1  "options": { "repeat_penalty": 1.1 }
 固定隨機種子  "seed": 42  "options": { "seed": 42 }


1. 使用 requests 套件 :

首先使用 requests 套件存取 Ollama 相容轉接層的 /v1/chat/completions 端點 :

定義端點網址 : 

>>> url="http://localhost:11434/v1/chat/completions"

定義 HTTP 請求標頭, 這裡需在 Authorization 欄位用 Bearer 指定 OpenAI API 金鑰, 但這只是形式, 不需要去申請金鑰, 隨便填例如 ollama 即可 : 

>>> headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer ollama"  # api_key 填任意值 (例如 ollama)
    }

定義酬載, 依照 OpenAI API 格式, temperature 參數直接放在外層 : 

>>> payload={
    "model": "gemma4:e4b",
    "messages": [
        {"role": "system", "content": "請一律用台灣用語與繁體中文回答"},
        {"role": "user", "content": "請用 100 個字簡介量子糾纏"}
        ],
    "temperature": 0.3,
    "stream": False
    }

呼叫 requests.post() 傳入 headers 與 json 酬載提出請求, 傳回值為一個 Response 物件, 呼叫其 json() 方法將 JSON 字串轉成字典後即可在 messges 鍵的 content 鍵取得模型回應 : 

>>> reply=requests.post(url, headers=headers, json=payload)    
>>> result=reply.json()    
>>> print(result['choices'][0]['message']['content'])   
量子糾纏是一種奇特的量子現象。當兩個或多個粒子發生糾纏時,它們會建立起一種超越空間的特殊連結。

這意味著,即使將這些粒子分開到極遠的地方,只要你測量其中一個粒子的某個屬性(例如自旋),會瞬間、同步地決定另一個粒子的狀態。這種「幽靈般的超距作用」,讓它們的行為高度相關,彷彿心有靈通。

糾纏現象是量子計算、量子通訊等尖端科技的基礎,是現代物理學最令人著迷的領域之一。


2. 使用 openai 套件 :

使用 OpenAI API 需先安裝 openai 套件 (但不需要申請金鑰, 任意填即可) :

pip install openai    

然後匯入 openai.OpenAI 類別, 傳入 base_url 與 api_key 參數建立 OpenAI 物件 : 

>>> from openai import OpenAI
>>> client=OpenAI(
    base_url='http://localhost:11434/v1/',
    api_key='ollama'  # 填任意值
    )

注意, 這裡 base_url 只要給端點的根目錄位置 http://localhost:11434/v1/ 即可, 具體要去哪個端點是由呼叫的函式決定的. 呼叫 OpenAI 物件的 chat.completions.create() 方法與指定之本地模型對話 :

>>> reply=client.chat.completions.create(
    model="gemma4:e4b",
    messages=[
        {"role": "system", "content": "請一律用台灣用語與繁體中文回答"},
        {"role": "user", "content": "請用 100 個字簡介量子糾纏"}
        ],
    temperature=0.3,  # OpenAI 格式參數直接放最外層
    stream=False
    )

回應字串放在傳回物件 ChatCompletion 的 choices[0].message.content 鍵裡 : 

>>> print(reply.choices[0].message.content)   
量子糾纏是一種奇特的量子現象。當兩個或多個粒子發生糾纏後,它們會形成一種深層的量子連結。

無論這些粒子相隔多遠,它們的物理狀態都是相互關聯的。當你測量其中一個粒子的屬性(例如自旋)時,另一個粒子的屬性會瞬間、同步地決定,彷彿它們心有靈犀一般。

這種非定域的關聯性,超乎傳統物理學的預期。它不僅是理論概念,更是未來發展量子計算、量子通訊等尖端科技的關鍵資源。


3. 使用 ollama 套件 :

上面測試的 Ollama 版本如下 :

>>> import ollama 
>>> reply=ollama.chat(
    model='gemma4:e4b',
    messages=[
        {"role": "system", "content": "請一律用台灣用語與繁體中文回答"},
        {"role": "user", "content": "請用 100 個字簡介量子糾纏"}
        ],
    stream=False,
    options={"temperature": 0.3}
    )
>>> print(reply['message']['content'])  
量子糾纏是一種奇特的量子現象,描述兩個或多個粒子之間存在著超越空間距離的特殊連結。

當這些粒子發生糾纏後,它們的量子狀態會互相綁定。無論將它們分開到多遠,只要你測量其中一個粒子的屬性(例如自旋),你就能**瞬間**知道另一個粒子的狀態,即使它們相隔數光年。

這就像一對心靈相通的「量子雙胞胎」,一個改變,另一個會同步改變。這現象是量子計算和量子通訊的基礎,曾被愛因斯坦戲稱為「鬼魅般的超距作用」。

沒有留言 :