2026年10月4日 星期日

讓 BRIX 開機就提供 Ollama 服務:systemd 自動啟動與 SSH 測試紀錄

智慧生活科技|本地 AI 服務實作

讓 BRIX 開機就提供 Ollama 服務:systemd 自動啟動與 SSH 測試紀錄

把 GIGABYTE BRIX GB-BTIP-N150 設定成家中的本地 AI 主機後,若每次開機都要登入 Ubuntu 再手動執行 ollama serve,使用上並不方便。本次透過 Ubuntu 的 systemd 服務管理器,讓 Ollama 在開機後自動啟動,並從 Windows CMD 透過 SSH 驗證服務。

測試環境與目標

  • 主機:GIGABYTE GB-BTIP-N150,16GB 記憶體。
  • 作業系統:Ubuntu 26.04.1 LTS。
  • Ollama 版本:0.35.1。
  • 模型:qwen3:4b-instruct-2507-q4_K_M。
  • Windows 端透過 SSH 連線,之後可再由 Python 程式建立 SSH 隧道呼叫模型。

目標是讓 Ollama 成為 Ubuntu 的系統服務:即使 BRIX 尚未登入桌面,服務也能在開機時啟動,等待 Windows 端連線。

一、確認 Ollama 執行檔位置

先透過 SSH 登入 BRIX,在 Ubuntu shell 查詢 Ollama 路徑:

which ollama

建立 systemd 服務時,ExecStart 必須填入這個指令顯示的實際路徑,再加上 serve。例如路徑若為 /usr/local/bin/ollama,服務啟動指令就是 /usr/local/bin/ollama serve。

二、建立 Ollama systemd 服務

本機原本沒有 ollama.service,因此手動建立服務設定檔:

sudo nano /etc/systemd/system/ollama.service

服務以 nfusrai 帳號執行,並指定該帳號的家目錄,使服務可使用同一帳號下載的模型。API 綁定在 localhost,Windows 端仍透過 SSH 隧道連線。

[Unit]
Description=Ollama Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nfusrai
Group=nfusrai
Environment="HOME=/home/nfusrai"
Environment="OLLAMA_HOST=127.0.0.1:11434"
ExecStart=/usr/local/bin/ollama serve
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
路徑提醒:上例的 /usr/local/bin/ollama 要依照 which ollama 的結果調整。存檔時在 nano 按 Ctrl+O、Enter,再按 Ctrl+X 離開。

三、啟用服務並立即測試

重新載入 systemd 設定,並啟用服務。enable 會設定開機自動啟動;--now 也會立刻啟動服務:

sudo systemctl daemon-reload
sudo systemctl enable --now ollama

查看服務狀態與 API 版本:

systemctl is-enabled ollama
systemctl is-active ollama
curl http://127.0.0.1:11434/api/version

本次服務狀態回報 enabled、active,API 回傳:

{"version":"0.35.1"}

四、重開機驗證不需登入

為確認服務確實能在重新開機後自行啟動,執行:

sudo reboot

BRIX 重開機時 SSH 會中斷。等待主機重新上線後,從 Windows CMD 重新登入:

ssh nfusrai@192.168.1.114

登入後再次檢查:

systemctl is-enabled ollama
systemctl is-active ollama
curl http://127.0.0.1:11434/api/version
重開機後的實際結果:
is-enabled:enabled
is-active:active
API:{"version":"0.35.1"}

這表示 Ollama 已在 BRIX 開機後自動啟動,不必先登入 Ubuntu 桌面,也不必手動執行 ollama serve。

五、SSH 密碼輸入失敗的原因

重開機後,Windows CMD 曾連續出現 Permission denied。後來確認原因不是 SSH 服務故障,也不是 Ollama 設定問題,而是 Windows 輸入法當時停在中文模式,輸入的密碼字元與實際密碼不同。切換回英文輸入模式後,SSH 即成功登入。

Linux 終端機輸入密碼時不會顯示星號或文字,因此畫面沒有變化是正常的。輸入前應切換為英文/半形模式,並留意 Caps Lock 與鍵盤配置;輸入完成後按 Enter。

六、這次測試的結論

BRIX 已設定好開機自動執行 Ollama。Ubuntu 桌面即使停在登入畫面,systemd 仍會在背景啟動 Ollama 服務;Windows 可在主機開機並連上網路後,透過 SSH 登入或由 Python 自動建立 SSH 隧道,呼叫 minPC 上的模型。

智慧生活科技專業社群|GIGABYTE BRIX × Ubuntu systemd × Ollama × SSH

用 Python 透過 SSH 呼叫 mini PC 上的 Ollama,生成一篇小故事

智慧生活科技|Python 與在地 AI 實作

用 Python 透過 SSH 呼叫 mini PC 上的 Ollama,生成一篇小故事

如何讓 Windows 電腦透過 Python 使用另一台 Ubuntu mini PC 上的本地 AI 模型?本文以 GIGABYTE BRIX GB-BTIP-N150 為例,示範 Python 自動建立 SSH 隧道、呼叫 Ollama API、接收繁體中文故事,並在程式結束時自動關閉連線。

一、測試架構與準備條件

