
从云端 API 迁移到端侧 AI:完整指南
将移动应用从云端 AI API 迁移到端侧推理的分步迁移计划。数据提取、微调、集成、测试、发布和监控。
您有一个移动应用,其 AI 功能由云端 API 驱动。它能用,但成本在增长,延迟很明显,而且您希望支持离线使用。本指南详细介绍从云端 API 到端侧推理的完整迁移过程。
迁移不是重写。它是一个渐进式过渡,端侧 AI 逐步替代云端 API 的特定功能,每一步都经过验证。
第一阶段:评估(第 1 周)
盘点您的 AI 功能
列出每个调用云端 AI API 的功能:
| 功能 | 每日 API 调用 | 平均 Token 数 | 月成本 | 需要离线? |
|---|---|---|---|---|
| 聊天助手 | 5,000 | 2,500 | $450 | 最好有 |
| 内容分类 | 12,000 | 800 | $180 | 是 |
| 智能回复 | 8,000 | 600 | $120 | 是 |
| 摘要 | 2,000 | 3,000 | $270 | 否 |
按迁移价值优先排序
为每个功能评分:
- 成本影响: 高频功能节省最多钱
- 延迟敏感度: 速度最重要的功能从端侧获益最大
- 离线价值: 用户在无网络时需要的功能
- 复杂度: 简单任务(分类、短文本生成)更容易迁移
从最高价值、最低复杂度的功能开始。分类和智能回复是典型的首选候选。
设定质量基线
迁移之前,衡量云端 AI 在每个功能上的表现:
# 评估集:200-500 个带有人工验证正确答案的样本
evaluation_set = load_evaluation_data("eval_set.jsonl")
for example in evaluation_set:
cloud_response = call_cloud_api(example.input)
cloud_score = evaluate(cloud_response, example.expected)
log_baseline(example.id, cloud_score)
基线是您的端侧模型必须达到或超过的标准。
第二阶段:准备训练数据(第 1-3 周)
从 API 日志提取
您现有的 API 调用日志是主要的训练数据来源:
- 从日志基础设施导出 API 日志(输入/输出对)
- 过滤质量(成功的响应、用户接受的输出)
- 匿名化(移除 PII)
- 格式化为标准的聊天训练格式
# 从 API 日志中提取训练数据
training_examples = []
for log in api_logs:
if log.status == "success" and log.user_feedback != "negative":
training_examples.append({
"messages": [
{"role": "user", "content": log.user_input},
{"role": "assistant", "content": log.model_output}
]
})
用合成数据补充
如果您的 API 日志不足(少于 500 个高质量样本),用合成数据补充:
- 使用云端 API 生成最佳样本的变体
- 为日志中代表不足的边缘情况创建样本
- 手动验证合成样本(抽样 10-20%)
目标数据集大小
| 功能 | 最少 | 推荐 |
|---|---|---|
| 分类 | 500 | 1,000 |
| 智能回复 | 500 | 2,000 |
| 对话 | 1,000 | 3,000 |
| 摘要 | 500 | 2,000 |
第三阶段:微调(第 3-4 周)
选择基础模型
| 功能类型 | 推荐模型 | 大小 |
|---|---|---|
| 分类、标签 | Llama 3.2 1B | 600MB (Q4) |
| 智能回复、建议 | Llama 3.2 1B | 600MB (Q4) |
| 对话、会话 | Llama 3.2 3B | 1.7GB (Q4) |
| 摘要 | Llama 3.2 3B | 1.7GB (Q4) |
使用 LoRA 训练
将训练数据上传到微调平台。配置 LoRA 参数:
- Rank:16-32(1B)或 32-64(3B)
- 学习率:1e-4 到 2e-4
- Epochs:3-5
- 评估集拆分:10%
Ertas 等平台处理训练基础设施:选择基础模型,上传数据,配置参数,在云端 GPU 上训练,导出 GGUF。
对照基线评估
用评估集运行微调后的模型:
for example in evaluation_set:
on_device_response = run_local_model(example.input)
on_device_score = evaluate(on_device_response, example.expected)
compare_to_baseline(example.id, on_device_score)
通过 标准: 主要指标上端侧准确率与云端基线在 3% 以内。
需要时迭代
如果模型未达到质量标准:
- 为失败的类别添加更多训练样本
- 增加 LoRA rank 以获得更多容量
- 尝试更大的基础模型(1B 到 3B)
- 调整超参数(降低学习率,增加 epochs)
每次更改后重新评估。大多数模型在 2-3 次训练迭代内达到生产质量。
第四阶段:集成(第 4-5 周)
将 llama.cpp 添加到项目
按照平台特定的集成指南:
- iOS:Swift Package 或预编译 framework
- Android:llama.android 库或 NDK 构建
- React Native:llama.rn 包
构建 AI 提供者抽象
创建一个通用接口,云端和端侧提供者都实现:
protocol AiProvider {
func generate(prompt: String, maxTokens: Int) async throws -> AiResponse
var isAvailable: Bool { get }
}
class CloudProvider: AiProvider { /* 现有实现 */ }
class OnDeviceProvider: AiProvider { /* 新的 llama.cpp 实现 */ }
实现模型分发
选择打包或安装后下载。为 GGUF 文件设置 CDN 托管。实现下载进度 UI、SHA256 验证和存储管理。
添加路由逻辑
根据模型可用性和 A/B 测试分组将请求路由到云端或端侧:
func getProvider(for userId: String) -> AiProvider {
let cohort = getCohort(userId)
if cohort == .onDevice && onDeviceProvider.isAvailable {
return onDeviceProvider
}
return cloudProvider
}
第五阶段:A/B 测试(第 5-7 周)
渐进式发布
- 第 5 周:10% 端侧(监控崩溃、错误)
- 第 6 周:50/50 分组(收集对比指标)
- 第 7 周:分析结果
关键监控指标
- 任务完成率(主要)
- 功能参与度(D7 留存)
- 延迟(TTFT 和总延迟)
- 崩溃率
- 用户反馈(如果有反馈机制)
决策标准
迁移 如果任务完成率在云端的 3% 以内且崩溃率没有增加。 迭代 如果质量较低但接近(差距在 5% 以内)。用更多数据重新训练。 暂停 如果质量差距显著(超过 5%)。调查根本原因。
第六阶段:迁移(第 7-8 周)
全面发布
在 1-2 周内推进到 100% 端侧:
- 75% 端侧,25% 云端 (1 周)
- 100% 端侧(保留云端作为回退)
保留云端作为回退
不要立即移除云端 API 集成。保留它作为以下情况的回退:
- 无法运行模型的设备(4GB 以下 RAM)
- 模型下载失败
- 发现模型质量问题时的紧急回滚
逐步关闭云端
在 100% 端侧稳定运行 30 天后:
- 降低云端 API 层级(降低速率限制承诺)
- 90 天后:评估是否保留云端回退或完全移除
- 跟踪云端回退使用率。如果低于 1% 的请求,可以安全移除。
第七阶段:运营(持续)
模型更新流程
建立定期更新周期:
- 从用户交互中收集新训练数据
- 每月或每季度重新训练
- 对照前一版本模型进行评估
- 通过 OTA 模型更新推送
- 每次更新后监控质量指标
监控
跟踪端侧 AI 健康指标:
- 推理延迟(P50,P95)
- 模型加载成功率
- 生成质量(通过用户反馈/操作)
- 内存使用和崩溃率
- 模型下载成功率
成本跟踪
记录成本节省:
- 迁移前的云端 API 账单
- 迁移后的云端 API 账单(仅回退)
- 模型分发的 CDN 成本
- 微调 成本(每次重新训练)
- 每月净节省
时间线总结
| 阶段 | 持续时间 | 关键交付物 |
|---|---|---|
| 评估 | 第 1 周 | 功能清单、质量基线 |
| 准备数据 | 第 1-3 周 | 清洗、格式化的训练数据集 |
| 微调 | 第 3-4 周 | 达到质量标准的 GGUF 模型 |
| 集成 | 第 4-5 周 | 应用中的 llama.cpp、模型分发 就绪 |
| A/B 测试 | 第 5-7 周 | 质量对等的统计证据 |
| 迁移 | 第 7-8 周 | 100% 端侧,保留云端回退 |
| 运营 | 持续 | 定期模型更新、监控 |
总计:从开始到完全迁移 8 周。 后续模型更新(重新训练和部署)只需要几天而非几周。
微调步骤是 Ertas 等平台节省最多时间的地方。上传您的 API 日志数据,选择基础模型,训练,导出 GGUF。平台处理 GPU 基础设施、训练优化和 GGUF 转换。您的重心保持在数据质量和应用集成上。
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

How to Add AI to Your Mobile App: A Developer's Decision Guide
A comprehensive guide covering every approach to adding AI features to iOS and Android apps. Cloud APIs, on-device models, and hybrid architectures compared with real cost and performance data.

A/B Testing Cloud API vs On-Device AI in Production
How to run a fair A/B test between your cloud API and on-device model in a live mobile app. Metrics, cohort design, statistical significance, and the metrics that actually matter.

AI in iOS Apps: CoreML, Cloud APIs, and On-Device LLMs Compared
Three paths to AI in your iOS app. CoreML for Apple's ecosystem, cloud APIs for capability, and on-device LLMs via llama.cpp for cost and privacy. A practical comparison for Swift developers.