前言
把 LLM 跑在自己的機器上,這件事在兩年前還像是天方夜譚,現在卻已經變得異常簡單。Ollama 讓你用一行指令就能下載和運行各種開源模型,Open WebUI 則提供了一個漂亮的 ChatGPT 風格介面。兩者搭配起來,你就有了一個完全私有、不需要網路、不用擔心資料外洩的 AI 聊天助手。
身為後端工程師,我對「資料不出門」這件事特別在意。公司的程式碼、客戶的資料、內部文件 — 這些東西我不太想丟給外部的 API。本地 LLM 解決了這個問題。這篇文章是我部署和調校的完整紀錄。
Ollama 安裝與基礎使用
安裝
# macOS(最簡單)
brew install ollama
# Linux(一行搞定)
curl -fsSL https://ollama.ai/install.sh | sh
# 或者用 Docker
docker run -d \
--name ollama \
-v ollama_data:/root/.ollama \
-p 11434:11434 \
ollama/ollama
# 驗證安裝
ollama --version
下載和運行模型
# 下載並運行 Llama 3.1 8B(入門推薦)
ollama run llama3.1
# 下載 Code Llama(寫程式用)
ollama run codellama:13b
# 下載 Mistral(輕量好用)
ollama run mistral
# 下載 Qwen 2.5(中文能力較好)
ollama run qwen2.5:14b
# 列出已下載的模型
ollama list
# 移除模型(釋放硬碟空間)
ollama rm mistral
模型選擇建議
| 模型 | 參數量 | VRAM 需求 | 適合場景 |
|——|——–|———–|———-|
| llama3.1:8b | 8B | ~6GB | 一般對話、簡單任務 |
| llama3.1:70b | 70B | ~40GB | 複雜推理、長文生成 |
| codellama:13b | 13B | ~10GB | 程式碼生成、補全 |
| mistral:7b | 7B | ~5GB | 快速回應、輕量任務 |
| qwen2.5:14b | 14B | ~12GB | 中文任務、多語言 |
| deepseek-coder-v2 | 16B | ~12GB | 程式碼、技術文件 |
Ollama API 使用
import requests
import json
def chat_with_ollama(prompt, model="llama3.1", stream=False):
"""基本的 Ollama API 呼叫"""
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": model,
"prompt": prompt,
"stream": stream,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"num_predict": 1024,
}
}
)
return response.json()["response"]
# 使用範例
answer = chat_with_ollama("用 Python 寫一個快速排序演算法")
print(answer)
# 串流回應(更好的使用者體驗)
def chat_stream(prompt, model="llama3.1"):
"""串流式回應"""
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": model,
"prompt": prompt,
"stream": True,
},
stream=True,
)
full_response = ""
for line in response.iter_lines():
if line:
data = json.loads(line)
chunk = data.get("response", "")
full_response += chunk
print(chunk, end="", flush=True)
if data.get("done", False):
break
print() # 換行
return full_response
chat_stream("解釋 Docker 的 network 模式有哪些?")
# 對話模式(帶上下文記憶)
def chat_conversation(messages, model="llama3.1"):
"""多輪對話"""
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": model,
"messages": messages,
"stream": False,
}
)
return response.json()["message"]["content"]
# 使用範例
messages = [
{"role": "system", "content": "你是一位資深的後端工程師,用繁體中文回答。"},
{"role": "user", "content": "什麼是 CQRS 模式?"},
]
reply = chat_conversation(messages)
print(reply)
# 繼續對話
messages.append({"role": "assistant", "content": reply})
messages.append({"role": "user", "content": "能給一個 Python 的實作範例嗎?"})
reply2 = chat_conversation(messages)
print(reply2)
Open WebUI 部署
用 Docker Compose 一鍵部署
這是我推薦的方式,Ollama 和 Open WebUI 一起管理:
# docker-compose.yml
services:
ollama:
image: ollama/ollama
container_name: ollama
restart: always
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
# 如果有 NVIDIA GPU,取消下面的註解
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=your-secret-key-here
- WEBUI_AUTH=true
volumes:
- open_webui_data:/app/backend/data
depends_on:
- ollama
volumes:
ollama_data:
open_webui_data:
# 啟動
docker compose up -d
# 確認服務狀態
docker compose ps
# 查看日誌
docker compose logs -f open-webui
# 首次使用:瀏覽器打開 http://localhost:3000
# 第一個註冊的帳號會自動成為管理員
下載模型(透過 Open WebUI 或命令列)
# 方法 1: 命令列(推薦,比較快)
docker compose exec ollama ollama pull llama3.1
docker compose exec ollama ollama pull codellama:13b
# 方法 2: 在 Open WebUI 的管理介面中下載
# Settings → Models → Pull a model
進階設定
# docker-compose.yml 的進階版本
services:
ollama:
image: ollama/ollama
container_name: ollama
restart: always
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
environment:
# 效能相關設定
- OLLAMA_NUM_PARALLEL=2 # 同時處理的請求數
- OLLAMA_MAX_LOADED_MODELS=2 # 同時載入的模型數
- OLLAMA_KEEP_ALIVE=5m # 模型閒置後保留在記憶體的時間
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=change-this-to-a-random-string
- WEBUI_AUTH=true
- DEFAULT_MODELS=llama3.1 # 預設模型
- ENABLE_SIGNUP=false # 關閉註冊(只允許管理員建帳號)
- ENABLE_COMMUNITY_SHARING=false # 關閉社群分享
volumes:
- open_webui_data:/app/backend/data
depends_on:
- ollama
volumes:
ollama_data:
open_webui_data:
自訂模型(Modelfile)
Ollama 讓你可以用 Modelfile 來自訂模型的行為:
# Modelfile.backend-engineer
# 建立一個專門的後端工程師助手
FROM llama3.1
# 設定系統 prompt
SYSTEM """你是一位資深的後端工程師助手。你精通 Python、Go、PostgreSQL、Redis、
Docker、Kubernetes。你用繁體中文回答問題,風格簡潔直接,會附上程式碼範例。
當你不確定時會明確告知。"""
# 調整參數
PARAMETER temperature 0.3 # 程式碼相關任務用低溫度
PARAMETER top_p 0.9
PARAMETER num_predict 2048 # 允許較長的回覆
PARAMETER stop "<|eot_id|>"
# 建立自訂模型
ollama create backend-helper -f Modelfile.backend-engineer
# 使用自訂模型
ollama run backend-helper
# 也可以在 Open WebUI 中選擇這個模型
# Modelfile.code-reviewer
# 程式碼 review 專用模型
FROM codellama:13b
SYSTEM """你是一位嚴格但友善的程式碼審查者。你會:
- 指出潛在的 bug 和安全問題
- 建議效能改善的方向
- 檢查命名慣例和程式碼風格
- 用繁體中文回覆
回覆格式:先列出問題等級(Critical/Warning/Info),再說明。"""
PARAMETER temperature 0.2
PARAMETER num_predict 2048
效能調校
硬體需求估算
模型 VRAM 需求的大致公式:
- FP16 (半精度): 參數量(B) × 2 GB
- Q4_0 (4-bit 量化): 參數量(B) × 0.5-0.7 GB
例如 Llama 3.1 8B:
- FP16: 8 × 2 = ~16GB VRAM
- Q4_0: 8 × 0.6 = ~5GB VRAM(Ollama 預設用這個)
macOS Metal 加速
# macOS 上 Ollama 自動使用 Metal GPU 加速
# 確認 GPU 是否被使用
ollama run llama3.1 --verbose
# 看 "eval rate" 這個指標,Metal 加速通常能達到 30-60 tokens/s (M1/M2)
# 如果發現速度太慢,檢查統一記憶體使用情況
# macOS 的好處是 GPU 和 CPU 共用記憶體,大模型也能跑
Linux NVIDIA GPU
# 確認 NVIDIA 驅動和 CUDA 已安裝
nvidia-smi
# Docker 需要 nvidia-container-toolkit
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
# 在 docker-compose.yml 中啟用 GPU(見上方設定)
量化選擇
# Ollama 提供不同量化等級的模型
ollama pull llama3.1:8b-instruct-q4_0 # 4-bit,最小最快
ollama pull llama3.1:8b-instruct-q5_1 # 5-bit,品質和速度的平衡
ollama pull llama3.1:8b-instruct-q8_0 # 8-bit,品質最好但最慢
# 建議:
# - VRAM < 8GB: 用 q4_0
# - VRAM 8-16GB: 用 q5_1
# - VRAM > 16GB: 用 q8_0 或直接 FP16
整合到開發工具
VS Code / Cursor 整合
// settings.json — 設定 Continue 插件使用本地 Ollama
{
"continue.models": [
{
"title": "Local Llama 3.1",
"provider": "ollama",
"model": "llama3.1",
"apiBase": "http://localhost:11434"
},
{
"title": "Local CodeLlama",
"provider": "ollama",
"model": "codellama:13b",
"apiBase": "http://localhost:11434"
}
]
}
命令列整合
# 在 .zshrc 或 .bashrc 中加入快捷函數
function ask() {
# 快速問 AI(不進入互動模式)
curl -s http://localhost:11434/api/generate \
-d "{\"model\":\"llama3.1\",\"prompt\":\"$*\",\"stream\":false}" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['response'])"
}
function review() {
# 快速 code review
local file=$1
local content=$(cat "$file")
ask "Review this code and point out issues:\n\n$content"
}
# 使用方式
ask "Docker network host 模式和 bridge 模式差在哪?"
review ./src/main.py
小結
本地部署 LLM 已經不再是「技術展示」,而是真正可以融入日常工作流的實用工具。Ollama + Open WebUI 的組合讓整個部署過程變得異常簡單,即使是不太熟 ML 的後端工程師也能在 30 分鐘內搞定。
我的建議是:
- 先從小模型開始(llama3.1:8b 或 mistral:7b),感受一下本地推理的速度和品質
- 建立自訂 Modelfile,針對你最常見的使用場景調整 system prompt 和參數
- 整合到現有工具鏈,讓使用 AI 的摩擦力降到最低
- 不要期望本地模型能取代 GPT-4 或 Claude,但在很多日常任務上它們已經夠用了
延伸閱讀:
- Ollama 官方文件:https://ollama.ai
- Open WebUI 官方文件:https://docs.openwebui.com
- Hugging Face 模型排行榜:看看最新的開源模型表現
- LocalAI:另一個本地 LLM 部署方案