AI 工程

用本地 Coding Agent 取代 Claude Code/Codex 訂閱:照著做的一份實戰設定

每個月被 Claude Code、Codex 的訂閱帳單提醒一次、把整個 codebase 丟到別人家的 GPU 上、沒網路就動不了——如果你也覺得這三件事有點卡,那 Sebastian Raschka(《Build a Large Language Model from Scratch》作者、Ahead of AI 電子報主筆)最近這篇〈Using Local Coding Agents〉值得照著做一遍。

他的結論不浮誇:30–35B 這個級距的開放權重 MoE 模型,已經「足夠」應付很多日常 coding agent 工作。注意是「足夠」,不是「打趴 Opus」。但對工程師來說,「足夠且跑在自己機器上」常常就是分水嶺。這篇就用實戰教學的角度,把他驗證過的設定一步步拆給你照做。

先講清楚:本文數字多為 Raschka 在文章與其 GitHub repo(rasbt/local-coding-agent-evals)回報的實測結果,我沒有自己重跑。版本號(如 Qwen3.6、North Mini Code、Gemma 4)以他文中所列為準;若你查到的 tag 名稱不同,以你 ollama list 看到的為準。

一、它到底在解決什麼

訂閱式 coding agent 很好用,但有三個結構性痛點:

  1. 成本不可預測:用越兇帳單越大,重度使用者一個月燒掉的錢,可能夠買一台二手 Mac Mini。
  2. 資料外送:你的 private repo、密鑰、商業邏輯,全程經過第三方伺服器。對受規範產業(金融、醫療、政府標案)這常常是直接出局。
  3. 離線就廢:飛機上、客戶內網、斷線時,agent 直接罷工。

過去「本地跑 LLM 寫 code」的勸退理由是:小模型笨、大模型跑不動。但 2025–2026 這波 MoE(Mixture-of-Experts)開放權重模型改變了天平——35B 的總參數量、每次只啟用約 3B,等於用「大模型的知識量」配「小模型的速度」。Raschka 這篇就是去驗證:這個天平到底翻過去了沒。

二、運作原理:本地化只動「最底下那一層」

要照做,得先有正確的心智模型。一個 coding agent 不是單一個東西,它是三層疊起來的(這也是 Hugging Face agent glossary 的拆法):

  • Harness(執行循環):CLI 工具本身——Codex、Qwen-Code、Claude Code。負責呼叫模型、解析 tool call、決定何時停、處理錯誤。
  • API 接口:harness 與模型溝通的協定,絕大多數採 OpenAI 相容格式
  • Model(模型):真正生成 token 的 LLM。

雲端版本,是 harness 把請求送到供應商的伺服器。「本地化」做的事很單純:只把最底層的 model,換成跑在你 localhost 上的開放權重模型,上面兩層幾乎不動。 因為大家都講 OpenAI 相容協定,你只要把 harness 的 endpoint 從供應商網址改成 http://127.0.0.1:11434/v1,整條鏈路就接上了。

本地 coding agent 三層運作堆疊與資料流

中間那層「推理後端」就是把模型權重載入、對外開一個 OpenAI 相容 port 的程式。Raschka 主推 Ollama,理由很實際:跨 macOS/Linux/Windows、命令列就能裝、預設就開 OpenAI 相容 API。其他選項他也點名:LM Studio、vLLM、SGLang、MLX。其中 MLX 是 Apple Silicon 專屬的優化路徑,在 Mac 上拉模型時要挑 -mlx 變體。

為什麼 MoE 模型能在 Mac Mini 上跑得動

關鍵在「啟用參數」。Qwen3.6 35B-A3B 的 A3B 意思是 active 3B——35B 的權重全載進記憶體(所以吃 RAM),但每生成一個 token 只有約 3B 參數真的參與運算(所以速度像小模型)。這就是它能在一台 Mac Mini M4 上跑出堪用速度的原因。

三、手把手:把本地 agent 接起來

以下是照著文章與 repo 可以複製的流程。先準備好硬體心理預期:Raschka 的測試機是 Mac Mini M4(Apple Silicon,統一記憶體)和一台 DGX Spark(Linux)。有意思的是,他自己幾乎都把 agent 跑在 DGX 上,把 Mac 留給其他工作、也避免長時間推理讓 Mac 過熱。

Step 1:裝 Ollama、拉模型

