semantic searchon-device AIembeddingsmobile AIimplementation
端侧语义搜索: 无需服务器的AI驱动搜索
如何构建完全在用户手机上运行的语义搜索。本地嵌入、向量相似度,以及无需服务器或API即可对用户内容进行自然语言查询。
Edward Xi Yang
当用户不知道确切的词语时,关键词搜索就会失败。"上周关于预算会议的那封邮件"无法匹配标题为"第三季度财务回顾"的邮件。语义搜索理解含义,而非仅仅匹配关键词。
标准方案将语义搜索放在带向量数据库的服务 器上。但对于用户内容存储在本地的移动应用(笔记、消息、照片、文档),将这些内容发送到服务器就违背了保持端侧处理的初衷。
端侧语义搜索让一切保持在本地。嵌入模型在手机上运行。向量索引存储在本地。搜索查询永远不会离开设备。
语义搜索的工作原理
- 索引: 每段内容使用小型模型转换为嵌入向量(代表其含义的数字列表)
- 存储: 嵌入向量与内容一起存储在本地数据库中
- 查询: 用户的搜索查询使用同一模型转换为嵌入向量
- 匹配: 查询向量与所有存储的向量使用余弦相似度进行比较
- 排序: 结果按相似度分数排列返回
核心在于嵌入。关于同一主题的两段文本会产生相似的向量,即使它们没有共同的关键词。
嵌入模型
端侧嵌入模型小巧且快速。不同于生成式LLM(600MB-1.7GB),嵌入模型通常只有20-80MB:
| 模型 | 大小 | 维度 | 速度 (iPhone 15) |
|---|---|---|---|
| all-MiniLM-L6-v2 | 23MB | 384 | 500+嵌入/秒 |
| nomic-embed-text-v1.5 | 55MB | 768 | 200+嵌入/秒 |
| bge-small-en-v1.5 | 33MB | 384 | 400+嵌入/秒 |
以每秒200-500个嵌入的速度,索引1,000条笔记只需2-5秒。查询嵌入几乎是即时的(5ms以内)。