本次由 Ubuntu mini PC 執行 Ollama 與語言模型,Windows 電腦則執行 Python 程式。SSH 負責建立加密連線與本機埠轉送;Python 將問題送到 Windows 本機轉送埠,SSH 再把請求帶到 minPC 的 Ollama。

  • mini PC:GIGABYTE GB-BTIP-N150,Ubuntu,IP 位址 192.168.1.114。
  • Ollama API:minPC 上的 127.0.0.1:11434。
  • 模型:qwen3:4b-instruct-2507-q4_K_M,需先在 minPC 下載完成。
  • Windows 電腦:已安裝 Python 與 OpenSSH,用 CMD 執行程式。
  • 帳號:SSH 使用者 nfusrai。
重要:執行前請確認 minPC 上的 Ollama 正在運作、模型已下載,而且 Windows 能以 ssh nfusrai@192.168.1.114 登入 mini PC。本程式使用 SSH 隧道,不必將 Ollama API 直接開放到區域網路。

二、Python 如何建立 SSH 隧道

程式使用 Python 標準函式庫 subprocess 啟動 Windows 的 ssh 用戶端。SSH 指令的核心如下:

ssh -o ExitOnForwardFailure=yes -N -L 127.0.0.1:11436:127.0.0.1:11434 nfusrai@192.168.1.114
  • -N:只建立轉送,不在 mini PC 上執行互動式命令。
  • -L 127.0.0.1:11436:127.0.0.1:11434:把 Windows 本機的 11436 埠轉送到 SSH 主機端的 11434 埠。
  • nfusrai@192.168.1.114:指定登入 mini PC 的帳號與 IP。
  • ExitOnForwardFailure=yes:如果本機轉送埠無法建立,就讓 SSH 明確失敗。

程式啟動時,SSH 會在同一個 CMD 視窗要求輸入密碼。通過驗證後,Python 會每隔半秒測試一次 /api/version,最多等待 60 秒;確認 API 可連線後,才開始詢問使用者要生成什麼內容。

三、Python 如何呼叫 Ollama API

SSH 隧道建立後,Python 不直接連到 minPC 的 IP:11434,而是向 Windows 本機的 http://127.0.0.1:11436/api/generate 發送 HTTP 請求。SSH 會自動將這筆資料轉送到 minPC 的 Ollama。

請求內容包含模型名稱、系統提示詞、使用者問題、是否串流,以及輸出 token 上限。程式以 json.dumps(..., ensure_ascii=False) 保留中文,再用 UTF-8 編碼送出。

四、完整 Python 程式

將以下程式存成 test_ollama_ssh_windows.py。這支程式不需安裝額外 Python 套件。

#!/usr/bin/env python3
"""自動建立 SSH 隧道,從 Windows 呼叫 BRIX 上的 Ollama。"""
import json
import subprocess
import sys
import time
import urllib.error
import urllib.request

SSH_HOST = "nfusrai@192.168.1.114"
LOCAL_PORT = 11436  # 避開既有測試常用的 11435
MODEL = "qwen3:4b-instruct-2507-q4_K_M"
API_URL = f"http://127.0.0.1:{LOCAL_PORT}/api/generate"
VERSION_URL = f"http://127.0.0.1:{LOCAL_PORT}/api/version"

if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8")

ssh_command = [
    "ssh",
    "-o", "ExitOnForwardFailure=yes",
    "-N",
    "-L", f"127.0.0.1:{LOCAL_PORT}:127.0.0.1:11434",
    SSH_HOST,
]

ssh_process = None
try:
    print("正在建立到 BRIX 的 SSH 隧道;若出現提示,請輸入 SSH 密碼。")
    ssh_process = subprocess.Popen(ssh_command)

    # 最多等 60 秒,讓 SSH 驗證完成並確認 Ollama API 可連線。
    deadline = time.monotonic() + 60
    while time.monotonic() < deadline:
        if ssh_process.poll() is not None:
            raise RuntimeError(
                f"SSH 程序已結束,結束碼:{ssh_process.returncode}。"
                "請確認 SSH 帳號、密碼與主機位址。"
            )
        try:
            with urllib.request.urlopen(VERSION_URL, timeout=2) as response:
                version = json.loads(response.read().decode("utf-8"))
            print(f"SSH 隧道已連線;Ollama 版本:{version.get('version', '未知')}")
            break
        except (urllib.error.URLError, TimeoutError):
            time.sleep(0.5)
    else:
        raise TimeoutError(
            "等待 Ollama API 逾時。請確認 BRIX 上的 Ollama 正在執行。"
        )

    prompt = input("請輸入問題(直接按 Enter 使用預設問題):").strip()
    if not prompt:
        prompt = "請用繁體中文簡短自我介紹。"

    payload = {
        "model": MODEL,
        "system": "請使用繁體中文與臺灣用語,回答簡短。",
        "prompt": prompt,
        "stream": False,
        "options": {"num_predict": 128},
    }
    request = urllib.request.Request(
        API_URL,
        data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
        headers={"Content-Type": "application/json; charset=utf-8"},
        method="POST",
    )

    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.loads(response.read().decode("utf-8"))
    print("\n模型:", result.get("model", MODEL))
    print("回答:\n", result.get("response", "(API 沒有回傳 response 欄位)"), sep="")
    print("\n完成原因:", result.get("done_reason", "未提供"))

