前言

把 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 """你是一位嚴格但友善的程式碼審查者。你會:

  1. 指出潛在的 bug 和安全問題
  2. 建議效能改善的方向
  3. 檢查命名慣例和程式碼風格
  4. 用繁體中文回覆
回覆格式:先列出問題等級(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 分鐘內搞定。

我的建議是:

  1. 先從小模型開始(llama3.1:8b 或 mistral:7b),感受一下本地推理的速度和品質
  2. 建立自訂 Modelfile,針對你最常見的使用場景調整 system prompt 和參數
  3. 整合到現有工具鏈,讓使用 AI 的摩擦力降到最低
  4. 不要期望本地模型能取代 GPT-4 或 Claude,但在很多日常任務上它們已經夠用了

延伸閱讀:

  • Ollama 官方文件:https://ollama.ai
  • Open WebUI 官方文件:https://docs.openwebui.com
  • Hugging Face 模型排行榜:看看最新的開源模型表現
  • LocalAI:另一個本地 LLM 部署方案