iOS 端侧模型训练与应用入门(五)

3 阅读4分钟

模块五:智慧——从数据到洞察 (The Intelligence)

写在前面: 如果没有任何反馈,用户只不过是在填一张 excel 表。 我们之前做的一切——Embedding、分类、训练,都是为了这一刻:给用户提供有灵魂的反馈。这在 AI 圈有个时髦的词叫 RAG(检索增强生成),但我们要在手机上做一个“微缩版”。


5.1 你的第二大脑:语义记忆 (Semantic Memory)

为什么叫“记忆”而不是“检索”?

当用户问“我最近状态怎么样?”时:

  1. 传统检索 (Search):只能找关键词匹配的记录(比如包含“状态”二字的日记)。

  2. 语义记忆 (Memory):能回想起你三周前写过“好累不想动”(Embedding 距离很近),即使这段话里没有“状态”这两个字。

核心差异

我们不是为了让 AI 变得博学(External Knowledge),而是为了让 AI 真的认识你(Personal Context)。它不再是一个冷冰冰的问答机,而是一个拥有你过去所有生活片段记忆的老朋友

价值:让 AI 说的每一句话,都有据可查,都是针对的。不是通用的“你要多运动”,而是基于记忆的“我看你上次跑步还是三周前,要不今天动一下?”


5.2 检索:如何瞬间找到相关记忆?

当用户输入“我想提升自己”时,系统怎么知道他之前学过画画、放弃过吉他?

核心原理:Embedding 相似度

还记得模块一里的“坐标”吗?“提升自己”有一个坐标。我们只需要算出所有历史记录的坐标,看看谁离它最近。

方案 A:手写工坊 (Basic SQL + Manual Cosine) —— 简单粗暴

如果你的数据量只有几千条(个人目标管理 APP 通常如此):

  1. :在 SQLite 或 Core Data 里多加一列,存 Embedding 的 float 数组。

  2. :取出所有数据的 Embedding,写一个简单的函数计算余弦相似度 (Cosine Similarity)。

  3. :按分数排序,取前 5 个。

  • 优点:零依赖,任何数据库都能做。

  • 缺点:数据量上了万级会慢,每次都要全表扫描。

Swift 代码速查 (Schem A)


func cosineSimilarity(_ a: [Float], _ b: [Float]) -> Float {
    let dotProduct = zip(a, b).map(*).reduce(0, +)
    let magnitudeA = sqrt(a.map { $0 * $0 }.reduce(0, +))
    let magnitudeB = sqrt(b.map { $0 * $0 }.reduce(0, +))
    return dotProduct / (magnitudeA * magnitudeB)
}

// 实际使用时,建议使用 Accelerate 框架库 (vDSP) 进行向量加速,速度快 10 倍以上。

方案 B:引入外援 (sqlite-vec) —— 进阶推荐

随着 APP 发展,你可能需要更快的速度。这时可以使用 sqlite-vec 这样的向量搜索插件。

它让 SQLite 像开了挂一样,支持类似这样的查询:


SELECT * FROM goals

WHERE vec_distance_cosine(embedding, ?) < 0.2

ORDER BY vec_distance_cosine(embedding, ?)

LIMIT 5;

  • 优点:极快,代码极其简洁,不用自己写循环算距离。


5.3 生成:混合引擎与云端策略的抉择

找到了相关数据,怎么生成建议?我们推荐“三层架构”。

  • 层级 1:脊髓 (Reflex - 规则)

  • 特点:< 1ms,条件触发。

  • 例子IF 学习类目标本周占比 > 80% THEN 提示“注意休息”

  • 层级 2:小脑 (Routine - 端侧 LLM)

  • 特点:自然语言,有温度。

  • 例子:把查到的历史数据塞给本地的 Gemma/Phi-3 模型:“用户想‘提升自己’,但他以前吉他只坚持了2天,请给他一句鼓励。”

层级 3:云端协同 (The Cloud Strategy) —— 慎重抉择

在最初的设计中,可能会想用云端强大的 GPT-4 来给用户写深度周报。但这里涉及到一个战略调整

关键调整:云端用于“训练”而非“推理”

与其每次都把用户隐私数据传给云端去生成一句话,不如采用更长线的策略:

  1. 本地向量化与脱敏
  • 在上传前,只上传向量 (Enbedding)标签 (Labels)

  • 抹去原始文本(“我去国贸相亲” -> [0.12, ...] + Social)。

  • 云端拿到的只是一堆数字,反推回原始文本极其困难(虽然理论上非在特定条件下完全不可能,但门槛极高)。

  • :这与 联邦学习 (Federated Learning) 有所不同。联邦学习是把梯度(Gradient)传上去,我们这里直接传脱敏后的中间层特征(Embedding),工程实现更简单,兼容性更好。

  1. 云端进化
  • 云端收集了成千上万用户的(脱敏)向量分布。

  • 用这些数据训练一个更强大的教师模型

  • 然后把这个更强的模型蒸馏、压缩,下发回用户的手机。

决策红线

这取决于你的业务承诺。

  • 如果你承诺“数据绝不出设备”,那即便只上传向量,也是一种风险(用户未必理解向量和文本的区别)。那就坚决别做

  • 如果你是注重体验的服务,且用户协议允许脱敏数据改进服务,那么这种“本地推理,云端进化”的模式,是兼顾隐私与智能的最佳平衡点。