except urllib.error.HTTPError as exc:
    print(f"HTTP 錯誤:{exc.code} {exc.reason}")
    print(exc.read().decode("utf-8", errors="replace"))
    raise SystemExit(1)
except urllib.error.URLError as exc:
    print("API 連線失敗:請確認 BRIX 上的 Ollama 正在執行。")
    print("詳細資訊:", exc.reason)
    raise SystemExit(1)
except (TimeoutError, RuntimeError) as exc:
    print("連線問題:", exc)
    raise SystemExit(1)
except KeyboardInterrupt:
    print("\n已中止測試。")
finally:
    if ssh_process is not None and ssh_process.poll() is None:
        ssh_process.terminate()
        try:
            ssh_process.wait(timeout=5)
        except subprocess.TimeoutExpired:
            ssh_process.kill()

五、執行方式與輸出判讀

先讓 mini PC 的 Ollama 保持運作。在 Windows CMD 切換到 Python 程式所在資料夾,執行:

py test_ollama_ssh_windows.py

輸入 Ubuntu 的 SSH 密碼,看到「SSH 隧道已連線」後,輸入問題。本次測試輸入「請用三句話寫一篇小故事。」

六、實際執行結果

C:\Users\cheng-min>py test_ollama_ssh_windows.py
正在建立到 BRIX 的 SSH 隧道;若出現提示,請輸入 SSH 密碼。
nfusrai@192.168.1.114's password:
SSH 隧道已連線;Ollama 版本:0.35.1
請輸入問題(直接按 Enter 使用預設問題):請用三句話寫一篇小故事。

模型: qwen3:4b-instruct-2507-q4_K_M
回答:
老陳每天清晨都坐在門口,看一隻小貓在花盆邊打滾。
貓總在日落時分,把一朵枯花叼進屋裡,放在他枕邊。
某天他發現,那朵花竟開出細小的紅花,像他早年丟失的夢。

完成原因: stop
結果:SSH 已連到 BRIX,Ollama API 回報版本 0.35.1,模型成功生成三句繁體中文故事。完成原因: stop表示本次輸出自然結束,而非達到 token 上限。

七、程式結束時自動關閉 SSH

程式最後的 finally 區塊會檢查 SSH 子程序是否還在執行;若仍在,就先呼叫 terminate(),等待最多五秒,必要時再強制停止。這讓使用者只需在一個 CMD 視窗操作,不必另外開一個視窗手動維持隧道。

常見問題

輸入密碼後一直等待,沒有「SSH 隧道已連線」?

請確認 mini PC 上 Ollama 正在執行,且 SSH 帳號、IP 位址正確。也可先在 Windows CMD 使用 ssh nfusrai@192.168.1.114 確認 SSH 登入正常。

顯示本機埠無法綁定或轉送失敗?

程式使用 Windows 的 11436 埠。若另一個程式已占用此埠,請關閉占用它的舊 SSH 隧道,或將程式中的 LOCAL_PORT 改成其他未使用的埠號。

Python 找不到 ssh 指令?

請確認 Windows 已安裝 OpenSSH Client,且在 CMD 執行 ssh -V 能顯示版本資訊。

結語:把本地模型接進生活應用

這次完成了「Windows Python → SSH 加密隧道 → mini PC Ollama → Qwen3 Instruct」的單視窗測試。下一步可在 Windows 端加入麥克風語音辨識,將台語問題轉成文字交由本地模型處理,再透過台語語音合成把回答播出,逐步建立由 mini PC 推論、Windows 收音與播放的台語互動原型。

智慧生活科技專業社群|本地生成式 AI、Python 網路程式與 SSH 實作

用 Python 從 Windows 遠端測試 Ollama:Qwen3 繁體中文故事生成

智慧生活科技|AI 實作紀錄

用 Python 從 Windows 遠端測試 Ollama:Qwen3 繁體中文故事生成

讓 GIGABYTE BRIX 負責本地 AI 推論,Windows 電腦負責操作與後續語音互動。本文記錄如何透過 SSH 隧道連線,再用 Python 傳送繁體中文問題,並驗證模型能否完成回答。

測試環境與架構

  • AI 主機:GIGABYTE GB-BTIP-N150,記憶體 16GB,作業系統 Ubuntu。
  • 模型:qwen3:4b-instruct-2507-q4_K_M。
  • 客戶端:Windows 電腦,以 CMD 執行 Python。
  • Ollama API:主機端 127.0.0.1:11434,經 SSH 轉送至 Windows 的 127.0.0.1:11435。

這種配置讓 BRIX 專心執行模型;麥克風、喇叭與互動程式則可留在 Windows 電腦。測試時不必把 Ollama API 直接公開到區域網路。

第一步:在 Windows CMD 開啟 SSH 隧道

在 Windows CMD 執行下列指令,並保持這個視窗開啟:

ssh -N -L 127.0.0.1:11435:127.0.0.1:11434 nfusrai@192.168.1.114

輸入 Ubuntu 帳號密碼後,視窗停在連線狀態、沒有新的命令提示符,代表隧道正在運作。另開 CMD 視窗後,可先檢查 Ollama API:

curl.exe http://127.0.0.1:11435/api/version

