Back to blog
    从云端 API 迁移到端侧 AI:完整指南
    migrationcloud APIon-device AIdeploymentmobile AIsegment:mobile-builder

    从云端 API 迁移到端侧 AI:完整指南

    将移动应用从云端 AI API 迁移到端侧推理的分步迁移计划。数据提取、微调、集成、测试、发布和监控。

    EErtas Team·

    您有一个移动应用,其 AI 功能由云端 API 驱动。它能用,但成本在增长,延迟很明显,而且您希望支持离线使用。本指南详细介绍从云端 API 到端侧推理的完整迁移过程。

    迁移不是重写。它是一个渐进式过渡,端侧 AI 逐步替代云端 API 的特定功能,每一步都经过验证。

    第一阶段:评估(第 1 周)

    盘点您的 AI 功能

    列出每个调用云端 AI API 的功能:

    功能每日 API 调用平均 Token 数月成本需要离线?
    聊天助手5,0002,500$450最好有
    内容分类12,000800$180
    智能回复8,000600$120
    摘要2,0003,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 调用日志是主要的训练数据来源:

    1. 从日志基础设施导出 API 日志(输入/输出对)
    2. 过滤质量(成功的响应、用户接受的输出)
    3. 匿名化(移除 PII)
    4. 格式化为标准的聊天训练格式
    # 从 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%)

    目标数据集大小

    功能最少推荐
    分类5001,000
    智能回复5002,000
    对话1,0003,000
    摘要5002,000

    第三阶段:微调(第 3-4 周)

    选择基础模型

    功能类型推荐模型大小
    分类、标签Llama 3.2 1B600MB (Q4)
    智能回复、建议Llama 3.2 1B600MB (Q4)
    对话、会话Llama 3.2 3B1.7GB (Q4)
    摘要Llama 3.2 3B1.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% 以内。

    需要时迭代

    如果模型未达到质量标准:

    1. 为失败的类别添加更多训练样本
    2. 增加 LoRA rank 以获得更多容量
    3. 尝试更大的基础模型(1B 到 3B)
    4. 调整超参数(降低学习率,增加 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% 的请求,可以安全移除。

    第七阶段:运营(持续)

    模型更新流程

    建立定期更新周期:

    1. 从用户交互中收集新训练数据
    2. 每月或每季度重新训练
    3. 对照前一版本模型进行评估
    4. 通过 OTA 模型更新推送
    5. 每次更新后监控质量指标

    监控

    跟踪端侧 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