opencode×AI-Math
課後延伸

在自己電腦上跑本地模型

本地模型把推論工作放在自己的電腦上,由 Ollama 載入模型,OpenCode 負責接收你的任務與操作工具。這一章練習如何連接兩者,以及怎麼確認 agent 真的完成了工作。

如果目的是完成工作坊,沿用 opencode/big-pickle 即可。本地路線適合想研究模型設定,或需要讓推論資料留在自己電腦上的同學;使用外部工具時,仍要留意它會把哪些內容送上網。

先看自己的需求與電腦

本地模型需要下載權重,執行時也會占用記憶體。模型檔案放得下,不代表執行時的記憶體一定夠。 對話變長、可用的工具變多,都可能增加負擔。

  • 有獨立顯示卡時,留意顯示卡記憶體;沒有時,留意一般記憶體與其他程式的用量。
  • 先從短對話與小任務開始。載入很慢、系統明顯卡住,就縮小任務、換較小模型,或回到網路模型。
  • 挑模型時,同時檢查大小與 tool calling 能力。tool calling 是模型依照工具定義提出操作請求,例如讀檔或執行指令。

模型名稱或大小本身不能保證能做好 agent 任務。可以先看 Ollama 的 tools 模型清單,再依後面的檢查流程確認自己的選擇。

安裝 Ollama

請在和工作坊相同的環境中操作。原生 Windows 練習就用 Windows 版;WSL 練習就把 Ollama 裝在 WSL,先避免跨兩個系統連接。

Windows 與 macOS

從 Ollama 官方下載頁 安裝對應版本,開啟 Ollama。Windows 安裝後請重開 PowerShell,讓終端機能找到新指令。

Linux/WSL

在 Ubuntu 終端機執行官方安裝指令:

curl -fsSL https://ollama.com/install.sh | sh

如果系統由 systemd 管理服務,可以查看狀態:

systemctl status ollama

按 q 離開狀態畫面。其他啟動方式請依 Ollama Linux 說明 操作。

確認指令可用

ollama --version
ollama list

ollama list 是已下載的模型清單。尚未下載時,沒有模型列出是正常的;不是要另外申請帳號。

先讓模型能聊天,再檢查工具能力

在模型頁選好一個完整名稱後,用 ollama pull 下載,再用 ollama run 開始短對話。兩個指令後面都要接你選的模型名稱。下面的完整設定範例提供可照抄的寫法。

聊天時問一個簡單問題,確認有回應後輸入 /bye 離開。接著用 ollama show 加上同一個模型名稱,查看 Capabilities 是否包含 tools。

你要找的是這類資訊:

Capabilities
  completion
  tools

有 tools 代表提供工具呼叫介面,還要再用實際任務檢查模型是否會正確使用它。如果出現 does not support tools,先重新確認模型能力;不要靠改 OpenCode 的顯示名稱來繞過。

Context 是什麼,為什麼兩邊都要設定

Context 是模型一次能讀到的內容,包括你的需求、對話、檔案內容與工具說明。Token 是模型切分文字的單位,不能直接把 token 數當成中文字數。

這裡有兩個需要配合的設定:

設定管哪一件事
Ollama 的 num_ctx模型實際載入多少 context 空間
OpenCode 的 limit.context告訴 OpenCode 模型能接收多少內容,以便管理對話

只改 OpenCode,不會替 Ollama 配好記憶體。兩邊不一致時,OpenCode 可能仍繼續送出模型放不下的內容。不要只看「沒有錯誤訊息」就判定設定成功,請看模型載入後的狀態。

完整範例:用 Modelfile 固定 context,再接到 OpenCode

這份範例沿用 qwen3.5:9b-q4_K_M 與 32768 的 context 設定,方便逐項對照。它是設定範例,不是每台學生筆電都適合的建議;記憶體不足時請停止載入,改選較小模型。換模型時,以下名稱都要一起調整。

下載並試一段短對話

ollama pull qwen3.5:9b-q4_K_M
ollama run qwen3.5:9b-q4_K_M

對話裡輸入 /bye 離開,再檢查能力:

ollama show qwen3.5:9b-q4_K_M

建立固定設定的模型名稱

在工作坊專案裡建立 Modelfile,沒有副檔名,內容如下:

FROM qwen3.5:9b-q4_K_M
PARAMETER num_ctx 32768

回到終端機,逐行執行:

ollama create qwen3.5-32k -f ./Modelfile
ollama show --parameters qwen3.5-32k

參數輸出應有 num_ctx 32768。這個新名稱讓你可以保留原模型,分開使用不同 context 設定。

在專案設定中登錄 provider

