在前一篇測試中, 我們使用 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'])
量子糾纏是一種奇特的量子現象,描述兩個或多個粒子之間存在著超越空間距離的特殊連結。
當這些粒子發生糾纏後,它們的量子狀態會互相綁定。無論將它們分開到多遠,只要你測量其中一個粒子的屬性(例如自旋),你就能**瞬間**知道另一個粒子的狀態,即使它們相隔數光年。
這就像一對心靈相通的「量子雙胞胎」,一個改變,另一個會同步改變。這現象是量子計算和量子通訊的基礎,曾被愛因斯坦戲稱為「鬼魅般的超距作用」。
沒有留言:
張貼留言