測試時收到 {"version":"0.35.1"},確認 Windows 已經能透過 SSH 隧道連上 BRIX 的 Ollama。

第二步:準備 Python 測試程式

將以下程式存成 test_ollama_windows.py。程式使用 Python 標準函式庫,不需另外安裝套件;它會用 UTF-8 傳送 JSON、等待模型回覆,再印出回答和完成原因。

#!/usr/bin/env python3
"""從 Windows 測試經 SSH 隧道連線的 Ollama API。"""
import json
import sys
import urllib.error
import urllib.request

API_URL = "http://127.0.0.1:11435/api/generate"
MODEL = "qwen3:4b-instruct-2507-q4_K_M"

# Windows CMD 通常可直接處理 Python Unicode;此設定也讓輸出統一使用 UTF-8。
if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8")

prompt = input("請輸入要問模型的問題(直接按 Enter 使用預設問題):").strip()
if not prompt:
    prompt = "請用繁體中文簡短自我介紹。"

payload = {
    "model": MODEL,
    "system": "請使用繁體中文與臺灣用語,回答簡短。",
    "prompt": prompt,
    "stream": False,
    "options": {"num_predict": 128},
}
request = urllib.request.Request(
    API_URL,
    data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
    headers={"Content-Type": "application/json; charset=utf-8"},
    method="POST",
)

try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.loads(response.read().decode("utf-8"))
    print("\n模型:", result.get("model", MODEL))
    print("回答:\n", result.get("response", "(API 沒有回傳 response 欄位)"), sep="")
    print("\n完成原因:", result.get("done_reason", "未提供"))
except urllib.error.HTTPError as exc:
    print(f"HTTP 錯誤:{exc.code} {exc.reason}")
    print(exc.read().decode("utf-8", errors="replace"))
    raise SystemExit(1)
except urllib.error.URLError as exc:
    print("連線失敗:無法連到 Windows 本機的 Ollama SSH 隧道。")
    print("請確認 SSH 隧道視窗仍開啟,並先測試:curl.exe http://127.0.0.1:11435/api/version")
    print("詳細資訊:", exc.reason)
    raise SystemExit(1)
except TimeoutError:
    print("等待模型回覆逾時。請確認 BRIX 上的 Ollama 正常,再提高逾時時間或稍後重試。")
    raise SystemExit(1)

第三步:執行並輸入問題

在另一個 Windows CMD 視窗切換到程式所在資料夾,執行:

py test_ollama_windows.py

程式會提示輸入問題。本次輸入「請用三句話寫一篇小故事。」後,模型名稱顯示為 qwen3:4b-instruct-2507-q4_K_M,並成功回傳繁體中文內容。

本次成功測試結果

請用三句話寫一篇小故事。

模型: qwen3:4b-instruct-2507-q4_K_M
回答:
小巷裡的阿傑,每天傍晚都會幫老奶奶推車送菜。
那天他發現車輪下藏著一封舊信,寫著「給未來的我」。
他笑了,原來他早就知道,自己會成為那個未來。

完成原因: stop
測試判讀:模型有回傳完整故事,且完成原因是 stop,表示這次回答自然結束,並非因生成字數上限而中斷。

測試心得與下一步

本次已完成從 Windows CMD 經 SSH 隧道呼叫 BRIX 上 Ollama,並用 Python 傳送繁體中文、接收模型回覆的測試。Python 透過 json.dumps(..., ensure_ascii=False) 與 UTF-8 編碼處理中文,免去先前在 CMD 使用 echo 寫入中文 JSON 時遇到的亂碼問題。

下一階段可在 Windows 端加入語音辨識,把麥克風說出的台語轉成文字後交給 Ollama,再把模型回答交由台語語音合成播放。如此可逐步建成「Windows 收音與播音、BRIX 執行本地模型」的台語互動原型。

智慧生活科技專業社群|Ollama × Python × SSH 遠端測試實作

從 Windows CMD 遠端測試 Ollama:Qwen3 中文回覆成功紀錄

智慧生活科技|實作紀錄

從 Windows CMD 遠端測試 Ollama:Qwen3 中文回覆成功紀錄

讓 GIGABYTE BRIX 負責本地模型推論,Windows 電腦負責操作與後續語音互動。本篇記錄 SSH 隧道、模型選擇、中文編碼排查,以及成功取得繁體中文回覆的完整過程。

測試環境

本次以 GIGABYTE GB-BTIP-N150(16GB)作為 Ollama 主機,安裝 Ubuntu;另一台 Windows 電腦透過 SSH 使用 Ollama API。麥克風、喇叭與未來的語音介面都規劃在 Windows 電腦端。

  • Ollama 主機:192.168.1.114
  • 主機端 Ollama API:127.0.0.1:11434
  • Windows 本機轉送埠:127.0.0.1:11435
  • 成功模型:qwen3:4b-instruct-2507-q4_K_M
  • Ollama API 版本:0.35.1

一、以 SSH 建立 API 隧道

在 Windows CMD 開啟第一個視窗,輸入以下指令:

ssh -N -L 127.0.0.1:11435:127.0.0.1:11434 nfusrai@192.168.1.114

輸入 Ubuntu 帳號密碼後,視窗會停留在連線狀態、沒有新的命令提示符,這是正常的。測試時要保持此視窗開啟。