先另存一份原本的 opencode.json,例如 opencode-cloud.json.bak,方便比較與還原。在原檔加入下面的 provider 區塊,其他既有的規則與權限保留。若你還沒加其他設定,下面是可對照的完整範例:

{
  "$schema": "https://opencode.ai/config.json",
  "model": "opencode/big-pickle",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama (local)",
      "options": { "baseURL": "http://localhost:11434/v1" },
      "models": {
        "qwen3.5-32k": {
          "name": "Qwen3.5 local",
          "tool_call": true,
          "limit": { "context": 32768, "output": 8192 }
        }
      }
    }
  },
  "permission": { "bash": "ask", "edit": "ask", "webfetch": "ask" },
  "instructions": ["AGENTS.md"]
}

baseURL 是 Ollama 的本機服務位址;這個相容介面的網址要包含 /v1。models 下的名稱必須與 ollama list 相同;name 只是顯示文字。

這裡先保留網路模型為預設。確認設定能被讀取:

opencode models ollama

清單應出現 ollama/qwen3.5-32k。接著啟動 opencode,用 /models 選擇它,並確認畫面標示為本地模型。

看實際載入的 context

送出一個簡短問題,讓模型載入。它還在執行或留在記憶體裡時,另開同一環境的終端機:

ollama ps

檢查 CONTEXT 是否與 32768 相符,同時留意 PROCESSOR 與系統是否卡頓。如果數字不符,先查看原本是否另設了 OLLAMA_CONTEXT_LENGTH;請選一種設定方式管理,避免互相覆蓋。

降低 context 時,修改 Modelfile 後重新執行 ollama create,並同步調整 OpenCode 的 limit.context。若仍無法穩定執行,就先回到網路模型。

最後一關:它真的有建立檔案嗎

模型能回話、清單能列出名字,都還不代表 agent 任務完成。先確認畫面目前選的是 ollama/... 本地模型。 如果仍顯示 Big Pickle,先展開上一節完成連接與模型切換;否則測到的是網路模型。確認後,在 OpenCode 的互動模式中貼上:

請讀 AGENTS.md,再建立 local_hello.py,內容是印出 1 到 10 的平方。
用 uv run python local_hello.py 實際執行。
完成後回報你寫入的檔案與執行指令;沒有成功的部分請明說。

逐次閱讀並回答權限要求。看工具紀錄是否真的有讀檔、寫檔與執行,接著在終端機自己核對:

uv run python -c "from pathlib import Path; p=Path('local_hello.py'); print('檔案存在:', p.is_file()); print(p.read_text(encoding='utf-8') if p.is_file() else '尚未建立')"
uv run python local_hello.py

檔案內容應計算並印出平方數。輸出可以分行,也可以排成一列;順序應是:

1 4 9 16 25 36 49 64 81 100

請看清楚兩件事:程式是不是自己執行後真的得到這個結果,以及 agent 有沒有把失敗的步驟說成完成。這個小任務跑通後,再試讀取一個已完成的 Lab,先不要一次要求重寫整個專案。

只有文字回覆,卻沒有動手

模型可能只印出一段指令,或說檔案已寫好卻沒有實際呼叫工具。先把任務縮小成「讀這個檔案並說明內容」,再逐步增加寫檔與執行。

可以在 AGENTS.md 補上簡短要求:

## 執行與回報

- 需要讀檔、寫檔或執行時,使用目前提供的對應工具。
- 印出指令不代表已經執行;只回報工具實際產生的結果。
- 任務沒有完成時,說明停在哪一步,不要補造輸出。

規則可以提醒模型,但不能補足所有能力差距。確認設定、縮小任務後仍做不到,就換模型或回到工作坊的網路模型,不必一直修改同一份設定。

卡住時先查這幾項

看到的情況下一步
找不到 ollama 指令安裝後重開終端機,再試 ollama --version
connection refused確認 Ollama 已開啟,且和 OpenCode 在同一個環境
找不到模型或 404對照 ollama list、設定中的模型名稱與 /v1 網址
does not support tools用 ollama show 檢查能力,改選支援工具的模型
CONTEXT 和設定不符檢查 Modelfile、環境變數與實際載入的模型名稱
系統變得很慢停下任務,縮小 context 或換較小模型;不要只增加等待時間
只印出指令或宣稱完成查實際檔案與工具紀錄,把任務縮成一步再試
忘記先前的要求將重點寫進 notes/progress.md,換新對話重讀;參考 需求與續作

接著怎麼用

成功後,把自己的模型名稱、設定方式和成功指令記在 notes/。不要把自己的速度或記憶體用量當成同學電腦也能達到的結果。

參考資料