Back to blog
    行動應用的裝置端文字分類
    text classificationon-device AImobile AINLPimplementationsegment:mobile-builder

    行動應用的裝置端文字分類

    如何建構在使用者手機上運行的快速、精確文字分類。情感分析、內容分類、意圖偵測和垃圾訊息過濾,無需 API 呼叫。

    EErtas Team·

    文字分類是最實用的裝置端 AI 功能。它快速(100ms 以內)、精確(微調後 90%+)、在最小的模型上就能運作(1B),且可在幾乎任何現代手機上運行。

    如果你的應用程式需要分類內容、偵測意圖、過濾垃圾訊息、分析情感或路由訊息,裝置端分類是最高效的方法。

    為什麼分類是裝置端的理想選擇

    分類具有使其非常適合行動端的特性:

    短輸出: 模型只需生成一個詞或短語(類別標籤)。這只需毫秒,而非秒。

    小模型即可勝任: 微調 1B 模型以 90-94% 的準確率處理分類。不需要更大、更慢的模型。

    高頻率: 分類通常在每段內容上運行(每則訊息、每則筆記、每個照片說明)。在高頻率下,雲端 API 成本快速累積。在裝置端,每次分類都是免費的。

    適合背景運行: 分類可以在背景中運行,無需使用者互動。自動分類輸入的費用。儲存時自動標記筆記。收到訊息時自動偵測垃圾訊息。

    分類使用案例

    情感分析

    判斷使用者輸入的情感基調。適用於:

    • 客戶回饋應用(正面/負面/中性)
    • 社群媒體監控
    • 日記/心情追蹤應用
    • 支援工單優先級路由

    內容分類

    自動為使用者內容指派類別:

    • 費用分類(餐飲、交通、娛樂、公用事業)
    • 筆記標記(工作、個人、想法、參考)
    • 郵件分類(重要、電子報、社交、交易)
    • 照片相簿整理(旅遊、美食、人物、自然)

    意圖偵測

    理解使用者想做什麼:

    • 語音助手路由(播放音樂、設定計時器、發送訊息、搜尋)
    • 聊天機器人意圖分類(提問、投訴、請求退款)
    • 搜尋查詢分類(導航、資訊、交易)

    內容過濾

    偵測並過濾不想要的內容:

    • 通訊應用中的垃圾訊息偵測
    • 不當內容標記
    • 社群應用中的離題訊息偵測

    語言偵測

    識別輸入文字的語言,用於多語言應用。路由到適當的模型或翻譯流程。

    實作

    提示詞模式

    對於基於 LLM 的分類,提示詞很簡單:

    Classify the following text into one of these categories: [Food, Transport, Entertainment, Utilities, Shopping, Healthcare, Other]
    
    Text: "Uber ride to airport"
    Category:
    

    模型生成一個詞:「Transport」

    為分類微調

    以聊天格式建立訓練範例:

    {"messages": [
      {"role": "user", "content": "Classify: Uber ride to airport"},
      {"role": "assistant", "content": "Transport"}
    ]}
    
    {"messages": [
      {"role": "user", "content": "Classify: Netflix monthly subscription"},
      {"role": "assistant", "content": "Entertainment"}
    ]}
    
    {"messages": [
      {"role": "user", "content": "Classify: Grocery store visit"},
      {"role": "assistant", "content": "Food"}
    ]}

    使用涵蓋所有類別的 500-1,000 個範例,微調 1B 模型可達到 90-94% 的準確率。這超越了提示式 GPT-4o 在同一任務上的表現(通常 78-85%)。

    結構化輸出

    為了可靠的解析,指示模型輸出 JSON:

    {"messages": [
      {"role": "user", "content": "Classify this expense: Uber ride to airport\nOutput JSON with 'category' and 'confidence' fields."},
      {"role": "assistant", "content": "{\"category\": \"Transport\", \"confidence\": \"high\"}"}
    ]}

    微調模型學會產出一致的 JSON。直接在你的應用程式碼中解析輸出。

    速度最佳化

    分類生成非常少的 tokens(1-10 個)。你可以針對最大吞吐量進行最佳化:

    • n_predict 設定為較低的值(最多 10-20 tokens)
    • 使用 stop tokens 在類別標籤後停止生成
    • 使用 temperature 0 獲得確定性輸出
    • 處理列表時批次化多個分類

    透過這些最佳化,1B 模型在旗艦手機上每秒可分類 5-15 個項目。

    效能預期

    按訓練資料量的準確度

    訓練範例數1B 準確率3B 準確率
    10078-82%82-86%
    25084-88%87-91%
    50088-92%91-94%
    1,00090-94%93-96%
    2,00092-95%94-97%

    大多數分類任務超過 1,000 個範例後收益遞減。從 500 開始,只有在準確率不足時才增加更多。

    按裝置的速度

    裝置1B 分類時間每秒分類數
    iPhone 16 Pro30-60ms15-30
    iPhone 1450-80ms12-20
    Galaxy S2440-70ms14-25
    中階 Android80-130ms8-12

    在任何現代手機上,每次分類都在 150ms 內完成。使用者感覺是即時的。

    與雲端 API 的比較

    指標雲端 API裝置端 1B(微調)
    延遲500-2,000ms30-130ms
    準確度(領域)78-85%(提示式)90-94%(微調)
    每次分類成本$0.00003-0.0003$0
    離線
    隱私資料發送給第三方裝置端

    裝置端在分類的每個指標上都勝出:更快、更精確(微調後)、免費、離線、且隱私。

    架構模式

    背景分類服務

    對於需要自動分類內容的應用:

    // Android:背景分類
    class ClassificationService {
        private val model: LlamaModel = LlamaModel()
    
        fun classifyExpense(description: String): ExpenseCategory {
            val prompt = "Classify: $description"
            val result = model.generate(prompt, maxTokens = 10, temperature = 0f)
            return ExpenseCategory.fromString(result.trim())
        }
    
        fun classifyBatch(items: List<String>): List<ExpenseCategory> {
            return items.map { classifyExpense(it) }
        }
    }

    即時分類

    對於在使用者輸入時分類的功能(輸入費用時自動建議類別):

    // iOS:帶有防抖的即時分類
    class ClassificationViewModel: ObservableObject {
        @Published var suggestedCategory: String = ""
        private var classifyTask: Task<Void, Never>?
    
        func onTextChanged(_ text: String) {
            classifyTask?.cancel()
            classifyTask = Task {
                try? await Task.sleep(nanoseconds: 300_000_000) // 300ms 防抖
                guard !Task.isCancelled else { return }
                let category = await classifier.classify(text)
                await MainActor.run { suggestedCategory = category }
            }
        }
    }

    入門指南

    1. 定義你的類別。 列出你的分類器應產出的 5-20 個標籤。
    2. 建立訓練範例。 最少 500 個範例,涵蓋所有類別和真實輸入。
    3. 微調 1B 模型。 使用像 Ertas 這樣的平台:上傳你的範例、選擇 1B 基礎模型、使用 LoRA 訓練、匯出 GGUF。
    4. 整合 llama.cpp。 將推論函式庫加入你的 iOS 或 Android 專案。
    5. 在真實資料上測試。 將你的評估集通過模型運行。目標 90%+ 準確率。
    6. 部署。 將模型打包或透過安裝後下載傳遞。

    分類是通往生產品質裝置端 AI 的最快路徑。模型小、任務簡單,且對於領域特定類別來說,結果明顯優於雲端 API。

    Ship AI that runs on your users' devices.

    Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    Ship AI that runs on your users' devices.

    Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    Keep reading