# 先到 ollama.com 安裝,然後拉模型
# macOS(Apple Silicon):挑 MLX 變體更快
ollama pull qwen3.6:35b-mlx

# Linux / GPU 機器
ollama pull qwen3.6:35b

下載約 22GB,執行時需要約 30–40GB RAM。如果你的機器只有 16GB,這顆會吃不下——這是要先算清楚的硬門檻。Ollama 起來後,OpenAI 相容 API 預設就在 http://127.0.0.1:11434/v1

Step 2A:接 Qwen-Code(Qwen 原廠 harness)

git clone https://github.com/QwenLM/qwen-code.git
cd qwen-code
npm install && npm run build

第一次跑 qwen 進設定,選 Custom Provider → OpenAI-compatible,填:

  • API endpoint:http://127.0.0.1:11434/v1
  • Provider name:ollama
  • Model:qwen3.6:35b

接著務必把對外回報關掉。編輯 ~/.qwen/settings.json

{
  "privacy": { "usageStatisticsEnabled": false },
  "telemetry": { "enabled": false, "logPrompts": false },
  "general": { "enableAutoUpdate": false }
}

logPrompts: false 這行特別重要——本地化的初衷就是不要把 prompt 外送,別讓 harness 的遙測偷偷把它送出去。

Step 2B:接 Codex(讓 OpenAI CLI 跑你的本地模型)

Codex 支援自訂 provider。在 ~/.codex/ 下設一個 profile(檔名如 ollama.config.toml)指向本地 Ollama:

model = "qwen3.6:35b"
model_provider = "ollama"
model_reasoning_effort = "high"

model_reasoning_effort = "high" 是這類 agent 任務值得先開的設定——多花一點 token 換更穩的推理,對需要連續 tool call 的編碼任務通常划算。

Step 3(進階):跨機跑——用 SSH tunnel 把遠端模型當本地

如果你像 Raschka 一樣,模型跑在另一台機器(GPU 主機/DGX),但想在筆電上敲指令,用一條 SSH tunnel 把遠端的 11434 port 轉到本地就好:

ssh -N -L 11434:127.0.0.1:11434 user@your-gpu-host

跑起來之後,筆電上所有 harness 仍然指向 127.0.0.1:11434,完全無感——但運算其實在遠端那台。這招對「重模型放工作站、人坐咖啡廳」的工作型態很實用。

Step 4:自己量一遍,別只信別人的數字

repo 附了三組可重跑的 benchmark,建議照做來校準你自己的硬體:

# 速度與記憶體(prefill/decode 速度、wall time、長 prompt 下的記憶體)
uv run speed-memory-benchmark/ollama_speed_memory_bench.py --model qwen3.6:35b-mlx

# 硬核 tool-reasoning:5 題,只看模型有沒有做對工具決策(不實際執行)
python3 hard-tool-reasoning-benchmark/ollama_hard_reasoning_bench.py --model qwen3.6:35b

第三組是 Agent Problem Pack:在隔離 workspace 裡丟 5 個小型 coding 任務,實測 agent 真的能不能把事做完。這比看 SWE-bench 分數更貼近你的日常。

Step 5:用小模型的 prompt 心法

35B 級的本地模型不是 Opus,硬塞「幫我把整個專案重構成微服務」這種大題目,它會崩。要把它用好,關鍵是把任務切到它接得住的大小。幾個照著就有感的招式:

  • 一次只給一個明確任務。與其「順便把測試也補一補、再把 lint 修掉」,不如拆成三輪各跑一次。小模型在單一目標上的成功率遠高於多目標。
  • 明確點名檔案與函式路徑,例如「修改 src/auth/token.py 裡的 refresh_token(),讓它在過期時回傳 401」。不要讓它自己在大 codebase 裡漫遊找檔案——那會吃光 context、也容易跑偏。
  • 主動控制 context 長度。長 context 會直接推高 RAM(前面提過 50k context 時記憶體會跳到 20–29GB)並拖慢 decode。完成一個段落就清掉對話、或用 harness 的 /compact 類指令壓縮歷史,比讓它無限累積更穩。
  • 先讓它講計畫、你確認、再動手。要求「先列出你打算改哪些檔案與步驟,等我說 go 再執行」。這在小模型上能擋掉不少「自信地改錯地方」的情況。
  • 給範例勝過給形容詞。要它輸出特定格式時,貼一段你要的樣子,比寫「請寫得乾淨一點」有效太多。