另開一個 Windows CMD,確認 API 隧道已連通:

curl.exe http://127.0.0.1:11435/api/version

收到下列類似回應,就代表 Windows 已經能透過 SSH 連到 Ollama:

{"version":"0.35.1"}
若連線失敗:看到「Failed to connect to 127.0.0.1 port 11435」時,先確認 SSH 隧道視窗仍開著。這表示 Windows 本機的轉送埠沒有在監聽,尚未進入模型測試階段。

二、確認原模型的回覆模式

原先安裝的 qwen3:4b 可以載入與執行,但 API 測試時,生成上限用完前仍在輸出 thinking,正式回答欄位 response 是空白。回應中的 done_reason":"length" 表示生成額度用完,模型還沒有完成回答。

進一步查詢 /api/show 後,模型回報思考模式只有 true 這個可用值。也就是說,這個安裝版本不能透過 "think":false 關閉思考模式。對一般短問答而言,改用 Instruct 取向的模型更合適。

三、下載 Qwen3 4B Instruct 模型

在另一個 Windows CMD 視窗,以 SSH 登入 BRIX 並下載量化版模型:

ssh nfusrai@192.168.1.114 ollama pull qwen3:4b-instruct-2507-q4_K_M

等待下載完成。原有 Thinking 模型可以先保留;呼叫 API 時指定新的模型名稱即可。

四、排除 Windows CMD 中文編碼問題

最初使用 CMD 的 echo 將中文字寫入 JSON 檔,模型收到後表示內容像是亂碼。改用記事本直接輸入中文仍未排除問題。最後將中文改寫成 JSON Unicode escape,避開命令列與檔案傳送過程中的中文編碼差異。

在 Windows CMD 輸入以下命令開啟記事本:

notepad ollama_test.json

把下列 JSON 貼入記事本,按 Ctrl+S 儲存後關閉:

{"model":"qwen3:4b-instruct-2507-q4_K_M","prompt":"\u8acb\u7528\u7e41\u9ad4\u4e2d\u6587\u7c21\u77ed\u81ea\u6211\u4ecb\u7d39\u3002","stream":false,"options":{"num_predict":128}}

這串 \u 編碼會由 JSON 解碼成「請用繁體中文簡短自我介紹。」整份測試檔只有英數字元,因此不必直接在 CMD 中傳送中文字。

五、從 Windows 呼叫模型

確認 SSH 隧道視窗仍保持連線後,在另一個 CMD 視窗執行:

curl.exe --max-time 120 http://127.0.0.1:11435/api/generate -H "Content-Type: application/json" --data-binary "@ollama_test.json"

成功時,API 回傳的 model 欄位會是 qwen3:4b-instruct-2507-q4_K_M,而 response 欄位會出現繁體中文自我介紹。本次測試已成功取得中文回答,表示整段流程都已連通:

Windows CMD → SSH 隧道 → BRIX 上的 Ollama → Qwen3 Instruct 模型

測試結論與後續方向

這次測試釐清兩個關鍵點:第一,原本的 qwen3:4b 使用 Thinking 取向,思考輸出會占用生成額度;第二,Windows CMD 傳送中文時可能遇到編碼差異。改用 Qwen3 4B Instruct,並以 JSON Unicode escape 傳送中文後,模型已能正常以繁體中文回覆。

下一步可在 Windows 電腦端加入語音辨識與台語文字處理,再將辨識結果傳給 Ollama;收到回答後,由 Windows 端的台語語音合成播放。BRIX 專責本地模型推論,Windows 則負責麥克風、喇叭與互動介面。

本次成果:遠端 API 連線成功,Instruct 模型成功以繁體中文回覆。
智慧生活科技專業社群|Ollama 本地 AI 實作紀錄

在 GIGABYTE BRIX N150 安裝 Ollama,並用 SSH 遠端操作

這篇記錄如何在 GIGABYTE GB-BTIP-N150(16GB 記憶體、Ubuntu)安裝 Ollama,下載中文模型 Qwen3 4B,並從 Windows 使用 SSH 遠端終端機操作。實測確認:SSH 可登入 BRIX,且能列出並執行已安裝的模型。

在 GIGABYTE BRIX N150 安裝 Ollama,並用 SSH 遠端操作

迷你電腦也能在本機執行小型語言模型。這次以 GIGABYTE GB-BTIP-N150、16GB 記憶體和 Ubuntu 為例,從安裝 Ollama 到 Windows 遠端登入,一步一步完成設定。

一、安裝 Ollama

在 BRIX 開啟 Ubuntu 終端機,執行官方安裝指令:

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

安裝後可查看用戶端版本:

ollama --version

如果出現「Warning: could not connect to a running ollama instance」,但同時顯示 client version,代表指令已安裝,但當時尚未連上正在執行的 Ollama 服務。

二、啟動 Ollama 並下載模型

若 Ollama 服務尚未執行,可在一個終端機輸入:

ollama serve

讓服務保持執行,再開啟另一個終端機,下載並啟動 Qwen3 4B:

ollama run qwen3:4b

第一次執行會下載模型。進入 >>> 提示符後,就可以直接輸入問題。輸入 /bye 離開模型對話。

可用以下指令確認模型是否已下載:

ollama list

實測清單中可看到 qwen3:4b,模型大小約 2.5 GB。

如果畫面顯示 Unit ollama.service not be found,代表目前沒有找到名為 ollama 的 systemd 服務單元;本次安裝後採用終端機執行 ollama serve 的方式啟動,並以 ollama run 測試成功。

三、在 BRIX 啟用 SSH

若要從 Windows 使用命令列遠端操作 BRIX,先在 BRIX 安裝並啟動 SSH 伺服器:

sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh

查詢 Ubuntu 登入帳號和 BRIX 的區域網路 IP:

whoami
hostname -I

本次測試使用的帳號是 nfusrai,BRIX 的 IP 是 192.168.1.114。您的設備可能會使用不同帳號或 IP,請以終端機查到的結果為準。

四、從 Windows 遠端登入

在 Windows 開啟 PowerShell,輸入 SSH 指令:

ssh nfusrai@192.168.1.114

第一次連線若出現主機真實性確認,輸入 yes;接著輸入 BRIX 的 Ubuntu 使用者密碼。成功後會看到類似以下提示符:

nfusrai@giga-n150:~$

看到這個提示符,就表示已進入 BRIX 的遠端終端機。密碼輸入時不會顯示字元,輸入完成後按 Enter 即可。

五、在 SSH 視窗執行 Ollama

遠端登入後,可以直接查詢已下載模型:

ollama list

啟動模型進行對話:

ollama run qwen3:4b

輸入 /bye 結束模型對話,輸入 exit 登出 SSH。

本次測試結果

  • BRIX 上已安裝 Ollama,並成功執行 qwen3:4b。
  • Windows PowerShell 透過 ssh nfusrai@192.168.1.114 成功登入 Ubuntu。
  • SSH 遠端執行 ollama list,成功列出 qwen3:4b。
  • 因此,日常遠端操作 Ollama 可以直接使用 SSH 終端機,不必透過遠端網頁。

小提醒:SSH 連線需要 BRIX 已開機、連上同一個網路,且 SSH 服務正在執行。若 BRIX 的 IP 改變,Windows 連線指令中的 IP 也要更新。不要把 SSH 或 Ollama 埠直接公開到網際網路;外網遠端連線建議透過 VPN。

2026年9月28日 星期一

從程式基礎到智慧應用:Python 程式實習課程

從程式基礎到智慧應用:Python 程式實習課程

Python 程式實習以「看懂問題、設計流程、撰寫程式、測試除錯、整合應用」為學習主線。學生從變數、條件判斷、迴圈與資料結構開始,逐步運用函式、模組、檔案與資料處理,再把程式連接到 Raspberry Pi、Hub 8735 Ultra 或既有雲端應用,完成能說明、能測試、能展示的實作成果。

一、Python 程式實習學習架構

課程重點在 Python 程式設計能力。硬體與雲端服務是學生應用程式的情境:先學會如何表達資料、控制程式流程及拆解任務,再運用 Python 與裝置或服務交換資料。


Python 程式實習學習架構:由程式基本功出發,逐步完成裝置串接與整合專題。

二、從基礎語法建立程式思考

初學程式時,先練習將生活中的需求拆成明確步驟,再把步驟寫成 Python 指令。變數與資料型別用來保存資訊,輸入與輸出讓程式能與使用者互動,運算式則負責計算及比較。

學習內容程式觀念練習例子
變數與資料型別整數、浮點數、字串、布林值;為資料選擇合適型別。保存感測數值、商品名稱或是否需要提醒等資訊。
輸入、輸出與運算讀取輸入、顯示結果、使用運算式處理數值。輸入資料後,計算平均值或產生簡短摘要。
條件判斷使用 if、elif、else 依條件選擇程式分支。依照設定條件顯示不同狀態或建議。
重複執行使用 for 或 while 處理重複任務。逐筆整理資料、重複讀取輸入或持續檢查狀態。

三、使用資料結構整理資訊

實際應用通常需要處理一批資料。學生可以運用字串處理文字,使用串列保存多筆項目,使用字典描述具有欄位名稱的資料,並透過檔案讀寫保存程式輸入或輸出。

# 用字典整理一筆場域資料
reading = {
    "site": "水井村",
    "temperature": 27.5,
    "status": "正常"
}

print(reading["site"], reading["temperature"])

教師可提供去識別化或模擬資料,讓學生練習查找、分類、統計與轉換。透過清楚的資料結構,程式更容易閱讀、測試,也更方便後續串接服務。

四、以函式、模組與除錯提升程式品質

當程式逐漸變長,學生需要學習把重複工作整理成函式,使用參數傳入資料、以回傳值交付結果,並透過模組重用已寫好的功能。例外處理則協助程式面對輸入錯誤、檔案不存在或服務暫時無法連線等情況。

  • 函式:把一項清楚的工作包裝起來,讓主程式更容易理解。
  • 模組:匯入標準函式庫或課程提供的程式模組,擴充功能。
  • 例外處理:辨識可能發生的錯誤,提供適當訊息或後續處理。
  • 測試與除錯:以小資料測試功能,閱讀錯誤訊息,逐步定位問題。

五、讓 Python 處理資料並連接服務

掌握程式基本能力後,學生可練習讀取教師提供或允許使用的資料,進行清理、轉換及摘要。進一步可認識 JSON 等常見資料格式,以及 HTTP/API 請求的基本概念,理解程式如何向服務提出請求並處理回應。課程實作應使用已核准的測試服務與介面,並遵守資料來源、授權與個資保護規範。

應用階段Python 任務學習重點
資料蒐集讀取輸入資料、檔案或授權的服務回應。辨識資料來源與欄位。
資料處理整理文字及數值、篩選紀錄、計算統計或產生摘要。資料型別、串列、字典、函式與程式流程。
資料交換依介面規格將資料轉為 JSON,處理服務回傳結果。資料格式、請求與回應、錯誤處理。
結果呈現顯示狀態、產生簡易報表或提供查詢結果。將程式輸出連結到使用者需求。

六、從 PC 延伸到 Raspberry Pi 與場域應用

PC 適合撰寫及測試 Python 程式;Raspberry Pi 可用於裝置端實作。課程可先在 PC 完成資料處理,再依設備介面與課程環境,透過 USB 進行 PC 與 Pi 的資料交換,或使用 Wi-Fi 連接 Hub 8735 Ultra/雲端應用。

若在 Raspberry Pi 上使用 MicroPython,學生可比較它與一般 Python 的使用情境。兩者語法有相通之處,但可用的函式庫、硬體介面與執行環境可能不同,因此程式要依實際裝置及課程提供的範例調整。USB 資料交換也須依設備採用的介面與驅動設定操作。

理解問題→設計流程→撰寫 Python→測試除錯→整合應用

七、以智慧生活情境發展專題

學生可從既有系統選擇一種應用情境,聚焦完成一項範圍適中的程式任務。系統串接依已開放的操作介面及資料權限進行;若無法直接連接正式服務,也可使用教師提供的模擬資料完成相同程式概念練習。

應用情境Python 專題方向
智慧養殖:水井村 USR整理模擬或授權的養殖資料,計算摘要、顯示狀態或產生提醒。
智慧工藝:水井三寶建立工藝資料清單,實作分類、查詢或互動介紹。
智慧商店:雲林國際慢食協會整理商品資訊,製作搜尋、分類或簡易商品問答原型。
智慧學習:元長樂齡中心製作簡易問答或互動練習,呈現適合學習者使用的內容。

八、建議的學習成果與評量方式

期末可採個人或小組專題,讓學生完成一個能清楚展示的 Python 應用原型。評量除了結果,也可檢視學生如何拆解問題、安排程式結構、處理例外及驗證輸出。

  • Python 程式碼及簡要流程圖。
  • 測試資料、測試結果與除錯紀錄。
  • PC 與 Raspberry Pi 的資料交換或服務串接展示。
  • 一份專題說明,交代使用情境、資料來源、程式功能與限制。

建議評量面向:程式概念正確性、程式可讀性、測試與除錯歷程、資料使用合宜性,以及應用成果是否回應所選情境。

結語:讓程式成為解決問題的工具

Python 程式實習的學習成果,不只是記住語法,而是能把需求轉成清楚的程式流程,選擇合適的資料結構,運用函式整理功能,並透過測試與除錯逐步完成作品。當程式再與 Raspberry Pi、Hub 8735 Ultra 或雲端服務連結,學生便能把程式能力應用到智慧養殖、智慧工藝、智慧商店與智慧學習等真實情境。

教學支援:實作題目、設備介面與場域案例可透過智慧生活科技專業社群交流,並依教室設備及既有系統開放的介面調整。

#Python程式設計 #程式實習 #RaspberryPi #MicroPython #資料處理 #智慧生活

從一台電腦走進網際網路:網際網路應用課程的知識與實務

從一台電腦走進網際網路:網際網路應用課程的知識與實務

網際網路每天都在傳送訊息、影像與感測資料。學生如何看見資料離開電腦後,經過哪些網路設備與服務,最後抵達雲端應用?本課程以 PC+Raspberry Pi+Hub 8735 Ultra/雲端應用為實作平台,帶學生從網路設定、封包傳輸與連線診斷,逐步走到智慧生活場域應用。

一、課程平台:讓資料傳輸看得見

學生使用 PC 與 Raspberry Pi 練習網路與裝置通訊;再透過 Wi-Fi,將資料送往 Hub 8735 Ultra 或已建置完成的雲端應用。課程的核心不是只操作設備,而是理解資料如何形成、如何傳遞,以及服務端如何回應。



網際網路應用課程學習架構:從網路設定與封包傳送,延伸到雲端服務與智慧場域。

圖中的大型網際網路雲端代表課程的學習核心。學生從 PC 端操作網路診斷工具,透過 USB 與 Raspberry Pi 交換資料,再讓 Pi 經 Wi-Fi 進入網路,最後連接 Hub 或雲端服務。箭頭分別表示資料傳輸,以及 DNS 查詢、API 請求等服務互動。

二、學生可以學到哪些網際網路知識?

