content generationon-device AIdraftingmobile AIimplementation
裝置端內容生成:離線也能運作的 AI 草稿功能
如何建構無需網路即可運作的 AI 草稿功能。電子郵件回覆、訊息建議、筆記擴展和內容範本,全部在使用者裝置上生成。
Edward Xi Yang
電子郵件回覆建議。訊息自動完成。筆記擴展。社群貼文草稿。這些功能有一個共同模式:使用者提供簡短輸入,AI 生成更長、更精煉的輸出。
內容生成是裝置端 AI 第二自然的應用場景(僅次於分類)。它 充分利用了語言模型的優勢,同時保持在行動裝置硬體的效能預算之內。
裝置端生成擅長處理的內容
短篇內容(200 字以下)
| 使用場景 | 輸入 | 輸出 | 模型大小 |
|---|---|---|---|
| 電子郵件回覆 | 收到的郵件 + 「接受」 | 2-3 句回覆 | 3B |
| 訊息建議 | 對話上下文 | 3-5 個回覆選項(每個 1 句) | 1-3B |
| 筆記擴展 | 要點列表 | 段落 | 3B |
| 社群標題 | 照片上下文 + 關鍵字 | 1-2 句標題 | 1-3B |
| 留言回覆 | 貼文 + 使用者情緒 | 1-2 句回覆 | 1-3B |
| 表單填寫 | 欄位標籤 + 上下文 | 建議值 | 1B |
短篇生成是最佳甜蜜點。模型產生 50-200 個 token(1-3 句到一個短段落),在 3B 模型上需 2-5 秒,在 1B 模型上需 1-3 秒。
中篇內容(200-500 字)
| 使用場景 | 輸入 | 輸出 | 模型大小 |
|---|---|---|---|
| 電子郵件草稿 | 主旨 + 要點 | 完整郵件內文 | 3B |
| 會議摘要 | 逐字稿摘錄 | 摘要段落 | 3B |
| 產品描述 | 產品名稱 + 功能 | 行銷文案 | 3B |
| 部落格大綱 | 主題 + 目標受眾 | 結構化大綱 | 3B |
中篇內容在 3B 模型上需 5-15 秒。當使用者明確要求草稿(點擊「草擬郵件」按鈕)時這是可接受的,但對於行內建議來說太慢 了。
架構模式
一鍵草稿
最高互動率的模式。向使用者展示一個按鈕,根據上下文生成完整草稿:
[收到關於安排會議的郵件]
[接受] [拒絕] [建議替代方案]
> 點擊「接受」
草稿:「感謝您的來信。週二下午 2 點對我來說沒問題。
我會發送日曆邀請。期待見面。」
[發送] [編輯]
AI 根據使用者選擇的動作生成草稿。無需打字。使用者審閱後發送(或先編輯)。
行內自動完成
使用者輸入時提供完成建議:
使用者輸入:「感謝您的更新。我會審閱...」
建議(灰色文字):「...文件,並在週五前回覆您。」
[按 Tab 接受]
自動完成需要最低延遲。建議必須在使用者暫停後 200-300 毫秒內出現。這在旗艦裝置上使用 1B 模型可以實現(35-50 tok/s = 200 毫秒內生成 7-10 個字)。
範本擴展
使用者選擇範本,AI 填入上下文細節:
範本:「會議後跟進」
上下文:與 Sarah 討論第三季預算審查
生成結果:
「嗨 Sarah,感謝今天就第三季預算審查進行的富有成效的討論。
如我們所討論的,我將在下週三之前準備好修訂後的預測。
如果您需要其他任何資料,請隨時告知。」
實作
生成介面
// iOS:草稿生成
class DraftGenerator {
private let model: LlamaContext
func generateReply(
incomingMessage: String,
action: ReplyAction,
onToken: @escaping (String) -> Void
) async -> String {
let prompt = buildPrompt(message: incomingMessage, action: action)
var fullResponse = ""
await model.generate(prompt: prompt, maxTokens: 256) { token in
fullResponse += token
onToken(token) // 串流到 UI
}
return fullResponse
}
private func buildPrompt(message: String, action: ReplyAction) -> String {
return """
Write a brief reply to this message. Action: \(action.rawValue)
Message: \(message)
Reply:
"""
}
}多個建議
生成 2-3 個替代草稿讓使用者選擇:
// Android:生成多個建議
suspend fun generateSuggestions(
context: String,
count: Int = 3
): List<String> {
return (1..count).map {
model.generate(
prompt = buildSuggestionPrompt(context),
maxTokens = 64,
temperature = 0.8f // 較高溫度以增加多樣性
)
}
}使用溫度 0.7-0.9 來增加建議之間的多樣性。較低溫度(0.1-0.3)適用於需要一致、高品質草稿的情況。
上下文管理
好的草稿需要好的上下文。提供模型以下資訊: