跳到主要內容

LV.07

召喚本地模型

十分鐘,在你的電腦上開診

BOSS
環境變數迷宮守衛
時間
約 60 分鐘
建議先過
LV.01 、LV.06

這一關要打倒什麼?

Boss 是「環境變數迷宮守衛」,招式只有一招:反覆對你說 command not found。它的本體不是魔王,而是路徑(PATH)設定。

類比一下:PATH 像是醫院分機簿。你在電話上說「接放射科」,總機要知道去哪裡找這個分機;找不到,就回你「查無此分機」。Terminal 找不到指令,意思相同。

這一關要完成的事很單純:在你的電腦上,從零開始跑起一個本地模型,並跟它說上話。

版本資訊截至 2026-10:Ollama 穩定版 v0.35.1(2026-09-29,出處 github.com/ollama/ollama/releases);mlx-lm 0.32.0(PyPI,2026-10-01)。作者的實測環境為 M5 32GB、macOS 27.0.1,Ollama 0.35.1(Homebrew)。你的版本可能不同,指令也可能微調,請以官方文件為準。

先講為什麼:跑一個模型需要哪些零件?

一個本地 LLM 要說話,至少要三個零件:

  1. 權重:模型本身的大檔案(上一關算過大小)。
  2. 推論引擎(inference engine):把權重讀進記憶體、一個字一個字算出來的程式。
  3. 介面:聊天視窗、命令列,或是給別的程式呼叫的 API。

工具的差別,就是這三者怎麼打包。

工具介紹

Ollama

  • 授權 MIT;macOS 版需要 macOS 14 以上(官方 macOS 文件)。
  • 有小 App,也有 CLI(命令列)。
  • 引擎部分:根據 release note,在 Apple Silicon 上,MLX runtime 支援的模型架構(清單含 gemma4、qwen3.5 等)會自動走 MLX,其他走 llama.cpp。所以舊說法「Ollama 底層 = llama.cpp」不再完整,要說「視模型而定」。
  • 預設提供與 OpenAI 相容格式的本機 API,這點在 LV08 會用到。

LM Studio

  • 桌面 App,GUI 最友善:搜尋、下載、聊天、啟動本機 server 都在同一個畫面。
  • 同時有 MLX 與 llama.cpp 兩種引擎。
  • 它是免費使用的專有軟體(不是開源),lms 命令列工具則是 MIT。
  • 2026 年起官方品牌上同時有 Bionic 與 LM Studio,下載入口請務必確認是你要的那一個(作者的研究筆記標為「需確認」)。

mlx-lm

  • Apple 的 MLX 生態系的命令列/Python 工具,只能在 Apple Silicon 使用。
  • 主要指令:mlx_lm.chat(互動聊天)、mlx_lm.generate(單次生成)、mlx_lm.server(本機 API)。後面訓練(LV13)也靠它。

不建議主推的

  • GPT4All:依 GitHub 日期,最近一次發行是 2025-02、repo 約 16 個月沒有更新,實質停滯。
  • Open WebUI:功能齊全,但授權是自訂版本,含品牌保護條款,不能寫成 MIT 或 Apache。只是自己用沒問題,教學上不當主線。

實作

🍎 Mac 路線 A:LM Studio(最不需要打指令)

  1. 到 LM Studio 官網下載並安裝(請確認下載頁是 LM Studio 本體)。
  2. 開啟後,在搜尋欄找 Gemma 4 E4B 或 Qwen3.5-4B 的 4-bit 版本,下載。16 GB Mac 建議從這個等級開始。
  3. 載入模型,在聊天框輸入:「用三句話向國中生說明什麼是血壓。」
  4. 觀察回覆速度(tok/s)與記憶體壓力。
  5. 開啟 Developer 頁籤的本機 server,記下它顯示的網址與連接埠。

🍎 Mac 路線 B:Ollama + curl

先安裝(以 Homebrew 為例;也可以下載官方 App):

brew install ollama
ollama --version

逐行解釋:

  • brew install ollama:用 Homebrew 套件管理器安裝 Ollama。
  • ollama --version:確認安裝成功並顯示版本;若出現 command not found,重開一個新的 Terminal 視窗再試。

接著下載並開始對話:

ollama run gemma4:e2b
  • ollama run:如果模型還沒下載就先下載,再進入互動聊天。
  • gemma4:e2b:模型名稱與標籤。這個名稱只是示範格式,請到 Ollama 官方模型庫確認目前實際的標籤。
  • 離開聊天輸入 /bye。

作者的實測:Gemma 4 E2B 預設會輸出一段英文的思考過程(thinking),這在下一關會影響結果,先有印象即可。

再用 API 呼叫。先在另一個 Terminal 視窗確認服務有開,然後:

curl http://localhost:11434/api/generate -d '{
  "model": "gemma4:e2b",
  "prompt": "用一句話說明什麼是高血壓。",
  "stream": false
}'

逐行解釋:

  • curl:命令列版的網路請求工具。
  • http://localhost:11434:localhost 代表你自己的電腦,11434 是 Ollama 預設連接埠。請求沒有送出你的電腦。
  • -d '{...}':要送出的資料,是 JSON 格式。
  • "model":要用哪個模型,要和你下載的名稱一致。
  • "prompt":你的問題。
  • "stream": false:一次回傳完整答案,而不是一個字一個字送。

🍎 Mac 路線 C(進階):mlx-lm

python3 -m venv ~/llm-env
source ~/llm-env/bin/activate
pip install mlx-lm
mlx_lm.generate --model <你要用的 MLX 模型> --prompt "Hello" --max-tokens 50
  • 第 1–2 行:建立並啟用虛擬環境(venv),把套件裝在獨立的資料夾,不會弄亂系統的 Python。
  • pip install mlx-lm:安裝套件。
  • --model:填入 Hugging Face 上的 MLX 模型名稱(例如 mlx-community 底下的版本)或本機資料夾。這裡刻意不寫死,因為名稱常變。
  • --max-tokens 50:限制最多產生 50 個 token,先確認流程通了。

☁️ Colab:Unsloth 載入同一模型並 generate

在新的 notebook 先切換到 GPU runtime(通常分到 T4,但官方不保證),然後依本站 Colab notebook(改寫自 Unsloth 官方 Gemma 4 notebook)的寫法:

from unsloth import FastModel

model, tokenizer = FastModel.from_pretrained(
    model_name="unsloth/gemma-4-E2B-it",
    max_seq_length=2048,
    load_in_4bit=False,  # T4 出現 CUDA out of memory 時改成 True
)
msgs = [{"role": "user", "content": "用一句話說明什麼是高血壓。"}]
inputs = tokenizer.apply_chat_template(
    msgs, add_generation_prompt=True, return_tensors="pt",
    tokenize=True, return_dict=True, enable_thinking=False,
).to("cuda")
out = model.generate(**inputs, max_new_tokens=60)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))

逐行解釋:

  • FastModel.from_pretrained:載入模型與分詞器(tokenizer)。Gemma 4 是多模態模型,Unsloth 用 FastModel 載入;unsloth/gemma-4-E2B-it 和 Mac 上 gemma4:e2b 是同一個基底模型。
  • max_seq_length:最長可處理的 token 數。
  • load_in_4bit=False:本站 notebook 的預設;若 T4 記憶體不足,改成 True 用 4-bit 量化載入。
  • apply_chat_template:把問題包成 Gemma 4 的對話格式;enable_thinking=False 關閉思考模式(理由見下一關)。
  • .to("cuda"):把輸入送到 GPU。
  • generate 與 decode:產生新 token,再只把新產生的部分轉回文字。

Unsloth 的 API 會更新,若執行出錯,請以官方 notebook 為準(見 unsloth.ai/docs)。

限制提醒:Colab 的運算在 Google 的伺服器上。這一章你輸入的是無害的衛教問題,沒有問題;但本站從 LV08 開始,處理病歷類文字一律使用合成資料。真實病歷即使在本機執行,也需要院方核准與倫理審查(IRB);本地不等於合法。

該選哪個工具?

三個問題幫你決定:

  1. 你想不想碰 Terminal? 不想:LM Studio。願意嘗試:Ollama。
  2. 你之後要不要自己訓練? 要:一定會用到 mlx-lm(Mac)或 Unsloth(Colab),建議至少試過一次命令列。
  3. 你要不要用程式呼叫模型? 要:Ollama 與 LM Studio 都有本機 API,用法相近,選順手的即可。

作者的建議是兩個都裝:LM Studio 用來快速試模型、看速度;Ollama 用來寫程式與後面的匯入。裝兩個不衝突,只是要留意各自會存一份模型,硬碟空間會被吃掉(單一模型常見數 GB 起跳)。

常見故障排除

  • command not found:重開 Terminal;確認安裝;必要時檢查 PATH。
  • 記憶體壓力變紅:換小一級的模型或量化,並關掉瀏覽器分頁。
  • Ollama 與其他程序同時吃記憶體:作者曾在 32 GB Mac 上遇過 26B 模型加上另一個程序導致 Metal 記憶體不足(OOM),單獨跑才正常。
  • 自己匯入的模型看不到:若 server 設了自訂的 OLLAMA_MODELS 路徑,client 端 ollama create 寫入的位置可能不同。

本關重點

  • 本地模型 = 權重 + 推論引擎 + 介面;各工具只是打包方式不同。
  • Ollama 在 Apple Silicon 視模型架構自動走 MLX 或 llama.cpp(截至 2026-10);LM Studio 有雙引擎與 GUI;mlx-lm 是命令列與 Python 工具。
  • 呼叫本機 API 的資料送到 localhost,沒有離開你的電腦;但下載模型要連網。
  • Colab 的運算在 Google 伺服器,真實病歷不適合放;本站一律用合成資料,本地也不等於合法。
  • 看到 command not found 先想安裝與 PATH,不要先怪模型。

BOSS 戰:環境變數迷宮守衛

HP0/4
  1. 你在 Terminal 輸入 `ollama run ...` 卻看到 `command not found`。最可能的原因是什麼?

  2. 關於 Ollama 在 Apple Silicon 上的底層引擎,下列敘述何者較符合截至 2026-10 的資訊?

  3. 你用 `curl` 呼叫本機的 Ollama API 做摘要,資料有沒有離開你的電腦?

  4. 在 Colab 上載入模型並 generate,和在 Mac 上用 Ollama 跑最大的差別是什麼?