這些技巧在雲端旗艦上是「加分」,在本地小模型上常常是「能不能用」的分界。

四、數據與限制:誠實版

先看速度。Qwen3.6 35B-A3B 在 Mac Mini M4 約 40 tok/s、DGX 約 30 tok/s(作者回報)。Raschka 給的及格線是:「比 20–30 tok/s 快,對本地 agent 工作就算合理」。換句話說,這顆已經過線——本地化不必然拖慢你。

harness × 模型 5 題實測對照

再看能力。在那組 5 題 agent pack 上(作者回報):

  • Qwen3.6 35B-A3B:Qwen-Code 4/5、Codex 5/5
  • North Mini Code 1.0(他口中「同級最有意思的替代品」):Qwen-Code 4/5、Claude Code 5/5
  • Gemma 4 E2B(約 8GB RAM 就跑得動):agent 任務 0/5——小歸小,但拿來當 agent 不行。

這裡有兩個比「分數」更值得記住的洞察:

洞察一:token 用量是 harness 決定的,不是模型。 同一批任務,Claude Code 平均吃掉最多 token、Codex 最少。差異主要來自 harness 怎麼組 context、塞多少 system prompt,而不是底層 LLM。你選哪個 harness,直接影響本地推理的負擔。

洞察二:別預設「原廠 harness 配原廠模型最佳」。 最反直覺的一筆是——Qwen3.6 透過 Codex 跑,反而比透過自家的 Qwen-Code 更好。這代表 harness 與模型的搭配是要實測的經驗問題,不是查表就有答案。

限制也要講白:

  • 天花板還在訂閱那邊。Raschka 沒有說本地打趴雲端;他明說最頂的閉源模型仍然更強。最強的開放權重(他文中點名 GLM 5.2 一類)又「太大,消費級硬體跑不動」。本地是「夠用」,不是「最強」。
  • RAM 是真門檻。30–40GB 起跳,且長 context 下會浮動(他測 50k context 時記憶體在 20–29GB 間跳)。16GB 機器基本無緣這個級距。
  • 5 題是小樣本。這是快速校準用的 smoke test,不是 SWE-bench 規模的權威評測。把它當「方向對不對」的指標,不是「贏幾分」的排行榜。

五、什麼時候該用、什麼時候別用

適合切到本地的場景:

  • repo 不能外送(合規、客戶 NDA、敏感程式碼)。
  • 需要離線(飛機、內網、現場)。
  • 重度使用、訂閱費已經很有感,且你手上有 ≥32GB RAM 的 Apple Silicon 或一台 GPU 機。
  • 偏「樣板化、上下文中等」的工作:重構、寫測試、補型別、改 lint、跑遍小修補。

還是乖乖用訂閱的場景:

  • 吃硬推理的難題(複雜架構設計、跨檔案大重構、刁鑽 debug),天花板仍在 Opus/GPT 旗艦那邊。
  • 機器只有 16GB RAM,或不想讓筆電長時間滿載發燙。
  • 你的價值是速度,而本地那 40 tok/s 還是讓你等得不耐煩。

務實的折衷是混用:日常樣板工作交給本地模型(省錢、保密、離線可用),真正難的題目再切回雲端旗艦。harness 那層不用換,只切 model 設定就好——這正是三層架構的好處。

六、對工程團隊的意義

  1. 先量自己的硬體,不要照搬數字。 把 repo 那三組 benchmark 在你團隊的標準機上跑一遍,得出你們自己的 tok/s 與通過率,再決定要不要鋪開。
  2. 把「換 harness」當成可調參數。 既然 Qwen3.6 在 Codex 上比 Qwen-Code 好,團隊值得用自己的真實任務做一輪 harness × model 的小型對照,找出最佳組合,而不是預設原廠配對。
  3. 本地化要連遙測一起做完。 把 prompt 外送關掉(logPrompts: false、停用 usage statistics)才算真的「資料不出網」,否則本地化只做了一半。
  4. 用 SSH tunnel 把重模型集中化。 一台共用 GPU 工作站 + 團隊成員 tunnel 過去,比每人塞一顆 35B 進筆電更省資源,也更好管。
  5. 定位成「成本與隱私的下層保險」,而不是「全面取代雲端」。把它當預設承接日常工作的那一層,難題保留升級路徑——這個分工最穩。

七、來源

整理:DataAgent · Coding Agent 實戰教學

發表迴響

%d 位部落客按了讚: