
端侧内容生成:离线也能用的 AI 草稿功能
如何构建无需互联网即可运行的 AI 草稿功能。邮件回复、消息建议、笔记扩展和内容模板,全部在用户设备上本地生成。
邮件回复建议、消息自动补全、笔 记扩展、社交帖子草稿。这些功能有一个共同模式:用户提供简短输入,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 关于 Q3 预算审查的会议
生成内容:
"Sarah 您好,感谢今天关于 Q3 预算审查的富有成效的讨论。
如约定,我会在下周三之前准备好修订后的预测。
如有其他需要,请随时告知。"
实现方式
生成接口
// 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)。
上下文管理
好的草稿需要好的上下文。为模型提供:
- 被回复的内容(邮件、消息、帖子)
- 用户的操作或意图(接受、拒绝、提问)
- 相关元数据(发件人姓名、主题、日期)
- 用户的写作风格(来自训练数据)
保持总上下文在 500 个 token 以内以确保快速生成。
内容生成的微调
基础模型生成通用内容。微调模型生成符合您应用风格和特定用例的内容。
训练数据来源
- 现有用户内容(经授权):您的用户目前如何撰写邮件、消息和笔记?他们的风格就是训练目标。
- 合成示例: 使用更大的模型生成训练对,然后验证质量。
- 基于模板的生成: 为常见场景创建模板并生成变体。
训练重点领域
| 领域 | 训练示例数 | 影响 |
|---|---|---|
| 语气/风格一致性 | 200-500 | 高(让输出更自然) |
| 领域词汇 | 100-300 | 高(使用正确术语) |
| 格式遵循 | 200-500 | 高(每次生成结构正确) |
| 长度控制 | 100-200 | 中(保持在目标长度内) |
| 边缘情况处理 | 100-200 | 中(优雅降级) |
总计:700-1,700 个训练示例即可获得一个调优良好的内容生成模型。
Ertas 等平台处理完整流程。上传您的训练对话,使用 LoRA 微调,导出 GGUF。模型学习您应用的内容风格,生成感觉原生的草稿。
性能预期
生成速度(3B 模型,Q4_K_M)
| 设备 | 短草稿(50 token) | 中等草稿(200 token) |
|---|---|---|
| iPhone 16 Pro | 1.5-2.5 秒 | 6-10 秒 |
| iPhone 15 | 2-3.5 秒 | 8-14 秒 |
| Galaxy S24 | 1.5-2.5 秒 | 6-10 秒 |
| 中端 Android | 3-5 秒 | 12-20 秒 |
生成速度(1B 模型,Q4_K_M)
| 设备 | 短草稿(50 token) | 建议(20 token) |
|---|---|---|
| iPhone 16 Pro | 1-1.5 秒 | 0.4-0.6 秒 |
| iPhone 15 | 1.5-2 秒 | 0.5-0.8 秒 |
| Galaxy S24 | 1-1.5 秒 | 0.4-0.6 秒 |
| 中端 Android | 2-3 秒 | 0.8-1.2 秒 |
内联自动补全使用 1B 模型。完整草稿生成使用 3B。
质量考量
幻觉管理
内容生成模型可能会编造细节。对于草稿,这意味着生成上下文中不存在的姓名、日期或事实。
缓解措施:
- 在提示中提供完整上下文(不要期望模型知道未给出的事实)
- 利用微调模型遵循训练模式的倾向(微调模型在领域内任务上的幻觉更少)
- 在 UI 中添加"发送前审阅"步骤
长度控制
使用目标长度的示例进行微调。如果您希望生成 2-3 句的回复,就用 2-3 句的示例训练。模型从训练数据而非指令中学习预期的输出长度。
重新生成
始终提供"重新生成"按钮。如果第一次草稿不理想,用户可以获取新的。当温度大于 0 时,每次生成都会产生不同的输出。
即时生成、离线支持和零使用成本的组合,使端侧内容生成成为任何需要用户写作的应用中的高价值功能。
Ship AI that runs on your users' devices.
Free plan with 30 credits/mo, no card required. Paid plans from $25/mo USD.