學習主題重要概念實作練習
網路連線與架構用戶端、伺服器、區域網路、網際網路、閘道器與雲端服務的關係。繪製 PC、Raspberry Pi、Wi-Fi 路由器、Hub/雲端服務的連線圖。
IP 位址與 DNSIP 位址用來辨識網路端點;DNS 將網域名稱解析為 IP 位址。使用 ipconfig 檢視網路設定,使用 nslookup 查詢網域名稱。
封包與路由資料會切分成封包,經過不同網路節點轉送到目的地;路徑與延遲可能改變。使用 ping 測試連線,使用 tracert 觀察路由節點與回應時間。
TCP 與 UDP兩種常見傳輸層協定,各有不同的傳輸特性與適用情境。在 PC 與 Raspberry Pi 間傳送文字、指令或狀態資料,觀察傳輸與回覆。
Wi-Fi 與物聯網無線網路讓裝置連入區域網路,並透過閘道器連接外部服務。設定 Raspberry Pi 網路連線,確認裝置可到達指定服務。
雲端服務與 API服務端接收請求、處理資料並回傳結果;API 是應用程式與服務交換資料的介面。依課程提供的介面或測試環境,送出資料並檢查回應與錯誤訊息。
網路資料應用網頁與服務提供可整理的資料,但擷取及使用必須遵守來源規範與授權。使用教師提供或允許使用的資料,練習爬蟲、整理資料與簡單查詢。

三、從工具操作到網路診斷

網路診斷工具可以讓抽象的網路概念變成可觀察的結果。學生先查看本機網路設定,再測試連線、追蹤路徑及查詢網域名稱,練習根據輸出推測問題可能出現在電腦設定、DNS、路由或遠端服務。

  • ipconfig:檢視本機 IP、子網路遮罩、預設閘道與 DNS 等資訊。
  • ping:測試目的端是否可回應,觀察往返時間與封包遺失情形。
  • tracert:查看封包到目的端途中經過的路由節點。
  • nslookup:向 DNS 查詢網域名稱對應的網路位址。

實作時可安排「連不上服務」的診斷任務:學生先整理現象,再選擇適當指令測試,最後以證據說明問題與處理方式。這能建立有步驟的除錯習慣,而不是只反覆重開設備。

四、實作資料如何從 PC 抵達雲端?

課程可依下列流程安排,讓學生逐段完成並驗證:

① 設定網路→② 傳送資料→③ 診斷路徑→④ 串接服務→⑤ 完成應用
  1. 認識 PC 的網路身分:取得 IP、閘道與 DNS 資訊,畫出目前設備所在的網路環境。
  2. 建立 PC 與 Raspberry Pi 資料交換:依教室設備介面,以 USB 連線傳送指令與回覆。實際使用的連線方式、驅動程式與介面設定,依課堂設備配置進行。
  3. 測試網路與路由:使用診斷工具檢查端點可達性,並追蹤資料前往目標服務的路徑。
  4. 讓 Raspberry Pi 透過 Wi-Fi 連線:確認裝置已連上指定網路,並能與目標端點交換資料。
  5. 連接 Hub 或雲端應用:依教師提供的服務介面或操作方式送出資料、查看回應,完成小型應用展示。

五、連結已建置完成的智慧生活場域

課程可使用已完成的系統作為學習情境,讓學生練習思考網路技術如何支持實際服務。依系統開放的介面與資料權限,教師可安排觀察、模擬資料傳送或小型串接專題。

應用場域可討論的網路應用問題
智慧養殖:水井村 USR感測資料如何由場域端送出?遠端使用者如何取得環境資訊?
智慧工藝:水井三寶如何透過網路呈現工藝內容、導覽資訊或互動服務?
智慧商店:雲林國際慢食協會商品與店家資訊如何整理、查詢並提供給使用者?
智慧學習:元長樂齡中心如何透過網路支援學習內容、互動活動或服務資訊?

進階活動可以加入爬蟲或 LLM Agent:先以授權資料建立可查詢的內容,再設計能回答場域問題的資訊小幫手。學生同時練習檢查資料來源、辨識回答依據及保護個人資料。

六、建議的學生學習成果

期末可採分組實作,每組選擇一種智慧生活情境,完成下列成果:

  • 一張清楚標示 PC、Raspberry Pi、網路設備、Hub/雲端服務的系統架構圖。
  • 一份網路設定及連線診斷紀錄,說明使用哪些工具、觀察到什麼結果。
  • 一段可展示的裝置資料交換或服務請求流程。
  • 一個連結場域需求的應用原型,並說明資料來源、傳輸路徑與服務回應。

評量可著重概念理解、實作正確性、診斷過程與成果說明。學生不只展示「程式有跑」,也要能說明資料從哪裡來、經過哪些網路環節,以及遇到問題時如何定位原因。

結語:讀懂網路中的資料旅程

透過 PC、Raspberry Pi、Hub 8735 Ultra 與既有雲端應用,學生能把 IP、DNS、TCP/UDP、封包路由、Wi-Fi 與雲端服務連成一條可實作的學習路徑。從設定網路、傳送資料、診斷連線,到完成智慧場域應用,網際網路不再只是課本上的名詞,而是可以觀察、測試與應用的技術。

教學支援:課程技術與場域實作可透過智慧生活科技專業社群交流,並依 Hub 8735 Ultra、雲端服務及教室設備實際開放的介面安排操作。

#網際網路應用 #TCP #UDP #RaspberryPi #網路診斷 #物聯網 #智慧生活