LLM API 串接
以下示範如何使用 Python 串接本地端的 Ollama API。Ollama 預設會在以下網址提供 API:
```text
http://localhost:11434
```
## 一、事前準備
### 1. 安裝並啟動 Ollama
安裝 Ollama 後,確認服務已啟動:
```bash
ollama serve
```
有些作業系統安裝後會自動啟動服務。
### 2. 下載模型
例如下載 `llama3.2`:
```bash
ollama pull llama3.2
```
也可以先直接測試:
```bash
ollama run llama3.2
```
### 3. 安裝 Python 套件
以下範例使用 `requests`:
```bash
pip install requests
```
---
# 範例一:使用 `/api/generate` 產生文字
`/api/generate` 適合單次提示,例如請模型摘要、翻譯或回答一個問題。
```python
import requests
url = "http://localhost:11434/api/generate"
payload = {
"model": "llama3.2",
"prompt": "請用繁體中文簡單說明什麼是 Python。",
"stream": False
}
try:
response = requests.post(url, json=payload, timeout=120)
response.raise_for_status()
result = response.json()
print("模型回答:")
print(result["response"])
except requests.exceptions.ConnectionError:
print("無法連線到 Ollama,請確認 Ollama 服務是否已啟動。")
except requests.exceptions.Timeout:
print("請求逾時,模型可能需要較長的處理時間。")
except requests.exceptions.HTTPError as error:
print("API 發生錯誤:", error)
```
### 重要參數
```python
{
"model": "llama3.2",
"prompt": "你的問題",
"stream": False
}
```
- `model`:使用的模型名稱。
- `prompt`:傳送給模型的提示內容。
- `stream`:是否採用串流回傳。設為 `False` 時,會等模型完成後一次回傳完整結果。
API 回傳結果大致如下:
```json
{
"model": "llama3.2",
"response": "Python 是一種高階、直譯式的程式語言……",
"done": true
}
```
---
# 範例二:使用 `/api/chat` 進行對話
`/api/chat` 適合具有上下文的聊天情境,可以傳入多筆訊息。
```python
import requests
url = "http://localhost:11434/api/chat"
payload = {
"model": "llama3.2",
"messages": [
{
"role": "system",
"content": "你是一位友善的 Python 教學助手。"
},
{
"role": "user",
"content": "請解釋 Python 中 list 和 tuple 的差異。"
}
],
"stream": False
}
try:
response = requests.post(url, json=payload, timeout=120)
response.raise_for_status()
result = response.json()
print("模型回答:")
print(result["message"]["content"])
except requests.exceptions.ConnectionError:
print("無法連線到 Ollama,請確認 Ollama 服務是否已啟動。")
except requests.exceptions.Timeout:
print("請求逾時。")
except requests.exceptions.HTTPError as error:
print("API 發生錯誤:", error)
```
### `messages` 的角色
常見角色如下:
```python
[
{
"role": "system",
"content": "設定模型的行為"
},
{
"role": "user",
"content": "使用者的問題"
},
{
"role": "assistant",
"content": "模型先前的回答"
}
]
```
API 回傳結果大致如下:
```json
{
"model": "llama3.2",
"message": {
"role": "assistant",
"content": "list 可以修改,而 tuple 通常不可修改……"
},
"done": true
}
```
因此,可以透過以下方式取得回答:
```python
answer = result["message"]["content"]
```
---
## 將對話記錄保留下來
如果要進行多輪對話,可以把每次的使用者問題和模型回答加入 `messages`:
```python
import requests
url = "http://localhost:11434/api/chat"
messages = [
{
"role": "system",
"content": "你是一位 Python 助手,請使用繁體中文回答。"
}
]
while True:
user_input = input("你:")
if user_input.lower() in ["exit", "quit"]:
break
messages.append({
"role": "user",
"content": user_input
})
payload = {
"model": "llama3.2",
"messages": messages,
"stream": False
}
response = requests.post(url, json=payload, timeout=120)
response.raise_for_status()
result = response.json()
answer = result["message"]["content"]
print("Ollama:", answer)
messages.append({
"role": "assistant",
"content": answer
})
```
這樣每次請求都會帶上先前的對話內容,模型就能維持基本的上下文。
## 常見問題
### 無法連線到 `localhost:11434`
確認 Ollama 是否正在執行:
```bash
ollama serve
```
也可以測試:
```bash
curl http://localhost:11434/api/tags
```
### 找不到模型
確認模型名稱與已安裝的模型一致:
```bash
ollama list
```
例如使用:
```python
"model": "llama3.2"
```
### API 是否需要 API Key?
Ollama 在本地端預設通常不需要 API Key。若 Ollama 被設定為遠端服務或經過反向代理,則可能需要額外設定驗證機制。
相關學習地圖、教學課程
Python 人工智慧