
離線 AI:打造不需網路就能運作的行動功能
如何打造不需網路連線就能運作的 AI 功能。裝置端模型、離線優先架構模式,以及離線 AI 不是選配的使用場景。
雲端 AI 有一個 硬性依賴:網路。當連線中斷時,功能就壞了。對許多行動使用場景來說,這不僅僅是不便。而是致命缺陷。
一個沒有漫遊數據就無法使用的旅行翻譯應用程式。一個在收訊不穩的工地上停止運作的現場服務助手。一個在偏遠診所無法處理資料的健康應用程式。一個在飛機上失去 AI 功能的筆記應用程式。
離線 AI 對這些應用程式來說不是錦上添花。而是核心需求。透過裝置端推理,這完全可以實現。
離線 AI 不可或缺的場景
旅行與國際場景
在國際旅行的使用者通常會避免漫遊數據費。機場 WiFi 不可靠。翻譯、導航輔助和旅行規劃需要在沒有連線的情況下運作。一個只在連接 WiFi 時才能翻譯的語言應用程式,在使用者最需要的時刻恰恰毫無用處。
現場工作
工地、農田、礦區、偏遠檢 查場所。這些環境經常沒有或只有很差的行動網路覆蓋。使用行動應用程式進行文件記錄、測量、品質檢查或報告的工作者,需要 AI 功能在現場就能運作。
醫療保健
基於隱私和法規原因(HIPAA、GDPR),患者資料不應離開裝置。臨床決策支援、筆記轉錄、醫療編碼。這些功能必須在 WiFi 可能受限或不可靠的診所環境中運作。
發展中市場
全球超過 30 億人的網路連線是間歇性的。針對這些市場的應用程式不能假設永遠在線的連線。可以離線運作的 AI 功能擁有大幅更廣的目標市場。
日常中斷
地鐵、電梯、飛機、地下室、偏遠地區。即使在已開發市場,連線間隙也是常態。AI 功能在這些時刻顯示載入動畫或錯誤訊息,會訓練使用者不去依賴它。
架構:離線優先搭配裝置端推理
關鍵洞察在於架構。不要建構雲端優先搭配離線備援(這很脆弱),而是建構離線優先搭配可選的雲端增強。
模型分發
GGUF 模型檔案需要在 AI 功能運作之前就在裝置上。兩種方式:
隨應用程式打包: 將模型包含在應用程式二進位檔或作為應用程式資源。使用者隨應用程式一起下載。對 200MB 以下的模型來說是最簡單的方式(符合行動網路下載限制)。對較大的模型,使用 iOS App Thinning 或 Android Asset Delivery。
安裝後下載: 應用程式安裝時不含模型。首次啟動時,偵測到缺少模型後提示使用者透過 WiFi 下載。這保持了初始應用程式下載的小巧,同時仍在需要之前將模型交付。
// iOS:檢查模型並提示下載
func ensureModelAvailable() -> Bool {
let modelPath = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent("model.gguf")
if FileManager.default.fileExists(atPath: modelPath.path) {
return true
}
// 顯示下載 UI
showModelDownloadPrompt()
return false
}
本地推理
一旦模型在裝置上,推理完全在本地進行。llama.cpp 使用裝置的 CPU 和 GPU(iOS 上的 Metal、Android 上的 Vulkan)處理運算。不需要網路呼叫。
推理流程:
- 使用者提供輸入(文字、語音轉錄等)
- 輸入在本地進行 token 化
- 模型逐 token 生成回應
- Token 被解碼並在 UI 中顯示
每一步都在裝置上進行。不涉及網路。
有連線時同步
對於受益於雲端連線的功能(分析、模型更新、使用者資料同步),使用佇列與同步模式:
- 在本地佇列分析事件(SQLite、Core Data、Room)
- 當連線恢復時,將佇列同步到你的後端
- 在有連線時的應用程式啟動時檢查模型更新
- 永遠不要因為網路不可用而阻擋使用者體驗
什麼可以離線運作
| 功能 | 可離線? | 所需模型大小 | 備註 |
|---|---|---|---|
| 文字分類 | 是 | 1B (~600MB) | 快速,小模型即可 |
| 聊天助手 | 是 | 3B (~1.7GB) | 品質生成需要 3B |
| 摘要 | 是 | 3B (~1.7GB) | 3B 品質良好 |
| 翻譯 | 是 | 1-3B | 取決於語言對 |
| 內容草稿 | 是 | 3B (~1.7GB) | 電子郵件回覆、筆記、訊息 |
| 自動完成 | 是 | 1B (~600MB) | 速度很重要,1B 很快 |
| 情感分析 | 是 | 1B (~600MB) | 簡單分類任務 |
| 命名實體擷取 | 是 | 1-3B | 結構化輸出任務 |
| 網頁搜尋 | 否 | N/A | 需要即時網路資料 |
| 即時資料檢索 | 否 | N/A | 需要伺服器連線 |
| 圖片生成 | 部分 | 1-2GB+ | 可行但記憶體密集 |
規律是:任何處理使用者輸入並從模型訓練知識中生成輸出的任務都可以離線運作。需要外部即時資料的任務則不行。
離線優先的模型管理
版本檢查
// Android:在應用程式啟動時檢查模型版本
suspend fun checkModelUpdate() {
if (!isNetworkAvailable()) return
val manifest = fetchModelManifest() // 從你的 CDN 取得 JSON
val currentVersion = prefs.getString("model_version", "")
if (manifest.version != currentVersion) {
// 排程背景下載
scheduleModelDownload(manifest.url, manifest.checksum)
}
}
儲存管理
GGUF 模型為 600MB-1.7GB。儲存管理很重要:
- 下載前檢查可用空間
- 下載前向使用者顯示模型的大小
- 允許使用者刪除和重新下載模型
- 在 iOS 上,標記模型檔案使其不被備份到 iCloud(可以重新下載)
- 處理低儲存空間警告,提供移除模型的選項
完整性驗證
下載後務必驗證模型檔案:
// SHA256 驗證
func verifyModel(at path: URL, expectedHash: String) -> Bool {
guard let data = try? Data(contentsOf: path) else { return false }
let hash = SHA256.hash(data: data)
let hashString = hash.compactMap { String(format: "%02x", $0) }.joined()
return hashString == expectedHash
}
離線 AI 的 UX 模式
模型下載狀態
- 下載過程中顯示清晰的進度指示器
- 允許暫停和恢復
- 在網路重新連線時自動恢復
- 開始前顯示下載大小
功能可用性
- 當模型尚未下載時,顯示清楚的訊息解釋為什麼 AI 功能不可用以及如何啟用
- 當模型已載入並就緒時,不顯示特殊指示器。離線 AI 應該感覺像原生功能。
- 永遠不要顯示「離線模式」標記或降級 UI。裝置端模型就是這個功能。
優雅降級
對於同時使用裝置端和雲端 AI 的混合應用程式:
- 所有支援的任務預設使用裝置端
- 如果有連線且任務超出裝置端能力,可選擇路由到雲端
- 如果裝置端可以處理,永遠不要因為雲端不可用而讓使用者的請求失敗
建構離線優先的流程
邁向離線 AI 的路徑:
- 選擇你的模型: 1B 用於簡單任務(分類、自動完成),3B 用於生成和聊天