一. 前言:本地 AI 不只是把模型下載下來 #
如果你最近有玩過本地 LLM,很可能做過這件事:裝 Ollama、下載模型、在終端機輸入 ollama run llama3.2,然後開始聊天。
這當然很酷。
但拍拍君覺得,本地 AI 真正好玩的地方不是「離線聊天」,而是把 Mac 變成自己的小型 AI server,再讓 iPhone、iPad、Terminal、Python 工具、捷徑都能呼叫它。
換句話說,模型跑起來只是第一步。
真正的工作流會長得像這樣:你在 iPhone 分享一篇文章,Mac 上的本地模型幫你摘要;你在 Mac 複製一段草稿,一個快捷鍵就能改寫;你用 Python 批次整理文字,不需要每次打開聊天介面。
這篇要整理一套 Apple 生態系裡很實用的本地 AI 架構:
- Mac:負責跑模型與提供 API
- Ollama:負責通用 LLM chat 與快速模型切換
- MLX:負責 Apple Silicon 友善的 Python 推論實驗
- iPhone:負責隨手輸入、分享文字、語音與捷徑觸發
- Tailscale 或區網:負責讓裝置安全互通 目標不是炫技,而是讓你真的會用。
二. 先分清楚三種本地 AI 場景 #
很多本地 AI 工作流失敗,不是模型不夠強,而是場景沒分清楚。
1. 互動聊天型 #
這是最直覺的用法:你問一句,它答一句。 適合解釋概念、改寫句子、寫草稿、腦力激盪、快速翻譯。 Ollama 很適合這類工作,因為安裝簡單、模型切換也快。
2. 自動化處理型 #
你不是要聊天,而是要丟一段資料給模型處理。 例如摘要剪貼簿、改寫 commit message、整理 messy note、從 log 裡抽錯誤原因、產生標題候選。 這類工作最適合做成 CLI、Apple Shortcut 或小型 HTTP API。
3. Python 推論型 #
你想在程式裡控制模型,例如跑 embedding、做分類、批次摘要、測試 prompt 評估流程。 如果你用 Apple Silicon,MLX 很值得認識。 它是 Apple 專為自家晶片設計的機器學習框架,適合在 Mac 上做 Python 端模型實驗。
三. 架構總覽:Mac 當核心,手機當入口 #
拍拍君推薦的最小架構長這樣:
iPhone / iPad
|
| Shortcuts / browser / app
v
Local network or Tailscale
|
v
Mac mini / MacBook
|-- Ollama HTTP API
|-- Python FastAPI wrapper
|-- MLX scripts
|-- local files / notes / tools
這個架構的優點很直接。 第一,模型不用塞在手機上,手機負責輸入與顯示就好。 第二,Mac 的 Apple Silicon 跑 3B、7B、8B、甚至部分 14B 模型已經很實用。 第三,iPhone 可以透過分享選單、語音輸入、捷徑,把零碎文字送回 Mac 處理。 第四,資料可以盡量留在自己的設備裡,不必所有草稿都丟到雲端。 當然,本地不等於絕對安全;只是你掌握了更多邊界。
四. Mac 端:先把 Ollama 跑穩 #
如果你還沒裝 Ollama,可以用 Homebrew:
brew install ollama
啟動服務:
ollama serve
下載通用模型:
ollama pull llama3.2
如果常寫程式,也可以準備 coding 模型:
ollama pull qwen2.5-coder:7b
先測試 CLI:
ollama run llama3.2
再測試 HTTP API:
curl http://localhost:11434/api/chat \
-d '{
"model": "llama3.2",
"messages": [
{"role": "user", "content": "用三句話解釋什麼是本地 LLM"}
],
"stream": false
}'
如果這一步成功,代表你的 Mac 已經是一台本地 LLM server。 先不要急著開放到外網,先把本機工作流做穩。
五. 用 Python 包一層:讓工具比較好接 #
直接呼叫 Ollama API 可以,但拍拍君通常會再包一層 Python function。 這樣之後要換模型、加 system prompt、處理錯誤、做記錄,都比較方便。 建立小專案:
mkdir local-ai-workflow
cd local-ai-workflow
uv init
uv add httpx rich typer
寫 ai.py:
# ai.py
from __future__ import annotations
import httpx
OLLAMA_URL = "http://localhost:11434/api/chat"
DEFAULT_MODEL = "llama3.2"
def chat(prompt: str, *, model: str = DEFAULT_MODEL) -> str:
payload = {
"model": model,
"messages": [
{"role": "system", "content": "你是精簡、可靠、偏工程實用的繁體中文助手。"},
{"role": "user", "content": prompt},
],
"stream": False,
}
with httpx.Client(timeout=120) as client:
response = client.post(OLLAMA_URL, json=payload)
response.raise_for_status()
data = response.json()
return data["message"]["content"]
再寫 CLI:
# cli.py
from __future__ import annotations
import typer
from rich.console import Console
from ai import chat
app = typer.Typer(help="Local AI workflow helper")
console = Console()
@app.command()
def ask(text: str, model: str = "llama3.2") -> None:
"""Ask local LLM a question."""
console.print(chat(text, model=model))
@app.command()
def summarize(path: str, model: str = "llama3.2") -> None:
"""Summarize a text file."""
content = open(path, encoding="utf-8").read()
prompt = f"""
請把下面內容整理成繁體中文重點摘要。
要求:5 個 bullet points 以內、保留重要名詞、不要加入原文沒有的資訊。
內容:
{content}
"""
console.print(chat(prompt, model=model))
if __name__ == "__main__":
app()
執行:
uv run python cli.py ask "幫我用一句話說明 Ollama 的用途"
這時候你已經不只是打開聊天視窗,而是有一個可以整合到 shell、Automator、Shortcuts、git hook 的小工具。
六. 把 iPhone 接進來:用 FastAPI 給捷徑呼叫 #
iPhone 端最簡單的玩法,是用 Shortcuts 呼叫 Mac 上的 HTTP endpoint。
不過拍拍君不建議直接把 Ollama API 丟給手機,而是用 FastAPI 包一個窄窄的介面,例如只提供 /summarize 和 /rewrite。
安裝:
uv add fastapi uvicorn
建立 server.py:
# server.py
from __future__ import annotations
from fastapi import FastAPI
from pydantic import BaseModel
from ai import chat
app = FastAPI(title="Local AI Gateway")
class TextIn(BaseModel):
text: str
@app.post("/summarize")
def summarize(payload: TextIn) -> dict[str, str]:
prompt = f"""
請把下面文字整理成繁體中文短摘要。
限制:最多 5 點,不要編造;如果內容太少,就直接說內容不足。
{payload.text}
"""
return {"result": chat(prompt)}
@app.post("/rewrite")
def rewrite(payload: TextIn) -> dict[str, str]:
prompt = f"請把下面文字改寫得更清楚自然,保留原意:\n\n{payload.text}"
return {"result": chat(prompt)}
啟動:
uv run uvicorn server:app --host 0.0.0.0 --port 8787
在同一個 Wi-Fi 裡,iPhone 可以用 Mac 的區網 IP 呼叫:
http://你的-mac-ip:8787/summarize
Shortcuts 流程大概是:取得分享輸入、Get Contents of URL、Method 選 POST、Request Body 選 JSON、text 欄位放分享文字、顯示 result。
這樣你在 iPhone 上看到一段文章,就可以分享給自己的 Mac 處理。
它不是雲端服務,是你的私人小工具。
七. 不在家也想用?用 Tailscale,不要裸奔開 port #
如果你想在外面也連回 Mac,請不要直接把 port 開到公網。 比較好的做法是用 Tailscale 這類 private mesh VPN:Mac 和 iPhone 都登入同一個 tailnet,然後用 Mac 的 Tailscale IP 呼叫 API。 URL 可能像這樣:
http://100.x.y.z:8787/summarize
但這仍然需要基本保護,至少加一個 token。 例如 FastAPI 檢查 header:
# auth.py
from __future__ import annotations
import os
from fastapi import Header, HTTPException
API_TOKEN = os.environ.get("LOCAL_AI_TOKEN")
def check_token(authorization: str | None = Header(default=None)) -> None:
if not API_TOKEN:
raise RuntimeError("LOCAL_AI_TOKEN is not set")
if authorization != f"Bearer {API_TOKEN}":
raise HTTPException(status_code=401, detail="unauthorized")
endpoint 加 dependency:
from fastapi import Depends
from auth import check_token
@app.post("/summarize", dependencies=[Depends(check_token)])
def summarize(payload: TextIn) -> dict[str, str]:
...
在 iPhone Shortcuts 的 request header 加:
Authorization: Bearer 你的長隨機字串
這不是企業級安全設計,但比完全裸奔好很多。
八. MLX 的角色:不是取代 Ollama,而是補上 Python 實驗能力 #
有 Ollama 了,還需要 MLX 嗎? 拍拍君的答案是:看任務。 Ollama 適合快速下載模型、統一 chat API、CLI 試模型、做日常小工具。 MLX 適合 Apple Silicon 上的 Python 實驗、控制 batch / token / sampling、接 NumPy 或 PyTorch 風格資料流程、研究模型轉換與量化。 可以先安裝:
uv add mlx mlx-lm
跑一個模型:
uv run python -m mlx_lm.generate \
--model mlx-community/Qwen2.5-1.5B-Instruct-4bit \
--prompt "請用繁體中文解釋 MLX 是什麼" \
--max-tokens 200
如果你只是要日常助手,Ollama 比較省心。 如果你想做模型實驗,MLX 比較有趣。 兩者不是敵人,比較像是 Ollama 是萬用插座,MLX 是實驗桌上的電源供應器。
九. 模型選擇:不要迷信最大參數 #
本地 AI 的第一個坑是「模型越大越好」。 不一定。 在 Mac 上,模型選擇通常要平衡 RAM、回覆速度、上下文長度、任務難度、中文能力、coding 能力。 拍拍君會這樣粗分:
日常摘要 / 改寫: 3B ~ 8B
一般問答 / 助手: 7B ~ 14B
coding 輔助: 7B coder ~ 14B coder
長文整理: 看 context window,比參數更重要
大量批次任務: 小模型可能更划算
例如 Ollama 裡可以準備幾種模型:
ollama pull llama3.2
ollama pull qwen2.5-coder:7b
ollama pull gemma3:4b
摘要用快一點的小模型,寫 code 才切 coder 模型。 不要每次都拿大模型打蚊子;工具要常用,速度很重要。
十. 兩個可以立刻用的小工作流 #
工作流 A:iPhone 分享文章 → Mac 摘要 → 回到剪貼簿 #
Mac endpoint 可以這樣設計:
@app.post("/article-summary", dependencies=[Depends(check_token)])
def article_summary(payload: TextIn) -> dict[str, str]:
prompt = f"""
請把下面文章整理成:一句話總結、三到五個重點、值得保留的關鍵詞。
如果文章內容不足,請明確說明。
文章:
{payload.text}
"""
return {"result": chat(prompt, model="llama3.2")}
Shortcut 則是分享輸入 → POST 到 /article-summary → 取出 result → Copy to Clipboard → Show Result。
這個流程很小,但使用感會差很多,因為你不需要打開聊天網站、貼上、等待、再複製。
工作流 B:Mac CLI 改寫剪貼簿 #
macOS 可以用 pbpaste 和 pbcopy:
#!/usr/bin/env bash
set -euo pipefail
TEXT="$(pbpaste)"
uv run python cli.py ask "請把下面文字改寫得更清楚自然,保留原意:
$TEXT" | pbcopy
echo "已改寫並複製到剪貼簿"
存成 local-rewrite,放到 PATH 裡。
之後你可以複製一段草稿,跑 local-rewrite,再直接貼上結果。
如果想更順,可以用 Raycast、Keyboard Maestro、Alfred 或 Shortcuts 綁快捷鍵。
重點不是工具名字,而是把 LLM 放到你原本的操作路徑上。
十一. 監控與安全:本地工具也要有邊界 #
本地服務最常見的問題是昨天可以,今天突然不行。 至少準備幾個檢查:
curl http://localhost:11434/api/tags
curl http://localhost:8787/health
ollama list
FastAPI 可以加一個 health endpoint:
@app.get("/health")
def health() -> dict[str, str]:
return {"status": "ok"}
安全方面,拍拍君建議至少做到:
- 不要把 Ollama API 直接暴露到公網
- 遠端使用請走 Tailscale 或 VPN
- 自己包的 endpoint 加 token
- 不要把 token 寫死在公開 repo
- 不要讓 API 可以任意讀取本機檔案
- 不要隨便把「執行 shell command」功能接給模型
- log 裡避免記錄敏感全文 尤其是工具呼叫很容易玩過頭。 先從「純文字輸入、純文字輸出」開始,等你真的需要,再一個一個加權限。
十二. 拍拍君推薦的漸進式路線 #
如果你想實作,照這個順序比較不容易爆炸:
- 第一天只跑 Ollama:安裝、下載模型、測 CLI、測 API。
- 第二天做 Python CLI:
ask、summarize、rewrite。 - 第三天包 FastAPI:
/health、/summarize、/rewrite、token。 - 第四天接 iPhone Shortcuts:分享文字、呼叫 API、顯示結果、複製到剪貼簿。
- 第五天再玩 MLX:跑一個模型、比較速度與品質、看哪些任務適合搬過去。 不要第一天就研究十個模型格式。 那樣很容易變成模型收藏家,而不是工具使用者。
十三. 常見坑整理 #
模型太大,結果懶得用。 把 chat 當唯一介面,忘記 CLI、快捷鍵、分享選單其實更適合高頻任務。 沒有 system prompt,導致摘要、改寫、格式化任務品質飄來飄去。 沒有 timeout,本地模型卡住時整個工具一起卡。 把安全留到最後,等要連手機時才發現 API 完全裸奔。 這些坑都不難解,但要一開始就有意識。
十四. 跟前面幾篇文章怎麼接起來? #
如果你想補基礎,可以先看這幾篇:
- 超好用的本地LLM: Ollama
- 本地 LLM 實戰:Ollama + Python 打造自己的小助手
- MLX 入門教學:在 Apple Silicon 上跑機器學習
- Python Typer 進階:巢狀 subcommands、callback 與 CLI 架構 今天這篇比較像是把它們串起來。 Ollama 提供模型入口,MLX 提供 Python 實驗能力,Typer / FastAPI / Shortcuts 提供工作流介面,Apple 生態系則提供很自然的跨裝置入口。
結語:本地 AI 的重點是放進生活的縫隙 #
本地 AI 最迷人的地方,不是你可以在終端機裡跟模型聊天。 那只是起點。 真正有用的是:複製一段文字,按快捷鍵就能改寫;在 iPhone 分享文章,幾秒後得到摘要;在 Mac 跑 Python script,批次處理自己的資料;想實驗模型時,用 MLX 直接進 Python 世界。 換句話說,本地 AI 應該變成一種基礎能力。 像 shell、剪貼簿、搜尋、捷徑一樣,不一定每天都很華麗,但要在你需要的地方安靜出現。 拍拍君覺得,這才是 Apple 生態系跑本地 AI 最舒服的方向。 不是追最大模型,不是追最炫 demo,而是把 Mac 的算力、iPhone 的便利、Python 的彈性串在一起,做出你真的會每天用的小工具。